在大型列表中搜索子字符串

时间:2012-12-20 22:14:53

标签: python full-text-search substring

我试图在2个字符串之间找到所有形式的插入。所以我有一个1400万字符串的列表,然后我必须检查每个字符串可能的插入可以将一个字符串转换为另一个字符串(基本上计算插入频率)。假设x是一个字符串,y是另一个字符串,其中x是y的子字符串,所以我们必须找出哪些插入将x转换为y。

我正在使用以下代码段。它可以工作,但是已经占用了很多时间。我甚至试图在64个处理器上分配负载,但还需要20天才能完成。

for i in Words:
#trying to distribute load across different processes, so can ignore this part
   h = hashlib.sha256(i)
   n = int(h.hexdigest(),base=16)
   if (n%64!=ix): #ix is a process based id
    continue


   for j in Words:#
    if len(i)>len(j):
        continue
    if( i!=j and i in j):  # i is a substring of j
        ind=j.find(i)
        s1=j[0:ind]
        s2=j[ind+len(i):len(j)]

                    if(len(s1)>0):
            if (not transform.has_key(s1)):
                transform[s1]=1
            else:
                transform[s1]+=1

        if(len(s2)>0):
            if (not transform.has_key(s2)):
                transform[s2]=1
            else:
                transform[s2]+=1

1 个答案:

答案 0 :(得分:1)

不是将每个单词相互比较(二次运行时),而是取每个单词的每个正确的子串(线性运行时,假设单词长度有界)并检查它是否在单词集中(查找{的元素) {1}}是常数时间。)

在我的笔记本电脑上运行时间不到2秒(46265字(长度<10),共有47015个独特转换(总共799089)):

set