背景:对于我的大学课程之一,我正在制作国际象棋。 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一起完成这项工作与完成本地结构完全不同,因此对我而言具有不同的价值。 –