背景:私の大学のコースの1つでは、私はChessを作っています。 GUIはすでにコントローラーへのフックで終了しています。私がしなければならないことは、オブジェクトを実装することだけです。伝統的には、オブジェクトの種類ごとに固有のネイティブ構造を使用します。移動履歴のスタック(サポートを元に戻しますが、やり直しはできません)、ボードの2次元配列/ベクトルなどを使用します。仕様の一部は、特殊なXML形式でゲームを保存するので、DOMDocumentを使用してゲーム全体を保存することができます。これにより、DOMとロード/保存アクションを実装するライブラリがあれば、ロードと保存が非常に簡単になります。これは、XMLと私の構造の間で変換する必要がなくなったためです。DOMの要素をすばやく選択する
問題:スピード。チェスのすべてのアルゴリズムでは、私は場所によって多くの選択をしなければなりません。
XMLフォーマット(不変):
<board>
<piece type="rook" color="white" column="0" row="7"/>
<piece type="knight" color="white" column="1" row="7"/>
<piece type="bishop" color="white" column="2" row="7"/>
<piece type="queen" color="white" column="3" row="7"/>
<piece type="king" color="white" column="4" row="7"/>
<piece type="bishop" color="white" column="5" row="7"/>
<piece type="knight" color="white" column="6" row="7"/>
<piece type="rook" color="white" column="7" row="7"/>
<piece color="white" column="3" row="6" type="pawn"/>
<piece row="6" type="pawn" color="white" column="4" />
</board>
今、私はすべての作品の要素を取得し、属性をフィルタリング、O(n)を操作する必要があります。配列/ベクトルの実装では、簡単なインデックス作成のため、O(1)時間を簡単に達成できます。 O(n)の価格は、特に膠着状態を検出する場合には、支払うには高すぎます。
どのように速度を改善しますか?私は基本的にDOMを索引する方法を探しています。私はいくつかのアイディアを持っていましたが、この問題をどうやって解決しますか?
私は主にアイデアを探していますが、実際のコードではありませんが(参考になりますが)、C++で開発中で、おそらくXercesのライブラリを使用します。
チェスに私の王を置く可能性のある作品のすべての可能な動きを計算する場合を考えてみましょう。ピースの通常の移動パターンを計算することに加えて、移動を止める障害を計算し、それを捕捉し、その移動が選択された場合に対戦相手のいずれかがキングを捕獲できるかどうかを判断する必要があります。私はまた、その動きが彼らの王をチェックするかどうかを決定しなければならない。大事な速度のために十分な計算がそこにあります。問題はそれが何回呼ばれたかという事実ほどの数ではありません。 –
速度の障害に応じて、ソリューションは解決策ではありません。私はすでに私がそれらをマップできることを知っています。どのようにこの問題に取り組んでいますか?単にこのプロジェクトを完成させるよりも、このプロジェクトにはさらに多くのことがあります。DOMを使ってそれを行うことは、ネイティブ構造で行うこととは全く異なるプロジェクトです。したがって、私にとっては異なる価値があります。 –