一文学会算法复杂度分析,面试再也不用愁了。

简介: 一文学会算法复杂度分析,面试再也不用愁了。

1什么是算法复杂度

身为程序员的我们都知道程序=数据结构+算法 算法=逻辑+控制。当我们要解决一个问题的时候,必然会经过以下几个步骤

问题的理解

数据结构设计

算法设计

算法分析

程序实现与测试

所谓时间复杂度就是衡量一个算法效率的手段


2如何比较算法的效率呢?

也就是比较算法的所用时间,但是一个算法所需要的时间和一下3个因素有关,规模 输入 算法本身,举一个例子:现在需要把1-10的乱序扑克牌从小到大排列。

10就是规模 ,输入就是乱序1-10的数字,算法就是看采取什么样的排序算法,就是上面说的算法设计。


抛开软件因素和硬件因素,算法是由一组语句构成,一个算法的效率就是一个语句执行了多少次,次数越少时间越少,算法效率更高。所以一个算法的基本操作次数和规模有一定的函数关系,这里算法的时间复杂度表达式为


3渐进分析

我们计算时间复杂度并不是要一个准确的值,而是一个相对近似的计算,大概知道所耗费的时间就行,所以就得用到渐进分析。

上界符号O

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都不会大于g(n)。

图像表示如下:

下界符号Ω

这个刚好和上一个概念相反,上一个理解了这个也就理解了,

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都大于等于g(n)。

也就是上图最右侧部分。

紧渐进符号Θ

这个也很好理解,就是时间复杂度函数值f(n)的值在两个函数之间,也就是上图最左侧部分。

非紧上界封号o

这种情况就是(上界符号O)的情况去掉等于的情况。

非紧下界封号w

这种情况就是(下界符号Ω)的情况去掉等于的情况。

于是我们就可以这样近似记忆


在渐进分析的基础之上,我们会经常遇到以下几种情况。

绘制成图像就是这样。

我们在分析时间复杂度的时候,都是找出循环次数最多的语句。计算出相关表达式,常用的表达式有以下几种。

了解了上面的东西我们来解释如何利用上面的知识进行计算。


求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:

案例1

  for (i=1; i<=n; i++)

         x++;

  for (i=1; i<=n; i++)

       for (j=1; j<=n; j++)

            x++;

 第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

案例2

  for (i=1;i<n;i++)

   {

       y=y+1;         ①  

       for (j=0;j<=(2*n);j++)    

          x++;         ②      

   }          

解:语句1的频度是n-1

         语句2的频度是(n-1)*(2n+1)=2n2-n-1

         f(n)=2n2-n-1+(n-1)=2n2-2;

       又Θ(2n2-2)=n2

Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到      

时间复杂度T(n)=O(n2).  

再来看一个比较常见的log相关的

    i=1;     ①

   while (i<=n)

      i=i*2; ②

解:语句1的频度是1,

         设语句2的频度是f(n),   则:2^f(n)<=n;f(n)<=log2n    

         取最大值f(n)=log2n,

         T(n)=O(log2n )

以上就是算法的时间复杂度了,面试的时候就不用担心被问这个问题了,以后的文章我会分析leetcode等相关算法,每个题目分析时间复杂度,也就相当于是对知识的应用了。

持续分享编程数据结构与算法相关知识。

相关文章
|
5天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
20 4
|
3天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
15 1
|
23天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
9天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
19 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
1月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
1天前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
27天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
1月前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。
|
1月前
|
算法 C++
第一周算法设计与分析 E : 构造回文串
这篇文章介绍了解决算法问题"构造回文串"的方法,即判断给定的整数N(视为字符串)是否可以通过在前面添加任意个0(或不添加)来构造一个回文串,并给出了相应的C++代码实现。
|
1月前
|
算法 C++
第一周算法设计与分析 H : 括号匹配
这篇文章介绍了解决算法问题"括号匹配"的方法,通过使用栈来检查给定字符串中的括号是否合法匹配,并提供了相应的C++代码实现。