【问题标题】:Hash table vs. Sorted Array - which to use?哈希表与排序数组 - 使用哪个?
【发布时间】:2013-03-07 07:26:17
【问题描述】:

假设我想要存储一组数据(未排序)以便快速查找。在加载数据之前我不知道大小是多少,我应该一次加载所有数据,以便立即开始执行查找。

此外,在程序执行期间的任何时候,更多数据可能会呈现给我以存储在我选择的数据结构中。

我应该使用哈希表还是排序数组来存储这些数据?显然,静态哈希表需要在运行时根据所提供的数据大小制作 - 这是否足以成为一个缺点,我应该简单地对给我的数据进行排序,即使它是 O(NlogN) 而不是 O(否)?还是我应该考虑一些动态散列的方法?

澄清:我需要加载任意大小的数据,然后对数据执行搜索和插入,但没有明确的顺序或我必须执行的搜索/插入量的想法。

我知道这很笼统……但是如果在加载数据后我必须进行比搜索更多的插入操作怎么办?搜索量多于插入量呢?

【问题讨论】:

  • 这个问题没有明确的答案 - 这完全取决于您的用例。您能否详细说明您需要支持哪些操作?
  • 我添加了一个说明 - 希望对您有所帮助

标签: arrays performance data-structures hash complexity-theory


【解决方案1】:

这实际上取决于操作的频率。

    1234563此处可能适合使用二叉搜索树或哈希表。
  • 如果相对于插入次数执行大量查找,那么排序数组可能是一个好主意,尽管哈希表可能更快。当您需要对数据进行排序以执行范围搜索或最近邻查找等操作时,排序数组通常是一个不错的选择,但如果您不需要这样做,则可能不合适。

  • 如果您的键是某些类型(整数、字符串等),您可能可以使用更具体的数据结构,例如 trievan Emde Boas tree 以获得额外的性能。这些有时是比哈希表或排序数组更好的选择,因为它们可以利用数据的细节。

如果你真的不知道会发生什么,我会使用哈希表作为初始实现。这不太可能是一个糟糕的选择,尽管您可以使用更精细的数据结构来代替。如果您事先不知道使用模式,排序数组不太可能是一个好主意。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    Templatetypedef 的答案是正确的,但我会添加一些关于 RedBlack Trees 的更多信息,这会在您的两个选项之间提供一个很好的折衷方案。他提到了尝试和 vEB 树(以前没有听说过后者,听起来很有用!)红黑树不如这些选项最优,但可能是更通用的解决方案。当然值得研究这些更优雅的树结构选项以及列表或哈希映射。

    RedBlack Tree:
    Insertion: O(log n)
    Key Lookup: O(log n)
    Key Search: O(log n)
    Iteration: O(n)
    
    Sorted List:
    Insertion: O(n log n)
    Index Lookup: O(1)
    Sorted Search: O(log n)
    Iteration: O(n)
    
    Hash Table:
    Insertion: O(1)
    Key Lookup: O(1)
    Key Search: O(n)
    Iteration: O(n)
    

    【讨论】:

    • 很好的附加信息!我没有考虑过 R/B 树 - 我需要对这些树与散列进行一些时间测试。
    • 顺便说一句,key lookupkey search 有什么区别?
    • @Kokizzu 好问题,我意识到这不是很清楚。 “键查找”是指访问已知键的值。 “Key Search”是指找到最接近的key;排序结构可以有效地做到这一点,但是哈希表需要检查每个键。
    猜你喜欢
    • 2023-03-27
    • 2015-10-15
    • 2017-03-14
    • 2014-10-27
    • 1970-01-01
    • 2013-04-18
    • 2012-07-28
    • 2018-11-15
    • 2013-12-04
    相关资源
    最近更新 更多