时间空间复杂度详解

数据结构中常常要求我们根据某些场景设计一种算法,使其能够帮助我们解决某些问题。算法的核心就是正确性了,算法不正确,再简单也是没用的。

还有一点就是我们常说的起到关键作用的时间、空间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。掌握基本的算法时间复杂度分析方法是很有必要的。在数据结构中我们常用的就是算法的上界也就是O(),其他的还有下界什么的,这里就不讲了。

算法复杂度要考虑很多比如通讯耗费时间,所使用指令耗费时间,磁盘读写所用时间等,但是在数据结构中我们只考虑核心语句执行的次数就可以了,这时候n就取无穷大就行了,然后找它的同阶无穷大,这就是它的复杂度了。这里关键的就是推导出来与n相关的一元多项式。 

假如一个算法的规模是n,执行所需要的次数为: 100n²+0.02n+10000000000000(n趋近于无穷大)

我们其实只用看最高项就行了,也就是这个100n²,其他的因为都是n²的低阶无穷大,所以可以忽略掉了。

复杂度的分析只看最高项的指数,系数直接写成1就好了。

那它的时间复杂度就是O(n²)。

100n,0.000001n,3n+20000,10000000000000n,0.01n+1000000000000000000000000000000

写成复杂度都是O(n)

1,3000,199990,10000000,

写成复杂度都是O(1)因为都是常数次就能执行完,与数据规模无关。

for (i=1; i<=n; i++)  

 {sum++;}

的时间复杂度为Ο(n)

for (i=1; i<=n; i++)  

     for (j=1; j<=n; j++)  

    {sum++;}

的时间复杂度为Ο()

如果上面两个小程序合起来就是O(n²)

同理,空间复杂度的计算也是如此。

很多场景下,我们会发现,要么需要花费较多的时间,要么就要花费较多的空间,二者大部分时候不可兼得。

按照现在的计算机发展来看,绝大部分软件对响应时间都有比较高的要求,比如玩消消乐的时候,你交换一下小动物,2秒后才有动画效果,虽然运行一点不发热,就用一点点内存,但是这速度估计你直接就删除游戏并不忘了问候开发人员几句。大部分时候都可以牺牲空间换时间的,少部分内存不足且实时性要求很低的的情况下采用时间换空间,更有甚者,可能连内存极其稀缺,比如我们排序算法中的外部排序就是这种情况。

比较两个算法优劣的时候,很多人喜欢放进去一个具体数据去对比核心语句执行了多少次,结果就把自己弄晕了,因为我们评价算法复杂度是在规模无限大的时候去评价的,在具体用到的时候大家也可以根据情况去算相应的数据,选择最优算法,比如100亿的数据跟100个数据用得算法很有可能不一样,同理,在不同系统中同一个算法表现也不一样,比如在分布式系统中,快排的表现就有点不尽人意了。

猜你喜欢

转载自blog.csdn.net/mad_sword/article/details/90738481