Tags: acharron/practice_algorithm_data_struct
Tags
n-queen : Add : start_pos に good-enough min-conflict 仕様に変更
init_start_pos_v0_2() では各行に全てのセルを確認してからどのセルが min-conflict
なのかを判断していました。
しかし、全てのセルをチェックするのはもったいない、 O(n^2) になる
今回 v0.4 では、初期ポジションを作る処理は、1行に対して全てのセルを確認しなくて、
上限 T 個のセルだけを確認する。このような流れ :
* 1. ランダムで1つのセルを選ぶ
* 2. そのセルのconflict数を計算
* 3a. conflictが 0 なら、そのセルにクイーンを置く。終了
* 3b. conflictが 1 以上なら、ステップ1に戻る、別のセルを選択する
* 4. もし T 回もトライしたけど conflict = 0 のセルを見つからなかった場合、
今まで判断した T個のセルの中で「今まで見た中で一番マシなセル」にする。終了
"good-enough" セルを選んだ
そうすると、1行に当てる最悪の時間は T 回 (固定値) だけ
最悪の場合、 preprocess の処理が O(nT) = O(n) になりました。
T の固定値を調整することで、preprocessの処理時間と初期ポジションの良さのバランスできる
n-queen : Add : conflict 計算の仕様を改善 : バッファーで貯めていく n = 10 000 までは行ける!処理時間は 25~35s * 「あるセルのconflict数」は毎回計算するのではなくて、クイーンを動かす時に保存 * それでも、やはりまだ O(n^2) なので、まだまだ TODO * 「ある行にはどこが min-conflict ?」の計算仕様を改善? * 全く別のデータ構造で O(n^2) をなくす
n-queen : Add : v0.2 Good start position (preprocess) + optimizations * start_pos (preprocess 処理) をランダムではない方法に実装 * いくつかの処理改善 (無駄な計算を無くしたり。。。) * timelog に IS_QUIET を追加 TODO * Bottleneck : fetch_col_with_min_conflict_in_row() それぞれの行にどこが min-conflict の col を探すのは時間かかる