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

Algorithm 时间复杂度为O(m)的单词搜索使用Trie-m是单词的大小,algorithm,time-complexity,trie,Algorithm,Time Complexity,Trie,我一直在尝试一个在O(w)时间内运行的算法,其中w是我试图在字母顺序单词列表中查找的单词的长度。空间不是一个问题。我已经找到了一些关于使用a在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 我想找到

我一直在尝试一个在O(w)时间内运行的算法,其中w是我试图在字母顺序单词列表中查找的单词的长度。空间不是一个问题。我已经找到了一些关于使用a在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


我找到了一篇文章,上面说创建Trie的时间是O(n*l),其中l是S中单词的平均长度。这可能告诉我需要使用不同的数据结构来解决问题,但我无法确定哪种数据结构类型适合我的问题

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

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


如果挑战是你得到一个排序的单词数组和一个要查找的单词作为输入,并且你花在修改该数组上的任何时间都“算数”,那么我认为你运气不好。你可以在O(log(n)*w)中的排序数组中找到一个单词,但你做得再好不过了。

谢谢奥利弗!你的解释很清楚。