使用Trie-m进行时间复杂度为O(m)的单词搜索是单词的大小

时间:2015-10-04 18:15:32

标签: algorithm time-complexity trie

我一直在尝试一个在O(w)时间内运行的算法,其中w是我试图在按字母顺序排列的单词列表中找到的单词的长度。空间不是问题。我找到了一些关于使用Trie在O(w)时间内找到单词的信息,但我不确定这个时间是否包含构建Trie本身所需的时间量?假设我有一个按字母排序的单词数组S,我希望找到一个单词w,S有n个单词,w的长度为m。以下是我到目前为止的情况:

1. build Trie, T, from S // O(?) time
2. search for w in T // O(m) time

我想找到一种方法让步骤2保持恒定时间,这样我的总时间复杂度将为O(m)。有没有办法做到这一点?如果是这样,我只需要一些指导如何进行设置。如果没有,我还在伪造另一种数据结构吗?空间消耗不是问题。我可以根据需要使用尽可能多的空间来使算法在O(w)中运行,我似乎无法做到这一点,除非我能在恒定时间内设置Trie。

我发现this帖子说明创建Trie的时间是O(n * l),其中l是S中单词的平均长度。这可能告诉我需要使用不同的数据结构我的解决方案,但我无法确定哪种其他数据结构类型适合我的问题。

1 个答案:

答案 0 :(得分:2)

通常,只需创建一个Trie或其他一些数据结构(如哈希mpap),然后在每次需要查找单词时重新使用它。如果您被允许这样做,那么您可以或多或少地忽略创建Trie的成本并专注于在该Trie中查找单词的时间,正如您所注意到的那样,O(m)。

请注意,如果您只是"给予"一个按字母顺序排列的单词的某个人,某个地方支付了一个O(n * m)的价格,从磁盘,数据库或其他东西中读取所有这些单词并将它们放入列表中。如果他们必须对阵列进行排序,他们需要支付额外费用。请注意,您可以在相同的O(n * m)时间内读取磁盘上的所有单词(或从数据库中或者它们来自的任何地方)并进入Trie,因此,在某种意义上,构建Trie是&# 34;自由"只要这个特别的挑战允许你构建树而不是被迫使用已排序的数组。

如果挑战在于你给出了一个排序的单词和一个单词来查找作为输入,并且任何时候你花费在修改该数组"计数",那么我认为你&#39 ;运气不好。您可以在O(log(n)* w)中找到排序数组中的单词,但是您不能做得更好。