当订单对于群集很重要时,为整数值分配字符串

时间:2017-11-02 12:57:45

标签: string machine-learning cluster-analysis metric

我有一个拥有许多计算机名称的网络。我想为每个计算机名分配一个int值,以便我可以集群具有接近int值的计算机名称。同一群集中的计算机名称应该是共享相同前缀的计算机(前缀的长度不是常量),并且只有后缀不同(后缀的长度不是常量)才会具有相对接近的值。

例如,假设我有3个计算机名称: 1.' wber1637' 2.' wbcx9999' 3.' abcx9999'。 第一个和第二个名称具有相同的前缀(在这种情况下,前缀的长度为2 - ' wb'),因此我希望它们将被赋予彼此接近的int值。相比之下,与其他两个名称具有不同前缀的第三个名称(尽管具有相同的后缀,' cx9999',作为第二个名称)应该被赋予一个远离int的int值。其他两个名字的值。

1 个答案:

答案 0 :(得分:0)

将名称中的字符视为数字本身

这样,从类似开头开始的名称大小大致相同,如果结尾不同则会有较小的变化

例如:

ascii中的

wber1637个字母是0x77,0x62,0x65,0x72,0x31,0x36,0x33,0x37

将他们变成一个数字以获得0x7762657231363337 - 8602549779357381431 十进制

ascii中的

wbcx9999个字母是0x77,0x62,0x63,0x78,0x39,0x39,0x39,0x39

将他们变成一个数字得到0x7762637839393939 - 8602547606238345529 十进制

与abcx9999相比,它们有点接近彼此(请注意它们是如何从860254开始的)

ascii中的

abcx9999个字母是0x61,0x62,0x63,0x78,0x39,0x39,0x39,0x39

将他们变成一个数字得到0x6162637839393939 - 7017280537403930937 十进制

wbcx9999wber1637之间的差异为 2173119035902

wbcx9999abcx9999之间的差异为 1585267068834414592

在java中,生成

是一项简单的任务
String name = "wber1637";
long output = 0; //note that an 8 digit string fits exactly into a long
for(char c : name.toCharArray())
    output = (output << 8) + c;