复杂度分析(一)

标签(空格分隔): 数据结构与算法学习


引言:前面的两章理论引导,可以对我们的现有思想做下碰撞。接下来就要进入入门篇的内容了,复杂度分析数据结构与算法的半壁江山。

为啥要进行复杂度分析?

  这里得先提一下,算法和数据结构本身解决的就是程序运行的快和省,所以衡量一个算法的指标就是程序执行效率。
由于技术水平的进步,现在的监控及测试工具有很多,我们完全可以通过这种外部的技术手段 对现有的程序的执行消耗和性能进行分析。既然如此那还需要什么复杂度分析呢。
这里我们必须要注意到监测工具是对现有硬件条件下对现有数据在程序中运行的执行效率监控。而实际上在不同的硬件条件下,不同的数据规模或者数据类型的条件下 我们可能得到一些非准确性的结果。而这种分析方法在一些书籍中称为叫事后统计法。但是,这种统计方法有非常大的局限性。
####1)程序执行效率受硬件条件的影响很大
core i3 和core i7两台执行的效率肯定是不一样的,而且不同算法在不同的cpu条件下 a算法原先比b算法执行效率高,但换一台机器你可能会看到不同的结果。
####2)程序的数据结构
比如本身有序的数据用排序可能有的排序算法很快就执行完,有的执行的速度反而慢。
而第二种算法可能在无序的时候运行时间要比第一种的要快。所以算法收输入数据的影响很大。

复杂度分析的大O表示法

什么是大O表示法,其实就是一个趋势分析表示法。
大O表示法:T(n)=O(f(n))
T(n)正相关f(n),是一种趋势这就是大O表示法。
时间复杂度:算法的执行时间与数据规模的关系。
具体到时间复杂度来用大O表示的话请看如下解释:
T(n)表示执行时间,O表示T(n)与f(n)正相关。f(n)表示算法的执行次数。n表示数据量。大O其实就是看一个趋势的表示法。

public void cal(int n){
    int sum = 0;
    for(int i=0;i

这里我们也以估算的形式,假设每行代码的执行时间单元为1,那么我们统计出来执行次数就得到一个执行时间了。
int sum = 0 ; 执行1次,接下去两行执行n次 那么总执行次数就是n+1
,那么T(n)= O(n+1),而1对n来说数据量一大真的是要忽略的,同理如果有存在 n^2+n+5 数据量一大 n和5都不算个事,所以最终我们可以表示成 T(n)=O(n^2);我们在用大O的时候本来就是表示一个趋势,所以我们可以忽略到常量,低阶,系数保留最高阶即可。

我们在进行算法复杂度分析的时候记住三个原则就能很快分析出来:1.关注代码循环次数最多的地方。2.去除细枝末节只保留最高阶的。3.关注调用关系,调用关系是乘法,比如cal()是复杂度为n的你调用了n次,那么总的时间复杂度就是n*n

空间复杂度

类比时间复杂度,空间复杂度就是额外内存消耗与数据规模之间的一个渐进关系

你可能感兴趣的:(算法)