目录
一、相关概念
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,如有侵权,请联系笔者删除。
最后希望大家一起学习,共同进步,如果有疑问或错误欢迎联系笔者。