Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
アルゴリズムのお勉強
兼 前期末対策
※注意書き
• 確実にテスト対策になる確証はありません
• あくまでお勉強用です
• テスト範囲やノートを参考にしています
• あと変なノリが含まれます
• あと、責任は取りません…というか取れません
それでもいいなら進めていってください。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
まずテスト範囲から
そのテスト内容の考察です。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
配列、キュー、スタックについての特徴、
これは表にまとめて暗記ですね。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
もっといえばそれをC言語で実装する方法、
さすがにそこまでは出ないかもしれません。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
次に、マージソートに適するデータ構造。
データ構造の特徴から考えていきます。
理由...
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
次にグラフに入ります。
頂点SからV-U内の頂点の
重み最小な道の長さです。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
これは定義として覚えておいて、
求めるならば、総当たりで求めてください。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
補題は基本暗記でどうぞ。
一応解説はしてますが…
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• w(s, V-U)
• 補題1
• 補題2
• ダイクストラのアルゴリズム
ダイクストラは解き方中心に覚えましょう。
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
まず、データ構造の説明から。
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
配列は言わずと知れたデータ構造です。
添字でどこでも好きな値を
変更す...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
配列は末尾、つまりデータがないところに
簡単にデータを追加することがで...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
同様にデータの削除は末尾のみ可能です。
例えば、真ん中削除しちゃうと穴...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
先頭の削除もそういうわけで苦手です。
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
次にスタックです。
スタックは後入先出、先入後出です。
ちょうど積み上...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
配列で実装した場合は末尾に追加していき、
末尾から取り出します。
つま...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
連結リストの場合は
ポインタを使ったリスト構造です。
これは先頭の追加...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
結局のところスタックというデータ構造は、
後から追加したデータを先に処...
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
最後にキューです。
これは先入先出。
先に並んだ方が先に出ていきます。
データ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
つまり末尾に並んで先頭から出ていく、先に
並ぶと先に処理される、簡単で...
マージソートに適しているデータ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
マージソートに適しているデータ構造ですが、
こ...
マージソートに適しているデータ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
理由としては、マージソートの併合の時、
先頭(...
マージソートに適しているデータ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
つまり先入先出というデータ構造が
マージソート...
マージソートに適しているデータ構造
• 配列
末尾の追加、削除◎
先頭の削除×
• スタック
(配列) 末尾の追加、削除◎
(連結リスト) 先頭の追加、削除◎
• キュー
末尾の追加、先頭の削除◎
ということで、次はグラフに参ります。
w(s, V-U)
さて問題のこの式。
まずはグラフで見てみましょう。
V
w(s, V-U)
この集合はグラフVの頂点です。
V
w(s, V-U)
その中にスタート地点である、
頂点sを決めます。
s
V
w(s, V-U)
ではそのsのみを区切って分けてみます。
左がUで、U
s
V
w(s, V-U)
右はVからUを除いたものとなるので、
V-Uと表現することができます。U
s
V
V-U
w(s, V-U)
このときw(s, V-U)は右の集合の中で、
一番重みが小さい頂点の重みを返します。U
s
V
V-U
w(s, V-U)
仮にこの様になっていた場合は、
1が最小の重みですね。U
s
V
V-U
1
3
w(s, V-U)
では、その重み最小の頂点を追加すると、
Uに追加されて境界線が変わります。U
s
V
V-U
1
3
1
w(s, V-U)
w(s, V-U)の対象となる頂点は2つですが…
今回は上の2(1+1)が出てきます。U
s
V
V-U
1
3
1
w(s, V-U)
そんな感じでどんどん追加していきます。
U
s
V
V-U
1
3
1
3
4
w(s, V-U)
どんどん追加…
U
s
V
V-U
1
3
1
3
4
1
w(s, V-U)
とりあえず途中だけどここまで。
U
s
V
V-U
1
3
1
3
4
1
3
補題1
では補題1について説明します。
U
s
V
V-U
1
3
1
3
4
1
3
補題1
補題1の内容はこうですね。
要約すると、z以外はUに属する、
ということを言ってます。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
補題1
先ほどのグラフで言えば…
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
4
1
3
補題1
新しく追加する頂点(赤色)への道は
すべてUに含まれるということです。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
...
補題1
例えばこの赤い頂点の場合、
黄色の頂点はすべてUに含まれますね。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3...
補題1
背理法を使って証明していきます。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
4
1
3
補題1
まず、vkまでUに属さない点が
存在したと仮定します。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
...
補題1
点x, yとして追加します。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
4
1
3
x
y
補題1
距離は合わせて3になるように、
それぞれの辺の重みは1とします。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3...
補題1
さて、どうしてこれがダメなのでしょうか?
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
4
1
3
x...
x
補題1
あ、赤い頂点より頂点xの方がw(s, V-U)の値、
つまりU以外、V-Uの中で
一番最小な重みを持つ頂点となります。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2...
x
補題1
これは仮定と異なりますね。
つまり…
こういう頂点は存在してはいけないのです。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
...
x
補題1
ということで、補題1は成り立ちますね。
• w(s, V-U)を表す道を
P=s, v1, v2, …, vk, zとする。
このときs, v1, v2, …, vk ∈ Uである。
U
s
V
V-U
1
3
1
3
4
1
3
...
補題2
次に補題2です。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
補題2
簡単に言えば…
新しく追加される重み最小の道は、
一手前も重み最小の道ということです。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
補題2
同様にこのグラフでやってみましょう。
赤い道が今回の重み最小道です。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
補題2
補題が正しいならば、
一手前の赤い道は重み最小のはずです。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
補題2
じゃあ、こういう辺が存在していいの?
という問題になります。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
1
補題2
これも背理法で証明できます。
つまりこの辺が存在したら?と仮定。
といっても、非常に簡単で…
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
1
補題2
こっちの方が短いならば、
重み最小道はこちらになるはずです。
つまりw(s, V-U)は変化してしまいます。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
...
補題2
つまり存在したらw(s, V-U)は変わっちゃう、
存在すると矛盾が起きる…ということで、
背理法証明完了です。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
...
補題2
日本語難しい…です。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
1
補題2
ダイクストラのアルゴリズムでは、
補題1, 補題2を利用しています。
• 先ほどの補題1に続き、
s, v1, v2, …, vkは重み最小のs-vk道
である。
U
s
V
V-U
1
3
1
3
4
1
3
1
ダイクストラのアルゴリズム
• グラフの重み最小道を見つける
→重み1とすれば最小距離でも可 さて、そういうことでメインである、
ダイクストラのアルゴリズムについて
解説していきます。
ダイクストラのアルゴリズム
• グラフの重み最小道を見つける
→重み1とすれば最小距離でも可 ちなみにダイクストラのアルゴリズムは
貪欲法の一種。
効率の良いところ貪欲的に支配するもの也。
ダイクストラのアルゴリズム
• グラフの重み最小道を見つける
→重み1とすれば最小距離でも可 よく重要!
って言われるのはなぜでしょう?
グラフの最短経路って何に使わる?
ダイクストラのアルゴリズム
• グラフの重み最小道を見つける
→重み1とすれば最小距離でも可
有名なところで
ネットワークのルーティングがあげられます。
ダイクストラのアルゴリズム
• グラフの重み最小道を見つける
→重み1とすれば最小距離でも可
あとはゲームのAIが
最短経路を探したりとか…でしょうか。
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
では例題でも解いてみましょう。
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
大事になってくるこの表記はおさらいです。
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
Uはsから始まり、
徐々に大きくなる確定した集合です。
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
Uは確定の最短距離dがあります。
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
次にWはUに隣接するU以外の集合です。
つまりまだUではないけど隣接しているので、
次の...
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
Wは暫定ですが最短距離を持ち、
これをtmpとします。
なおtmpは更新されることがあり...
ダイクストラのアルゴリズム
• U:すでに最短距離が決まっている集合
• W:Uに隣接するU以外の集合
• d:確定の最短距離
• tmp:暫定の最短距離
更新されるタイミングは、
別の隣接頂点が見つかった時、です。
ダイクストラのアルゴリズム
ということで例題でも解いてみましょう。
a
b
c
f
e
d
1
1
2
2
3
8
6
ダイクストラのアルゴリズム
a→eの最短経路を求めてみましょう。
a
b
c
f
e
d
1
1
2
2
3
8
6
ダイクストラのアルゴリズム
とりあえずスタート地点はaなので、
Uとして囲みます。
a
b
c
f
e
d
1
1
2
2
3
8
U
6
ダイクストラのアルゴリズム
Aの距離は0ですね。
よってd=0です。
a
b
c
f
e
d
1
1
2
2
3
8
U d=0
6
ダイクストラのアルゴリズム
次に隣接しているWを求めて囲みます。
W={b, d, f}ですね。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
ダイクストラのアルゴリズム
tmpは単純に辺の重みでいいですね。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
tmp=1
tmp=6
tmp=2
ダイクストラのアルゴリズム
tmpが最小だったbをUに追加して…
各々の項目を更新します。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
tmp=6
tmp=2
tmp=2
ダイクストラのアルゴリズム
今回tmpの値を更新するものはないですね。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
tmp=6
tmp=2
tmp=2
ダイクストラのアルゴリズム
次の最短経路ですが…
tmp=2が2つあります。
どちらでもいいですが若いcを選びましょう。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
tmp=6
tmp=2
tmp=2
ダイクストラのアルゴリズム
cが追加されて…
dのtmpが更新されることに
気をつけてください。
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
tmp=4
tmp=2
d=2
ダイクストラのアルゴリズム
あとは同様にfが追加されて…
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
tmp=4
d=2
d=2
tmp=10
ダイクストラのアルゴリズム
dが追加されて…
(tmpが更新されていることの注意)
a
b
c
f
e
d
1
1
2
2
3
8
U
W
d=0
6
d=1
d=4
d=2
d=2
tmp=7
ダイクストラのアルゴリズム
最後にeを追加して終了です。
a
b
c
f
e
d
1
1
2
2
3
8
U d=0
6
d=1
d=4
d=2
d=2
d=7
ダイクストラのアルゴリズム
a→eの最短経路は
a, b, c, d, eとなり
その重みは7となりますね。
a
b
c
f
e
d
1
1
2
2
3
8
U d=0
6
d=1
d=4
d=2
d=2
d=7
ダイクストラのアルゴリズム
とりあえず留意点は、
色分けで落ち着いて丁寧に解く、
更新を忘れない…ぐらいでしょうか。
a
b
c
f
e
d
1
1
2
2
3
8
U d=0
6
d=1
d=4
d=2
d=2
d=7
疑似言語
さて、疑似言語の説明は必要でしょうか?
簡単にですが先ほどの手順と関連付けます。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <...
疑似言語
ここで、スタート地点のsをUに入れます。
図で言えばaの追加に対応します。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {...
疑似言語
ループの条件ですが、
Vの中身すべてがUに追加されていないとき、
つまりU!=Vの時ですね。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← ...
疑似言語
これが黄色で囲んでいる集合Wとなります。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != ...
疑似言語
Wの中身すべてに対して…
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 |...
疑似言語
tmpを求めます。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと...
疑似言語
補題よりこの式が
aからの暫定最小経路になりますね。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while...
疑似言語
そして、tmpが最小となるものが
追加される頂点です。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 whil...
疑似言語
aからの最短経路dを確定して、
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
...
疑似言語
Uに追加します。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣...
疑似言語
そして辺を追加します。
最短となる辺を追加すればいいわけです。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 ...
疑似言語
ということで…
ループ条件まで繰り返せば完了です。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while ...
以上
こんなものでしょうか、
テスト範囲網羅できてる自信ないです。
以上
誤字脱字、間違えてたらごめんなさい。
以上
以上簡単ですが、
アルゴリズムのお勉強となります。
教科書
• アルゴリズムとデータ構造 数理工学社 藤田 聡 2013/3/10
教科書のため、ところどころ引用になってる場所があります
立ち絵素材
• 臼井の会様 http://usui.moo.jp/frame2.html
ご視聴ありがとうございました。
頑張ってくださいね。
Nächste SlideShare
Wird geladen in …5
×

アルゴリズムのお勉強 ダイクストラ

主に勉強用のスライド
アルゴリズムとデータ構造について
・配列/スタック/キュー
・ダイクストラのアルゴリズム
立ち絵素材 臼井の会様

  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

アルゴリズムのお勉強 ダイクストラ

  1. 1. アルゴリズムのお勉強 兼 前期末対策
  2. 2. ※注意書き • 確実にテスト対策になる確証はありません • あくまでお勉強用です • テスト範囲やノートを参考にしています • あと変なノリが含まれます • あと、責任は取りません…というか取れません それでもいいなら進めていってください。
  3. 3. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム まずテスト範囲から そのテスト内容の考察です。
  4. 4. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム 配列、キュー、スタックについての特徴、 これは表にまとめて暗記ですね。
  5. 5. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム もっといえばそれをC言語で実装する方法、 さすがにそこまでは出ないかもしれません。
  6. 6. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム 次に、マージソートに適するデータ構造。 データ構造の特徴から考えていきます。 理由を含めて暗記でいいかと。
  7. 7. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム 次にグラフに入ります。 頂点SからV-U内の頂点の 重み最小な道の長さです。
  8. 8. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム これは定義として覚えておいて、 求めるならば、総当たりで求めてください。
  9. 9. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム 補題は基本暗記でどうぞ。 一応解説はしてますが…
  10. 10. はじめにテスト範囲の考察 • キューとスタック →マージソートで最適なデータ構造 • w(s, V-U) • 補題1 • 補題2 • ダイクストラのアルゴリズム ダイクストラは解き方中心に覚えましょう。
  11. 11. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ まず、データ構造の説明から。
  12. 12. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 配列は言わずと知れたデータ構造です。 添字でどこでも好きな値を 変更することができます。
  13. 13. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 配列は末尾、つまりデータがないところに 簡単にデータを追加することができます。
  14. 14. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 同様にデータの削除は末尾のみ可能です。 例えば、真ん中削除しちゃうと穴が空きます。 詰めるのめんどくさい…つまり苦手。
  15. 15. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 先頭の削除もそういうわけで苦手です。
  16. 16. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 次にスタックです。 スタックは後入先出、先入後出です。 ちょうど積み上げたものを崩す感じです。
  17. 17. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 配列で実装した場合は末尾に追加していき、 末尾から取り出します。 つまりこれが末尾の追加と削除です。
  18. 18. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 連結リストの場合は ポインタを使ったリスト構造です。 これは先頭の追加、削除になります。
  19. 19. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 結局のところスタックというデータ構造は、 後から追加したデータを先に処理する、 という考え方になりますね。
  20. 20. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 最後にキューです。 これは先入先出。 先に並んだ方が先に出ていきます。
  21. 21. データ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ つまり末尾に並んで先頭から出ていく、先に 並ぶと先に処理される、簡単ですね。
  22. 22. マージソートに適しているデータ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ マージソートに適しているデータ構造ですが、 これはキューですね。
  23. 23. マージソートに適しているデータ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ 理由としては、マージソートの併合の時、 先頭(小)をとりだして、末尾(さらに小)の キューに追加していくからです。
  24. 24. マージソートに適しているデータ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ つまり先入先出というデータ構造が マージソートに適していることになります。
  25. 25. マージソートに適しているデータ構造 • 配列 末尾の追加、削除◎ 先頭の削除× • スタック (配列) 末尾の追加、削除◎ (連結リスト) 先頭の追加、削除◎ • キュー 末尾の追加、先頭の削除◎ ということで、次はグラフに参ります。
  26. 26. w(s, V-U) さて問題のこの式。 まずはグラフで見てみましょう。 V
  27. 27. w(s, V-U) この集合はグラフVの頂点です。 V
  28. 28. w(s, V-U) その中にスタート地点である、 頂点sを決めます。 s V
  29. 29. w(s, V-U) ではそのsのみを区切って分けてみます。 左がUで、U s V
  30. 30. w(s, V-U) 右はVからUを除いたものとなるので、 V-Uと表現することができます。U s V V-U
  31. 31. w(s, V-U) このときw(s, V-U)は右の集合の中で、 一番重みが小さい頂点の重みを返します。U s V V-U
  32. 32. w(s, V-U) 仮にこの様になっていた場合は、 1が最小の重みですね。U s V V-U 1 3
  33. 33. w(s, V-U) では、その重み最小の頂点を追加すると、 Uに追加されて境界線が変わります。U s V V-U 1 3 1
  34. 34. w(s, V-U) w(s, V-U)の対象となる頂点は2つですが… 今回は上の2(1+1)が出てきます。U s V V-U 1 3 1
  35. 35. w(s, V-U) そんな感じでどんどん追加していきます。 U s V V-U 1 3 1 3 4
  36. 36. w(s, V-U) どんどん追加… U s V V-U 1 3 1 3 4 1
  37. 37. w(s, V-U) とりあえず途中だけどここまで。 U s V V-U 1 3 1 3 4 1 3
  38. 38. 補題1 では補題1について説明します。 U s V V-U 1 3 1 3 4 1 3
  39. 39. 補題1 補題1の内容はこうですね。 要約すると、z以外はUに属する、 ということを言ってます。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。
  40. 40. 補題1 先ほどのグラフで言えば… • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3
  41. 41. 補題1 新しく追加する頂点(赤色)への道は すべてUに含まれるということです。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3
  42. 42. 補題1 例えばこの赤い頂点の場合、 黄色の頂点はすべてUに含まれますね。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3
  43. 43. 補題1 背理法を使って証明していきます。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3
  44. 44. 補題1 まず、vkまでUに属さない点が 存在したと仮定します。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3
  45. 45. 補題1 点x, yとして追加します。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 x y
  46. 46. 補題1 距離は合わせて3になるように、 それぞれの辺の重みは1とします。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 x y 1 11
  47. 47. 補題1 さて、どうしてこれがダメなのでしょうか? • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 x y 1 11
  48. 48. x 補題1 あ、赤い頂点より頂点xの方がw(s, V-U)の値、 つまりU以外、V-Uの中で 一番最小な重みを持つ頂点となります。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 y 1 11
  49. 49. x 補題1 これは仮定と異なりますね。 つまり… こういう頂点は存在してはいけないのです。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 y 1 11
  50. 50. x 補題1 ということで、補題1は成り立ちますね。 • w(s, V-U)を表す道を P=s, v1, v2, …, vk, zとする。 このときs, v1, v2, …, vk ∈ Uである。 U s V V-U 1 3 1 3 4 1 3 y 1 11
  51. 51. 補題2 次に補題2です。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。
  52. 52. 補題2 簡単に言えば… 新しく追加される重み最小の道は、 一手前も重み最小の道ということです。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。
  53. 53. 補題2 同様にこのグラフでやってみましょう。 赤い道が今回の重み最小道です。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3
  54. 54. 補題2 補題が正しいならば、 一手前の赤い道は重み最小のはずです。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3
  55. 55. 補題2 じゃあ、こういう辺が存在していいの? という問題になります。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  56. 56. 補題2 これも背理法で証明できます。 つまりこの辺が存在したら?と仮定。 といっても、非常に簡単で… • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  57. 57. 補題2 こっちの方が短いならば、 重み最小道はこちらになるはずです。 つまりw(s, V-U)は変化してしまいます。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  58. 58. 補題2 つまり存在したらw(s, V-U)は変わっちゃう、 存在すると矛盾が起きる…ということで、 背理法証明完了です。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  59. 59. 補題2 日本語難しい…です。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  60. 60. 補題2 ダイクストラのアルゴリズムでは、 補題1, 補題2を利用しています。 • 先ほどの補題1に続き、 s, v1, v2, …, vkは重み最小のs-vk道 である。 U s V V-U 1 3 1 3 4 1 3 1
  61. 61. ダイクストラのアルゴリズム • グラフの重み最小道を見つける →重み1とすれば最小距離でも可 さて、そういうことでメインである、 ダイクストラのアルゴリズムについて 解説していきます。
  62. 62. ダイクストラのアルゴリズム • グラフの重み最小道を見つける →重み1とすれば最小距離でも可 ちなみにダイクストラのアルゴリズムは 貪欲法の一種。 効率の良いところ貪欲的に支配するもの也。
  63. 63. ダイクストラのアルゴリズム • グラフの重み最小道を見つける →重み1とすれば最小距離でも可 よく重要! って言われるのはなぜでしょう? グラフの最短経路って何に使わる?
  64. 64. ダイクストラのアルゴリズム • グラフの重み最小道を見つける →重み1とすれば最小距離でも可 有名なところで ネットワークのルーティングがあげられます。
  65. 65. ダイクストラのアルゴリズム • グラフの重み最小道を見つける →重み1とすれば最小距離でも可 あとはゲームのAIが 最短経路を探したりとか…でしょうか。
  66. 66. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 では例題でも解いてみましょう。
  67. 67. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 大事になってくるこの表記はおさらいです。
  68. 68. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 Uはsから始まり、 徐々に大きくなる確定した集合です。
  69. 69. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 Uは確定の最短距離dがあります。
  70. 70. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 次にWはUに隣接するU以外の集合です。 つまりまだUではないけど隣接しているので、 次の一手でつながるかも~な集合です。
  71. 71. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 Wは暫定ですが最短距離を持ち、 これをtmpとします。 なおtmpは更新されることがあります。
  72. 72. ダイクストラのアルゴリズム • U:すでに最短距離が決まっている集合 • W:Uに隣接するU以外の集合 • d:確定の最短距離 • tmp:暫定の最短距離 更新されるタイミングは、 別の隣接頂点が見つかった時、です。
  73. 73. ダイクストラのアルゴリズム ということで例題でも解いてみましょう。 a b c f e d 1 1 2 2 3 8 6
  74. 74. ダイクストラのアルゴリズム a→eの最短経路を求めてみましょう。 a b c f e d 1 1 2 2 3 8 6
  75. 75. ダイクストラのアルゴリズム とりあえずスタート地点はaなので、 Uとして囲みます。 a b c f e d 1 1 2 2 3 8 U 6
  76. 76. ダイクストラのアルゴリズム Aの距離は0ですね。 よってd=0です。 a b c f e d 1 1 2 2 3 8 U d=0 6
  77. 77. ダイクストラのアルゴリズム 次に隣接しているWを求めて囲みます。 W={b, d, f}ですね。 a b c f e d 1 1 2 2 3 8 U W d=0 6
  78. 78. ダイクストラのアルゴリズム tmpは単純に辺の重みでいいですね。 a b c f e d 1 1 2 2 3 8 U W d=0 6 tmp=1 tmp=6 tmp=2
  79. 79. ダイクストラのアルゴリズム tmpが最小だったbをUに追加して… 各々の項目を更新します。 a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 tmp=6 tmp=2 tmp=2
  80. 80. ダイクストラのアルゴリズム 今回tmpの値を更新するものはないですね。 a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 tmp=6 tmp=2 tmp=2
  81. 81. ダイクストラのアルゴリズム 次の最短経路ですが… tmp=2が2つあります。 どちらでもいいですが若いcを選びましょう。 a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 tmp=6 tmp=2 tmp=2
  82. 82. ダイクストラのアルゴリズム cが追加されて… dのtmpが更新されることに 気をつけてください。 a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 tmp=4 tmp=2 d=2
  83. 83. ダイクストラのアルゴリズム あとは同様にfが追加されて… a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 tmp=4 d=2 d=2 tmp=10
  84. 84. ダイクストラのアルゴリズム dが追加されて… (tmpが更新されていることの注意) a b c f e d 1 1 2 2 3 8 U W d=0 6 d=1 d=4 d=2 d=2 tmp=7
  85. 85. ダイクストラのアルゴリズム 最後にeを追加して終了です。 a b c f e d 1 1 2 2 3 8 U d=0 6 d=1 d=4 d=2 d=2 d=7
  86. 86. ダイクストラのアルゴリズム a→eの最短経路は a, b, c, d, eとなり その重みは7となりますね。 a b c f e d 1 1 2 2 3 8 U d=0 6 d=1 d=4 d=2 d=2 d=7
  87. 87. ダイクストラのアルゴリズム とりあえず留意点は、 色分けで落ち着いて丁寧に解く、 更新を忘れない…ぐらいでしょうか。 a b c f e d 1 1 2 2 3 8 U d=0 6 d=1 d=4 d=2 d=2 d=7
  88. 88. 疑似言語 さて、疑似言語の説明は必要でしょうか? 簡単にですが先ほどの手順と関連付けます。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  89. 89. 疑似言語 ここで、スタート地点のsをUに入れます。 図で言えばaの追加に対応します。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  90. 90. 疑似言語 ループの条件ですが、 Vの中身すべてがUに追加されていないとき、 つまりU!=Vの時ですね。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  91. 91. 疑似言語 これが黄色で囲んでいる集合Wとなります。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  92. 92. 疑似言語 Wの中身すべてに対して… Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  93. 93. 疑似言語 tmpを求めます。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  94. 94. 疑似言語 補題よりこの式が aからの暫定最小経路になりますね。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  95. 95. 疑似言語 そして、tmpが最小となるものが 追加される頂点です。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  96. 96. 疑似言語 aからの最短経路dを確定して、 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  97. 97. 疑似言語 Uに追加します。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  98. 98. 疑似言語 そして辺を追加します。 最短となる辺を追加すればいいわけです。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  99. 99. 疑似言語 ということで… ループ条件まで繰り返せば完了です。 Input : G = (V, E), V上の頂点S Output : s 始点とするGの最短経路木T 0 Tを初期化する; 1 ds ← 0; U <- {s}; 2 while U != V do 3 | Uと隣接しているV-U中の頂点の集合をwとする; 4 | foreach u ∈ W do 5 | | tmp ← min v∈U { dv + C(v, u) }; 6 | end 7 | Wの中で最小の暫定距離を持つ頂点uを選択する; 8 | du ← tmpuとし、uをUに追加する; 9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、 頂点wと辺{w, u}をTに追加する; 10 end
  100. 100. 以上 こんなものでしょうか、 テスト範囲網羅できてる自信ないです。
  101. 101. 以上 誤字脱字、間違えてたらごめんなさい。
  102. 102. 以上 以上簡単ですが、 アルゴリズムのお勉強となります。
  103. 103. 教科書 • アルゴリズムとデータ構造 数理工学社 藤田 聡 2013/3/10 教科書のため、ところどころ引用になってる場所があります
  104. 104. 立ち絵素材 • 臼井の会様 http://usui.moo.jp/frame2.html
  105. 105. ご視聴ありがとうございました。 頑張ってくださいね。

×