【问题标题】:Sets and hashmaps don't have constant lookup time?集合和哈希图没有固定的查找时间?
【发布时间】:2017-01-12 08:59:40
【问题描述】:

我正在阅读有关尝试的文章,这篇 topcoder 文章 (https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/) 说:

尝试可以在 O(L) 时间内插入和查找字符串(其中 L 表示单个单词的长度)。这比 set 快得多,但它比哈希表快一点吗?

我一直都知道,集合和哈希表查找东西的速度非常快,而且它们具有恒定的查找时间。这不是真的吗?为什么它比一组“快得多”?而且这似乎也暗示哈希表的查找时间也与集合不同。我一直认为集合和哈希表的实现方式几乎相同,只是存储了一些对象。

【问题讨论】:

    标签: algorithm performance hash time-complexity trie


    【解决方案1】:

    引用的文章没有将 trie 与抽象的“集合”数据结构进行比较;它将 trie 与 C++ 标准库std::set 进行比较,后者是一个搜索树,通常是一棵红黑树,它允许您按排序顺序迭代内容。 (C++ 也有std::unordered_set,它是基于哈希表的,但这篇文章可能是在标准库的一部分之前写的。)

    仅当哈希可以在 O(1) 中计算时,哈希表(平均)为 O(1),因为必须在完成任何查找之前计算键的哈希。对于字符串键,大多数哈希函数需要查看键中的每个字符,因此它们在字符串长度上是 O(L)。 (由于某种原因,这个相当明显的事实在讨论哈希表计算复杂度时经常被跳过。)由于 trie 和哈希表最终都必须验证提供的密钥等于容器中的候选密钥,因此存在 O(L ) 两种情况下的因素。

    但是,尝试仍然有优势。例如,它们可以按字典顺序迭代,如std::set,但通常更快,而哈希表只能以某些不确定的顺序迭代。因此,如果您需要进行前缀搜索,则哈希表不是合适的数据结构。

    【讨论】:

    • 好答案。另一件值得注意的事情是,对于适合缓存的小型集合,trie 可能非常快。但对于较大的查询,查找可能会比哈希表涉及更多的缓存行,这很容易将其减慢一个数量级。
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多