20176408李俊 查找技术

关键码:可以标识一个记录的某个数据项。
键值:关键码的值。
主关键码:可以唯一地标识一个记录的关键码。
次关键码:不能唯一地标识一个记录的关键码。
查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。
查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。
静态查找 :不涉及插入和删除操作的查找 。
静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作,或经过一段时间的查找之后,集中地进行插入和删除等修改操作。
动态查找 :涉及插入和删除操作的查找。
动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。
查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。
线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。
树表:适用于动态查找,主要采用二叉排序树的查找技术。
散列表:静态查找和动态查找均适用,主要采用散列技术。
查找算法时间性能通过关键码的比较次数来度量。
关键码的比较次数与哪些因素有关呢?
⑴算法;
⑵问题规模;
⑶待查关键码在查找集合中的位置;
⑷查找频率。
查找算法的时间复杂度是问题规模n和待查关键码在查找集合中的位置k的函数,记为T(n,k)。
平均查找长度:将查找算法进行的关键码的比较次数的数学期望值定义为平均查找长度。

顺序查找的缺点:平均查找长度较大,特别是当待查找集合中元素较多时,查找效率较低。
顺序查找的优点
算法简单而且使用面广。
1.对表中记录的存储没有任何要求,顺序存储和链接存储均可;
2.对表中记录的有序性也没有要求,无论记录是否按关键码有序均可。

折半查找
使用条件:
1.线性表中的记录必须按关键码有序;
2.必须采用顺序存储。

折半查找判定树
判定树:折半查找的过程可以用二叉树来描述,树中的每个结点对应有序表中的一个记录,结点的值为该记录在表中的位置。通常称这个描述折半查找过程的二叉树为折半查找判定树,简称判定树。
判定树的构造方法
⑴ 当n=0时,折半查找判定树为空;
⑵ 当n>0时,折半查找判定树的根结点是有序表中序号为mid=(n+1)/2的记录,根结点的左子树是与有序表r[1] ~ r[mid-1]相对应的折半查找判定树,根结点的右子树是与r[mid+1] ~ r[n]相对应的折半查找判定树。
折半查找性能分析
具有n个结点的折半查找判定树的深度为[log2 n] +1 。
查找成功:在表中查找任一记录的过程,即是折半查找判定树中从根结点到该记录结点的路径,和给定值的比较次数等于该记录结点在树中的层数。
查找不成功:查找失败的过程就是走了一条从根结点到外部结点的路径,和给定值进行的关键码的比较次数等于该路径上内部结点的个数。

二叉排序树(也称二叉查找树):或者是一棵空的二叉树,或者是具有下列性质的二叉树:
⑴ 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
⑵ 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
⑶ 它的左右子树也都是二叉排序树。
二叉排序树的定义采用的是递归方法

中序遍历二叉排序树可以得到一个按关键码有序的序列。
二叉排序树的构造从空的二叉排序树开始,依次插入一个个结点 。

一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列;
每次插入的新结点都是二叉排序树上新的叶子结点;
找到插入位置后,不必移动其它结点,仅需修改某个结点的指针;
在左子树/右子树的查找过程与在整棵树上查找过程相同;
新插入的结点没有破坏原有结点之间的关系。

二叉排序树的删除
在二叉排序树上删除某个结点之后,仍然保持二叉排序树的特性。
分三种情况讨论:
1.被删除的结点是叶子;
操作:将双亲结点中相应指针域的值改为空。
2.被删除的结点只有左子树或者只有右子树;
操作:将双亲结点的相应指针域的值指向被删除结点的左子树(或右子树)。
3.被删除的结点既有左子树,也有右子树。
操作:以其前驱(无右子树)(左子树中的最大值)替代之,然后再删除该前驱结点。
操作:以其后继(无左子树)(右子树中的最小值)替代之,然后再删除该后继结点。

二叉排序树的查找
在二叉排序树中查找给定值k的过程是:
⑴ 若root是空树,则查找失败;
⑵ 若k=root->data,则查找成功;否则
⑶ 若k<root->data,则在root的左子树上查找;否则
⑷ 在root的右子树上查找。
上述过程一直持续到k被找到或者待查找的子树为空,如果待查找的子树为空,则查找失败。
二叉排序树的查找效率在于只需查找二个子树之一。

平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:
⑴ 根结点的左子树和右子树的深度最多相差1;
⑵ 根结点的左子树和右子树也都是平衡二叉树。
最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。

平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。

顺序查找、折半查找、二叉排序树查找等。
这些查找技术都是通过一系列的给定值与关键码的比较,查找效率依赖于查找过程中进行的给定值与关键码的比较次数。

散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。
散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
散列函数:将关键码映射为散列表中适当存储位置的函数。
散列地址:由散列函数所得的存储位置址 。
散列既是一种查找技术,也是一种存储技术。
散列只是通过记录的关键码定位该记录,没有完整地表达记录之间的逻辑关系,所以,散列主要是面向查找的存储结构。
散列技术最适合回答的问题是:如果有的话,哪个记录的关键码等于待查值。
散列技术的关键问题:
⑴ 散列函数的设计。如何设计一个简单、均匀、存储利用率高的散列函数。
⑵ 冲突的处理。如何采取合适的处理冲突方法来解决冲突。

冲突:对于两个不同关键码ki≠kj,有H(ki)=H(kj),
即两个不同的记录需要存放在同一个存储位置,ki和kj相对于H称做同义词。
设计散列函数一般应遵循以下原则:
⑴ 计算简单。散列函数不应该有很大的计算量,否则会降低查找效率。
⑵ 函数值即散列地址分布均匀。函数值要尽量均匀散布在地址空间,这样才能保证存储空间的有效利用并减少冲突。

发布了11 篇原创文章 · 获赞 1 · 访问量 1220

猜你喜欢

转载自blog.csdn.net/qq_43253170/article/details/84586176