두 바이너리 문자열의 해밍 거리는 서로 다른 비트 수임을 압니다. 2 개의 바이너리 스트링에 대해서 : 1110과 1101, 만약 내가 가장 높은 비트에서 같은 비트의 수로 그들의 유사성을 밝히고 싶다면. (이 예제에서는 왼쪽에서 오른쪽으로 두 비트가 다를 때까지 비트를 계산합니다. 결과는 2입니다.) 이러한 종류의 유사성이 정의되었거나 정식 이름입니까?이진 문자열 사이에 이런 종류의 거리에 대한 공식 이름이 있습니까?
답변
나는 나의 대학에서 다른 교수의 몇 가지를 상담하고 우리는 우리가 이러한 종류의 문제는 내가 그들을 본 적이 없다 특히, 항상 흥미,
그러나이 :-) 들어 본 적이 없다, 동의 전에 ... 그래서 나는 해결책을 찾고 있었다.
설명의 요점으로 거리를 알아내는 데 목표를두고 있습니다 (나는 Confer distance ... hey why not? ... 나는 Mapper의 의견을 사랑했습니다) 등가적인 저장 길이의 수 (2 개의 unsigned long을 말함). 그리고 앞에 오는 0을 모두 무시하고있다. 예를 들어, 부호없는 반바지 54090 대 3374 ... 54090 = 1101_0011_0100_1010 및 3374 = 0000_1101_0010_1110입니다. 가장 높은 순위 1 (가장 왼쪽)을 찾으면 첫 번째 불일치 전에 110_1001의 비트 패턴이 일치하므로 거리가 7입니다.
다음은이 거리 통계를 찾기 위해 작성한 C++ 프로그램입니다. "find_highest_1"과 "confer_dist"함수는 관련 함수입니다. 부호없는 타입이되도록 #define을 변경하십시오. 그러나 서명되지 않은 char을 선택하면 중요하지 않고 비참하게 작성된 숫자 입력 코드가 예상대로 작동하지 않지만 거리 계산은 다음과 같이됩니다 .-P
#include <iostream>
using namespace std;
/* the type chosen for T MUST be unsigned, but any size is fine */
#define T unsigned short
#define T_BITS (sizeof(T) * 8)
string print_bin(T num) {
string result = "0b";
for(int i = T_BITS - 1; i >= 0; i--) {
if((i + 1) % 4 == 0) result.append("_");
result.append(to_string((num & (((T)1) << i)) >> i));
}
return result;
}
int find_highest_1(T num) {
int i = -1; // -1 matters here because of how the Confer Distance is found
if(num != 0) {
i = 0;
for(int shift = T_BITS/2; shift >= 1; shift >>= 1) {
if(num & (~(T)0) << shift) {
num >>= shift;
i += shift;
}
}
}
return i;
}
int confer_dist(T a, T b) {
int len_a = find_highest_1(a) + 1;
int len_b = find_highest_1(b) + 1;
int min_length;
min_length = (len_a < len_b) ? len_a : len_b;
a >>= len_a - min_length;
b >>= len_b - min_length;
return min_length - find_highest_1(a^b) - 1;
}
int main(int argc, const char * argv[])
{
T num1, num2;
cout << "enter two numbers: ";
cin >> num1 >> num2;
cout << "num1 = " << print_bin(num1) << endl;
cout << "num2 = " << print_bin(num2) << endl;
cout << "Confer dist: " << confer_dist(num1, num2) << endl;
return 0;
}
어떻게 작동하는지 설명하는 데 의견을 말하지는 않았지만 누구에게나 도움이된다면 행복 할 것입니다.
답장을 보내 주셔서 감사합니다. 나는 이런 종류의 거리가 이진 트리에서 사용될 수 있다고 생각하기 때문에이 질문을한다. 이진 코드가 루트에서 리프까지의 경로 일 경우이 거리는 두 리프 사이의 유사도로 정의 될 수 있습니다 (또는이를 정의하는 몇 가지 유사한 방법이 있습니까?). :) – firefly
- 1. C++에서 이런 종류의 패턴에 대한 이름이 있습니까?
- 2. 어떻게 이런 공식이 공식
- 3. 이런 종류의 문제에 대한 해결책은 무엇입니까?
- 4. asp.net에서 이런 종류의 실행에 대한 제안
- 5. 이런 종류의 단위에 대한 명명 방법은 무엇입니까?
- 6. 이런 종류의 데이터 프레임 워크가 있습니까?
- 7. 누구나 이런 종류의 고무 효과에 대한 알고리즘을 알고 있습니까?
- 8. 이진 검색 트리 공식
- 9. 이런 종류의 충돌 보고서는 쓸모가 있습니까?
- 10. 이런 종류의 앱을 사용할 수 있습니까?
- 11. 어떻게 이런 종류의 복제를 할 수 있습니까?
- 12. 어떻게 이런 종류의 옵션을 만들 수 있습니까?
- 13. 어떻게 이런 종류의 창을 얻을 수 있습니까?
- 14. 어떻게 이런 종류의 테두리를 만들 수 있습니까?
- 15. 이런 종류의 JSON을 직렬화하려면 어떻게해야합니까?
- 16. 거리에 대한 지평선 찾기
- 17. 이런 종류의 프로젝트를 어떻게 구성합니까?
- 18. 이 유형의 이진 검색의 이름이 있습니까?
- 19. 이런 종류의 조건으로 조각을 만들어야합니까?
- 20. 이런 종류의 이벤트 처리기를 제거해야합니까?
- 21. 이런 종류의 코드가 항상 작동합니까?
- 22. 이런 종류의 사용으로 벌타는 괜찮습니까?
- 23. 이런 종류의 스위치 케이스를 제거하는 방법은 무엇입니까?
- 24. 이러한 종류의 주석 달린 줄에는 이름이 있습니까?
- 25. 어떻게 이런 종류의 예외를 해결할 수 있습니까? ArgumentOutOfRangeException
- 26. 이런 종류의 배열 선언은 합법적입니까?
- 27. 이런 종류의 정보를 시각화하는 방법
- 28. 이런 종류의 파일을 무시하지 않으십니까?
- 29. 이런 종류의 목록을 구현하는 방법
- 30. jFreeChart : 이런 종류의 차트가 가능합니까?
'floor (log2 (a-b))'(또는 이와 유사)이 아닌가요? –
@OliCharlesworth : 그 거리를 계산하는 수식은 아마도 그렇게 보일 것입니다. 그러나 나는 그 질문이 오히려 어떤 * 이름 *을 가지고 있는지 아닌지 생각합니다. 말하자면, * Charlesworth Distance * 또는 그와 비슷한 것입니다 .--) –
이 질문은 프로그래밍이 아닌 사물의 이름에 관한 주제이기 때문에 주제가 아닌 것으로 보입니다. –