这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
查找:在给定的数据集合中找到满足条件的数据元素的过程叫做查找
平均查找长度(ASL) :在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度是所有查找过程中关键字比较次数的平均值。ASL是衡量查找算法效率的最主要指标
1.顺序查找
适用:顺序表,链表
其中顺序表则是通过数组下标来顺序扫描每一个元素,而链表他是通过指针next来依次扫描, 因此对于一般的顺序查找,只需要检查每个关键字是否满足条件即可(简单来说就是一个for循环就可搞定)
n个元素,查找第i个元素,则需要n-i+1次比较 设查找概率相同且Pi = 1/n
2.折半查找(又称二分查找)
适用:有序的顺序表
思想:将要查找的数据Key拿来和中间元素进行比较 若相等就返回 若失败就要判断和中间位置的大小若大于中间位置则又将中间元素后面部分又进行折半查找,若小于中间位置就又将中间元素前面部分又进行折半查找 依次类推知道找到和key相等的值 若都没有找到则退出(我认为这个算法的重点就在判断这个中间位置从前还是从后)
//我假设这个数组是int类型
int Search(int[] L,int key){
int low = 0;
int high = L.size() -1;
int mid;
while(low <= high){
mid = (mid+high)/2;
if(a[mid] == key){
return mid;
}
else if(a[mid] > key){
high = mid -1;
}
else{
min = mid +1;
}
}
return -1;
}
其实这个过程就可以想像使用判定二叉树就是根据这个逻辑来进行的
关于ASL 我们先分析判定树的ASL再去看折半查找的ASL
判断树:
ASL(成功)= (11 + 22 + 43 + 44)/ 11 = 3 (例如:查找29要查找一次,查找13要比较两次.....)
ASL(失败) = (43 + 84)/ 11 = 3.67 (例如:查找6 则查找3次失败,查找14 查找3次失败....)
折半查找: 结点总数为n 2^h - 1 = n 可知 h = log2^(n+1)
第i层结点的个数为 2^i-1 查找该层的结点就需要比较i次
因此:
即折半查找的平均查找长度: