简单算法时间复杂度分析:
1.大O描述的是算法的运行时间与输入数据的关系
2.渐进时间复杂度,描述的是n趋于无穷时时间复杂度
动态规划:
最短路径:
松弛操作:
dijkstra单元最短路径:不能处理图中带有负权边,复杂度O(ELogV)
Bellman-Ford单元最短路径:不能处理带有负权环,可以判断,复杂度O(EV)
拥有负权环的图,不再拥有最短路径
Floyed算法处理无负权环的图,O(V^3)
最长路径:
最长路径不能有正权环
无权图的最长路径是指数级别的
有权图,不能使用Dijkstra来求最长路径
可以使用BellmanFord
无权图:
主要针对无向有权图
LazyPrim算法
Kruskal算法
图:
有向图,无向图
有权图,无权图
简单图:没有自环边和平行边的图
图的表示方法:邻接矩阵,邻接表
邻接表适用于稀疏图
邻接矩阵适用于稠密图或者完全图
深度遍历复杂度:
稀疏图-邻接表 O(V+E)
稠密图-邻接矩阵O(V^2)
并查集:
目的:解决连接问题。网络中的连接状态,网络是个抽象的概念,用户之间形成的网络。数学中的集合
时间复杂度:并查集的操作,近乎是O(1)
哈希表:
1.哈希表设计充分体现了算法设计领域的经典思想:空间换时间
2.哈希表是时间和空间的均衡
3.哈希函数设计很重要
4.建通过哈希函数得到的索引分布越均匀越好。
哈希函数设计:
1.原则:
一致性:a=b,hash(a)=hash(b)
高效性:计算高效
均匀性:分布均匀
查找表也可以使用平衡树。
平均每个地址承载的元素多过一定程度,就扩容。
哈希冲突的办法:
1.开放地址发
线性探测
平方探测
二次哈希
结论:扩容的负载率选的合适,时间复杂度也是O(1)
2.链地址法
3.Colaecsed Hashing
综合了链地址法和开放地址法
红黑树:
1.概念:
每个节点或者红色或者黑色
根节点是黑色的
每个叶子节点(最后的空节点)是黑色的
如果一个节点是红色的,那么他的孩子节点都是黑色的
从任意一个节点到叶子节点(最后的空节点),经过的黑色节点是一样的
2.性质:
红黑树是保持“黑平衡”的二叉树
严格意义上,不是平衡二叉树
最大高度:2logn,O(logn)
统计性能好,还有伸展树
字典树:
线段树:
使用原因:对于给定区间:更新区间中的一个元素或者一个区间的值。查询区间的最大值,最小值,或者区间的和
是平衡二叉树
优先队列:
堆:
二叉堆:是一颗完全二叉树,也是平衡二叉树。堆中的某个节点的值总是不大于其父节点的值。最大堆,最小堆。
heapify时间复杂度:
将n个元素插入到空堆中,时间复杂度是logn
heapify时间复杂度是O(n)
集合和映射:
1.集合
(1)应用:客户统计
词汇量统计
有序集合的元素具有顺序性(基于搜索树实现)
无序集合的元素具有无序性(基于哈希表实现)
多重集合
2.映射
有序映射:键具有顺序性(基于搜索树)
无序映射:键具有无序性(基于哈希表)
多重映射:键可以重复
二分搜索树:
1.使用树的原因:天然的组织结构,高效
2.二叉树:(1)具有唯一根节点
(2)每个节点最多有两个孩子
(3)每个节点做多有一个父节点
(4)具有天然的递归结构,每个节点的左子树和右子树都是二叉树
(5)一个节点也是二叉树,NULL也是
3.二分搜索树:(1)是二叉树
(2)每个节点大于左子树所有节点的值,小于右子树所有节点值
(3)元素具有可比较性
(6)二分搜索树中序遍历是顺序的
(7)二分搜索树的后序遍历可以用来释放内存
4.层序遍历(广度优先遍历):可以更快搜索,用于搜索策略。也可以用于无权图的最短路径
5.二分查找法:对于有序的数列,才能使用二分查找法
递归:
1.本质上,将大问题转换为更小同一问题。
2.举例:数组求和
3.代价:函数调用消耗时间+系统调用栈
队列:
1.
链表:
1.优点:真正的动态,不需要处理固定容量的问题。
2.缺点:丧失了随机访问的能力。
3.时间复杂度:增删改查只对头结点来说是o(1),平均是O(n)。
栈:
1.是一种线性数据结构
2.只能从一端添加元素,也只能从一端取出元素。
3.这一端称为栈顶。
4.应用:1.编辑器撤销
2.程序调用的系统栈
数组:
1.特点:快速查询,最好应用于“索引有语义”的情况
2.时间复杂度:
增:O(n)
删:O(n)
改:已知索引:O(1),未知索引:O(n)
查:已知索引:O(1),未知索引:O(n)