如何优化我的字谜搜索功能?

Posted

技术标签:

【中文标题】如何优化我的字谜搜索功能?【英文标题】:How to optimize my anagram search function? 【发布时间】:2021-01-31 04:20:06 【问题描述】:

我正在解决 HackerRank 的一个问题 - 我有一个有效的字谜搜索功能,但是,当涉及到大型输入数组/字符串时,它太慢了。

dictionaryquery 输入都是单词列表,该函数应在 query 中查找每个单词的字谜数,并返回每个字对应的字谜计数列表。

dictionary = ["abc", "bca"]
query = ["abc", "xyz"]

# return [2, 0]

我尝试了 2 种方法来减少运行时间,但没有成功(隐藏测试允许的最大时间限制为 10 秒)-

    一旦我知道不再有匹配项,就跳出循环 创建仅包含与搜索词长度相等的词的子词典
def stringAnagram(dictionary, query):
    result = []
    for i in range(len(dictionary)):
            dictionary[i] = "".join(sorted(dictionary[i]))
    dictionary.sort()
    dictionary.sort(key=len)
    
    for word in query:
        i = 0
        sortedWord = "".join(sorted(word))
        subDictionary = [entry for entry in dictionary if len(entry) == len(sortedWord)]
        
        for entry in subDictionary:
            if sortedWord == entry:
                i += 1
        result.append(i)
        
    return result

谁能指出瓶颈在哪里?

【问题讨论】:

你从来没有明确地说明stringAnagram应该做什么,一些示例输入和输出会有所帮助。 在未来,codereview.stackexchange.com 会更适合这个,因为你的代码已经可以工作了。当然,您需要重新格式化问题以匹配该网站的规则。 @CoryKramer 对不起,我忘了补充,我现在添加了解释和示例 collections.Counter 是你的朋友。这就是我写stromberg.dnsalias.org/~strombrg/anagrams时使用的@ 【参考方案1】:

不是创建特定长度的字符串的排列并比较它以查看是否有任何匹配,而是有一个简单的观察,即如果它们是字谜,则两个字符串中任何字符的数量将相同。

【讨论】:

【参考方案2】:
def stringAnagram(dictionary, query):
    sorted_dictionary = ''.join(sorted(word)) for word in words
    result = [word for word in query if ''.join(sorted(word)) in sorted_dictionary]
    return result

【讨论】:

这只会返回字典中包含字谜的单词列表 - 是否可以为字典中的每个单词添加多少字谜?

以上是关于如何优化我的字谜搜索功能?的主要内容,如果未能解决你的问题,请参考以下文章

查找字典单词的字谜

优化子串字谜比较算法

查找字符串中的所有字谜如何优化

织梦根据搜索引擎优化网站功能

如何优化拼字游戏中的单词排列?

大型字谜搜索未读取到集合 Python 的末尾