说到排序必然就要说到查找,所谓查找(或搜索)指的是从数据文件中找出满足某些条件的记录,用来查找的条件称为“键值(key)”,就如同排序所用的键值一样。一次查找所用的时间很短,但当程序中需要大量使用查找操作的时候,查找的时间消耗效率就显得非常重要。
同排序一样,可根据数据量的大小将查找分为内部查找和外部查找。从另一个角度看,又可分为静态查找和动态查找,定义如下:
1、静态查找:查找的表格或文件的内容不会被改动,例如符号表的查找就是一种静态查找。
2、动态查找:查找的表格或文件的内容可能会被改动,例如在树状结构中所谈的B树查找就属于一种动态查找。
常见的查找方法有顺序查找、二分查找、斐波那契查找、插值法、哈希法、m路查找树、B树等。现一一介绍:
一、顺序查找
通常用于未经排序的文件,又称为线性查找。查找的过程从文件第一项数据开始,按序比较每一个键值。因此顺序查找的平均比较次数为(n+1)/2。
当n很大时,顺序查找并不适合,它是一种适用于小数据文件的查找方法。
其优点仅仅是文件或数据事前不需要经过任何的处理与排序,其缺点是速度慢。
二、二分查找
若要查找的数据已经事先排序好,则可以使用更快的查找方法,如二分查找。二分查找法是将数据分割成两个部分并比较待查找的键值与中间值的大小,若相等,则找到,否则进入可能存在的部分,再分割,如此往复,直到找到或确定不存在。
使用二分查找要求被查找的数据事先已排序,且数据量不能太大,必须能在内存中执行(所以是内部查找)。此法适用于不需要增删的静态数据。因为每次查找都会比上一次少一半,所以最多只需要比较log(n) + 1或log(n+1)次,时间复杂度为O(logN)。
三、插值查找
又叫做插补查找法,