算法第四版- 4.4 && 5.1
4.4最短路径
5.1 字符串排序
文章目录
1.Dijkstra && Floyd &&SPFA
Dijkstra漫画
Dijkstra算法进阶漫画
Floyd漫画
上面是漫画,下面是解析和代码实现,解析写的也很好。
三种算法解析以及其代码实现!!
2.拓扑排序
无环加权有向图的最短路径算法采用了拓扑排序
private void relax(EdgeWeightedDigraph G, int v) {
for (DirectedEdge e : G.adj(v)) {
int w = e.to();
if (distTo[w] > distTo[v] + e.weight()) {
distTo[w] = distTo[v] + e.weight();
edgeTo[w] = e;
}
}
}
最主要的就是
AcyclicSP(EdgeWeightedDigraph G,int s)
{
/**/
Topological top=new Topological(G);
for(int v:top.order()) relax(G,v);
/**/
}
3.关键路径
就是最长路径
按照拓扑顺序放松顶点,就能在和E+V成正比的时间内解决无环加权有向图的单点最短路径问题.同理,要解决无环加权有向图的最长路径问题,只需将原图中所有边的权重变为负值,再求最短路径即可.
4.套汇
套汇问题等价于加权有向图中的负权重环的检测问题.
总结:
5. 字符串排序
1) LSD(低位优先)
和基数排序类似,不过只能解决定长的字符串排序
2)MSD(高位优先)
先统计频率,比如a开头的有俩,b开头的有俩,s开头的有8个,t开头的有4个。
然后直接对数组切分,遇到字符串直接塞到对应的区间去。
所以是稳定的。
3)三向快速排序
快速排序就是归并+递归的感觉。
三向是分为等于,小于,大于三种。
三向字符串快速排序:根据键的首字母进行三向切分,仅在中间子数组的中的下一个字符继续递归排序.它能够很好地处理等值键,有较长公共前缀的键,取值范围较小的键和小数组.另外它不需要额外的空间.