我有一个文件文本,其中包含二进制(或十六进制)中的P个随机条目进行处理,从那个P号码开始,我必须取N个条目,使得它们之间的差异最大,所以我有一个很好的代表可能的人口。
到目前为止,我已经考虑过对当前N和包含使用修改版本的算法的元素的平均值进行比较:How do I calculate similarity of two integers?
或者在要选择的下一个元素和数组中的所有元素之间具有相似性的累积分数(最高的差异),并选择下一个,并重复直到选择了所需的N
我不知道是否有更好的解决方案。
实施例
[00011111,00101110,111111111,01001010,00011000,110010000,01110101]
P = 7 N = 3
结果:[00011111,110010000,00101110]
提前致谢
答案 0 :(得分:0)
如果要选择最不同的二进制表示,可以计算所有组合的汉明距离(参见https://en.wikipedia.org/wiki/Hamming_distance)。
编辑:小黑客
import numpy as np
a = [0b00011111, 0b00101110, 0b11111111, 0b01001010, 0b00011000, 0b10010000, 0b01110101]
N = 3
b = []
for i in a:
b.append(np.unpackbits(np.uint8(i))) #to binary representation
valuesWithBestOverallDiffs = []
def getItemWithBestOverallDiff(b):
itemWithBestOverallDiff = [0, 0] #idx, value
for biter, bval in enumerate(b):
hammDistSum = 0
for biter2, bval2 in enumerate(b):
if biter == biter2:
continue
print("iter1: " + str(biter) + " = " + str(bval))
print("iter2: " + str(biter2) + " = " + str(bval2))
hammDist = len(np.bitwise_xor(bval, bval2).nonzero()[0])
print(" => " + str(hammDist))
hammDistSum = hammDistSum + hammDist
if hammDistSum > itemWithBestOverallDiff[1]:
itemWithBestOverallDiff = [biter, hammDistSum]
#print(itemWithBestOverallDiff)
return itemWithBestOverallDiff
for i in range(N):
itemWithBestOverallDiff = getItemWithBestOverallDiff(b)
print("adding item nr " + str(itemWithBestOverallDiff[0]) + " with value 0b" + str(b[itemWithBestOverallDiff[0]]) + " = " + str(a[itemWithBestOverallDiff[0]]))
val = a.pop(itemWithBestOverallDiff[0])
b.pop(itemWithBestOverallDiff[0])
valuesWithBestOverallDiffs.append(val)
print("result: ")
print(valuesWithBestOverallDiffs)
最终输出是 结果: [144,117,255]
是0b10010000,0b01110101,0b11111111
答案 1 :(得分:0)
你应该成对比较它们。这个比较问题是最短的常见超序问题(见this)。字符串x和y的最短公共超序列是最短字符串z,使得x和y都是z的子序列。最短的常见超序是与最长公共子序列密切相关的问题(见enter link description here)。最长公共子序列的最佳解决方案是动态编程方法。