大话数据结构读书笔记(八)-查找

第8章、查找

1、基本概念(1)查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录。(2)查找表:同一类型数据元素构成的集合。(3)关键字:是数据元素中某个数据项的值,用它可以标识一个数据元素。关键码:关键字所标识的数据元素的某个数据项。主关键字唯一标识一个数据元素;主关键码,主关键字所在的数据项。次次关键字,不唯一标识,次关键码,次关键字所在的数据项。(4)静态查找表:只作查找操作(A):查询某个“特定”数据元素是否存在,(B):检索某个“特定”数据元素及数据项信息。(5)动态查找表:A)查找时插入数据元素,B)查找时删除数据元素。

2、顺序查找表:顺序表:线性表属于静态查找表。从头到尾逐个比较查找。(效率低时间复杂度O(N))。

3、有序表的查找:1)折半查找(二分查找)要求线性表有序和采用顺序存储。mid=(low+high)/2 = low+(high-low)*1/2。2)差值查找:插值公式=(key-a[low])/(a[high]-a[low]),mid=low+(high-low)*(key-a[low])/(a[high]-a[low]),适用:关键字分布比较均匀的查找表。3)斐波那契查找,黄金分割,mid=low+F[k-1]-1,斐波那契数列:F[K]=F[K-1]+F[K-2]。

4、线性索引查找,索引是对于按先后顺序存储的海量数据,为了加快查找速度而设计的一种查找结构。索引:把一个关键字与它对应的记录相关联的过程,一个索引由若干个索引项组成。索引表:a.线性表,b.带指针,c.有序。按结构分类:线性索引,树形索引,多级索引。
1)稠密索引:是指在线性索引中,数据集中的每个记录对应一个索引项
特点:记录无序,索引表中的索引项(按关键字)有序,索引项包含2个数据项:a.关键字,b.指针缺点:索引项个数与数据集中的记录个数相同,空间代价大。
2)分块索引:把数据集的记录按分块有序的原则分成若干块,每一块对应一个索引项,特点:分块有序:a.块内无序,块内记录可以无序,b.块间有序,块与块之间按关键字有序。索引项包含3个数据项:a.最大关键字,b.快中的记录个数,c.指向块首数据元素的指针。最佳情况:分块数m=块中记录数t。

3)倒排索引,最基础的搜索技术,根据属性(字段、次关键码)的值来查找记录,不是由记录确定属性值,而是由属性值确定记录的位置。索引项通用结构,包含2个数据项:a.次关键字,b.记录号表:是指向该记录的指针、是该记录的主关键字。优点:查找记录非常快。缺点:记录表号不定长,维护(插入删除等)比较困难。

5、二叉排序树:又称二叉查找树它或者是空树或者是若做子树不为空左子树结点值均小于根节点,右子树不为空其值均大于根节点值。构建二叉树并不是为了排序而是为了提高插入和删除关键字的速度。二叉排序树的插入操作:先查找遍历树确定没有该元素在插入。删除元素不用遍历整个树找到即可删除。插入删除性能取决于存储结构,链式存储,修改指针。查找性能取决于二叉排序树的层数/深度:最好情况,深度与完全二叉树相同(平衡状态)、近似折半查找;最坏情况,斜树(二叉树深度等于结点个数)、等同顺序查找最好时O(logn)最坏O(n)。

6、平衡二叉树(AVL树):是二叉排序树,每个结点的左右子树高度差至多等于1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF。查找、插入删除时间复杂度都是O(logn)。 
最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树,我们称为最小不平衡子树。调整不平衡二叉树思路:
1)BF=正(0、1、2),以BF=1为轴,右旋转/顺时针旋转,得到(0、0、0)。
2)BF=负(0、-1、-2),以BF=-1为轴,左旋转/逆时针旋转,得到(0、0、0)。
3)BF=一正一负(0、1、-2),先以BF=1为轴右旋转,得到(0、-1、-2),再②,得到(0、0、0)。

4)BF=一负一正(0、-1、2),先以BF=-1为轴左旋转,得到(0、1、2),再①,得到(0、0、0)。

7、多路查找树:a.每个结点的孩子数可以多于2个,且每个结点处可以存储多个元素,b.所有元素之间存在某种特定的排序关系。打破了一个结点只存储一个元素的限制,4种特殊形式:2-3树、2-3-4树、B树、B+树。

1)2-3树:2结点或3结点,2结点:1个元素2个孩子,要么没有孩子要么有2个孩子,不能只有一个孩子,左<右。3结点:2个元素3个孩子,要么没有孩子要么有3个孩子,左<中<右。

2)2-3-4树:2结点或3结点或4结点,4结点:3个元素4个孩子,要么没有孩子要么有4个孩子,左<左中<右中<右。

B树:是平衡的多路查找树,2-3、2-3-4是B树的特例。B树的数据结构是为内外存的数据交互专门设计准备的,适用于外查找的树。内外存的查找性能更多取决于读取次数,所以设计要考虑B树的平衡和层次。

B+树:应文件系统所需而出现的一种B树的变形,解决了所有元素遍历等基本问题。适用:B+树结构特别适合带有范围的查找。前面的树都是没有重复值的,即每一个元素在该树中只出现一次,而B+树不同于之前所讲的树,在B+树结点中的元素会在叶子中再次列出,即元素会重复出现。更多关于B树的问题(微博地址)http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html。 


8、散列查找:散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。不用比较,直接通过关键字key得到要查找记录的存储位置。散列函数、哈希(Hash)函数:f,注意:散列技术中最关键的是设计一个简单、均匀、利用率高的散列函数,散列表、哈希表(Hash table):使用散列技术将记录存储在一块连续的存储空间中,该存储空间称为散列表,动态数组。

构造散列函数:原则:a.计算简单,b.散列地址分布均匀

1、直接定址法:取关键字的某个线性函数,f(key)=a*key+b;优点:简单、均匀、不会产生冲突,适合事先知道关键字的分布,查找表较小且连续,不常用。

2、数字分析法:抽取,使用关键字的一部分来计算存储位置,适合事先知道关键字的分布且关键字若干位的分布较均匀,关键字位数较多。

3、平方取中法:先(关键字^2)再抽取中间位,适合不知道关键字分布,关键字位数较少。

4、折叠法适合不知道关键字分布,关键字位数较多。

5、除留余数法:散列表长m,f(key)=key MOD p,(p≦m),其中可以对关键字取模,也可以在折叠、平方取中后再取模,缺点:p值取的不好,很容易有冲突、出现同义词,取的好也不容易避免冲突,最常用。

6、随机数法:f(key)=random(key),适合关键字长度不等。

处理散列冲突:1)开放定址探测法:单向寻找,线性探测法。改进,di=1^2,-1^2,2^2,-2^2,...,q^2,-q^2,(q≦m/2),双向寻找,二次探测法,伪随机数,随机种子,di=random(di),随机探测法。

2)再散列函数法:一旦发生冲突就换一个散列函数,优点:使得关键字不会产生聚集。缺点:增加了计算时间。

3)链地址法:有冲突的关键字存储在一个单链表中,同义词子表.优点:冲突较多时,不会找不到空地址缺点:查找时可能需要遍历单链表。

4)公共溢出区法:有冲突的关键字都放在公共溢出表,散列表=基本表+溢出表。查找:先通过散列函数得到散列地址在基本表中找,如果没有,再到溢出表中顺序找。适合冲突较少的情况。

9、散列表的查找:散列表的查找性能取决于:

1)关键字的分布,2)散列函数的选择,3)处理冲突的方法,4)装填因子α装填因子=记录个数/散列表长度,α=n/m,通常将散列表的空间设置的比查找表/集合大,空间换时间。

你可能感兴趣的:(大话数据结构读书笔记)