【发布时间】:2020-10-07 15:43:15
【问题描述】:
我使用链表实现了一个 Trie(不是像往常一样的数组) 我的 TrieNode 包含链表作为节点(而不是限制输入类型 - 英语、数字等......) 我想知道我的 Trie 使用链表作为节点的当前复杂性是多少。 谢谢!
【问题讨论】:
标签: data-structures linked-list tree singly-linked-list information-retrieval
我使用链表实现了一个 Trie(不是像往常一样的数组) 我的 TrieNode 包含链表作为节点(而不是限制输入类型 - 英语、数字等......) 我想知道我的 Trie 使用链表作为节点的当前复杂性是多少。 谢谢!
【问题讨论】:
标签: data-structures linked-list tree singly-linked-list information-retrieval
如果要检查长度为 l 的单词 w 是否在 trie 中,则需要检查最多 l 个级别的特里。在每一层中,您需要使用线性搜索检查当前节点是否有下一个您需要的字母的子节点。您需要迭代的最大子节点数是您使用的字母表的大小。
因此我认为答案是 O(l * |A|),其中 A 是您使用的字母表,以防万一小写拉丁字母A= a,b..,y,z;所以|A| = 26。
【讨论】:
x * y * z(其中 x、y 和 z 是第一个、第二个和第三个节点中的字母数,分别),但 trie 的 Big-O 复杂度仍然是 O(1000 * A),因为这是最坏的情况(一个 1000 个字符长且全是 Z 的单词)。
我不会说我会使用链表或数组* 作为 trie 的节点存储,因为任何一个都会使每个节点的搜索和插入都成为O(n),因此整个 trie 的复杂性O(n * D) 逼近O(A * D),其中A 和D 分别是字母长度和trie 深度。
相对而言,每个节点的哈希映射在我看来是最简单/性能最高的 trie 实现的简单实现,因为它将搜索和插入的复杂性降低到每个节点 O(1) 和整体 O(D)。唯一额外的复杂性是调整地图大小,但如果空间不是问题,您可以预先调整每个地图的大小,使其初始容量为A,从而无需动态调整地图大小。
*:这是基于对数组实现使用蛮力搜索和插入。如果您可以创建字符到从零开始的索引的静态 1-1 映射,那么您可以使用数组实现相同的操作和空间复杂度,以及比使用哈希映射稍微更好的性能。
【讨论】: