- 数据结构是什么 是一种“存储结构” 算法是什么 是一种操作数据得一种方法,数据结构和算法相辅相成 离了数据结构 某些算法就没有用了 比如二分查找需要随机访问也就是在数组这个数据结构下操作,但是在链表下就不适用了,因为链表是不能随机访问的,数据结构只是一种数据的存在形式如果没有算法来操作数据,那么孤立存在的数据结构就是没有用的
- 时间复杂度 概念 是算法的执行时间与数据规模的关系 怎么求就是看哪个代码执行的次数最多 而且有未知数 常数 系数 有高阶时的低阶都对时间复杂度影响较低 可以忽略不记
- T(n) = O(f(n));大O时间复杂度
- O(1)常数时间复杂度 没有循环 没有递归 那么无论多少条代码都是O(1)
- O(n) 一行代码执行n次 第三行代码执行了n次 其实第二行代码也得执行n次 就是 2n了 但是系数可以省略
void test(int n){ for(int i = 0;i<n;i++){ i = i +i ; } }
- O(n^2) 嵌套循环 俩层循环
- O(log n)
void test(int n){
int i=0;
for(i=0;i<n;){
i = i * 2;
}
return i;
}
2^1 2^2 2^3 最后2^x=n 停止执行 则执行了多少次第四行代码
x次 x=以2为底的log n 若是i=i*3;则是以3为底的 则表示在大O就是O(log n)
- O(nlog n)就是多加了一层for执行了n次 快速排序 归并排序就是这么个时间复杂度
void insert(int value,int n){
int temp = -1;
int[] a = new int[n]
for(int i=0;i<n;i++){
if(a[i] == value) {
temp = i;
break;
}
}
return temp;
}
-
这是一个查找方法 没有找到返回-1 找到返回value在数组中的位置
-
最好时间复杂度 O(1) 执行一次就找到
-
最坏时间复杂度 O(n) 执行结束了才找到
-
平均时间复杂度 假设在数组中占概率1/2 在某一个位置为1/n 则存在概率为1/(2*n) 则加权平均值为(3n+1)/4 则简化一下就是O(n)
-
还有一个均摊时间复杂度 如果O(1)出现的次数大于O(n)则为O(1) 靠感觉吧 看了一会也感觉和平均差不多
-
空间复杂度 代码存储大小和数据增长规模的关系
-
复杂度分析法则
- 单段代码 :看执行次数最多的代码 循环
- 多段代码:比如说一段代码里有单重循环和多重循环 看多重循环
- 嵌套代码:求乘积 O(n^2) 递归 多重循环
- 多个参数:求加法 有多个参数影响的代码 但不是多重循环 比如说两个单重循环 一个执行m次 一个执行n次 则O(m+n)