ここのアルゴリズムを考える †
ここの穴掘り法について考えていきましょう。
- 速い!でも102行ここには敵いません;; -- Charlotte 2005-05-28 11:36:15 (土) New!
- 早すぎorz何故早いのかここのを解読中です。--kz3 2005-05-28 12:08:25 (土) New!
- 現在管理人にソースの一部を掲載して議論してよいかどうか確認中。--kz3
- だったらその場で管理人に聞いちゃえばよい、とか思ったり思わなかったり・・・
- 新企画だw -- Charlotte
- 現在回答待ち。そしてソースにフルコメント化。@@; -- kz3
- おお! で、この雑談リンクがないです;; -- Charlotte
- あ、迷路のコメントからリンク貼ってますよ^^; -- kz3
- あっ。貼ってました。。。解決後に雑談に移動します。 -- Charlotte
- 回答は夜になると、おもわれ。 -- Charlotte
- 全てを完全に理解するのは、いつになるか分かりませぬ・・・;; -- kz3
- ようするに、ただログとって戻るからすごい速いわけですよね。 -- Charlotte
- そうなんですよ、僕だって一応ログは取ってるんですが、ログ取りの方法が違うのかな・・・ -- kz3
- あと僕はソース見やすくするために2次元配列使ってるから遅いのかも・・・ -- kz3
- ふ、分かってきた^^; -- kz3
- 進むたびにログをとってる模様 -- Charlotte
- b,bb,hantメンバ(構造体じゃないけど)の意味完全理解b -- kz3
- その通り! -- kz3
- backはスタックですね。progがスタックポインタで進むとどんどん上書き。 -- kz3
- うむうm、これ思いつくのはすごいですねw -- Charlotte
- って変数メンバ=ソース ∴ソース無断公開かな・・・;; -- kz3
- 僕のログ取りはマップに直に記録していますよね。 -- kz3
- 概要はつかめた。ひとまず、僕のソースも2次元配列→1次元配列に直してみます -- kz3
- 変数メンバ=ソース う〜んそこら辺微妙ですよね。 -- Charlotte
- データ構造変更完了。正常動作確認。早くなったかは・・・疑問;; -- kz3
- 変更版はどこにUPしたらいいでしょう? -- kz3
- ver.1とかつけてさいUPまたは上書き(消さないといけない)でお願いします。 -- Charlotte
- 迷路に追加しておきます。見やすい編集をお願いしますm_ _m -- kz3
- 棒倒し法の要領でやってみると速いかもしれない -- Charlotte
- 戻りすぎのせいで完成に満たないようです;; -- Charlotte
- 戻りすぎ!?バグですか!?デバッグだ・・・orz -- kz3
- デバッグ完了しました!!ver2.1にします。バグとりなのでね^^ -- kz3
- 偶数座標はぜったいに掘らないといけないから・・・。 -- Charlotte
- 迷路如きがこんなに難しいとは。こうなったら最短ソースを目指すw -- Charlotte
- ここの管理人さんから許可が出たので、「解読」の方にレスをつけていきます^^ -- kz3
- メンバの名前が微妙に変わってる;;--kz3
- 解読した結果私のアルゴリズムと、revyさん( ここの管理人さんでありソースの作者です)のアルゴリズムでどうしてここまで速度に差が出るのか、それは2つあることが分かりました。
- 進路決定の方法
- kz3 :毎回乱数で進路を決める
- revyさん:固定テーブル
- 足跡の記録の仕方
- kz3 :マップ(迷路を表現するデータ構造)に直接記録
- revyさん:足跡はスタックで管理
revyさんの穴掘り法が早いのはまさにこれです。
これがあるからプログラム=アルゴリズム+データ構造と言われるのです。
revyさんも私も(2次元マップから1次元マップに変更しました)迷路を表現するデータ構造はそれぞれ
1
2
3
4
5
6
7
8
|
| #define SIZE 99 #const HSIZE SIZE*SIZE
dim meiro, HSIZE
#const _mclass 51 dim maze,_mclass*_mclass
|
やっている事は同じです。が、足跡の記録方法が大きく違います。
まずはrevyさんの足跡の記録方法から。
1
2
3
4
5
6
7
8
9
10
11
| -
|
|
|
|
|
-
|
|
|
!
| if go { back.plog = hito
meiro.hori2 = 0
meiro.hori1 = 0
hito = hori2 plog++
}else { plog--
hito = back.plog hori2 = -1 : hori1 = -1
}
|
進むたびに1つ前の位置(の値)をスタックに積みます。
戻る時はスタックから1つ前の位置(の値)を取り出します。
上の9行目の人バックで人が元の位置に戻るのですが、スタック参照で一発で戻っていますね。
対するkz3はというと・・・
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
| repeat 4
if way.cnt=_ftop{ maze.mdig=_bbottom }
if way.cnt=_fright{ maze.mdig=_bleft }
if way.cnt=_fbottom{ maze.mdig=_btop }
if way.cnt=_fleft{ maze.mdig=_bright }
digno=_digok : break
loop
if digno=_digok:continue
if maze.mdig=_start :break
if maze.mdig=_btop :mdig-=_mclass :continue
if maze.mdig=_bright :mdig++ :continue
if maze.mdig=_bbottom :mdig+=_mclass :continue
if maze.mdig=_bleft :mdig--
|
進んだ場合、どの方向から来たのかをその場所に記録します。
戻る時はその場所に記録された来た方向をたどっていきます。
ここで、左に戻るためには4回比較しなければなりません・・・。
- 書きすぎました・・・;;すみません。ページ構成よろしくお願いしますm_ _m
- これだから簡潔にまとめる技術が必要なんですよね;; -- kz3
- こうなるともう雑談ではないので、迷路のほうに移動したいと思います。 -- Charlotte
- ありがとうございますm_ _m -- kz3
- これより速いのは無理なんですかね。 -- Charlotte
- 早くする方法を思いつきました(ぇ -- kz3
- ログをスタックにしてより早いものに書き換えてみます^^; -- kz3
- おお! -- Charlotte
- データ構造は、ログ取りにスタック(revyさん)、迷路本体に配列(共通)、方向テーブル(kz3)でいきますq -- kz3
- 高速化は前途多難でした;; 簡単に可能なのは、=1と比較するところを&1とすることでしょうか・・・ -- kz3