Algorithm 基于排序的字谜与基于哈希的字谜时间复杂度

Algorithm 基于排序的字谜与基于哈希的字谜时间复杂度,algorithm,time-complexity,Algorithm,Time Complexity,我已经在采访中两次听到以下问题: 给定一个长字符串列表、str_列表和目标字符串,如果目标字符串是str_列表中任何单词的字谜,则返回True 假设有多个查询是可能的,所以我们不希望有提前返回或w/e的解决方案 我已经两次实现了下面的解决方案,我认为是ONM,其中N是str_列表的长度,M是str_列表中最长单词的长度 def is_anagram(str_list,target): anagrams = set() #O(N) for s in str_list:

我已经在采访中两次听到以下问题:

给定一个长字符串列表、str_列表和目标字符串,如果目标字符串是str_列表中任何单词的字谜,则返回True

假设有多个查询是可能的,所以我们不希望有提前返回或w/e的解决方案

我已经两次实现了下面的解决方案,我认为是ONM,其中N是str_列表的长度,M是str_列表中最长单词的长度

def is_anagram(str_list,target):
    anagrams = set()
    #O(N)
    for s in str_list:
        #O(M)
        anagrams.add(frozenset(Counter(string).items()))

    #O(len(target), but we could just check length vs. longest str in str_list, so O(M))
    return frozenset(Counter(target).items()) in anagrams

    ##Total = O(N*M)
每次他们都告诉我这很不错,但我可以用下面的版本做得更好,使用排序:

def sorted_is_anagram(str_list,target):

    #O(N)
    for i,string in enumerate(str_list):
        #MLog(M)
        str_list[i] = "".join(sorted(string))

    #O(M*NLogN)
    str_list = set(sorted(str_list))

    #O(M(Log(M)))
    return "".join(sorted(target)) in str_list


    ##Total = O(N*MLog(M) + M*NLogN)
是我疯了,还是他们的版本根本不好?我搞砸了什么


谢谢

你可能误解了这个问题。通常,问题涉及一次给定一组大字符串,然后对该字符串集进行多个查询。例如,您可能会得到一个包含250000个英语单词的列表作为字符串集。然后,将有数百万个查询针对该列表

解决方案包括两部分。首先,创建一个字典,它的键是已排序的字谜。该值是可以由这些字母组成的单词列表。因此,考虑到单词列表和淤泥,您将:

{key="ilst", value={"list","silt"}}
保存生成的字典,以便可以跨调用使用

现在,当有人提出一个问题时,你对给定单词中的字母进行排序,在字典中查找,然后用字谜来回答

如果给你N个平均长度为M的单词,那么构建字典是基于*M log M。但这是一次性的成本


每个查询都需要对传递的单词中的字母进行排序,该单词也是OM log M,但字典查找是O1。所以K查询的成本是OK*M log M。

不会返回frozensetCountertarget。字谜中的项目是Om time,导致K查询的成本是OKM?@Aclwitt:我不知道计数器和frozenset是如何实现的,所以我不能肯定。我想OKM是可能的,但我认为不太可能。我怀疑这其中隐藏着一个代价,那就是我缺乏python经验。不过,你可以试一试。写两个版本并计时。看到你的结果会很有趣。