背景:對於我的大學課程之一,我正在製作國際象棋。 GUI已經完成了鉤入控制器,我所要做的就是實現這些對象。傳統上,我只是使用適合每種類型對象的本機結構,移動歷史(撤消支持,但不重做)的堆棧,二維數組/板載矢量等。規範的一部分是我必須加載並以專門的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++開發,可能會使用XML的Xerces庫,儘管我主要是在尋找想法,而不是實際的代碼(儘管這會有所幫助)。
考慮一下這個案例,當我計算出一塊可以讓我的國王下棋的棋子時,所有可能的棋步。除了計算棋子的正常移動模式之外,我還必須計算阻止它移動的障礙物,它可以捕捉的棋子,並確定是否有任何一方的對手可以在選擇棋子時捕捉到棋子。那麼我也必須確定這一舉措是否會讓他們的國王受制。那裏有足夠的計算來處理大哦速度。問題不在於它被稱爲多少次的事實。 –
根據速度障礙:您的解決方案不是解決方案。我已經知道我可以映射它們。你將如何解決這個問題?這個項目不僅僅是簡單地完成它。與DOM一起完成這項工作與完成本地結構完全不同,因此對我而言具有不同的價值。 –