分组传入二进制输入的有效方法

时间:2012-12-17 13:38:56

标签: python python-3.x cluster-analysis

我有一个源,它以000, 001, 010, 000的形式随机生成二进制输出字符串。

我想要一些散列或群集程序,根据与其他输入不同的位数将输入分组,例如输入流000,001和010应该全部转到同一个桶/群集,因为它们有一点不同。

我最初的想法是将第一个连续的输入位分组为一个,例如来自

000
001
010

成一个。然后接下来的那些:

011
100
101

但我很快意识到边界之间存在相似之处,例如0001000应该属于同一个存储桶,而011000应该位于不同的存储桶中。< / p>

我怎么能接近这个?提示?

詹姆斯

2 个答案:

答案 0 :(得分:0)

使用灰色代码

https://en.wikipedia.org/wiki/Gray_code

  

反射二进制代码,也就是Frank Grey之后的格雷码,是一个二进制数字系统,其中两个连续值只有一位不同。

这导致三个位的以下顺序(以及相关的整数 - 这是不是的默认二进制编码!):

000  = 0
001  = 1
011  = 2
010  = 3
110  = 4
111  = 5
101  = 6
100  = 7

然后将线性分割所需数量的桶中的数据。

或者,您也可以查看校验和和纠错码。

答案 1 :(得分:0)

对不起,对于你的特殊情况,我没有找到一个功能,但在这里你可以有一些灵感:

如果你想拥有一个依赖于一个数字的存储桶功能,你可以这样做:

def bucket(i):
    bucket = 0
    bit = 1
    while bit <= i:
        if bit & i > 0:
            bucket += 1
        bit <<= 1 # shift the bit 1 higher
    return bucket

如果你有两个数字依赖:

def bucket(i, x):
    # perform some operation, store it in i
    bucket = 0
    bit = 1
    while bit <= i:
        # you can compare bits here
        if bit & i > 0:
            bucket += 1
    bit <<= 1
    return bucket

这就是你如何进行按位分组

buckets = {}
for number in numbers:
    numberBucket = bucket(number)
    buckets.setdefault(numberBucket, [])
    buckets[numberBucket].append(number)