一.查找
1.顺序查找:
(1) 算法思想:顺序表的记录都是无序的。从头到尾或者从尾到头沿着一个方向依次将扫描到的
元素值与给定的关键字 key 相比较。若元素值与 key 相等,则查找成功,若扫描完所有的节点,仍
未找到,则查找失败。
(2) 时间复杂度:最好的情况即一次就找到,时间复杂度 O(1);而最坏情况是直到最后一个记录才
找到,或着根本没找到,时间复杂度是O(n)。顺序查找平均需要查找 (n+1)/2次,时间复杂度是O(n)
(3) 优点:直观简单。 缺点:当 n 很大是查找效率比较底。
2.折半查找: 前提条件是线性表有序
(1) 设被查找的元素的关键字为 key ,首先将查找范围下限设为 left = 0, 上限为 right = n - 1, 中点
mid = (left + right)/2; 中点元素标记为 a[ mid ]。 用 key 与中点元素 a[ mid ] 比较,若 key = a[ mid ],
该元素就是要找的元素,查找停止;key > a[ mid ]; 则替换下限 left = mid + 1; 到下半段继续查找,若
key < mid,则替换上限 right = mid - 1,到上半段继续查找。依次循环,直至找到元素或left > right 为
止,low > high,说明此元素未找到。
(2)时间复杂度:查找的总次数就是二叉树的深度,n 个结点的二叉树深度为 log( n ) + 1, 时间复杂
度是O( log n )。
(3) 优点 时间复杂度优于顺序查找。 缺点:每次查找从表的中间开始,如果是一个很大的表,表查
找的开始或结束附近的记录就需要经过多次查找。
3. 分块查找:
(1) 算法思想:数据( a[ 0 ] ...... a[ n-1] )均分 B 块,每一块中的数据无须有序,但要求“分块有序”,
意思是:前一块中的最大数据必须小于后一块中的最小数据。我们需要构造一块索引表 index ,每个元素
index[ i ]( 0 <= i <= B - 1 ) 中存放第 i 块的最大关键字 max 、该块的起始位置 start 及结束位置 end。
(2) 时间复杂度:每次查找先找到元素所在块,再查找块内的数据。设有 n 个元素,平均分成 m 个
块,每个块有 t 个元素,平均查找次数就是( m + 1)/2 + ( t + 1 )/2 = ( n/t + t )/2 + 1 >= log n + 1,所以分块
查找的时间复杂度介于 O( n ) 和 log n 之间。
(3) 优点:分块索引兼顾了有序和无序的需求,平衡了插入、删除和查找的性能,普遍应用于数据库查
找等方面。