- 高校数学の質問スレPart397 [無断転載禁止]©2ch.net [無断転載禁止]©2ch.net
552 :132人目の素数さん[]:2017/01/03(火) 08:54:02.14 ID:AKcpk3pA - なんか正しさの証明を書いてみると簡単なことなのに長くなりますね。
もし、間違っていたら指摘してください。 http://imgur.com/PDx2vmZ.jpg http://imgur.com/DbMiSz5.jpg ダイクストラのアルゴリズムは↑のものとします。 節点 s から、ある節点 i への最短経路が存在するとき、その長さを td(i) で表わすことにする。 i への経路、したがって最短経路が存在しないときには、 td(i) = ∞ とする。 ステップ(1)で選ばれる節点 v ∈ V - S に対して、 d(v) = td(v) が成り立つことを数学的帰納法により、以下で証明する。 最初にステップ(1)が実行されるときを考える。 明らかに、 d(s) = td(s) = 0 が成り立つ。 k ≧ 1 とする。 第 1 回目から第 k 回目にステップ(1)が実行されるときに、いつもステップ(1)で選ばれる節点 v ∈ V - S に対して、 d(v) = td(v) が成り立つと仮定する。 第 (k+1) 回目にステップ(1)が実行されるときを考える。 このとき、明らかに #S = k であり、 ∀i ∈ S に対して、 d(i) = td(i) が成り立つ。 第 (k+1) 回目にステップ(1)が実行されるときに選ばれる節点を v ∈ V - S とする。 d(v) = ∞ である場合と d(v) ≠ ∞ である場合で場合分けして考える。 (1) d(v) = ∞ である場合。 td(v) ≠ d(v) = ∞ と仮定して矛盾を導く。 td(v) ≠ ∞ であるから、節点 s から節点 v への経路 s = v_0 → v_1 → … → v_(l-1) → v_l = v が存在する。 明らかに、 td(v_0), td(v_1), …, td(v_(l-1)), td(v_l) ≠ ∞ である。 v_0 ∈ S, v_l ∈ V - S であるから、 v_i ∈ S, v_(i+1) ∈ V - S となるような i が存在する。 ∀j ∈ V - S に対して、 d(j) = ∞ であるから、 d(v_(i+1)) = ∞ である。また、 v_i ∈ S であるから、 d(v_i) = td(v_i) ≠ ∞ が成り立つ。 v_i がステップ(2)で S に追加されたときのことを考えれば分かるように、 (v_i, v_(i+1)) ∈ E かつ v_(i+1) ∈ V - S であるから、 d(v_(i+1)) = ∞ ということはない。これは矛盾である。 よって、 d(v) = td(v) = ∞ が成り立つ。
|
- 高校数学の質問スレPart397 [無断転載禁止]©2ch.net [無断転載禁止]©2ch.net
553 :132人目の素数さん[]:2017/01/03(火) 08:54:37.29 ID:AKcpk3pA - (2) d(v) ≠ ∞ である場合。
td(v) ≠ d(v) と仮定して矛盾を導く。 ステップ(2)を考えれば明らかなように、 d(v) ≠ ∞ であるから、節点 s から節点 v への 最短経路 s = v_0 → v_1 → … → v_(l-1) → v_l = v が存在する。 よって、 td(v) ≠ ∞ である。 仮定により、 td(v) ≠ d(v) であるから、 td(v) < d(v) が成り立つ。 v_0 ∈ S, v_l ∈ V - S であるから、 v_i ∈ S, v_(i+1) ∈ V - S となるような i が存在する。 td(v_(i+1)) < d(v_(i+1)) である。なぜなら、もし、そうでないと仮定すると、 d(v_(i+1)) = td(v_(i+1)) であるが、 td(v_(i+1)) ≦ td(v) < d(v) であるから、 d(v_(i+1)) < d(v) となってしまい、ステップ(1)での v の 選ばれ方に矛盾するからである。 v_i ∈ S であるから、 d(v_i) = td(v_i) である。 v_i がステップ(2)で S に追加されたときのことを考えれば分かるように、 (v_i, v_(i+1)) ∈ E かつ v_(i+1) ∈ V - S であるから、 d(v_i) + a_(v_i v_(i+1)) ≧ d(v_(i+1)) である。 一方、明らかに、 td(v_i) + a_(v_i v_(i+1)) = td(v_(i+1)) であるから、 td(v_(i+1)) = td(v_i) + a_(v_i v_(i+1)) = d(v_i) + a_(v_i v_(i+1)) ≧ d(v_(i+1)) となるが、これは矛盾である。 よって、 td(v) = d(v) が成り立つ。 以上より、第 (k+1) 回目にステップ(1)が実行されるときにも、ステップ(1)で選ばれる節点 v ∈ V - S に対して、 d(v) = td(v) が成り立つ。 S に追加される節点はすべて、ステップ(1)で選ばれた 節点 v ∈ V - S であり、一度 S に追加された節点 v の d(v) はそれ以後、 変更されないから、ステップ(1)でアルゴリズムが終了したとき、 ∀i ∈ S = V に対して、 d(i) = td(i) が成り立つ。
|
- 高校数学の質問スレPart397 [無断転載禁止]©2ch.net [無断転載禁止]©2ch.net
554 :132人目の素数さん[]:2017/01/03(火) 08:56:47.41 ID:AKcpk3pA - プログラム板のスレッドで、
O((n-1)!) という書き方はしない。もしそう書いたとしても、それは、 O(n!) と同じものと言われたのですが、おかしいですよね? ある本では、 正定数 c, n0 が存在して、 n ≧ n0 のとき、 T(n) ≦ c*f(n) であるなら、 T(n) は O(f(n)) であるという と定義されています。 T(n) = n! f(n) = n! g(n) = (n-1)! とします。 このとき、明らかに、 T(n) は O(f(n)) ですが、 T(n) は O(g(n)) ではありません。
|
- 高校数学の質問スレPart397 [無断転載禁止]©2ch.net [無断転載禁止]©2ch.net
555 :132人目の素数さん[]:2017/01/03(火) 08:57:35.54 ID:AKcpk3pA - >>549
>>551 ありがとうございます。 解析概論に載っているんですか。
|
- 高校数学の質問スレPart397 [無断転載禁止]©2ch.net [無断転載禁止]©2ch.net
556 :132人目の素数さん[]:2017/01/03(火) 08:59:45.85 ID:AKcpk3pA - >>552-553
はダイクストラのアルゴリズムの正しさの証明です。
|