A resource我正在阅读以下内容
如果我们将密钥存储在二叉搜索树中,则平衡良好的BST将需要与M * log N成比例的时间,其中M是最大字符串长度,N是树中密钥的数量。
我的问题是,上面的时间复杂度是M * log N,用于在trie中插入一个密钥,或者将N个密钥插入到trie中,还是用于在trie中搜索?另外,当你说Binary时,我们如何决定左右两边的内容。它是左边a-m的字符,右边是n-z,是树的第一层,依此类推?
答案 0 :(得分:0)
文章说,对于长度为M的字符串,trie优于二叉树,因为它需要O(M)时间,而对于二叉树,它需要O(M logN)时间。
Trie
有多个孩子而不只是两个。
class trienode:
char Character
map<char, trienode> Children
class trie:
trienode root
下面是一个包含三个单词am
,as
,at
和ok
的单词。 a
有3个孩子,o
有1个孩子。
(root)
' '
/ \
| |
a o
/|\ \
| | | |
m s t k
答案 1 :(得分:0)
时间复杂度 m * logn 是指您使用平衡BST代替使用trie来查找 n 给定键中的模式。
原因如下:
您将构建类似于对数字数组执行操作的BST。我们不考虑这个预处理步骤
一旦你构建了一个平衡的BST,当你搜索给定的模式时,最坏的情况是模式不存在于BST中或存在于叶节点。这里的关键点是,与具有数字的BST不同,您在任何节点的比较复杂度不是 O(1),而是 O(m)(因为在最坏的情况下,任何节点上的字符串都不同于最后一个字母的模式。)
在最糟糕的情况下,您必须将您的模式与 O(logn)节点进行比较。
因此,最坏情况下的复杂性是 O(m * logn)。