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

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

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


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


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


我们一般用大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)


复杂度大小对比如下:

1667907707877.jpg

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


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


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年。


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


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


用尽量小的存储空间


用尽量少的执行步骤


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


相关文章
|
1月前
|
算法 数据安全/隐私保护
基于信息论的高动态范围图像评价算法matlab仿真
本项目基于信息论开发了一种高动态范围(HDR)图像评价算法,并通过MATLAB 2022A进行仿真。该算法利用自然图像的概率模型,研究图像熵与成像动态范围的关系,提出了理想成像动态范围的计算公式。核心程序实现了图像裁剪处理、熵计算等功能,展示了图像熵与动态范围之间的关系。测试结果显示,在[μ-3σ, μ+3σ]区间内图像熵趋于稳定,表明系统动态范围足以对景物成像。此外,还探讨了HDR图像亮度和对比度对图像质量的影响,为HDR图像评价提供了理论基础。
|
3月前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
72 6
|
6月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
117 4
|
6月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
138 1
|
5月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
84 0
|
7月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
47 1
|
8月前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
125 1
【数据结构】算法的复杂度
|
8月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
【7月更文挑战第23天】在Python编程中,掌握算法复杂度—时间与空间消耗,是提升程序效能的关键。算法如冒泡排序($O(n^2)$时间/$O(1)$空间),或使用Python内置函数找最大值($O(n)$时间),需精确诊断与优化。数据结构如哈希表可将查找从$O(n)$降至$O(1)$。运用`timeit`模块评估性能,深入理解数据结构和算法,使Python代码更高效。持续实践与学习,精通复杂度管理。
83 9
|
9月前
|
机器学习/深度学习 算法 数据可视化
【机器学习】分类与预测算法的评价与优化
【机器学习】分类与预测算法的评价与优化
137 0

热门文章

最新文章