查找(二)——动态查找树表

目录

一、二叉排序树

1、二叉排序树的概述

2、二叉排序树的插入

3、二叉排序树的构造

4、二叉排序树的删除

5、二叉排序树的查找

6、二叉排序树的代码实现

二、平衡二叉排序树(AVL树)

1、相关概念

2、平衡二叉排序树

3、平衡二叉排序树代码实现

三、B-树

1、背景知识

2、B树的定义

3、B树的插入、删除、查找操作

四、哈希表

1、打个比方认识哈希法

2、什么是哈希表


一、二叉排序树

1、二叉排序树的概述

二叉排序树(也称二叉查找树):是一棵空的二叉树,或者是具有下列性质的二叉树:

(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;

(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;

(3) 它的左右子树也都是二叉排序树。

2、二叉排序树的插入

思路:若二叉排序树为空树,则新插入的结点为新的根结点;否则,新插入的结点必为一个

新的叶子结点,其插入位置由查找过程得到。

若二叉排序树为空树,则新插入的结点为新的根结点;

否则,如果插入的值比根节点值大,则在右子树中进行插入;

否则,在左子树中进行插入;

否则,递归。

3、二叉排序树的构造

从空的二叉排序树开始,依次插入一个个结点 。

4、二叉排序树的删除

在二叉排序树上删除某个结点之后,仍然保持二叉排序树的特性。

分三种情况讨论:

(1)被删除的结点是叶子;

(2)被删除的结点只有左子树或者只有右子树;

(3)被删除的结点既有左子树,也有右子树。

二叉排序树的删除算法(伪代码),如下:

(1)若结点p是叶子,则直接删除结点p;

(2)若结点p只有左子树,   则只需重接p的左子树;

(3)若结点p只有右子树,  则只需重接p的右子树;

(4)若结点p的左右子树均不空,则:

        (4.1)查找结点p的右子树上的最左下结点s及s双亲结点par;

        (4.2)将结点s数据域替换到被删结点p的数据域;

        (4.3)若结点p的右孩子无左子树,则将s的右子树接到par的右子树上;

                    否则,将s的右子树接到结点par的左子树上;

        (4.4)删除结点s。

5、二叉排序树的查找

在二叉排序树中查找给定值k的过程是:

(1)若root是空树,则查找失败;

(2) 若k=root->data,则查找成功;否则

(3)若k<root->data,则在root的左子树上查找;

(4)否则在root的右子树上查找。

上述过程一直持续到k被找到或者待查找的子树为空,如果待查找的子树为空,则查找失败。

二叉排序树的查找效率在于只需查找二个子树之一。

6、二叉排序树的代码实现

(1)二叉排序树的构建与结点插入

地址:二叉排序树的创建与结点插入(代码实现)_m0_52711790的博客-CSDN博客

(2)二叉排序树的结点删除

地址:♥删除二叉排序树结点的代码实现♥_m0_52711790的博客-CSDN博客_二叉排序树的删除代码

(3)二叉排序树的定值或结点查找

地址:二叉排序树之构建、插入、查找、删除、遍历_m0_52711790的博客-CSDN博客

(4)二叉搜索树的代码汇总

地址:二叉排序树之构建、插入、查找、删除、遍历_m0_52711790的博客-CSDN博客

二、平衡二叉排序树(AVL树)

1、相关概念

平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:

(1)根结点的左子树和右子树的深度最多相差1;

(2) 根结点的左子树和右子树也都是平衡二叉排序树。

平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。(由性质可知,一棵平衡二叉树的所有结点的平衡因子只能是-1、0或1)

最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。

构造二叉排序树的基本思想:

在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

二叉排序树的平衡化:

引入平衡二叉树的目的是改善二叉排序树的形态,减少平均查找长度。

2、平衡二叉排序树

如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使

之恢复平衡。我们称调整平衡过程为平衡旋转。

平衡旋转可以归纳为四类:

(1)LL平衡旋转

(2)RR平衡旋转

(3)LR平衡旋转

(4)RL平衡旋转

四类平衡旋转举例说明:

地址:AVL树平衡旋转详解

3、平衡二叉排序树代码实现

平衡二叉排序树之构建、插入、查找、删除、遍历、平衡旋转

地址:平衡二叉排序树之构建、插入、查找、删除、遍历、平衡旋转_m0_52711790的博客-CSDN博客

三、B-树

1、背景知识

动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度 O(log2N) 与树的深度相关,那么降低树的深度自然会提高查找效率。

但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下(为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。

也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率低下。那么如何提高效率,即如何避免磁盘过于频繁的多次查找呢?根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,那么是不是便能有效减少磁盘查找存取的次数呢?那这种有效的树结构是一种怎样的树呢?

这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构,也就是这篇文章所要阐述的第一个主题B-tree,即B树结构(后面,我们将看到,B树的各种操作能使B树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率)。

2、B树的定义

(1)B-树又称为平衡多路查找树,是一种组织和维护外存文件系统非常有效的数据结构。

(2)B-树中所有结点的孩子结点最大值称为B-树的阶,通常用m表示,从查找效率考虑,要求m≥3。

(3)B-树是所有结点的平衡因子均等于0的多路查找树。

一棵m阶的B 树 (m叉树)的特性如下:

(1)树中每个结点最多含有m个孩子(m>=2);

(2)除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);

(3)若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

(4)所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);

(5)每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:

        (a)Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 

        (b)Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。 

        (c)关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。

下面来模拟下查找文件29的过程:

(1)根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】

(2)此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。

(3)根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】

(4)此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。

(5)根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】

(6)此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

3、B树的插入、删除、查找操作

自己搜搜博客或看一下老师的PPT,目前暂未搞明白。

四、哈希表

1、打个比方认识哈希法

假定某教室有35个座位,如果不加限定让学生任意就座,则要找某个学生时就要将待找学生与当前座位上的学生一一做比较,这就是我们前面所介绍的查找方法的大致思路。

而哈希法则要限定学生所坐的位置,比如可规定学生座位的编号应与其学号的末两位相同,则学号为993605的学生应坐编号为5的座位。这样我们要找某个学生时只需根据其学号的末两位到相应座位上去找即可,不必一一比较了。

在这个例子里,学生好比记录,学号则为关键字,对关键字进行的操作则是取其末两位,用以确定记录的位置。

补充:

散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。

散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。

散列函数:将关键码映射为散列表中适当存储位置的函数。

散列地址:由散列函数所得的存储位置址 。

散列技术一般不适用于允许多个记录有同样关键码的情况。有冲突,降低了查找效率,体现不出计算式查找的优点。散列方法也不适用于范围查找,不能查找最大值、最小值也不可能找到在某一范围内的记录。

2、什么是哈希表

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表或哈希表。具体表现为:

存储位置 = f (key);

更多关于哈希表的内容自己百度一下。(主要是花花的老师讲哈希表就讲到这儿,所以先复习到这儿)

我是花花,祝自己也祝您变强了~ 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕飞雨的头发不能秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值