散列表

散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。

平衡二叉查找树(红黑树)

二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入、删除、查找操作时间复杂度是 O(logn)。

跳表

跳表,插入、删除、查找操作时间复杂度是 O(logn)。

散列表 vs 二叉查找树

相对散列表,二叉查找树好像并没有什么优势,那我们为什么还要用二叉查找树呢?

第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。

第二,散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。
比如:红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树

第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。

第四,散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。

红黑树 vs 跳表

红黑树是一种性能非常稳定的二叉查找树,所以,在工程中,但凡是用到动态插入、删除、查找数据的场景,都可以用到它。

不过,它实现起来比较复杂,如果自己写代码实现,难度会有些高,这个时候,我们其实更倾向用跳表来替代它。

参考:
https://time.geekbang.org/column/intro/126

查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)相关推荐

  1. java treeset 红黑树_【数据结构】红黑树与跳表-(SortSet)-(TreeMap)-(TreeSet)

    SortSet 有序的Set,其实在Java中TreeSet是SortSet的唯一实现类,内部通过TreeMap实现的:而TreeMap是通过红黑树实现的:而在Redis中是通过跳表实现的: Skip ...

  2. 数据结构——散列表(Hash Table)(哈希表)

    散列表 散列表英文是hash table,经常被叫做Hash表,或者哈希表. 哈希表其实就是由数组演化而来的,利用的就是数组支持按照下标随机访问数据的特性,可以说散列表就是数组的一种扩展. 百度文库对 ...

  3. 数据结构 -- 散列表

    散列表作为一种能够提供高效插入,查找,删除 以及遍历的数据结构,被应用在很多不同的存储组件之中. 就像rocksdb中的hashskiplist,redis的有序集合,java的 LinkedHash ...

  4. 红黑树 键值_查找(一)史上最简单清晰的红黑树讲解

    http://blog.csdn.net/yang_yulei/article/details/26066409 查找(一) 我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然 ...

  5. 查找(一)史上最简单清晰的红黑树讲解 http://blog.csdn.net/yang_yulei/article/details/26066409

    查找(一)史上最简单清晰的红黑树讲解 2014-05-18 00:05 4037人阅读 评论(6) 收藏 举报 分类: 数据结构(7) 算法(4) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  6. 数据结构学习——RBT(红黑树)以及实现Map和Set

    我们知道,二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项.但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有 ...

  7. 数据结构之手斯红黑树

    目录 1.红黑树的介绍 2.红黑树的基本性质和节点的定义 3.红黑树的旋转 4.红黑树的插入 插入情况一 插入情况二 插入情况三 插入情况四 红黑树插入总结: 5.红黑树的删除 6.红黑树总结 7.红 ...

  8. 重温数据结构:深入理解红黑树

    读完本文你将了解到: 什么是红黑树 黑色高度 红黑树的 5 个特性 红黑树的左旋右旋 指定节点 x 的左旋 右图转成左图 指定节点 y 的右旋左图转成右图 红黑树的平衡插入 二叉查找树的插入 插入后调 ...

  9. Python数据结构与算法(2.7)——跳表

    Python数据结构与算法(2.7)--跳表 0. 学习目标 1. 跳表的基本概念 1.1 跳表介绍 1.2 跳表的性能 1.3 跳表与普通链表的异同 2. 跳表的实现 2.1 跳表结点类 2.2 跳 ...

最新文章

  1. [HDF]hdf-4.2.6类库的使用
  2. Node.js Promise.all 限制并发数量
  3. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
  4. Sum of Consecutive Prime Numbers POJ - 2739(线性欧拉筛+尺取法)
  5. java servlet spring_spring与tomcat 对应关系,servlet各版本写法
  6. Go实现简单TCP扫描器
  7. 以小窥大,从一盏路灯看亿万物联网之路
  8. 云图说 | 华为云应用服务网格,让你的应用治理智能化、可视化
  9. java ftp 损坏_java ftp上传时断网,文件损坏
  10. CMake Error at cmake/boost.cmake:76 (MESSAGE)
  11. spring-boot spring-security-oauth2
  12. 「leetcode」501. 二叉搜索树中的众数【暴力统计】【中序遍历】详解
  13. 计算机领域车牌识别,城市智慧停车的智能眼睛——车牌识别系统
  14. Neo4j CQL - DELETE删除
  15. php java 私钥 转换格式,php公钥私钥 3 ---非标准格式转换为标准格式
  16. 3dmax su 简单_【建模技巧】如何用3DMAX制作简单的绣球模型
  17. memcached 源码分析
  18. Filecoin与以太坊结合开启Web3.0丨Filecoin是唯一可信存储
  19. CRF用于命名实体识别(快速上手实现)
  20. 并联串联混合的电压和电流_用“串反并同”和“等效电源”秒解电压、电流、功率怎么变的问题...

热门文章

  1. linux top 命令可视化_linux性能监控:CPU监控命令之top命令
  2. mysql修改数据存放位置_Mysql 修改数据库存放位置
  3. 数据中台 画像标签_如何通过数据中台标签平台,圈出产品高价值用户?
  4. 6park留园 android,‎App Store 上的“掌上留园-6park”
  5. odbc如何连oracle数据库,不安装Oracle如何连数据库(odbc驱动)
  6. 心理学上的被动_心理学教你认识孤僻、被动、社交恐惧症,它们都是内向惹的祸...
  7. 2016年4月计算机组成原理试题答案,2019年4月成人自考计算机组成原理真题及答案解析...
  8. java 本年第一天_JAVA获取本周 本月 本年 第一天和最后一天
  9. 使用Nacos搭建微服务注册中心和配置中心(一)
  10. java生成折线图,饼状图,柱形图