Binary 两个二进制字符串之间的这种距离有正式名称吗?

Binary 两个二进制字符串之间的这种距离有正式名称吗?,binary,hamming-distance,Binary,Hamming Distance,我们都知道,两个二进制字符串的汉明距离是不同位数。而对于两个二进制字符串:1110和1101,如果我想用最高位的相同位数来描述它们的相似性。(在本例中,从左到右,对两个位进行计数,直到两个位不同时,结果为2。) 这种相似性是已经定义的还是有正式名称的?我咨询了我所在大学的其他几位教员,我们同意,我们没有听说过:-) 然而,这类问题总是很有趣,特别是当我以前没有见过它们的时候。。。所以我一直在研究一个解决方案 作为澄清,我认为您的目标是找到两个等效存储长度(比如两个无符号长度)的二进制值之间的距离

我们都知道,两个二进制字符串的汉明距离是不同位数。而对于两个二进制字符串:1110和1101,如果我想用最高位的相同位数来描述它们的相似性。(在本例中,从左到右,对两个位进行计数,直到两个位不同时,结果为2。)
这种相似性是已经定义的还是有正式名称的?

我咨询了我所在大学的其他几位教员,我们同意,我们没有听说过:-)

然而,这类问题总是很有趣,特别是当我以前没有见过它们的时候。。。所以我一直在研究一个解决方案

作为澄清,我认为您的目标是找到两个等效存储长度(比如两个无符号长度)的二进制值之间的距离(我将其称为ConferDistance…嘿,为什么不?…我喜欢O.R.Mapper的评论),并且忽略所有前导0。例如,未签名的短裤54090对3374。。。54090=1101_0011_0100_1010和3374=0000_1101_0010_1110。找到最高阶1(最左边)后,在第一个差异之前,它们的位模式110_1001匹配,因此距离为7

是我编写的C++程序,用来查找这个距离度量。函数“find_highest_1”和“conferu dist”是相关的函数。将#define for T更改为任何无符号类型,但请注意,如果选择无符号字符,则不重要且写得很糟糕的数字输入代码将无法按预期工作,但距离计算将:-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;
}
#包括
使用名称空间std;
/*为T选择的类型必须是无符号的,但任何大小都可以*/
#定义T个无符号短字符
#定义T_位(sizeof(T)*8)
字符串打印位置(T个){
字符串结果=“0b”;
对于(int i=T_位-1;i>=0;i--){
如果((i+1)%4==0)结果。追加(“”);
结果。追加(到_字符串((num&((T)1)>i));
}
返回结果;
}
int find_highest_1(T num){
int i=-1;//-1在这里很重要,因为协商距离是如何找到的
如果(num!=0){
i=0;
用于(int-shift=T_位/2;shift>=1;shift>>=1){
如果(num&(~(T)0)>=shift;
i+=移位;
}
}
}
返回i;
}
国际会议区(TA、TB){
int len_a=找到最高的1(a)+1;
int len_b=找到最高的1(b)+1;
int最小长度;
最小长度=(len_a>=长度a-最小长度;
b>>=长度b-最小长度;
返回最小长度-查找最大长度1(a^b)-1;
}
int main(int argc,const char*argv[]
{
T num1,num2;
cout>num1>>num2;

这不就是
楼层(log2(a-b))
(或类似物)?@OliCharlesworth:计算该距离的公式可能是这样的,但我认为问题在于它是否有任何名称。比如,类似Charlesworth距离之类的;-)这个问题似乎离题了,因为它是关于事物的名称,而不是编程。@OliCharlesworth:算法/编程技术的名称不是很适合编程问题吗?或者,换言之,什么地方更适合问这个问题?类似的问题,如或没有收到任何类似的问题同样,投票结果也很接近。编程不仅仅是编写代码,还包括使用、了解和识别设计模式和算法。感谢您的评论。我问这个问题是因为我想在我的算法中使用这个距离度量。我想找到更多的理论支持,并了解更多关于它的内容。(你知道,这个名字对搜索很有用。)谢谢你的详细回答。我提出这个问题是因为我认为这种距离可以用在二叉树中。如果二进制代码只是从根到叶的路径,那么这种距离可以定义为两片叶之间的亲和力(或者有一些类似的方法来定义它?). :)