2014-02-09 5 views
2

Мы все знаем, что расстояние Хэмминга двух двоичных строк - это количество различных бит. Хотя для двух двоичных строк: 1110 и 1101, если я хочу описать их сходство с количеством одних и тех же битов с самого высокого бита. (В этом примере слева направо подсчитывайте биты до тех пор, пока два бита не будут разными, тогда результат будет равен 2.) Является ли это сходство определенным или имеет формальное имя?Существует ли формальное имя для такого расстояния между двумя двоичными строками?

+0

Разве это не просто слово (log2 (a - b)) '(или подобное)? –

+0

@OliCharlesworth: Формула для вычисления этого расстояния, вероятно, выглядит так, но я думаю, что вопрос скорее в том, имеет ли это * имя *. Скажем, что-то вроде * Charlesworth Distance * или тому подобное ;-) –

+0

Этот вопрос кажется не по теме, потому что речь идет о названиях вещей, а не о программировании. –

ответ

0

я консультировался несколько другой факультет в моем университете, и мы согласны с тем, что мы не слышали об этом :-)

Однако эти виды проблем всегда интересны, особенно, когда я их не видел раньше ... поэтому я работал над решением.

В качестве уточнения я беру на себя цель найти расстояние (которое я назову на конференцию ... эй, почему бы и нет? ... Я любил комментарий О.К.Марпера) между двоичными значениями двух числа эквивалентной длины хранения (скажем, два беззнаковых длин), и вы игнорируете все ведущие 0. Например, неподписанные шорты 54090 против 3374 ... 54090 = 1101_0011_0100_1010 и 3374 = 0000_1101_0010_1110. Как только вы найдете самый высокий порядок 1 (самый левый), у них есть бит-шаблон 110_1001, соответствующий перед первым несоответствием, поэтому расстояние равно 7.

Ниже приведена программа на C++, которую я написал, чтобы найти эту метрику расстояния. Функции «find_highest_1» и «confer_dist» являются подходящими. Измените #define для T как любой неподписанный тип, но будьте предупреждены, если вы выберете unsigned 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