Cに循環型の静的に割り当てられたバッファーがあり、これを幅優先探索のキューとして使用しています。キューの上位N個の要素を並べ替えてもらいたいのですが。通常のqsort()を使用するのは簡単ですが、循環バッファであり、上位N個の要素がラップアラウンドする可能性があります。もちろん、モジュラー演算を使用し、配列をラップする方法を知っている独自のソート実装を作成することもできますが、ソート関数を作成することは良い演習であると常に考えていましたが、ライブラリに任せたほうがよいでしょう。
私はいくつかのアプローチを考えました:
- 別の線形バッファーを使用します。最初に循環バッファーから要素をコピーし、次にqsortを適用してから、コピーして戻します。追加のバッファーを使用するということは、追加のO(N)スペース要件を意味します。
- qsortを使用して「上」と「下」の半分を並べ替えてから、追加のバッファーを使用してそれらをマージします
- 2.と同じですが、インプレースで最終的なマージを実行します(インプレースマージについてはあまりわかりませんが、私が見た実装では、スペースの複雑さを軽減する価値はないようです)
一方、25行(またはそれ以上)を追加する代わりに、自分のクイックソートをエレガントに作成しないようにする方法を1時間かけて検討することも、最も生産的ではない可能性があります...
訂正: DFSとBFSを切り替えるという愚かな間違いを犯しました(私はDFSを書くことを好みますが、この特定のケースではBFSを使用する必要があります)。混乱して申し訳ありません。
元の問題の詳細:
私は幅優先探索を実装しています(15パズルと同じように、より複雑で、各状態で4ではなく約O(n ^ 2)の拡張が可能です)。「ブルートフォース」アルゴリズムは実行されますが、「愚か」です。各ポイントで、すべての有効な状態がハードコードされた順序で展開されます。キューは循環バッファ(unsigned queue [MAXLENGTH])として実装され、整数インデックスを状態テーブルに格納します。インデックスをキューに入れたりデキューしたりする2つの単純な関数を除けば、カプセル化はありません。これは、静的に割り当てられた符号なしの単純な配列です。
次に、ヒューリスティックをいくつか追加します。私が最初に試したいのは、拡張後に拡張された子の状態を並べ替えることです(「より良い順序で拡張する」)。これは、単純なベストファーストDFSをプログラミングする場合と同じです。このために、キュー(最新の展開された状態を表す)に参加し、ある種のヒューリスティックを使用してそれらをソートしたいと思います。状態を別の順序で展開することもできます(したがって、この場合、キューのFIFOプロパティを壊してもそれほど重要ではありません)。
私の目標は、 A *、または深さ優先探索ベースのアルゴリズムを実装することではありません(すべての状態を拡張する余裕はありませんが、実装しないと、状態空間での無限サイクルの問題が発生し始めるため、反復深化のようなものを使用する必要があります)。