我有一个源,它以000, 001, 010, 000
的形式随机生成二进制输出字符串。
我想要一些散列或群集程序,根据与其他输入不同的位数将输入分组,例如输入流000,001和010应该全部转到同一个桶/群集,因为它们有一点不同。
我最初的想法是将第一个连续的输入位分组为一个,例如来自
000
001
010
成一个。然后接下来的那些:
011
100
101
等
但我很快意识到边界之间存在相似之处,例如000
和1000
应该属于同一个存储桶,而011
和000
应该位于不同的存储桶中。< / p>
我怎么能接近这个?提示?
詹姆斯
答案 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)