2014-02-09 1 views
2

두 바이너리 문자열의 해밍 거리는 서로 다른 비트 수임을 압니다. 2 개의 바이너리 스트링에 대해서 : 1110과 1101, 만약 내가 가장 높은 비트에서 같은 비트의 수로 그들의 유사성을 밝히고 싶다면. (이 예제에서는 왼쪽에서 오른쪽으로 두 비트가 다를 때까지 비트를 계산합니다. 결과는 2입니다.) 이러한 종류의 유사성이 정의되었거나 정식 이름입니까?이진 문자열 사이에 이런 종류의 거리에 대한 공식 이름이 있습니까?

+0

'floor (log2 (a-b))'(또는 이와 유사)이 아닌가요? –

+0

@OliCharlesworth : 그 거리를 계산하는 수식은 아마도 그렇게 보일 것입니다. 그러나 나는 그 질문이 오히려 어떤 * 이름 *을 가지고 있는지 아닌지 생각합니다. 말하자면, * Charlesworth Distance * 또는 그와 비슷한 것입니다 .--) –

+0

이 질문은 프로그래밍이 아닌 사물의 이름에 관한 주제이기 때문에 주제가 아닌 것으로 보입니다. –

답변

0

나는 나의 대학에서 다른 교수의 몇 가지를 상담하고 우리는 우리가 이러한 종류의 문제는 내가 그들을 본 적이 없다 특히, 항상 흥미,

그러나이 :-) 들어 본 적이 없다, 동의 전에 ... 그래서 나는 해결책을 찾고 있었다.

설명의 요점으로 거리를 알아내는 데 목표를두고 있습니다 (나는 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; 
} 

어떻게 작동하는지 설명하는 데 의견을 말하지는 않았지만 누구에게나 도움이된다면 행복 할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 이런 종류의 거리가 이진 트리에서 사용될 수 있다고 생각하기 때문에이 질문을한다. 이진 코드가 루트에서 리프까지의 경로 일 경우이 거리는 두 리프 사이의 유사도로 정의 될 수 있습니다 (또는이를 정의하는 몇 가지 유사한 방법이 있습니까?). :) – firefly

관련 문제