图系列&排序&效率优化[动态规划/贪心]&数学--算法过程及其意义

图系列

- 图存储
图
基于矩阵实现---适合稠密图
基于邻接链表实现---适合稀疏图
设结点数为N
设边数为M
稀疏还是稠密主要依据M和N*N关系界定.
一般M=N*N/2可界定为稠密.

- 图算法:深度搜索
算法:单一结点深度访问
算法描述:
对结点p的深度访问:

访问p
按分治方式对结点每个未被访问孩子执行深度访问

算法:图的深度访问
算法描述:
循环迭代:
从图中未被访问结点中选出一个p,对p执行单一结点深度访问
循环迭代的终止:
无法选出未被访问结点

算法解决的问题&性质:
单一结点深度访问时,可完成所有从结点可达结点的访问
且访问过程是下降,
下降到底依次上升一层执行兄弟结点访问这样一个动态过程

- 图算法:广度搜索
算法:单一结点广度访问
算法描述:
对结点p的广度访问:
p入队列
循环迭代:
出队列得到q.
对q访问.对q所有可达且尚未访问结点t执行入队列.
循环迭代的终止:
无结点可出队列

算法:图的广度访问
算法描述:
循环迭代:
从图中未被访问结点中选出一个p,对p执行单一结点广度访问
循环迭代的终止:
无法选出未被访问结点

算法解决的问题&性质:
单一结点广度访问时,可完成所有从结点可达结点的访问
且访问过程是一层一层,访问完一层,再访问下一层这样一个动态过程

- 图算法:最小生成树
最小生成树--prim和kruskal
prim基于结点迭代,更适合用于稠密图
kruskal基于边迭代,更适合用于稀疏图

算法:稠密图下用prim实现最小生成树求取算法
算法描述:

选择一个结点作为树的根结点
选择结点p已经在最小生成树中
对所有p可达结点更新结点距离最小生成树的距离
循环迭代:
从不在最小生成树的结点中选出距离树距离最小的结点t
对t可达且不在最小生成树中的结点更新其与最小生成树的距离

循环迭代的终止:
无法选出t或选出t到最小生成树的距离为无限
 
算法解决的问题&性质:
最小生成树用代价最小的边集合得到一个连通图中任意两点的方案
最小生成树算法存在的意义在于为无向连通图
找出一个代价最小的可连通图中任意两个顶点的方案
对不连通图,运行结果是返回失败

- 图算法:指定结点p到其余所有结点的最短路径Dijstra
指定结点到其余所有结点的最短路径
Dijstra算法,基于结点迭代

算法描述:
给定结点p
设p到p的最短路径为0
更新所有p可达且到p最短路径尚未确定结点到p的能达到的最短路径

循环迭代:
选择到p最短路径尚未确定结点中
到p能达到的最短路径最小的那个t.
t到p的最短路径变为确定.
对t可达且所有到p最短路径尚未确定结点
进行到p的能达到的最短路径的检测&更新

循环迭代的终止:
无法选出t

算法解决的问题&性质:
求取p到其余所有结点最短路径解决的是权重非负图,
p到每个结点一条最短路径
Dijstra算法产生的背景是为路由器充当结点的计算机网络中路由器
确定到其他路由器的最短路径并据此设置路由器的转发表
也属于基于结点的迭代

- 图算法:拓扑排序
算法描述:
对每个结点计算其入度
入度为0结点单独存入一个集合A

循环迭代:
选出一个入度为0结点p
更新所有从p可达且尚未处理结点p的入度,若入度变为0放入集合A

循环迭代终止:
无法选出入度为0节点

算法解决的问题&性质
如果结束时,所有结点已被处理,则按结点处理顺序产生的序列中,
前面结点可能有到达后面结点的路径,
而后面结点不可能有到达前面结点路径
如果结束时,仍有结点未被处理,则剩余未处理结点存在环路
拓扑排序可用于有向图的环路检测,
结点的可达与不可达性质也可用于解决特定问题

- 图算法:适合稀疏图的邻接表存储及求取最小生成树的Kruskal算法
图的邻接表存储---适合稀疏图
对稀疏图求解最小生成树更适合用Kruskal[基于边迭代]

对边按权重升序排序
依次处理每条边
若边的两个结点属于不同集合,执行集合合并.边被标记为选中.
若边的两个结点属于同一集合,略过

处理结束
若选中边数为N-1.
所有结点均属于同一集合.
求得最小生成树.
否则,无法求得最小生成树.

- 图算法:关键路径&关键结点
略
特定条件图,
对每个结点从s到e广度搜索得到每个结点最早完成时间
特定条件图逆转,
对从e到s每个结点广度搜索得到每个结点最晚完成时间
最早完成时间与最晚完成时间一致结点为关键结点.
关键结点间路径为关键路径.

排序

- 归并排序
划分,对划分后子问题执行归并排序
对两个有序子问题执行合并
时间效率稳定为O(Nlog(N))

- 快速排序
选出主元,按主元进行划分
划分后两个子问题执行快速排序
可能退化到O(N^2)
平均效率为O(Nlog(N))

- 基数排序
分配收集
[从最低位,
按最低位值对所有元素进行桶分配,按桶有序收集元素.
对收集后元素,
按次低位进行桶分配,再次按次低位的桶进行元素收集.

循环迭代,最高位收集完毕即完成排序]

适用场景受限,没有特殊需要使用快速排序/归并排序作元素排序即可

效率优化

- 动态规划
是针对运用分治的算法中,存在重复求解子问题现象下,
对已经求解的子问题进行记录,
求解一个子问题时,
先查询此问题是否已被求解,
来避免重复求解同一子问题的效率优化方法

- 贪心算法
是适合在每一步有多种选择,
每种选择后得到一个规模更小的同类问题.
可以尝试每种选择并得到一个结果,在归并选出最终结果.
但若问题满足某种性质,利用此性质,
可以在每一步只尝试一种选择,
这样的情况称为贪心算法.

数学

数学:
求素数:只能被1和其自身整除的数
最小公倍数,最大公约数
对a,b
有a*b=ab的最大公约数*ab的最小公倍数

求解ab的最大公约数[a >= b]
int temp1 = a;
int temp2 = b;

temp1 = b;
temp2 = a % b;

循环迭代的终止:
temp2为0
temp1为ab的最大公约数

你可能感兴趣的:(Algorithm,&,DataStruct,图系列,图算法,排序算法,动态规划,贪心)