【问题标题】:Trie complexity using linked list使用链表尝试复杂度
【发布时间】:2020-10-07 15:43:15
【问题描述】:

我使用链表实现了一个 Trie(不是像往常一样的数组) 我的 TrieNode 包含链表作为节点(而不是限制输入类型 - 英语、数字等......) 我想知道我的 Trie 使用链表作为节点的当前复杂性是多少。 谢谢!

【问题讨论】:

    标签: data-structures linked-list tree singly-linked-list information-retrieval


    【解决方案1】:

    如果要检查长度为 l 的单词 w 是否在 trie 中,则需要检查最多 l 个级别的特里。在每一层中,您需要使用线性搜索检查当前节点是否有下一个您需要的字母的子节点。您需要迭代的最大子节点数是您使用的字母表的大小。

    因此我认为答案是 O(l * |A|),其中 A 是您使用的字母表,以防万一小写拉丁字母A= a,b..,y,z;所以|A| = 26。

    【讨论】:

    • Nitpick,我认为比“长度”更好的词是“深度”。
    • 是的,“深度”对于特里来说是有意义的。但是“长度”是指您要检查的单词的长度。 trie 的深度可以是 1000,但是如果单词的长度为 3,则无关紧要。
    • 不过,这不是重点。评估算法复杂性与特定示例中的操作数量无关。这是关于评估平均情况和/或最坏情况的情况。 Big-O 专门处理最坏情况。如果 trie 的深度为 1000 且单词长度为 3 个字符,则实际操作数为 x * y * z(其中 x、y 和 z 是第一个、第二个和第三个节点中的字母数,分别),但 trie 的 Big-O 复杂度仍然是 O(1000 * A),因为这是最坏的情况(一个 1000 个字符长且全是 Z 的单词)。
    【解决方案2】:

    我不会说我会使用链表或数组* 作为 trie 的节点存储,因为任何一个都会使每个节点的搜索和插入都成为O(n),因此整个 trie 的复杂性O(n * D) 逼近O(A * D),其中AD 分别是字母长度和trie 深度。

    相对而言,每个节点的哈希映射在我看来是最简单/性能最高的 trie 实现的简单实现,因为它将搜索和插入的复杂性降低到每个节点 O(1) 和整体 O(D)。唯一额外的复杂性是调整地图大小,但如果空间不是问题,您可以预先调整每个地图的大小,使其初始容量为A,从而无需动态调整地图大小。

    *:这是基于对数组实现使用蛮力搜索和插入。如果您可以创建字符到从零开始的索引的静态 1-1 映射,那么您可以使用数组实现相同的操作和空间复杂度,以及比使用哈希映射稍微更好的性能。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2023-02-07
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多