【问题标题】:I have a specific string of 1's and 0's and I would like to find its most appropriate match in another string with an error of maximum 20%我有一个由 1 和 0 组成的特定字符串,我想在另一个字符串中找到它最合适的匹配,最大误差为 20%
【发布时间】:2017-02-07 12:09:25
【问题描述】:

例如,我得到以下由 0 和 1 组成的字符串:001011。 这是我的模式,或字符串 A。 然后,给我一个更长的 0 和 1 的字符串 B(例如:010100010010010),我的任务是在 B 中找到字符串 A 的最合适的匹配,我说,,最合适的“因为它不需要必须是字符串A,最大可能有20%的误差。

例如:对于字符串 A:01001,一个好的匹配应该是 11001。字符串 B 的 80% 匹配字符串 A,除了第一位。对于同一个 A 字符串,11101 将仅匹配其中的 60%(11101 中第一个和第三个位置的位与 A 中的第一个和第三个位不匹配),这不是所需的解决方案。

如果 N 是字符串 A 的位数,这意味着我一次对 B 的 N 长度序列执行检查(B 中的评估位必须在连续的位置上,所以这排除了 B 中的子字符串)。例如: 让它成为 A-01011 和 B-010100100111。首先我们评估序列 01010(B 的前 5 位从第一个位置开始),然后是 10100(前 5 位从 B 的第二位开始)。在这个例子中,在 01010 中只有 4 位与 A 匹配,这意味着 01010 是 80% 的匹配。关于 10100,与 A 没有位匹配,因此是 0% 匹配。

我可能会遇到 A 为:01001 而 B 为:01101 的情况(B 的前 2 位与 A 的前 2 位匹配,B 的后 2 位与 A 的后 2 位匹配)。因此,它是 80% 的匹配。

如果 A 比 B 长,则 A 在 B 中没有匹配项。


我想知道解决这个问题的算法、策略。我希望我尽可能清楚地说明了这个问题,如果没有,我将进行修改,为您提供进一步的解释。我认为这个问题实际上可能在现实世界中有一些关于模式匹配的应用。 我需要一个解决方案,我期待尽可能地改进解释。

【问题讨论】:

  • 我将从逐个字符遍历字符串开始,并将它们与我的搜索字符串进行比较。也许做多次超限,你首先尝试找到一个完全匹配,然后搜索你的搜索字符串的轻微修改。这是一种蛮力方法,但它可以帮助您入门。之后进行优化。也许还可以查看正则表达式和正则表达式的实现方式。这也可能有所帮助。
  • 您正在比较 1 和 0 的字符串。这是否意味着您正在比较 1 和 0 的 Strings?如果是这样,您是在寻找可以应用于任意两个Strings 的通用算法,还是只关心 1 和 0?如果您只关心 1 和 0,那么 @Gijs 答案是一个很好的起点。否则,我同意您应该从蛮力实施开始(相当简单),并寻找优化它的具体方法。

标签: string algorithm bit


【解决方案1】:

所以你实际上只是比较二进制数。因此,将字符串转换为数字并将它们进行二进制比较。所以使用异或位操作(https://en.wikipedia.org/wiki/Bitwise_operation),(在C中^)

11001 ^ 11101 = 00100

0 ^ 0 = 0 
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0

(取自How to compare two bit values in C?。也许这是重复的?)。

在 python 中添加代码,可能不是最佳但可能有用

def bitcount(n):
count=0
while(n):
    count+= (n & 1)     
    n >>=1

return count

a="01011"
b="010100010010010"

number= int(a, 2)
new = []
result=[]
for i in range(0, len(b)-len(a)):
    new.append(int(b[i:i+len(a)],2))

    compare = number ^ new[i]

    if(bitcount(compare) < int(0.2*len(a))+1):
       print(b[i:i+len(a)])

我认为这与 (len(b)-len(a))*len(a) 成比例。 O(a b) 如果我错了,请纠正我?..

【讨论】:

  • 要获得匹配百分比,您仍然需要将字符串 A 中的位数除以结果中 1 的数量。
  • 这是一个很好的起点,主要是蛮力,所以关于算法的改进,你会如何使用动态规划来执行更少的操作?
  • 我会研究序列分析,比如 DNA 序列比较会做类似的事情。
猜你喜欢
  • 2017-03-11
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多