时间复杂度、空间复杂度的概念和计算(折半查找时间复杂度计算、按位异或的计算、递归的空间复杂度)

本文介绍了时间复杂度和空间复杂度的概念,强调在现代计算机环境下时间效率的重要性。讲解了如何计算时间复杂度,包括大O表示法的应用,并讨论了最坏情况分析。同时提到了空间复杂度的计算原则和折半查找的示例,以及常见的时间复杂度级别。
摘要由CSDN通过智能技术生成

一、时间复杂度
1、什么是时间复杂度和空间复杂度
2、如何计算常见算法的时间复杂度和空间复杂度

  在理解这两个概念之前,需要先明白一个概念:即算法效率
算法效率分为时间效率和空间效率,时间效率为算法运行的时间,空间效率为算法额外占据的内存。
  早期的计算机其内存容量很小,因此对空间效率比较重视,然而随着计算机的发展,如今计算机的内存容量已经很大了,对于算法的内存已经不再显得那样重要。所以今天更加关注的是时间效率,即时间复杂度。

1、时间复杂度:
即衡量算法运行的时间。时间复杂度是一个函数,其定量的描述了算法运行的时间。
事实上,算法实际运行的时间我们是不知道,需要在计算机上实际运行才知道到底要多久。
但是,我们却可以通过计算,估量一个算法的运行时间,一个算法到底需要跑几百年还是跑几分钟几秒钟我还是知道的吧?
通俗而言,时间复杂度就是首先估量一个算法是否可行。在面对大规模问题的时候,时间复杂度就显得尤为重要,同样规模的问题,不同的算法的运行时间可能出现巨大的差距。

如何计算时间复杂度呢?
时间复杂度的一个影响因素是基本操作的执行次数
我们在计算时间按复杂度时,不需要知道精确的执行次数,只需要大概的执行次数。
时间复杂度用大O的渐进表达式:O() 这是一种用于描述函数渐进行为的数学符号。O就表示估算,渐进
1、当时间复杂度(函数表达式)为常数时,都用O(1)表示
2、其他情况,只保留函数表达式的最高阶位,同时去掉系数

时间复杂度存在最好和最坏以及平均情况
最好情况:任意输入规模的最小运行次数
最坏情况:任意输入规模的最大运行次数
平均情况:任意输入规模的平均次数,就是最大次数和最小次数的平均值
而我们一般关注的是最坏的情况,我给你一个最坏的次数,那么你就能够做好最坏的准备,有一个预期

2、空间复杂度:

衡量算法占据的内存大小
  空间复杂度不是说一个程序占据内存空间几个字节,没有实际的意义。而是计算变量的个数
记住,时间复杂度不是计算时间,而是计算次数,空间复杂度数也不是计算内存大小,而是计算变量个数
其表示方式和时间复杂度是一样的,也是用大O渐进表示法

对于时间复杂度来说,时间是累计的,运行了多久就是多久。但是对于空间来说,空间是不累计的,因为一个变量出了函数就会被销毁,释放内存。

注意:对于动态内存管理来说,每一次开辟一次空间,就相当于创建了一个变量,
例如,malloc(n*sizeof(int)),其空间复杂度就是O(n)
可是为什么呢?因为这个malloc的意思是:开辟了一个数组空间,这个数组有n个元素,每个空间为int类型
所以,就相当于开辟了n个变量的空间,也就是说创建了n个变量

折半查找的空间复杂度:
假设有序数组有n个元素,一次找一半,最坏情况找到:
2*2*2*...*2*1 = N
这个式子的意思是:找一次,N就少一半,就相当于N/2;找两次,(N/2)/2;最后经过x次找到,
那么就是说n除了x次N,最后一次只剩下一个,就不用找了,就剩一个了。
因此,2^x = N;
所以,x 等于 以2为底数,n为真数的对数
那么算法执行次数就是x次,也就是O(log2 N)
但是因为对数形式书写不方便,一般来说都是直接写logN,但是这是不严谨的,只是为了书写方便,要注意

常见的时间复杂度:
O(n^2)、O(n)、O(logN)、O(1)
注意:最吊的时间复杂度是O(1),也就是说,如果一个算法的时间复杂度是O(1),那么该算法就是最优算法。
同时,O(logN)的时间复杂度和O(1)是一个级别的
为什么:
假设,一个算法时间复杂度为log2 N,底数直接取最小为2,对数运算:2^x = N
2^10 = 1024//千量级的
2^20 = 1024*1024//100万量级的
2^30 = 1024*1024*1024//10亿级别的
也就是说,计算一个数据规模为1千级别的,只需要计算10次,
计算一个数据规模为100万级别的,只需要计算20,
计算一个数据规模为10亿级别的,只需要计算3次!
简直不要太猛!
这还只是底数为2的数据,如果底数更大,那么次数降的更厉害

数据的交换可以使用按位异或实现

按位异或表示,相同为0,不同为1

例如:

想要把x换成y,即:x^y^x = y;

这在一些算法计算是用得到的

注意:递归的空间复杂度:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值