【问题标题】:Hash Table vs Other data structures like AVLTrees哈希表与其他数据结构,如 AVLTrees
【发布时间】:2018-11-23 00:17:11
【问题描述】:

我正在研究 Hash Table 和 AVLTree 的复杂性。理论上,在 Hash Tables 上插入和删除元素的复杂度是 O(1),对于 AVLTree O(log(n))(研究工作流的复杂性是数据结构上的元素数量),看到这个结果 Hash表似乎比 AVLTrees 更好,但如果我们考虑到结构本身的大小和计算给定键的散列函数所需的时间,难道 AVLTrees 不是更好吗?

【问题讨论】:

  • 对于相当大的数据集,我无法想象 O(log(n)) 算法会比 O(1) 算法更好 - 但你为什么不试试呢?建议:创建一个比较两者的基准,并发布您的结果。
  • @FoggyDay 当然 O(log(n)) 比 O(1) 最差,但是哈希表的添加操作需要散列函数的结果才能使用给定添加的内容键,如果散列函数具有复杂性 O(n),即使在实际添加元素时,您直接将其添加到散列函数输出的位置,对于大键(例如,包含 200 个字符的字符串)不会是比 AVLTrees 的添加操作慢,无论您​​实际添加什么,它总是 O(log(n))? (我谈论的是总体执行时间,我可能使用了错误的复杂性表示法)
  • 建议:创建一个比较两者的基准,并发布您的结果
  • @Angelixus 您忘记了在搜索插入点时,您可能需要对最多 200 个字符的 O(log n) 字符串进行比较。每个字符串比较都是 O(keylength)。使用散列,您可以进行一次 O(keylength) 散列码计算。渐近分析并不能说明全部情况。

标签: data-structures hashtable avl-tree


【解决方案1】:

哈希表和 AVL 树的功能完全不同。简而言之,哈希表用于查找,而树结构用于搜索和遍历。

哈希表让您可以非常快速地检索与各个键关联的值。如果您使用键“xqj57”插入了一个值,那么您可以快速检索它。如果没有插入“xqj57”,查找将说不存在这样的记录。插入和查找都是 O(1) 操作。

AVL 树和类似结构非常适合按排序顺序存储内容。这使您可以按排序顺序遍历结构,还可以轻松地按顺序检索键以“A”开头的所有记录,或获取键大于或等于“foo”的第一条记录,等等。插入和搜索是 O(log n) 操作。遍历当然是 O(n)。

如果要按排序顺序遍历哈希表,则必须先对其进行排序。

与树结构相比,哈希表确实有一点额外的内存开销,但不会那么

除非键特别长,或者您的散列函数非常复杂,否则计算键的散列值的成本与您必须执行的 log(n) 键比较成本相比要便宜在树结构中。

如果您只想快速插入和查找,那么很难击败哈希表。如果您想使用排序列表,那么哈希表绝对不是要走的路。 AVL 树、红黑树、跳过列表或其他此类排序结构的性能会更好。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2014-04-25
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多