在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]

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 实现为平衡二叉树而不是传统的哈希表?

二叉树和哈希表的优缺点对比与选择

二叉树和哈希表的优缺点对比与选择

为啥 Java 8 中的哈希映射使用二叉树而不是链表? [关闭]

哈希表与平衡二叉树[关闭]

在 Apple Swift 中,在啥情况下我不想要一个隐式展开的可选项?