假设我有一个字符串列表,其中每个字符串是
对于每个字符串,我想确定字符串中使该字符串唯一的字符的位置。
所以对于三个字符串的列表
abcd
abcc
bbcb
对于第一个字符串,我想识别第四个位置的字符d since d不会出现在任何其他字符串的第四个位置。
对于第二个字符串,我想识别第四个位置的字符c.
对于第三个字符串,我想识别第一个位置的字符b并且第四个位置的角色也b.
这可以简明地表示为
abcd -> ...d
abcc -> ...c
bbcb -> b..b
如果您考虑同样的问题,但使用二进制数列表
0101
0011
1111
那么我想要的结果就是
0101 -> ..0.
0011 -> .0..
1111 -> 1...
坚持二进制主题,我可以使用 XOR 来识别哪些位在其中是唯一的two二进制数自
0101 ^ 0011 = 0110
我可以将其解释为在这种情况下第二位和第三位(从左到右读取)在这两个二进制数之间是唯一的。这种技术可能会转移注意力,除非它能以某种方式扩展到更大的列表。
强力方法是依次查看每个字符串,并对每个字符串迭代列表中其余字符串的垂直切片。
所以对于清单
abcd
abcc
bbcb
我会从
abcd
并迭代垂直切片
abcc
bbcb
这些垂直切片在哪里
a | b | c | c
b | b | c | b
或以列表形式“ab”、“bb”、“cc”、“cb”。
这将导致四个比较
a : ab -> . (a is not unique)
b : bb -> . (b is not unique)
c : cc -> . (c is not unique)
d : cb -> d (d is unique)
或简洁地
abcd -> ...d
也许这是一厢情愿的想法,但我有一种感觉,应该有一个优雅且通用的解决方案,适用于任意大的字符串(或二进制数字)列表。但如果有的话,我还没有看到它。
我希望使用此算法从一组唯一图像(位图)中获取最小签名,以便将来有效地识别这些图像。如果不考虑未来的效率,我会使用每个图像的简单散列。
你能改进蛮力吗?
Edit我喜欢的方法是构建像素到图像的映射
sprawl[Tuple<x=10, y=33,color=f1fefd>] => {
image17,
image23,
...
}
sprawl[Tuple<x=10, y=34,color=f1fef0>] => {
image11
...
}
然后使用该图来识别每个图像的最小签名像素集。
如果一个像素(由 x、y、颜色标识)仅引用一个图像,那么我就找到了该图像的完美(最小)签名。
如果图像没有唯一的像素,情况会更复杂,但由于我知道列表中的所有图像都是唯一的,所以我应该能够组合两个或更多像素引用(但尽可能少)来推断图像。
Update
我一直在为此研究一种算法。我的问题非常类似于this one https://stackoverflow.com/questions/2249908/optimized-ocr-black-white-pixel-algorithm,我把我的算法写成回答这个问题 https://stackoverflow.com/questions/2249908/optimized-ocr-black-white-pixel-algorithm/2873004#2873004。此更新是为了引起仍在关注的任何人的注意(我看到五个书签)。我正在单独研究这个问题,所以欢迎任何和所有的反馈,即使只是为了观察我还没有说清楚!