JS: 算法时间复杂度分析

本文介绍了如何分析JavaScript算法的时间复杂度,通过去除常量和保留最高阶项来确定时间复杂度。举例说明了常量、线性、平方数量级的时间复杂度,并以冒泡排序为例,展示了算法在最好和最坏情况下的时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语句频度:设 n 为求解的问题的规模,基本操作(或语句)执行次数总和称为语句频度,记做f(n)

时间复杂度:算法(或程序)中基本操作(或语句)重复执行的次数总和称为时间复杂度,记做T(n),且有T(n) = O(f(n)) 。

求时间复杂度步骤:
1. 去掉f(n)中所有加法常数
2. 只保留最高阶项

举例:

function plus1(num){
	console.log(num);  	// 1
	num++				// 1
	console.log(num); 	// 1
}

语句频度: f(n) = 1 + 1 + 1 = 3
时间复杂度:T(n) = O(f(n)) = O(3) = O(1)
O(1)称为常量数量级

function sum(arr){
	var s = 0;					// 1
	var l = arr.length			// 1
	for(var i = 0; i < l; i++){	// n
		s += arr[i];			// n
	}
	console.log(s);				// 1
}

语句频度: f(n) = 1 + 1 + n + n + 1 = 2n + 3
时间复杂度:T(n) = O(f(n)) = O(2n+3) = O(n)
O(n)称为线性数量级

function square(n){
	var s = 0;						// 1
	for(var i = 0; i < n; i++){		// n
		for	(var j = 0; j < n; j++){// n*n
			s++						// n*n
		}
	}
	console.log(s);					// 1
}

语句频度: f(n) = 1 + n + n2 + n2 + 1 = 2n2 + n + 2
时间复杂度:T(n) = O(f(n)) = O(2n2 + n + 2) = O(n2)
O(n2)称为平方数量级

常见的时间复杂度:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)

log2n:
以2为底,n的对数,
对数是对求幂的逆运算,
即 2 的多少次方结果为 n,
如log21 = 0,log22 = 1,log24 = 2, log28 = 3等。

以冒泡排序为例:

function sort(arr){
	var l = arr.length;     			// 1
	var tmp;							// 1
	for(var i = 0; i < l; i++){			// n-1
		for(var j = 0; j < l - i; j++){	// n(n-1)/2 
			if(arr[j]> arr[j+1]){		// n(n-1)/2
				tmp = arr[j+1];		// 0到n(n-1)/2
				arr[j+1] = arr[j]	// 0到n(n-1)/2		
				arr[j] = tmp		// 0到n(n-1)/2						
			}	
		}
	}
	console.log(arr)					// 1
}

语句频度:
最好情况:f(n) = 2 + (n-1) + n(n-1) + 1 = n2 + 2
最坏情况:f(n) = 2 + (n-1) + 5n(n-1)/2 + 1 = 5n2/2-3n/2+3
时间复杂度:
最好情况: T(n) = O(f(n)) = O(n2 + 2) = O(n2)
最坏情况:T(n) = O(f(n)) = O(5n2/2 - 3n/2 + 3) = O(n2)
最好最坏情况时间复杂度相同,都是O(n2)。

// 优化冒泡算法
// 通过hasChanged标记判断是否已经排序完成来避免无效操作
function sort(arr){
	var l = arr.length;     			// 1
	var tmp;							// 1
	var i = 0;							// 1
	var hasChanged;    					// 1
	while(!hasChanged && i < l)			// 1到n-1
		hasChanged = false;				// 1到n-1
		for(var j = 0; j < l - i; j++){ // n-1到n(n-1)/2
			if(arr[j]> arr[j+1]){	// n-1到n(n-1)/2
				tmp = arr[j+1];	 	// 0到n(n-1)/2
				arr[j+1] = arr[j]	// 0到n(n-1)/2
				arr[j] = tmp		// 0到n(n-1)/2
				hasChanged = true;	// 0到n(n-1)/2
			}	
		}
		i++;							// 1到n-1
	}
	console.log(arr)					// 1
}

语句频度:
最好情况:f(n) = 8 + 2(n-1) + 2 = 2n + 6
最坏情况:f(n) = 4 + 3(n-1) + 3n(n-1) + 1 = 3n2+2
时间复杂度:
最好情况: T(n) = O(f(n)) = O(2n + 6) = O(n)
最坏情况:T(n) = O(f(n)) = O(3n2+2) = O(n2)
最好情况的时间复杂度得到提升,但是一个算法的时间复杂度有最坏情况决定,因此仍然是O(n2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值