次の日----- -----
小さな灰色のロードマップは次のとおりです。
ダイクストラのアルゴリズムを使用してテーブルから最初のステップは、頂点A、互いに頂点までの最短距離から決定されます。
第二のステップは、頂点Bから得られたダイクストラ法、他の各頂点までの最短距離を引き続き使用します。
頂点C、各頂点までの最短距離から始まる第3の工程と、。
頂点Dから始まる第四工程、......
.......
このように、それは頂点Gにトラバースされました
このアイデアの時間複雑さはどのくらいですか?
n個の頂点がグラフ内にある場合、最適化を考慮せずにヒープは、ダイクストラの時間複雑度はO(N ^ 2)です。したがって、各頂点に、再びO(N ^ 3)の全体的な時間計算量を算出します。
------------
栗の場合:
頂点Cと頂点エッジグラフを直接それらの間の直線距離が無限大に接続されていません。
、次いでからCへの最短パスがABCである「トップリレー」としてB場合、最短距離は、2 + 3 = 5です。
別の栗を取ります:
頂点Aと頂点Cを直接図形に接続され、距離が6です。しかし、 "バイパス" パスABCの存在は、距離は2 + 3 = 5 <6です。
したがって、中継頂点Bの後、からCまでの最短距離が5であってもよいです。
以下の詳細な手順フロイドのアルゴリズムは、私たちは見てみましょう。
1.フロイドのアルゴリズムを実現するために、我々は最初の重み付きグラフの隣接行列を構築する必要があります。
隣接行列のうち、それぞれの番号が別の頂点に一つの頂点からの直線距離を示し、距離継電器は、任意の頂点に関連していません。
このとき2.のみリレー、それからなるものの頂点間の距離と、頂点Aの頂点を可能にすると仮定?
BとCとの間の距離は、この場合、リレーAにおいて、距離AB + AC距離=距離を短く、本来無限大でした
5 + 2 = 7。
(オレンジ、他の一時的な頂点を頂点Aからの距離を表す)は、対応する行列要素を更新します。
3.次に、中継頂点と頂点A、Bへ、それからなるものの頂点間の距離?
AとDの間の距離は、Bは、ABはBD = + 5 + 1 = 6からの距離である距離を短くするために、リレーケースで、本来無限大です。
A及びE本来無限大との間の距離、Bは、リレーケースで、BE AB =距離+ 5 + 6 = 11の距離を短くします。
(オレンジ、他の一時的な頂点を頂点Bからの距離を表す)は、対応する行列要素を更新します。
次に頂点中継頂点としてA、B、Cに4.次に、それからなるものの頂点間の距離?
A和F之间的距离原本是无穷大,此时以C为中继,距离缩短为AC距离+CF距离=2+8=10。
更新对应矩阵元素(橙色区域代表顶点C到其他顶点的临时距离):
.........
.........
以此类推,我们不断引入新的中继顶点,不断刷新矩阵中的临时距离。
最终,当所有顶点都可以作为中继顶点时,我们的距离矩阵更新如下:
此时,矩阵中每一个元素,都对应着某顶点到另一个顶点的最短距离。
为什么这么说呢?让我们回顾一下动态规划的两大要素:
问题的初始状态
问题的状态转移方程式
对于寻找图的所有顶点之间距离的问题,初始状态就是顶点之间的直接距离,也就是邻接矩阵。
而问题的状态转移方程式又是什么呢?
假设新引入的中继顶点是n,那么:
顶点i 到 顶点j 的新距离 = Min(顶点i 到 顶点j 的旧距离,顶点i 到 顶点n 的距离+顶点n 到 顶点j 的距离)
final static int INF = Integer.MAX_VALUE;
public static void floyd(int[][] matrix){
//循环更新矩阵的值
for(int k=0; k<matrix.length; k++){
for(int i=0; i<matrix.length; i++){
for(int j=0; j<matrix.length; j++){
if(matrix[i][k] == INF || matrix[k][j] == INF) {
continue;
}
matrix[i][j] = Math.min(matrix[i][j], matrix[i][k] + matrix[k][j]);
}
}
}
// 打印floyd最短路径的结果
System.out.printf("最短路径矩阵: \n");
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++)
System.out.printf("%3d ", matrix[i][j]);
System.out.printf("\n");
}
}
public static void main(String[] args) {
int[][] matrix = {
{0, 5, 2, INF, INF, INF, INF},
{5, 0, INF, 1, 6, INF, INF},
{2, INF, 0, 6, INF, 8, INF},
{INF, 1, 6, 0, 1, 2, INF},
{INF, 6, INF, 1, 0, INF, 7},
{INF, INF, 8, 2, INF, 0, 3},
{INF, INF, INF, INF, 7, 3, 0}
};
floyd(matrix);
}
如何在短时间内成为Python工程师?
文章来自小灰,小灰的《漫画算法》上市后销量疯涨,出版社加印了好几次!占据各大电商图书板块第一位!
扫码查看详情
小灰把两年多以来积累的漫画作品进行了筛选和优化,并加上了一些更为基础和系统的入门章节,最终完成了本书的六大篇章:
第一章 算法概述
介绍了算法和数据结构的相关概念,告诉大家算法是什么,数据结构又是什么,它们有哪些用途,如何分析时间复杂度,如何分析空间复杂度。
第二章 数据结构基础
介绍了最基本的数据结构,包括数组、链表、栈、队列、哈希表的概念和读写操作。
第三章 树
介绍了树和二叉树的概念、二叉树的各种遍历方式、二叉堆和优先队列的应用。
第四章 排序算法
介绍了几种典型的排序算法,包括冒泡排序、快速排序、堆排序、计数排序、桶排序。
第五章 面试中的算法
介绍了10余道职场上流行的算法面试题及详细的解题思路。例如怎样判断链表有环、怎样计算大整数相加等。
第六章 算法的实际应用
このような使用のLRUアルゴリズムとして職場におけるアルゴリズムのいくつかの用途は、これにユーザ特性をビットマップとする統計的アルゴリズムを使用して、コールドデータを除去します。
この本は、フルカラー印刷システム、本の各章、各セクション、各単語、各チャート、コードの各行で、よく磨かの少し灰色と編集者だった、と最も簡単に使用するために努力します知識を理解するために話をする方法は、徹底したと言います。
スキャンコードまたは元の購入を読むためにクリック
ああまた、クーポンを受け取ることができるマイクロチャネルのスタッフの下に追加します。
コードブックストアは需要がある場合CSDNは、ここでは技術的な本をたくさん提供し、お客様に店舗捧げされているブックに加えて、我々はまた、などのヘッドセット、キーボード、などの生活習慣の製品を、提供、またはあなたもコードブックストアに連絡することができます顧客サービスやあなたが公の場で製品番号を必要とするメッセージを残すには、我々は、ああ、みんなのニーズを満たすためにしてみてください。
コードブックストアの運営スタッフとして、私たちの「にあなたを招待しCSDNコードブック福祉グループ」、グループは、時間から時間にあなたを与えるだろう、書籍、クーポンに本をなど、推薦図書や物流情報があることはカウンセリングのグループでもご覧になれます〜グループは100人でいっぱいで、グループの下に掃引する必要が現時点では、マイクロ文字Fanger魏のコードを追加するグループにあなたを引っ張ってくださいああ〜