用js写出二分查找(折半查找)算法和时间复杂度
程序员文章站
2024-03-20 09:45:52
...
- 2021-01-01
没想到2020稀里糊涂的已经过去了,昨天写2020年度总结的时候发现居然没什么好写的,看了看更的博客和平常的日记感觉真是没干啥正事。导致写2021年计划的时候写了一大堆,再加上2020计划了还没完成的事,我都担心今年完成不了又拖到2022年去了。
说了这么多都是白话,还是决定从现在就动起来,一周一更,请大家监督!
一、js写出二分查找(折半查找)
1. 二分查找是什么
比如现在有一个有序数组: arr = [ 1, 2, 3, 4, 5];
我想在其中查找一个特定元素: n1=3;
二分查找就是在这个数组arr的中间开始查找,如果arr[2]正好为n1,那么就查找结束了。
如果我想查找n2=4,那么arr[2]=3 < 4,所以在数组的后半部分查找,重复这个操作。
如果我想查找n3=6,那么找到最后,这个数组就为空了,这样就表示找不到这个元素。
2. 二分查找的非递归算法
function dichotomy_search(arr, key){
var low = 0;
var height = arr.length - 1;
while( low <= height ){
var mid = parseInt( height + low ) / 2;
if( kye == arr[mid] ){
return mid;
}else if( key > arr[mid] ){
low = mid + 1;
}else if( key < arr[mid] ){
height = mid - 1;
}else{
return -1;
}
}
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = dichotomy_search(arr, 10);
console.log(result); //返回 key在 arr的索引值
3. 二分查找的递归算法
function dichotomy_search(arr, low, height, key){
if( low > height ){
return -1;
}
var mid = parseInt((height + low) / 2);
if( kye == arr[mid] ){
return mid;
}else if( key > arr[mid] ){
low = mid + 1;
return dichotomy_search(arr, low, height, key);
}else if( key < arr[mid] ){
height = mid - 1;
return dichotomy_search(arr, low, height, key);
}
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = dichotomy_search(arr, 0, 10, 5);
console.log(result); //返回 key在 arr的索引值
二、时间复杂度
- 这个我看不懂… 找了一下资料也没能理解时间复杂度是怎么算的,现在先把这个贴过来,后面懂了再详细写写吧
- 时间复杂度: 算法最复杂情况下的运行时间
- 假设数组*有n个元素,那么查找过程为:
第1次折半: 还剩 n/2 个元素
第2次折半: 还剩 n/4 个元素
第3次折半: 还剩 n/8 个元素
…
第k次折半: 还剩 n/2k 个元素
最坏的情况下,最后还剩一个元素,令 n/2k=1,则得k=logn
那么这个T(n),小于等于且接近于函数fn=logn,时间复杂度为O()=O(logn)
上一篇: 线段树入门-hdu1754
下一篇: 二分查找及其变体