在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]
Posted
技术标签:
【中文标题】在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]【英文标题】:Under which circumstance should I use tries instead of binary trees/hash tables? [duplicate]在什么情况下我应该使用尝试而不是二叉树/哈希表? [复制] 【发布时间】:2013-08-05 15:13:03 【问题描述】:键通常是字符串这一事实是否使其对string
数据的集合更有用?我知道哈希表使用的空间更少,因为它分配了一块内存,而不是为每个字符串的每个字符分配内存。
在搜索方面,O(m) 是最坏的情况,其中 m 是密钥的长度。二叉树搜索是O(log n),所以我想我应该根据情况比较哪个更有效?
附:在您投票结束之前,这不是一个意见问题。我需要有关数据结构的真实事实来做出最佳选择。
谢谢
【问题讨论】:
你说的尝试是什么意思? @hoosssein:他的意思是tries。 【参考方案1】:您必须根据用例来决定要寻找什么。 就事实而言,我们应该牢记以下几点。
HashTable 存储key的数据,只有当你想搜索一个特定的字符串时才可以使用它。 因此,如果要搜索所有以 K 开头的字符串,则必须遍历整个 Hashtable,并且在向表中插入数据时,顺序信息也会丢失。
就 BST 的考虑而言,在其中存储字符串很容易,它会按照自然顺序存储字符串,但是在每个节点上都必须匹配所有字符,这不好从搜索时间的角度来看。
现在来到 Trie,不像 Hashtable 和 BST,Trie 从存储的角度来看不好,会占用太多空间,但从搜索的角度来看,它要快得多。
再一次,这完全取决于您想购买什么以及以什么价格购买,基于此您可以选择 Hashtable、BST、Trie 或 SuffixTree。
【讨论】:
以上是关于在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Haskell Maps 实现为平衡二叉树而不是传统的哈希表?