数据结构---查找

目录

一、相关概念

二、静态查找表

1.顺序表的查找

2.有序表的查找

3.索引顺序表的查找

三、动态查找表

1.二叉排序树和平衡二叉树

2.B-树和B+树(索引作用)

三、哈希表

1.哈希表定义

2.哈希函数的构造方法

3.处理冲突的方法

4.哈希表的查找及其分析


一、相关概念

1.查找表:由同一类型的数据元素构成的集合

2.静态查找表:仅用于查询和检索操作的查找表

3.动态查找表:在查找时包含插入、删除或修改

4.主关键字:可以唯一的识别一个记录的数据项

5.次关键字:关联若干项记录的数据项

6.查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素

7.查找成功:查找表中存在满足条件的记录

8.查找失败:查找表中不存在满足条件的记录

二、静态查找表

1.顺序表的查找

1.1顺序查找的思想

1.1.1从查找表的第一个元素向后(或者从最后一个元素向前),比较当前位置数据元素的关键字与查找关键字(考虑主关键字和次关键字)

1.1.2若相等,输出当前位置,查找成功;若不相等,走向下一个位置

1.1.3循环执行以上两步,直到查找成功或超出范围(查找失败)

1.2顺序查找提供监视哨的作用:在顺序查找时省略了下标的越界检查,提高效率(其中监视哨位置在数组首位【0】)

1.3顺序表查找的平均查找长度为(n+1)/2

2.有序表的查找

2.1折半查找的前提要求是顺序存储并且有序

2.2折半查找的思想:

2.2.1将要查找的关键字与查找表中间的元素的关键字进行比较。

2.2.2若相等,返回当前位置;若查找关键字比当前位置关键字小,向前递归,否则向后递归

2.3复杂度:O(log2(n))

2.3平均查找长度:(n=2^h-1)

2.4n个节点的用于折半查找的判定树,表示查找失败的外部节点共有n+1个

2.4.1n0+n1+n2=n;2n0+n1=n+1

2.4.2外部节点:只有一个后继的节点和无后继节点缺少的后继节点:2n0+n1

3.索引顺序表的查找

3.1索引顺序表的储存要求:

3.1.1线性表要求:查找表分为n块,当i>j时,第i块中的最小元素的关键字大于第j块中的最大元素的关键字

3.1.2索引表的要求:索引表是顺序储存;索引表里储存了各个块最大值和开始地址

3.2索引顺序表的查找思想:

3.2.1首先确定所要查找关键字在哪一块中

3.2.2在所确定的块中用顺序查找查找关键字

3.3如果索引表长度为b,每块平均长度为L,则索引查找的平均查找长度为(b+1)/2+(L+1)/2

3.4长度为n的线性表,分成(根号n)块平均查找次数最少

三、动态查找表

1.二叉排序树和平衡二叉树

1.1二叉排序数的定义:二叉排序树或者是一颗空树,或者是具有下列性质的二叉树:

1.1.1若根结点有左子树,则左子树上所有结点关键字的值均小于根结点关键字的值

1.1.2若根结点有右子树,则右子树上所有结点关键字的值均大于根结点关键字的值

1.1.3根结点的左、右子树也分别为二叉排序树

1.2二叉排序树的查找思想

1.2.1当二叉排序树不空时,先将给定值和根结点的关键字比较,若相等,则查找成功;否则:

1.2.2若给定值小于根结点的关键字,则在左子树上继续查找;

1.2.3若给定值大于根结点的关键字,则在右子树上继续查找;

1.2.4循环查找,直到查找成功或查找失败(遇到空结点)

1.3二叉排序树的平均查找长度仍然是O(log2(n))

1.4二叉排序树的结点插入:

1.4.1若二叉树为空:插入结点作为根结点;

1.4.2若二叉树非空:将待插入结点关键字与根节点比较:

1.4.2.2若相等,则无需插入;

1.4.2.2若小于根节点,插入左子树;

1.4.2.3若大于根节点,插入右子树

1.4.3注意查找插入位置时:

1.4.3.1函数要实时记录查找路径上的最后一个结点(插入位置)

1.4.3.2函数要实时记录查找结点的父结点

1.4.3.3解释:查找位置确定的标志有两个(找到了相同的元素、没找到相同的元素(记录待插入结点的父结点))

1.4.4查找插入位置函数有三种返回类型:

1.4.4.1返回真:找到元素,无需插入

1.4.4.2返回假:空树插入

1.4.4.2返回假:根据返回结点确定插入左右

1.4.5二叉排序树的插入算法的平均时间复杂度为O(log2(n))

1.5二叉排序树的结点删除

1.5.1定义:删除一个结点,要求删除结点后,仍保持二叉排序树的结构特点不变

1.5.2若删除结点为叶结点:删除结点,改变父结点指针

1.5.3若删除结点只有左子树:删除结点,结点的左子树顶替原结点位置

1.5.4若删除结点只有右子树:删除结点,结点的右子树顶替原结点位置

1.5.5若删除结点左右子树都有:

1.5.5.1将左子树作为右子树中最小结点的左子树(或者将右子树作为左子树中最大结点的右子树),顶替原结点位置(缺点是增加了树的高度)

1.5.5.2用左子树最大元素顶替删除结点位置(或者用右子树最小元素顶替原结点位置)

1.5.6删除算法的平均时间复杂度为O(log2(n))

1.6平衡二叉树(AVL树)的构建

1.6.1定义:(空树或者)所有结点的左子树和右子树的高度差的绝对值不超过1

1.6.2平衡因子(左子树高度-右子树高度):-1、0、1

1.6.3因插入右子树的右子树导致不平衡而调整:RR旋转(实质上向左旋转)

1.6.4因插入左子树的左子树导致不平衡而调整:LL旋转(实质上向右旋转)

1.6.5因插入左子树的右子树导致不平衡而调整:LR旋转(实质上先左旋再右旋)

1.6.6因插入右子树的左子树导致不平衡而调整:RL旋转(实质上先右旋再左旋)

1.6.7平衡二叉树的构造思想:

1.6.7.0最小不平衡子树:以离插入结点最近,且平衡因子绝对值大于1的结点作为根结点的子树

1.6.7.1每插入一个新结点,首先检查是否破坏树的平衡性

1.6.7.2若破坏了平衡性:找到最小不平衡子树,调整子树(保持二叉排序树特性的前提下)

2.B-树和B+树(索引作用)

2.1B-树的定义(一种平衡的多路查找树):空树或满足以下性质的m叉树:

2.1.1树中每个结点至多有m颗子树

2.1.2若根结点不是叶子结点,则至少有两颗子树

2.1.3除根结点外的所有非终端结点至少含有[m/2](上取整)棵子树

2.1.4所有的非终端结点中包含信息:(n,A,K,A1,K1,,,,,An,Kn)

2.1.4.1其中K为关键字,且从小到大排列

2.1.4.2A为指向子树的指针,每颗子树上的值都小于子树指针后面的K,大于指针前面的K

2.1.4.3n为关键字数量

2.1.4.4实际上还要有指向关键字的记录的指针(数据主要存在与记录里,B-树只是索引)

2.1.5所有的叶子结点都出现在同一层次上,并且不带信息(类似外部结点或者查找失败的结点,实际上这些结点不存在,指向它们的指针为空)

2.2B-树类似于索引顺序表与二叉排序树的结合

2.3B-树主要用作文件的索引

2.4在B-树中查找的主要思想:

2.4.1在指针所指结点的关键字序列中查找Ki<=s<K(i+1)

2.4.2若Ki!=s,去Ki后的指针所指树里找

2.4.3循环执行2.4.1与2.4.2直到找到或未找到(可以返回应插入点信息)

2.5B-树结点插入(m表示树阶数,即结点最多子树数):

2.5.1结点关键字个数必须大于[m/2](上取整)-1,插入结点时先在最底层的某个非终结结点插入关键字

2.5.2若此次插入后结点关键字数目<=m-1,插入成功

2.5.3若插入后结点关键字数目>m-1,进行如下拆分

2.5.4拆分为两个结点:[m/2](上取整)-1与m-[m/2](上取整)个结点,将关键字K[m/2]和新建结点指针插入到父结点

2.6B-树结点删除:([m/2]均为上取整)

2.6.1若删除关键字在非终端结点,使之与其后的子树中最小值交换,递归到删除子树最小值结点

2.6.2若删除关键字结点在终端结点,若删除后结点关键字数目不少于[m/2],则删除完成。否则:

2.6.2.1若删后结点关键字数目为[m/2]-1,则将结点指针所在父结点的左(或右关键字)(转移关键字前需要判断兄弟结点关键字数目大于[m/2]-1)转移下来凑够[m/2]个关键字,将对应相邻兄弟结点的最大(或最小结点)(根据前面转移的关键字与刚凑够数的结点的相对位置确定)补到已经被转移位置的关键字位置

2.6.2.2若被删结点关键字数目与兄弟结点关键字数目均等于[m/2]-1,两个结点和结点之间的父结点关键字一起合并为一个新结点

2.7B+树的定义(m阶B-与m阶B+的区别):(一种B-树的变型树)

2.7.1有n颗子树的结点中含有n个关键字

2.7.2所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,叶子结点本身依照关键字从大到小顺序排序

2.7.3所有非终端结点可以看成索引部分,结点中仅含有其子树(根结点)中的最大或最小关键字

2.8B+树的查找:类似B-树查找,但若查找到的结点不为终端结点,则继续向下直到叶子结点

2.9B+树的插入:

2.9.1插入仅在叶子结点上进行

2.9.2当结点中关键字数目大于m时,分裂的两个结点所含关键字数目为[(m+1)/2]、[(m+1)/2]

2.9.3拆分后的结点的双亲结点必须同时包含这两个结点的最大关键字

2.10B+树的删除:

2.10.1尽在叶子结点进行

2.10.2当叶子结点的最大关键字被删除时,其在非终端结点可以作为一个“分界关键字”存在

2.10.3若因删除而使结点中关键字数目少于[m/2],和兄弟结点结合(同B-树)

三、哈希表

1.哈希表定义

1.1哈希表的思想:以结点的关键字K为自变量,通过一个确定的函数关系H,计算出对应的函数值H(K),把这个函数值作为结点的储存地址(储存时和查找时直接到该地址---散列法)

1.2哈希表的定义:用散列法储存的线性表叫散列表(Hash table),又称杂凑表,哈希表,对应的函数称为散列函数、杂凑函数或哈希函数

1.3装填因子:设散列表空间大小为n,填入表中的结点数为m,则称a=m/n为散列表的装填因子

1.4散列函数的选取原则:运算简单、函数值域不能超过表长、尽可能使关键字不同时,散列函数值也不同

1.5冲突与同义词:若x!=y,但H(x)==H(y)称为冲突;x与y称为同义词(发生冲突的两个关键字)

2.哈希函数的构造方法

2.1直接定址法

2.1.0取关键字或关键字的某个线性函数值为哈希地址

2.1.1优点:无冲突

2.1.2缺点:若关键字集合取值跨度很大,浪费储存空间严重

2.2质数取余法

2.2.1用质数取余,减少冲突

2.2.2采用的质数要小于表长

2.3平方取中法

2.3.0在不知道关键字的全部情况时,可通过求关键字的平方值扩大差别,然后取中间几位作为哈希地址

2.4折叠法

2.5数字分析法

2.6基数转换法

3.处理冲突的方法

3.1开放定址法

3.1.0(开放地址法)开放地址指地址单元为空,对数组来说,是指还没存入数据的数据单元,在顺序储存结构中用一定方法进行散列存取的方法称为开放定址法

3.1.1开放定址法处理冲突的方法

3.1.1.1线性探测再散列(向后挪位置(一个一个挪)找到有空的位置)

3.1.1.2二次探测再散列法:向后挪(1、1、4、4、、、k^2、(-k)^2)(其中k<n/2)

3.1.1.3伪随机序列:向后挪(伪随机序列)

3.1.1.4再哈希法(多个哈希函数一次不行多次迭代)

3.2拉链法(链地址法)(采用链接表方式储存信息(索引表))

4.哈希表的查找及其分析

4.0a:装载因子;m:表长;n:记录数

4.1算法分析

4.2散列法与其他方法的比较

4.2.1除散列法外,其他查找方法的共同特征为:均建立在比较关键字的基础上

4.2.2散列法是根据关键字直接求出地址的查找方法,其查找的期望时间为O(1)


本笔记除了自己的一些理解外,参考《数据结构》,图片出自网络和课程ppt,如有侵权,请联系笔者删除。

最后希望大家一起学习,共同进步,如果有疑问或错误欢迎联系笔者。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

布纸刀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值