学完了数据结构的基本的几类,然后是它们的应用——查找,下面是今天的笔记。


查找(searching)

    1.定义:就是根据给的的某个值,在查找表中确定一个关键字等于给定值的数据元素(或记录)。

    2.查找概论:查找表(search table)的定义;关键字,主(次)关键字;静态查找表:只做查找操作的查找表;动态查找表:查找并插入或删除

    3.顺序查找表:针对线性表进行查找的,是一种静态查找表;顺序查找及算法;顺序查找的优化;

    4.有序表查找——前提是线性表中的记录必须有序

      折半查找:mid = (low + high)/2;时间复杂度:O(log n)

      差值查找:mid = low + (high - low)* (key-a[low])/(a[high]-a[low]);时间复杂度:O(log n);查找表较长且关键字分布比较均匀的查找表来说效率高;

      斐波那契(Fibonnacci)查找:黄金分割的原理——mid = low + F[k-1] - 1;平均性能最好;

    5.线性索引查找

      索引;线性索引:稠密索引、分块索引、倒排索引

      a. 稠密索引:将数据集中的每个记录对应一个索引项;

      b. 分块索引:把数据分成若干块,再对每块建立一个索引项;要求:块内可无序(块内遍历查找),块间有序;

      c. 倒排索引:记录号表 存储具有相同 次关键字的所有记录号(指向记录的指针或该记录的主关键字);优点查找记录快,缺点记录号不定长。

    6.二叉排序树——一种动态的查找表

      背景:无序线性表的插入删除效率较高,查找低;有序线性表的查找效率高,删除插入底;二叉排序树同时兼有两者优点。

      二叉排序树:若左子不空,左子树上的所有结点均小于根结点的值;若右...,右子树上的...均大于根结点的值;它的左右子树也为二叉排序树;

      目的是为了排序后快速的插入删除;具有插入删除时不移动元素的优点;缺点是操作时的比较次数等于二叉排序树的层数,而层数与树的结构有关,还有很大的优化空间;

    7.平衡二叉(AVL)树

      定义:是一种优化的二叉排序树(前提必须是二叉排序树)——每个结点的左子树和右子树的高度至多相差1。

      平衡因子BF:左子树深度减去右子树深度;最小不平衡子树。

      AVL实现原理:当最小不平衡子树的根结点BF>1时,右旋;<-1时,左旋;若当最小不平衡子树的根结点BF与其子树的根结点BF反号时,先旋转使得符号相同再处理。

    8.多路查找树(B树)

      背景:元素存储在外部存储设备如硬盘中,必须限制查找访问硬盘的次数以提高效率——试每个结点存储多个元素

      定义:每个结点的孩子数可以多于2个,每个结点可存储多个元素。

      两种特殊形式:2-3树:每个结点2个孩子或无——称为2结点:包含一个元素;或者每个结点3个孩子或无——称为3结点:包含一大一小两个元素。2-3-4树:增加一个4结点:包含大中小3个元素,有4个孩子或无。

      B树:是一种平衡的多路查找树,B树的阶是结点最大所含的孩子数;B树的属性;

      B+树:对B树的变形,出现在分支结点中的元素会被当做该分支结点位置的中序后继者再次列出;每个叶子结点都会保存一个指向后一叶子结点的指针;特点,某结点含n个孩子子树,则该节点就含有n个关键字(元素),且该结点只含每个子树中最大的关键字(元素);特别适合带范围的查找。

    9.哈希散列表的查找

      散列技术:通过一个关联记录的关键字和其存储位置的一个映射函数f——散列(Hash)函数,使得每个key对应一个存储位置f(key),用于存储记录的连续的一块存储空间称为散列表或哈希表。

      存储和查找使用同一个f函数,数据之间的关系不能用图形画出;

      适合查找与给定值相等的记录;不适合范围查找;两个不同的关键字对应到同一个地址的情况——冲突,两个key称为同义词。

      散列函数的构造方法:要求计算简单且散列地址分部均匀——直接定址法,数字分析法、平方取中、除留余数等

      处理冲突的方法:开放定址法,再选个其他的散列函数,链地址法,公共溢出法

      装填因子= 填入表中记录的个数/散列表长——越大,产生冲突的可能性就越大,选择其在一个合适的范围,使平均查找长度限定在一定的范围,以增加表空间为代价。