时间复杂度
掌握顺序表的CRUD操作–顺序表:模仿ArrayList
- add(index,e):向指定索引处新增元素e
- addFirst:头部添加元素,头插法
- addLast:尾部添加元素,尾插法
- get(i):获取指定索引处的值
- find(e):获取元素的索引—>indexOf
- contains:是否包含
- remove(index):删除指定索引处的元素
- remveFirst:删除第一个元素
- removeLast:删除最后一个元素
顺序表中:新增和删除都需要挪动元素
- 为什么要挪动元素?顺序表中采用的是数组,数组这种数据结构最大的特点:物理空间是连续的,所
以你只能在0-size的范围内添加元素,尾节点是size,而不是data.length - 顺序表空间开辟之后,及时不用,空间也占用在那里
复杂度分析
什么是复杂度分析?
- 代码执行的效率以及占用的物理资源
- 作用:评价一段代码/一段算法 优劣的一种重要的指标
复杂度分析的过程中:一般情况下,排除硬件的影响
复杂度分析分为两个:
1 时间复杂度
2 空间复杂度
1.1 时间复杂度
1.1.1 什么是时间复杂度
- 1.1作用:考量代码执行效率的一个非常重要的指标
- 1.2全称:
渐进
时间复杂度 - 1.3 抛开算法运行的软硬环境,只考虑算法与问题规模之间的关系
- 1.4算法的时间复杂度反映了程序执行时间随输入规模而增长的量级,在很大程度上能很好的反应出算法的优劣与否
- 1.5 算法执行时间需要通过依据该算法编制的程序在计算机上运行时所耗的时间来量度
总结:渐进时间复杂度
一般使用O表示时间复杂度,O(1)、O(n)、O(n^2)、O(n^3)、O(log2n)
时间复杂度,一般采用大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];
} } }
1.2Array的CRUD复杂度分析
- addLast:当不需要扩容的时候,时间复杂度是O(1);当需要扩容的时候,时间复杂度是O(n)
- 1 泛型:原来我们写的Array只能存放int类型,现在我们的Array可以存放任意类型
- 2 动态扩容:原来我们写的Array只能存放几个元素,一旦放满了,就会内存不够,进行动态扩容
- ArrayList:每次扩容1.5倍
- Array:每次扩容两倍:新增的时候、缩减容量的时候
- 3 复杂度分析:简单的复杂度分析
时间复杂度:掌握算法的时间复杂度分析
最好时间复杂度
最坏时间复杂度:通常使用最坏时间复杂度去表示一个算法的复杂度
平均/均摊时间复杂度
复杂度震荡:代码有问题
空间复杂度