查找算法总结

来源:互联网 发布:java反射获取私有变量 编辑:程序博客网 时间:2024/05/16 05:42

(一)顺序表的查找

算法原理:

从表中的第一个元素开始,逐个进行记录的关键字与给定值的比较,如果某个记录的关键字和给定值相等,则查找成功;反之,到最后一个记录,其

关键字与给定值不相等,则查找失败。

性能分析:

查找算法的基本操作是将记录的关键字与给定值进行比较,因此,通常以“其关键字与给定值进行比较的记录个数的平均值”作为衡量标准。

对于含有n个记录的表,查找成功时的平均查找长度为:1/n * (1+2+...+n) = (1+n)/2;查找不成功时的查找长度为n。


(二)有序表的查找

算法原理:

采用折半查找法进行查找

性能分析:

折半查找查找成功与不成功时,和给定值进行比较的关键字的个数至多为

折半查找的效率比顺序查找高,但是折半查找只适用于有序表,且限于顺序存储结构(对于线性链表无法有效地折半查找)。


(三)二叉排序树的查找

二叉排序树,又称为二叉查找树。它或者是一颗空树,或者具有下列性质的二叉树:

1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

3)它的左、右子树也分别为二叉排序树

算法原理:

当二叉树不为空时,首先将给定值与根节点的关键字进行比较,若相等,则查找成功,否则根据给定值与根节点的关键字之间的大小关系,在左子树或

右子树上继续进行查找。

性能分析:


含有n个结点的二叉排序树的平均查找长度与树的形态有关。当先后插入的关键字有序时,构建的二叉树是一颗单支树,如图b所示,此时,查找性能与顺序查找相同,平均查找长度为(n+1)/2,这是最差的情况。最好的情况是二叉排序树的形态与折半查找的判定树相同,其平均查找长度与

成正比。

补充:关于二叉排序树的插入、删除,详见另一篇博客,http://blog.csdn.net/u013989576/article/details/69815491


(四)平衡二叉树的查找

平衡二叉树,又被称为AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:左右两个子树都是平衡二叉树,且它的左右两个子树的高度差的绝

对值不超过1。若将二叉树上结点的平衡因子BF定义为该结点的左孩子的深度减去它的右孩子的深度,则平衡树所有结点的平衡因子只可能为-1、0和

1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树是不平衡的。

算法原理:

在平衡树上进行查找的过程和二叉排序树相同。

性能分析:

在查找过程中和给定值进行比较的关键字个数不超过树的深度。因此,在平衡树上进行查找的时间复杂度为O(log n)。

补充:关于平衡二叉树的插入,详见另一篇博客,http://blog.csdn.net/u013989576/article/details/69831487


(五)B-树的查找

B-树是一种平衡的多路查找树,在文件系统中很有用。

一颗m阶的B-树,或为空树,或为满足下列特性的m叉树:

1)树中每个结点至多有m棵子树

2)若根节点不是叶子结点,则至少有两棵子树

3)除根结点之外的所有非终端结点至少有m/2棵子树

4)每个非终端结点有至少有m/2⌉-1个关键字, 至多有m-1个关键字,且关键字从小到大依次排序

5)非叶子结点的关键字个数=指向儿子的指针个数-1

6)所有叶子结点都出现在同一层次上,并且不带信息

3阶B-树示意图:


算法原理:

在B-树上进行查找的过程是一个顺指针查找结点和在结点的关键字中进行查找交叉进行的过程。首先从根结点开始重复如下过程:若比结点的第一个关键字小,则继续查找该结点第一个指针所指向的结点;若等于结点中某个关键字,则查找成功;若在两个关键字之间,则查找在它们之间的指针所指向的结点;若比该结点所有关键字大,则查找该结点最后一个指针所指向的结点;若查找已经到达某个叶结点,则说明给定值对应的数据记录不存在,查找失败。

性能分析:

在B-树进行查找包括两种操作:在B-树中找结点,在结点中找关键字。由于B-树通常存储在磁盘上,则前一查找操作是在磁盘上进行,后一查找操作是在内存中进行,即在磁盘上找到指针p所指结点后,先将结点信息读入内存,然后再利用顺序查找或者折半查找查询等于K的关键字。在磁盘上进行一次查找比在内存中进行一次查找耗费时间多很多,因此,在磁盘上进行查找的次数,即待查关键字所在节点在B-树上的层次数,是决定B-树查找效率的首要因素。


(六)B+树的查找

B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:

1.有n棵子树的结点中含有n个关键字

2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。

通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。

3阶B+树示意图:


算法原理:

可以对B+树进行两种查找运算:一是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找。并且在查找时,若非终端结点的关键字等于给定值时,并不终止,而是继续向下直到叶子结点,因此在B+树,不管查找成功与否,每次查找都是走一条从跟到叶子结点的路径。




0 0
原创粉丝点击