算法与数据结构简介
为什么学习算法与数据结构?
- 掌握常用的算法和数据结构,可以提升代码的运行效率
- 功利性目的,找到更好的工作
- 喜欢上算法,理解并运用它,在编程领域,拥有雄厚的“内功”
区块链
区块链就是算法中的树+单向链表
如何有效学习算法与数据结构
有一本书叫《异类—不一样的成功启示录》,作者 马尔科姆·格拉德威尔提出来:一万个小时定律,以及精通一个领域所要做的3点内容
- 切碎知识点
- 刻意练习
- 反馈(LeetCode\GitHub看高手的代码)
算法的分类
切题四件套
- 明确题目意思
- 想好可能的解决方案
(1)比较时间复杂度和空间复杂度
(2)最佳解 - 多写多练
- 测试
时间复杂度&&空间复杂度
阶乘 >> 指数 >> 立方 >> 平方 >> 线性 >> 对数 >> 常数
O(n!) O(2^n) O(n^3) O(n^2) O(n) O(log n) O(1)
注意点:多种复杂度的情况,只看最高复杂度即可
O(1):
int n = 100;
System.out.println("结果是:" + n);
O(1):
int n = 100;
System.out.println("结果一是:" + n);
System.out.println("结果二是:" + n);
System.out.println("结果三是:" + n);
O(N):
int n =100;
for(int i = 1; i <= n; i++){
System.out.println("结果是:" + i);
}
O(N^2):
int n =100;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
System.out.println("结果是:" + i + "&&" + j);
}
}
O(log(N)):
int n =100;
for(int i = 1; i < n; i * 2){
System.out.println("结果是:" + i);
}
O(2^N):
int n =100;
for(int i = 1; i <= Math.pow(2,n); i++){
System.out.println("结果是:" + i);
}
O(N!):
int n =100;
for(int i = 1; i <= factorial(n); i++){
System.out.println("结果是:" + i);
}
举例说明
S(n) = 1+2+3+…+n
S(n) = n+(n-1)+…+1
推导出:2S(n) = n(n+1)
S(n) = n(n+1)/2 即等差数列S(n) = n(a1+an)/2 || Sn=n*a1+n(n-1)d/2
斐波拉契公式,前两项和等于后一项
从递归推断时间复杂度:主定理公式(英语:master theorem)
常用的递归算法的时间复杂度:
二分查找: O(log n)
二叉树遍历: O(n)
最优排序矩阵: O(n)
快排/归并排序: O(n log n)