欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用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)




相关标签: js/jq javascript