数据结构与算法-绪论(时间复杂度 空间复杂度 大O计法)

小孱弱弱自告奋勇,把自己对数据结构的理解分享一下!!!
话不多说进入正题:
众所周知,数据结构+算法=程序,一个好的程序必然是选择了又对又好的数据结构,带上精巧的算法组成的:
今天我们研究的是什么样的算法是好算法:
一个个好的算法必然做到了时间复杂度和空间复杂度的权衡得到的,空间复杂度好解释,
我们写的程序也好,使用的元素也好,都是存储在计算机中的,运行时必然占据一定的内存,占据内存的的规格就是空间复杂度。至于时间复杂度,我们考虑这样一个结构:

int sum=0,n;
cin>>n;
for(int i=1;i<=n;i++) 
   sum+=i;

这个循环一眼就能看出来他需要执行n次加法运算,他运算随耗费的时间完全由我们输入的n决定,就是这段代码段的时间复杂度。
为了更好的解释时间复杂度,前辈们引入一个方法:大O计法(也就是大O记号叫法不同而已)O(n)就是上图的代码的时间复杂度。

int sum=0,n;
cin>>n;
for(int i=1;i<=n;i++) 
 sum+=i;
 cout<<sum;

这段代码执行了n次循环是吧,别忘记还有一次输出,它的时间复杂度O(n+1)
试想一下:
如果我们的程序灰常复杂大O阶的表达式也会灰常的长~,非常不方便我们使用!
为了更加标准化,更加方便的描述时间复杂度,计算机先辈们定义了这样一些算法:
1.只取大O阶最高阶项。
例:O(2nn+n*6+8)=O(n^2)
2.最高阶项系数化为1。
3.若只有常数,化1。
例:O(32524334)=O(1)
下面介绍几种常用的大O阶:
1.常数阶O(1)
它的复杂度不会改变,是已经确定的。
2.线性阶O(n)
它的复杂度随n的规模线性增长。
3.对数阶O(logn)
它的复杂度随n的对数规模增长。
4.平方阶O(n^2)
它的复杂度随n^2增长。
……等等还有立方阶O(n^3 )
指数阶O(2^n)只不过他们的时间复杂度太高了,我们承受不起了!!

通常我们设计的程序时间复杂度越低越好,至少不能超过O(n^2),如果我们的程序时间复杂真的这么高,我们就可以考虑一下是不是能做一下改进,让它降低到对数阶甚至是线性阶,这就要考虑我们的思维能力和逻辑能力了!!

猜你喜欢

转载自blog.csdn.net/weixin_47644373/article/details/106098678
今日推荐