背景:对于我的大学课程之一,我正在制作国际象棋。 GUI已经完成了对控制器的挂钩,我所要做的就是实现对象。传统上,我只使用适合每种类型对象的本机结构,移动历史的堆栈(支持撤消,但不重做),板的2d数组/矢量等。规范的一部分是我必须加载并以专门的XML格式保存游戏,所以我很想简单地使用DOMDocument来完整地存储游戏。如果我有一个实现DOM加载/保存操作的库,这将使加载和保存变得非常容易,因为我不再需要在XML和我的结构之间进行转换。
问题:速度。在国际象棋的所有算法中,我必须按位置进行大量选择。
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库来处理XML,虽然我主要是在寻找想法,而不是实际代码(尽管这会有所帮助)。< / em>的
答案 0 :(得分:1)
因为国际象棋棋盘有固定的尺寸,我选择使用DOMNode
指针的2D数组。它非常快,虽然它确实增加了一些代码复杂性,但它的工作正常。
我希望我知道另一种做事的方式。
答案 1 :(得分:0)
您通过强制自己使用XML结构自己创建了速度障碍。这一切都是为了给你一个快速的保存/加载,这在游戏过程中比在实际玩游戏时更少。因此,我建议您使用本机结构来获得所需的速度,并编写序列化代码以将本机结构映射到XML。
我对你的速度问题感到好奇:当n很大时,O(n)vs O(1)只是一个问题。 O(n)搜索是否真的会出现大量问题?时间复杂性只是执行速度的理论指导。你需要记住,这将被实现,并且在你的实现中,权衡可以是正常的,即使它们不是理论上的最佳选择(即选择O(n)超过O(1))