算法
算法特性
五个特征
-
有穷性
不是死循环,可以执行完
-
确定性
有确定的结果
-
可行性
可以解决问题,可实行的
-
有输入
-
有输出
设计原则
-
正确性
-
可读性
-
健壮性
bug少
高效率与低存储
内存占用越小,CPU占用越小,运算速度越快。
重要指标
-
时间复杂度
运行一个算法所需要的时间。 O()
-
空间复杂度
运行算法所需要的内存
基础算法思想
- 排序算法
- 枚举算法
- 基础数论
- 递归算法
- 分治算法
- 回溯算法
- 贪心算法
- 动态规划
时间复杂度
时间复杂度用来表示一段代码执行所需要的时间,时间复杂度表示方法,大O表示法。
常数级
-
O(1)
1表示常数,所有能确定的数字都用O(1)表示,O(100)=O(1)
对数级
O(logn)
int i = 1;
while(i <= n){
i = i*2;
}
//2^x=n 求x就是运行次数=> x=log2n => 忽略常数 => logn => O(logn)
O(nlogn)
O(nlogn)
int i = 1;
for(int j = 0; j < n;j++)
while(i <= n){
i = i*2;
}
}
线性级
O(n)
for(int i = 0; i < n;i++){
a = a+1;
}
//n未知
平方
O(n^2)
for(int i = 0; i < n;i++){
for(int j = 0; j < n; j++){
a = a+1;
}
}
//n未知
for(int i = 0; i < n;i++){
for(int j = i; j < n; j++){
a = a+1;
}
}
/*运行多少次?n*(n+1))/2 => (n^2+n)/2;
有加减法的时候,找高阶项
O(n^2)
*/
N次方
O(n^n)
怎么找时间复杂度
-
找有循环的地方
-
找有网络请求的地方
- RPC
- 数据库请求
打印log,计算平均时间
时间复杂度效率排序
效率由高到低:
O(1) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^n)
算法优化的目标就是往O(1)方向优化。
数据结构
在计算机科学中,数据结构是计算机中存储、组织数据的方式。
所有的数据结构都是由下面这四种基本数据结构演变而来的:
- 数组
- 链表
- 树
- 图
线性结构
- 数组
- 链表
- 队列
- 栈
- 哈希表
树结构
- 二叉树
- 二叉搜索树
- 堆
- 平衡二叉树(红黑树)
- 并查集
- 字典树(Trie)
图结构
- 邻接表
- 邻接矩阵
算法与数据结构
程序 = 数据结构 + 算法
数据结构是算法的基石;
算法围绕数据结构进行操作。
相关书籍
数据结构
- 严蔚敏版 数据结构与算法
- 大话数据结构
算法
- 基础:刘汝佳 算法竞赛入门经典
- 进阶级:刘汝佳黑书
- 算法导论
刷题网站
- 力扣
- POJ or HDU