算法分析——浅析算法的时间复杂度

绪论

时间复杂度是学习算法的基石,也是判断一个算法优劣的重要因素,今天我们来聊聊什么是时间复杂度以及如何去算一个算法的时间复杂度。
本文以C++语言为例

1.电脑运行程序是需要时间的

void print()
{
	//这段代码会运行多久?
	int n = 100;
	for(int i = 0; i < n; i++)
	{
		cout<<n<<endl;
	}
}

想知道这段代码运行多久,首先得知道程序运行的时候时间都花费在哪里,
重要概念:电脑运行代码片段的时候,执行任何一条语句都需要花费时间,这是时间花费的主要地方。
为了方便运算,这里我们把每一条语句的执行时间都看做是一样的,记为一个时间单元。(实际上每条语句的时间不会完全一样,根据复杂程度而定。就类似于人看书一样,阅读文字是需要时间的)
这样可以简单的计算:运行时间 = 语句数量*时间单元
那么刚刚的代码中有多少语句呢?红色
1.红框两个语句只运行一次,花费2个时间单元。
2.黄框两个语句运行n次,花费2*n个时间单元。
3.绿框一个语句运行n+1次,花费n+1个时间单元。
所以该代码运行时间3n+3个时间单元,可以看出该代码的时间消耗与n成线性关系,现在用T(n)表示这个程序运行了多长时间,那么这个程序运行的时间就可以写成T(n)=3n+3

2.算法的时间复杂度

在1阶段中我们得到示例代码的运行时间的函数,那么它的时间复杂度是多少呢?接下来对这个函数进行简化,使得它既简单又不失原函数的特性。利用数学思想,我们一般只关心随着n趋于无穷时函数中对函数结果影响最大的项,也就是最高次项忽略低次项
所谓低阶项,简单地说就是当n非常大时,这个项相对于另外一个项很小,可以忽略,比如n相对于n^2,n就是低阶项。
示例时间函数T(n)=3n+3,当n非常大的时候常数3和n的系数3对函数结果的影响就很小了。所以一般我们会保留最高次项并忽略该项的系数,因此简化后的函数 f(n)=n。
简化后的式子被称为这个程序算法的时间复杂度,记做O(f(n)),f(n)就是简化后的式子,比如说刚开始示例的T(n)=3n+3,简化后T(n)~f(n)=n,那我们记为O(n)。更准确地说O代表了运行时间函数的一个渐进上界,即T(n)在数量级上小于等于f(n)
会使用到的阶级比较
在这里插入图片描述
因此可以得到计算时间复杂度O(f(n))的方法:先计算出运行时间的函数再对函数进行简化

简单计算方法

每次都要把时间函数算出来,好复杂,那么有没有更简便的计算呢?
一般来说,最内层执行次数最多的语句就决定了整个算法的趋势,所以只要看看最内层的语句执行次数的规律就行了。

int sum =1;
int n = 100;
while(sum<n)
{
 sum = sum*2;
}

上面这个示例的时间复杂度又是多少呢?和之前的分析方法一样,着重看执行次数最多的最内层代码语句
sum = sum*2;每循环一次,sum就给自身乘以2,乘了多少次就跳出循环了呢(大于等于n)?不知道,假设为x吧,那么2^x=n,解出x=logn,这说明随着n的增大,最消耗时间的内层语句是呈对数变化的,所以该代码时间复杂度为O(logn)

最后的话

本文是拜读了涛声依旧老哥图文并茂的文章后,动手梳理自己有关于时间复杂度的理解,同时也是第一篇文章,如有差错还请移步–>涛声依旧阅读更详细生动的时间复杂度的文章0.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值