计算机系统应用教程网站

网站首页 > 技术文章 正文

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

btikc 2024-10-28 13:09:19 技术文章 2 ℃ 0 评论


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)=2
n2-n-1
f(n)=2
n2-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等相关算法,每个题目分析时间复杂度,也就相当于是对知识的应用了。

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表