Skip to main content
 首页 » 编程设计

python之减少 Anagram 词搜索的计算时间

2025年05月04日19kuangbin

下面的代码是一种搜索单词列表并创建任何 Anagrams 子列表的蛮力方法。

搜索整个英语词典非常耗时,所以我很好奇有人有降低代码计算复杂性的技巧吗?

def anogramtastic(anagrms): 
    d = [] 
    e = [] 
    for j in range(len(anagrms)): 
        if anagrms[j] in e: 
            pass 
        else: 
            templist = [] 
            tester = anagrms[j]         
            tester = list(tester) 
            tester.sort() 
            tester = ''.join(tester) 
            for k in range(len(anagrms)): 
                if k == j: 
                    pass 
                else: 
                    testers = anagrms[k]         
                    testers = list(testers) 
                    testers.sort() 
                    testers = ''.join(testers) 
                    if testers == tester: 
                        templist.append(anagrms[k]) 
                        e.append(anagrms[k]) 
            if len(templist) > 0: 
                templist.append(anagrms[j]) 
                d.append(templist) 
    d.sort(key=len,reverse=True)  
    return d 
 
print(anogramtastic(wordlist)) 

请您参考如下方法:

使用卡住集字典怎么样? Frozensets 是不可变的,这意味着您可以对它们进行哈希处理以进行持续查找。当谈到变位词时,使两个词彼此变位词的原因是它们具有相同的字母和相同的计数。因此,您可以构造一个由 {(letter, count), ...} 对组成的卡住集,并对它们进行哈希处理以进行高效查找。

这是一个使用 collections.Counter 将单词转换为多重集的快速小函数:

from collections import Counter, defaultdict 
 
def word2multiset(word): 
    return frozenset(Counter(word).items()) 

现在,给定一个单词列表,像这样填充你的 Anagram 字典:

list_of_words = [... ] 
 
anagram_dict = defaultdict(set) 
for word in list_of_words: 
    anagram_dict[word2multiset(word)].add(word) 

例如,当list_of_words = ['hello', 'olleh', 'test', 'apple']时,这是anagram_dict运行后的输出上面的循环:

print(anagram_dict) 
defaultdict(set, 
            {frozenset({('e', 1), ('h', 1), ('l', 2), ('o', 1)}): {'hello', 
              'olleh'}, 
             frozenset({('e', 1), ('s', 1), ('t', 2)}): {'test'}, 
             frozenset({('a', 1), ('e', 1), ('l', 1), ('p', 2)}): {'apple'}})