1 数据结构
1.1 复杂度分析
什么是复杂度分析?
- 1 代码执行的效率以及占用的物理资源
- 2 作用:评价一段代码/一段算法 优劣的一种重要的指标
- 3 复杂度分析的过程中:一般情况下,排除硬件的影响
- 4 复杂度分析分为两个:
1 时间复杂度
2 空间复杂度
2.1 时间复杂度
什么是时间复杂度?
- 1 作用:考量代码执行效率的一个非常重要的指标
- 2 全称:
渐进时间复杂度
- 3
抛开算法运行的软硬件环境
,只考虑算法与问题规模之间的关系。 - 4 算法的时间复杂度反映了
程序执行时间随输入规模增长而增长的量级
,在很大成都上能很好反映出算法的优劣与否。 - 5 算法执行时间需要通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。
时间复杂度,一般采用大O表示,评估算法的一种方式
O(1):不是代表只有一行代码,只是说没有遍历去影响他,他的时间复杂度是常量级的
public void sum1(){ sout("和="+sum);
}
public void sum1(){ sout("和="+sum); sout("和="+sum); sout("和="+sum); sout("和="+sum);
}
public void sum1(){ sout("和="+sum); sout("和="+sum); //.....100行代码 sout("和="+sum); sout("和="+sum);
}
O(n):单层for循环,算法的时间复杂度只跟n的大小有关
O(n^2):嵌套for循环
public void sum1(int[] array){ for(int i=0;i<array.length;i++){ for(int j=0;j<array.length;j++){ sum = array[i] * array[j];
}
}
}
T = 2 n +2 时间复杂度是O(n)
T = 2000n +10000 时间复杂度是O(n)
T = 1.* n * n +0 时间复杂度是O(n^2)
问题:O(n^2)的执行一定会被O(n)消耗更多的时间吗?
答:不一定
当n=1的时候 T = 2000*n +10000 时间复杂度是O(12000) T = 1.* n * n +0 时间复杂度是O(1)
但是
当n=10000的时候 T = 2000*n +10000 时间复杂度是O(2001 0000) T = 1.* n * n +0 时间复杂度是1 0000 0000
结论:当n趋于无穷大的时候,O(n^2)的时间复杂度一定是高于O(n)
3.1 Array的CRUD复杂度分析
add
addLast:当不需要扩容的时候,时间复杂度是O(1);当需要扩容的时候,时间复杂度是O(n)