如何评价一个算法的好坏?-复杂度

导读:本篇文章讲解 如何评价一个算法的好坏?-复杂度,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

如何评价一个算法的好坏?以下两个维度:

时间复杂度:估算程序指令的执行次数(执行时间)

空间复杂度:估算所需占用的存储空间

我们一般用大O表示法来描述复杂度。

一般地,我们需要忽略常数、系数和低阶

2022   >>    O(1)

3n+4   >>    O(n)

n^2+2n+3   >>  O(n^2)

4n^3+3n^2+2n+1   >> O(n^3)

特殊地,log2(n) = log2(9) * log9(n)

所以一般把log2(n) 、 log9(n) 统称为logn

常见的复杂度:

12 O(1) 常数阶
2n + 3 O(n) 线性阶
4n^2 + 2n + 6 O(n^2) 平方阶
4log2n + 25 O(logn) 对数阶
3n + 2nlog3n + 15 O(nlogn) nlogn阶
4n^3 + 3n2 + 22n + 100 O(n^3) 立方阶
2^n O(2n) 指数阶

*****  O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

复杂度大小对比如下:

如何评价一个算法的好坏?-复杂度


下面举一个特别直观的例子,可以看到不同的算法的差别有多么大!!!!


大家肯定都知道斐波那契数列,它的递归写法如下:

public static int fib1(int n) {
		if (n <= 1) return n;
		return fib1(n - 1) + fib1(n - 2);
	}

 它的迭代写法如下:

public static int fib2(int n) {
		if (n <= 1) return n;
		
		int a = 0;
		int b = 1;
		for (int i = 0; i < n - 1; i++) {
			int c = a + b;
			a = b;
			b = c;
		}
		return b;
	}

 递归写法,通过简单的归纳推理可以知道,递归写法的时间复杂度为O(2^n),迭代写法的时间复杂度为O(n).

假如我的电脑主频为1GHz(实际为2.9,这里为了方便计算),那么电脑的运算速度为10^9次/秒,那么现在我们分别用着两种算法算一下第64个斐波那契数(n=64)。

O(n)大约耗时6.4*10^(-8)秒。

O(2^n)大约耗时584.94年

通过这一个例子,我们可以知道不同的算数有着很大的差距。有时候算法之间的差距,往往比硬件方面的差距还要大。

所以,对于咱们程序猿来说,咱们写的算法的优化方向是:

用尽量小的存储空间

用尽量少的执行步骤

在实际开发过程中,可以根据实际情况可以选择以空间换时间,或者以时间换空间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94490.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!