查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)
散列表
散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。
平衡二叉查找树(红黑树)
二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入、删除、查找操作时间复杂度是 O(logn)。
跳表
跳表,插入、删除、查找操作时间复杂度是 O(logn)。
散列表 vs 二叉查找树
相对散列表,二叉查找树好像并没有什么优势,那我们为什么还要用二叉查找树呢?
第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。
第二,散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。
比如:红黑树的插入、删除、查找各种操作性能都比较稳定。对于工程应用来说,要面对各种异常情况,为了支撑这种工业级的应用,我们更倾向于这种性能稳定的平衡二叉查找树
第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。
第四,散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。
红黑树 vs 跳表
红黑树是一种性能非常稳定的二叉查找树,所以,在工程中,但凡是用到动态插入、删除、查找数据的场景,都可以用到它。
不过,它实现起来比较复杂,如果自己写代码实现,难度会有些高,这个时候,我们其实更倾向用跳表来替代它。
参考:
https://time.geekbang.org/column/intro/126
查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)相关推荐
- java treeset 红黑树_【数据结构】红黑树与跳表-(SortSet)-(TreeMap)-(TreeSet)
SortSet 有序的Set,其实在Java中TreeSet是SortSet的唯一实现类,内部通过TreeMap实现的:而TreeMap是通过红黑树实现的:而在Redis中是通过跳表实现的: Skip ...
- 数据结构——散列表(Hash Table)(哈希表)
散列表 散列表英文是hash table,经常被叫做Hash表,或者哈希表. 哈希表其实就是由数组演化而来的,利用的就是数组支持按照下标随机访问数据的特性,可以说散列表就是数组的一种扩展. 百度文库对 ...
- 数据结构 -- 散列表
散列表作为一种能够提供高效插入,查找,删除 以及遍历的数据结构,被应用在很多不同的存储组件之中. 就像rocksdb中的hashskiplist,redis的有序集合,java的 LinkedHash ...
- 红黑树 键值_查找(一)史上最简单清晰的红黑树讲解
http://blog.csdn.net/yang_yulei/article/details/26066409 查找(一) 我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然 ...
- 查找(一)史上最简单清晰的红黑树讲解 http://blog.csdn.net/yang_yulei/article/details/26066409
查找(一)史上最简单清晰的红黑树讲解 2014-05-18 00:05 4037人阅读 评论(6) 收藏 举报 分类: 数据结构(7) 算法(4) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- 数据结构学习——RBT(红黑树)以及实现Map和Set
我们知道,二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项.但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有 ...
- 数据结构之手斯红黑树
目录 1.红黑树的介绍 2.红黑树的基本性质和节点的定义 3.红黑树的旋转 4.红黑树的插入 插入情况一 插入情况二 插入情况三 插入情况四 红黑树插入总结: 5.红黑树的删除 6.红黑树总结 7.红 ...
- 重温数据结构:深入理解红黑树
读完本文你将了解到: 什么是红黑树 黑色高度 红黑树的 5 个特性 红黑树的左旋右旋 指定节点 x 的左旋 右图转成左图 指定节点 y 的右旋左图转成右图 红黑树的平衡插入 二叉查找树的插入 插入后调 ...
- Python数据结构与算法(2.7)——跳表
Python数据结构与算法(2.7)--跳表 0. 学习目标 1. 跳表的基本概念 1.1 跳表介绍 1.2 跳表的性能 1.3 跳表与普通链表的异同 2. 跳表的实现 2.1 跳表结点类 2.2 跳 ...
最新文章
- [HDF]hdf-4.2.6类库的使用
- Node.js Promise.all 限制并发数量
- linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
- Sum of Consecutive Prime Numbers POJ - 2739(线性欧拉筛+尺取法)
- java servlet spring_spring与tomcat 对应关系,servlet各版本写法
- Go实现简单TCP扫描器
- 以小窥大,从一盏路灯看亿万物联网之路
- 云图说 | 华为云应用服务网格,让你的应用治理智能化、可视化
- java ftp 损坏_java ftp上传时断网,文件损坏
- CMake Error at cmake/boost.cmake:76 (MESSAGE)
- spring-boot spring-security-oauth2
- 「leetcode」501. 二叉搜索树中的众数【暴力统计】【中序遍历】详解
- 计算机领域车牌识别,城市智慧停车的智能眼睛——车牌识别系统
- Neo4j CQL - DELETE删除
- php java 私钥 转换格式,php公钥私钥 3 ---非标准格式转换为标准格式
- 3dmax su 简单_【建模技巧】如何用3DMAX制作简单的绣球模型
- memcached 源码分析
- Filecoin与以太坊结合开启Web3.0丨Filecoin是唯一可信存储
- CRF用于命名实体识别(快速上手实现)
- 并联串联混合的电压和电流_用“串反并同”和“等效电源”秒解电压、电流、功率怎么变的问题...
热门文章
- linux top 命令可视化_linux性能监控:CPU监控命令之top命令
- mysql修改数据存放位置_Mysql 修改数据库存放位置
- 数据中台 画像标签_如何通过数据中台标签平台,圈出产品高价值用户?
- 6park留园 android,App Store 上的“掌上留园-6park”
- odbc如何连oracle数据库,不安装Oracle如何连数据库(odbc驱动)
- 心理学上的被动_心理学教你认识孤僻、被动、社交恐惧症,它们都是内向惹的祸...
- 2016年4月计算机组成原理试题答案,2019年4月成人自考计算机组成原理真题及答案解析...
- java 本年第一天_JAVA获取本周 本月 本年 第一天和最后一天
- 使用Nacos搭建微服务注册中心和配置中心(一)
- java生成折线图,饼状图,柱形图