1、查找
概念:是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
基于线性表的查找(静态查找表):例如:顺序查找、折半查找、分块查找等。
基于树的查找(动态查找表):例如:二叉排序树、B树、AVL树等。
2、基于线性表的查找
线性索引查找是在待查询序列比较大,或者不方便排序的情况下的一种措施,通过一个较小的索引来实现快速查找。比如汉语字典,我们需要先在前面的索引中找到这个字,然后再到后面去查找这个字的详细资料,那么前面的这个索引起到的作用就是这个作用了。线性索引查找在实际应用中有多种形式,适合不同的情况。
(1) 顺序查找
概念:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。
平均的查找长度为(n+1)/2,最好的长度为1,最差的查找长度为n。时间复杂度o(n)
缺点也比较明显:算法效率较低,在较大规模的数据集合中进行查找时,不宜采用顺序查找。
优点在于:算法简单易行,且对表的结构无任何要求。
(2)折半查找(二分查找)
概念:线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储,其时间复杂度为O(logn)。
在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。
步骤:(1)确定查找区间的中点位置:mid=[(low+high)/2],其中,low为起始位置, high为终止位置
(2)将位于mid位置处的数据元素的关键字与给定值key进行比较
1. key=elem[mid].key 成功
2. key<elem[mid].key 则high=mid -1
3. key>elem[mid].key 则low=mid-1
(3)重复,直到2查找成功或者low>high
(3)索引查询(分块查找)
概念:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。
当数据量更大的时候,如果稠密索引的大小也超出了内存的容量,那么查找索引也会带来IO,效率就会大大降低了。分块索引的不同在于不需要对每一个记录记录索引,而是对记录进行分块。分块索引要求数据是分块有序的,也就是说,数据被分为很多块,每一块内部并没有排序,但是第n块中的每一个元素都比第n+1块要小,这样虽然每一块是无序的,但块和块是有序的。维护这样的顺序关系要比对整个排序消耗得少很多。
分块索引只需要记录每一块的信息,查找时先定位到某一块,然后到那个块里顺序查找。分块索引内记录的索引项包括这个块的最大值(或最小值)、位置信息等,可以包括块内元素个数等信息。
3、基于树的查找
前面讨论的几种查找方法中,二分查找效率最高,但其要求表中记录按照关键字有序,且只能在顺序表上实现,从而需要在插入和删除操作时移动很多的元素。如果不希望表中记录按关键字有序,而又希望得到较高的插入和删除效率,可以考虑使用几种特殊的二叉树或树作为表的组织形式。
(1)二叉排序树
概念:
(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
B树、红黑树,仙子啊不想写了。