给定用户输入,如何在O(logN)时间中搜索字谜?

时间:2018-08-10 11:04:07

标签: python binary-search anagram

嗨,我好几天都在考虑如何实现这一点。

我正在尝试实现一个程序,该程序将字典读入列表并在 O(N)时间内对其进行排序。之后,我必须在给定的在 O(log N)时间内从用户输入。我可以按字母对每个单词进行排序,并在O(N)中按字母顺序对列表进行排序。

由于我尝试在O(logN)时间中进行搜索,因此我尝试通过对每个单词中的每个字母进行排序并将其用作识别字谜的键来使用二进制搜索。 例如,“ act”是字谜组“ act,” cat”,“ tac”的键。

arr=['act','cat','tac','bad','fad'] 

排序后

[['act', 'act'], ['cat', 'act'], ['tac', 'act'], ['bad', 'abd'],  ['fad', 'adf']] 

但是二进制搜索只能找到一个目标,因此它将只为'act'下的字谜组返回'tac'。我的二进制搜索代码:

def binarySearch(arr, lower, upper, target):
anagramList=[]
if upper >= lower:
    mid = lower + ((upper - lower) // 2)
    if areAnagrams(arr[mid][1],target):
        anagramList.append(arr[mid])
    elif arr[mid] > target:
        return binarySearch(arr, lower, mid - 1, target)
    else:
        return binarySearch(arr, mid + 1, upper, target)
return anagramList

我试图像这样将它们分组

[['act','act','cat','tac'],['bad','abd'],['fad','daf]]

但是它的O(N ^ 2)复杂度比O(N)大吗?有人可以建议我应该怎么做吗?

编辑: 例如,如果查询字符串是alppe,则输出将包含单词appel和apple。

2 个答案:

答案 0 :(得分:1)

您可以使用词典,其关键词是带有字母排序的单词。

from collections import defaultdict
anagrams = defaultdict(list)

arr=['act','cat','tac','bad','fad']

for word in arr:
    anagrams[''.join(sorted(word))].append(word)

def get_anagram(user_input):
    return anagrams[''.join(sorted(user_input))]

示例:

>>> get_anagram('tca')
['act', 'cat', 'tac']

答案 1 :(得分:1)

您将需要使用collections模块中的Counter。 Counter类不可哈希,因此我们将根据它使它成为可哈希字典。

from collections import Counter, defaultdict


class hashablecounter(Counter):
    def __hash__(self):
        return hash(tuple(sorted(self.items())))


d = defaultdict(list)
arr=['act','cat','tac','bad','fad']

for a in arr:
    d[hashablecounter(a)].append(a)

s = 'cat'
print('Anagrams for ', s, ' are ', d[hashablecounter(s)])