【问题标题】:Trie complexity and searching尝试复杂性和搜索
【发布时间】:2023-08-07 22:42:02
【问题描述】:

创建一个单词列表的trie 的复杂性是多少?在该 trie 中搜索其他单词集的复杂性是多少? 当我有哈希表时,我应该使用 trie 进行字符串搜索吗?

【问题讨论】:

    标签: algorithm data-structures time-complexity hashtable trie


    【解决方案1】:

    创建trie的复杂度为O(W*L),其中W是单词的数量,L是单词的平均长度:您需要对每个单词平均执行L查找集合中的W 单词。

    稍后查找单词也是如此:您为每个 W 单词执行 L 步骤。

    哈希插入和查找具有相同的复杂性:对于每个单词,您需要检查相等性,这需要O(L),对于O(W*L) 的整体复杂性。

    如果您需要查找整个单词,哈希表更容易。但是,您不能使用哈希表通过前缀查找单词;如果您对基于前缀的查找不感兴趣,请使用哈希表;否则,使用 trie。

    【讨论】:

    • 如果我在 hashtable 中查找整个单词,我需要一些好的散列函数,我们在定义散列函数时应该小心。如果我错了,请纠正我...
    • @var 由于广泛使用字符串作为哈希表的键,因此发明了非常好的字符串哈希函数。在互联网上快速搜索会给你六个很好的建议。我会选择微软使用的那个,或者内置在 Java 字符串中的那个,因为它们已经优化了很多。
    • hastable 的查找时间复杂度不会是 O(1) 吗?
    • @lordvcs 仅当您认为字符串的长度是固定的或具有固定的上限时才成立,即当您将 L 视为常量而不是变量时。这个问题的上下文不允许你这样做,因为 trie 对字符串的长度很敏感(它会影响 trie 的高度)。