zoukankan      html  css  js  c++  java
  • 【杂谈】Hash表与平衡树

    hash表与平衡树查询数据的时间复杂度是多少?

    hash表为O(1),平衡树为O(logn)

    这个时间复杂度是如何得出的?

    时间复杂度是按照最糟糕的情况来的。但即使是最糟糕的情况,hash表也只需要计算一次,就可以定位到数据(对于常见的实现,实际上是定位到桶,然后在桶内遍历)。而对于平衡树,例如AVL树,由于数据是有序的,比对的最大次数就是树的深度。

    明明hash表查询更快,数据库为什么不用hash表?

    我能想到的有两方面,一个是平衡树的有序特性,另一个就是hash表的扩容问题。

    有序有什么用?

    假设数据库中有1百万条数据,有100条的id>xxx。现在我们要从这一百万条数据中,取出这100条id>xxx的数据。由于平衡树是有序的,只要找到xxx这个主键,就可以顺藤摸瓜,得到所有的大于xxx的用户。而对于hash表,它只能把每个数据都拿出来比对一遍。

    hash表的扩容问题是什么?

    我们常见的hash表实现,是基于数组实现的,用拉链法解决hash冲突。基于数组的固定大小,我们才方便进行hash计算。但是当数据量上去的时候,每个hash桶内的元素会越来越多,必然影响到查询。所以一般都会在达到临界值的时候,进行扩容。找一片更大的空间,然后把旧数据移入新空间中,这个过程需要重hash。数据量一大的话,重hash的时间成本非常高。

    可以尽量避免重hash吗?

    可以是可以。前提是我们知晓将要存入的数据大概在什么范围,这样的话就可以在初始化hash表的时候指定大小。但是对于数据库这种应用,我们没办法确定到底会放多少数据进去。

  • 相关阅读:
    CF-807B
    CF-807A
    sort()的升降序函数操作
    CF-805D
    CF-805B
    CF-805A
    CF-796C
    CF-796B
    图论学习四之Disjoint set union并查集
    图论学习三之Shortest Path最短路
  • 原文地址:https://www.cnblogs.com/longfurcat/p/11254199.html
Copyright © 2011-2022 走看看