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表的时候指定大小。但是对于数据库这种应用,我们没办法确定到底会放多少数据进去。

【杂谈】Hash表与平衡树的更多相关文章

  1. c++ 哈希表(hash表)

    一.定义 Hash表,也称散列表.一般应用于有大量"动态"的插入(删除)和查找操作的一类问题.(如果是"静态"的,通常可以先对数据排序,查找时就可以用" ...

  2. Hash表、 继承

    Hash表 我们来了解什么是Hash表?? 要想知道什么是哈希表,那得先了解哈希函数 二叉平衡树 红黑树 B B+树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较.那么,有没 ...

  3. hash表长度优化证明

    hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...

  4. 6.数组和Hash表

    当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-i ...

  5. PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]

    catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...

  6. hash-1.hash表和hash算法

    1.hash表 哈希表,也叫散列表,是根据关键码(Key)而直接访问的数据结构,也就是它把Key映射到表中一个位置来访问记录,即,把key计算成hashcode,把hashcode存到表中.这个把ke ...

  7. Hash表算法

    出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...

  8. HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)

    根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...

  9. STL之map应用 +hash表(51nod 1095)

    题目:Anigram单词 题意:给出词典,再给出一些单词,求单词的Anigram数量. 思路:先将字串转换成哈希表,然后再用map链接. hash表构造方法汇总:http://www.cnblogs. ...

随机推荐

  1. sql 日志恢复

    可能有不少朋友遇到过这样的问题: update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的S ...

  2. Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转

    同一文档,在不同的文档查看器或者编译环境中,需要对该文档进行相应的格式转换.下面的内容中,将介绍通过Java编程来实现PPT文档格式转换的方法. 使用工具: Spire.Presentation fo ...

  3. Java基础(三) String深度解析

    String可以说是Java中使用最多最频繁.最特殊的类,因为同时也是字面常量,而字面常量包括基本类型.String类型.空类型. 一. String的使用 1. String的不可变性 /** * ...

  4. 修改系统的shell

    一:修改系统的shell     (选用zsh解释器,相对于bash,对它有很好的兼容性,而且功能上更加强大)    1.查看系统中安装的shell      cat  /etc/shells     ...

  5. Exceptionless(二) - 使用进阶

    Exceptionless(二) - 使用进阶 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/11100563.html 官网 ...

  6. C语言-main方法的两个参数是干什么的?

    大家都知道C语言的main方法怎么写的吧!但你们知道mian方法里的参数的含义吗? 代码如下: int main(int argc,char *argv[]){ //argc是传进的参数个数 //ar ...

  7. Python初探-基础篇

    python和其他语言其实是相似的,如果你会了另一门语言,那学习这个语言,会很快上手 1.mac下自带的有python,版本为2.7.0(可以用home brew python3 安装最新版本的pyt ...

  8. Java基础篇01

    01. 面向对象 --> 什么是面向对象 面向对象 面向对象程序设计,简称OOP(Object Oriented Programming). 对象: 指人们要研究的任何事物,不管是物理上具体的事 ...

  9. Jenkins+svn+ftp自动化发布asp.net项目

    今天将自己所掌握的(Jenkins+svn+ftp自动化发布asp.net项目)知识分享给大家,希望能帮组到大家: (1)先下载Jenkins并安装: (2)安装.Net所需要的插件: (3)配置插件 ...

  10. 驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案

    CCMobile与安卓.IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品.系统基于mui框架开发,是一款可以兼容An ...