一、哈希表

也叫散列表,是根据关键码值而直接进行数据访问的数据结构。(把关键码值映射到表中一个位置来访问记录)映射函数叫做散列函数,存放记录的数组叫做散列表。
散列查找过程分为两步:
(1)在存储时通过散列函数计算记录的散列地址,并按此散列地址存储该记录。
(2)当查找时,一样通过散列函数计算记录的散列地址,然后访问散列地址的记录。
1.散列函数的构造方法
(1)直接定址法:取关键字的某个线性函数值为散列地址f(key)=a*key+b (需要事先知道关键字分布,适合查找较小且连续的情况)
(2)数字分析法: 使用关键字的一部分来计算散列存储的位置。
(3)平方取中法:假设关键字是1234,那它的平方就是1522756,再抽取中间的3位就是277
(4)折叠法: 将关键字从左到右分割成位数相等的几个部分,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。
(5)除留余数法:最常用的方法,f(key)=key mod p
2.哈希冲突
即不同key值产生相同的地址 f(key1)=f(key2)
哈希冲突解决方案:
1.开放定制法
线性探测再散列、平方探测再散列、随机探测再散列
2.链地址法
产生hash冲突后在存储数据后面加一个指针,指向后面冲突的数据
3.公共溢出区法
建立一个特殊存储空间,专门存放冲突的数据。此种方法适用于数据和冲突较少的情况。
4.再散列法
准备若干个hash函数,如果使用第一个hash函数发生了冲突,就使用第二个hash函数,第二个也冲突,使用第三个……
3.哈希表优缺点:
优点:查找速度快
缺点:存不了较大数据,线程不安全,扩容时会用空间操作,不支持多线程

二.红黑树

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
1.每个节点不是红色就是黑色
2.不可能有连在一起的红色节点
3.根节点都是黑色
4.每个红色结点的两个子结点一定都是黑色
5.任意一结点到每个叶子结点的路径都包含数量相同的黑结点
红黑树的变换:(插入节点默认为红色)
**改变颜色、左旋、右旋:**红黑树总是通过旋转和变色达到自平衡

例如:


红黑树的操作:
查找:
插入:查找插入位置+自平衡
删除:查找目标节点+删除后自平衡
细节参考:30张图带你彻底理解红黑树

三.B树(BTreee、B-Tree)

原文链接
b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。
m阶B树有如下特征:

1、定义任意非叶子结点最多只有M个儿子,且M>2;
2、根结点的儿子数为[2, M];
3、除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
4、非叶子结点的关键字个数=儿子数-1;
5、所有叶子结点位于同一层;
6、k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。

例如在一个下图的三阶B树查询元素5
a.第一次磁盘IO,把9所在节点读到内存,把目标数5和9比较,小,找小于9对应的节点;

b.第二次磁盘IO,还是读节点到内存,在内存中把5依次和2、6比较,定位到2、6中间区域对应的节点;

c.第三次跟第二步一样,然后在中间区域找到目标5
b树在查询时的比较次数并不比二叉树少,尤其是节点中的数非常多时,但是内存的比较速度非常快,耗时可以忽略,所以只要树的高度低,IO少,就可以提高查询性能,这是b树的优势之一。
B树的插入删除元素操作:
在下图插入元素4:

1,首先自顶向下查询找到4应该在的位置,即3、5之间;
2,但是3阶b树的节点最多只能有2个元素,所以把3、4、5里面的中间元素4上移(中间元素上移是插入操作的关键);
3,上一层节点加入4之后也超载了,继续中间元素上移的操作,现在根节点变成了4、9;
4,还要满足查找树的性质,所以对元素进行调整以满足大小关系,始终维持多路平衡也是b树的优势,最后变成这样:

再比如我们要删除元素11:
1,自顶向下查询到11,删掉它;
2,然后不满足b树的条件了,因为元素12所在的节点只有一个孩子了,所以我们要“左旋”,元素12下来,元素13上去:

这时如果再删除15呢?很简单,当元素个数太少以至于不能再旋转时,12直接上去就行了。

B+树:

b+树,是b树的一种变体,查询性能更好。m阶的b+树的特征:

有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。

b+树相比于b树的查询优势:

1.b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
2.b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
3.对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历,如下两图:
(查询3–11)
最后贴上几种数据结构的区别:

哈希表、红黑树、B树、B+树基础相关推荐

  1. 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)

    本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...

  2. 为什么HashMap使用红黑树而不使用AVL树

    在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度. 那么很多人就有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树 ...

  3. 面试题:为什么用红黑树不用普通的AVL树

    在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据由链表改为了存在红黑树中,以加快检索速度. 有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树 ...

  4. 双向链接的红黑树(一):基础概念和插入

    双向链接的红黑树(一):基础概念和插入 1.基础概念 2.直接插入 2.1 思路分析 2.2 代码分析 3. 免责声明 1.基础概念 首先我们还是先来看看双向链接红黑树的概念,其实和双向链接BST相似 ...

  5. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树

    B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...

  6. 为什么HashMap使用红黑树而不是AVL树或者B+树

    红黑树和AVL树都是最常用的平衡二叉搜索树. 但是,两者之间有些许不同: AVL树更加严格平衡,因此可以提供更快的査找效果.因此,对于查找密集型任务使用AVL树没毛病. 但是对于插入密集型任务,红黑树 ...

  7. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  8. 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树...

    参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...

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

    散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...

  10. 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

    虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...

最新文章

  1. 11岁姑娘挑战8分钟编程小程序!蚂蚁金服董事长井贤栋:欢迎加入
  2. mybatis mysql crud_Mybatis的CRUD操作
  3. numpy给数据新增一个维度np.newaxis及其使用场景
  4. 怎么改mnist数据的标签_【Pytorch】多个数据集联合读取
  5. mega_[MEGA DEAL] Ultimate JavaScript电子书和课程包(96%折扣)
  6. Phalcon和YII的优点
  7. linux软中断分析,linux操作系统下的软中断问题分析_linux教程
  8. Gradient Tree Boosting:梯度提升树详解
  9. jdk紧急漏洞,XMLDecoder反序列化攻击
  10. Swift之深入解析如何自定义操作符
  11. JUC锁-ReentrantReadWrite(五)
  12. Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取
  13. python读取log文件_python之文件的读写(文本文档,log文件)
  14. python自动化办公真的好用吗-Python做什么更合适?|老男孩Python自动化运维
  15. 华为云数据库可视化软件DataStudio导入excel表格问题
  16. JAVA常用框架及漏洞
  17. 使用matlab设计iir滤波器并自行编写代码实现iir滤波器(可对应于C语言应用在嵌入式系统中)
  18. oracle 文平,ORACLE调优之 内存结构调优(摘自文平书)
  19. 学到了林海峰,武沛齐讲的Day16完
  20. 英语四六级考试系统+爬虫获取试题的系统(数据库设计)的开发思路

热门文章

  1. linux对nohup日志进行定时拆分并且删除~持续补充
  2. 证券市场低频日度数据
  3. 什么是库存?什么是零库存?库存的定义
  4. Word中用Endnote插入的引用如何快速定位到参考文献
  5. 第7.5节 揭开Python类中self的面纱
  6. python项目中的self到底是什么?
  7. 2022-2028全球小脑牵引器行业调研及趋势分析报告
  8. 快速学习COSMIC方法之九:如何识别兴趣对象?
  9. CTF—RGB三原色
  10. 2021年终总结--躺平的一年