标题【数据结构篇】~复杂度
前言
C语言已经学完了,不知道大家的基础都打得怎么样了?
无论怎么说大家还是要保持持续学习的状态,来迎接接下来的挑战!
现在进入数据结构的学习了,希望大家还是和之前一样积极学习新知识,同时还要巩固C的部分,一起加油吧!
复杂度
相信大家都听过算法吧,那衡量算法的好坏就是用复杂度来看的
复杂度分为:时间复杂度和空间复杂度,时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。
讲复杂度之前这里有一个题 ,大家可以先尝试做一下看看你能想出几种方法?
初入复杂度第一题
1·时间复杂度
算法的时间复杂度是一个函数式T(N) ,这里的T(n)其实和数学中的函数差不多,它的单位是(ms)毫秒,这个T(N)函数式计算了程序的执行次数,那么执行次数和运行时间就是等比正相关。
如图:
大家可以自己尝试一下在Release模式下时间是多少,图中"C++"一次时间复杂度就为T(1),那它一共++了10000000次那这段代码的时间复杂度就是T(10000000)吗?
大O的渐进表示法
大O符号(Big O notation):是用于描述函数渐进行为的数学符号
💡 推导大O阶规则
1. 时间复杂度函数式T(N)中,只保留最高阶项,去掉那些低阶项,因为当N不断变大时,
低阶项对结果影响越来越小,当N无穷大时,就可以忽略不计了。
2. 如果最高阶项存在且不是1,则去除这个项目的常数系数,因为当N不断变大,这个系数
对结果影响越来越小,当N无穷大时,就可以忽略不计了。
3. T(N)中如果没有N相关的项目,只有常数项,用常数1取代所有加法常数。
所以上面那段代码的时间复杂度是O(1)!!!
下来有几个例子:
1·冒泡排序的时间复杂度为O(n^2 )
2.指数的时间复杂度
3.递归的时间复杂度
💡 总结
有些算法的时间复杂度存在最好、平均和最坏情况。
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
大O的渐进表示法在实际中一般情况关注的是算法的上界,也就是最坏运行情况。
2·空间复杂度
空间复杂度的计算方法和时间复杂度大差不差。
创建一个变量和调用一次函数O(n)就为O(1);
还是有两个例子,如图:
1.冒泡排序
2.递归
下面是复杂度的对照表
3.初入复杂度第一题解析
1.第一种解法(不满足时间复杂度)( 时间复杂度 O(n^2))
2.第二种解法 (空间复杂度 O(n))(用空间换时间)
第二种:先创建一个新数组把要轮转的部分放入新数组,然后遍历数组。