Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
アルゴリズムのお勉強
兼 前期末対策
※注意書き
• 確実にテスト対策になる確証はありません
• あくまでお勉強用です
• テスト範囲やノートを参考にしています
• あと変なノリが含まれます
• あと、責任は取りません…というか取れません
それでもいいなら進めていってください。
はじめにテスト範囲の考察
• キューとスタック
→マージソートで最適なデータ構造
• 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
ご視聴ありがとうございました。
頑張ってくださいね。
Upcoming SlideShare
Loading in …5
×

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

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

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

  • Be the first to like this

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

  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. ご視聴ありがとうございました。 頑張ってくださいね。

    Be the first to comment

    Login to see the comments

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

Views

Total views

782

On Slideshare

0

From embeds

0

Number of embeds

3

Actions

Downloads

0

Shares

0

Comments

0

Likes

0

×