基本概念
查找(Searching)
根据某个给定关键字K ,从集合R中找出关键字与K相同的记录
静态查找:集合中记录是固定的
没有插入和删除操作,只有查找
动态查找:集合中记录是动态变化的
除查找,还可能发生插入和删除
静态查找
方法1:顺序查找(SequentialSearch)
顺序查找算法的时间复杂度为O(n)。
int SequentialSearch (StaticTable *Tbl, ElementType K)
{ /*在表Tbl[1]~Tbl[n]中查找关键字为K的数据元素*/
int i;
Tbl->Element[0] = K; /*建立哨兵*/
for(i = Tbl->Length; Tbl->Element[i]!= K; i--);
return i; /*查找成功返回所在单元下标;不成功返回0*/
}
方法2:二分查找(Binary Search)
假设n个数据元素的关键字满足有序(比如:小到大)并且是连续存放(数组),那么可以进行二分查找。
二分查找算法
int BinarySearch ( StaticTable * Tbl, ElementType K)
{ /*在表Tbl中查找关键字为K的数据元素*/
int left, right, mid, NoFound=-1;
left = 1; /*初始左边界*/
right = Tbl->Length; /*初始右边界*/
while ( left <= right )
{
mid = (left+right)/2; /*计算中间元素坐标*/
if( K < Tbl->Element[mid]) right = mid-1; /*调整右边界*/
else if( K > Tbl->Element[mid]) left = mid+1; /*调整左边界*/
else return mid; /*查找成功,返回数据元素的下标*/
}
return NotFound; /*查找不成功,返回-1*/
}
二分查找算法具有对数的时间复杂度O(logN)
二分查找判定树
- 判定树上每个结点需要的查找次数刚好为该结点所在的层数;
- 查找成功时查找次数不会超过判定树的深度
- n个结点的判定树的深度为[logn(2)]+1.
- 11个元素的二分查找判定树ASL = (44+43+2*2+1)/11 = 3
Updata
什么时候出国读书、什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚,其实都是命运的巨变。只是当时站在三岔路口,眼见风云千樯,你作出抉择的那一日,在日记上,相当沉闷和平凡,当时还以为是生命中普通的一天。