2011-11-09 93 views
0

背景:对于我的大学课程之一,我正在制作国际象棋。 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库,尽管我主要是在寻找想法,而不是实际的代码(尽管这会有所帮助)。

回答

1

因为板对于国际象棋有固定的尺寸,我选择使用二维数组DOMNode指针。它非常快速,虽然它增加了一些代码复杂度,但它工作得很好。

我希望我知道另一种做事的方式。

0

您已经通过强制自己使用XML结构自己创建了速度障碍。所有这些都给你提供了一个快速的保存/加载,这在游戏过程中比实际玩游戏要少得多。因此,我建议你使用你的本地结构来获得你想要的速度,并编写序列化代码来将本地结构映射到XML。

虽然我很好奇你的速度问题:当n很大时,O(n)对O(1)只是一个问题。 O(n)搜索是否是一个问题,是否真的会有大量的片断?时间复杂度只是执行速度的理论指南。您需要记住,这将实施,并且在您的实施中,即使它们不是理论上的最佳选择(即,在O(1)上选择O(n)),也可以确定折衷。

+0

考虑一下这个案例,当我计算出一块可以让我的国王下棋的棋子时,所有可能的棋步。除了计算棋子的正常移动模式之外,我还必须计算阻止它移动的障碍物,它可以捕捉的棋子,并确定是否有任何一方的对手可以在选择棋子时捕捉到棋子。那么我也必须确定这一举措是否会让他们的国王受制。那里有足够的计算来处理大哦速度。问题不在于它被称为多少次的事实。 –

+0

根据速度障碍:您的解决方案不是解决方案。我已经知道我可以映射它们。你将如何解决这个问题?这个项目不仅仅是简单地完成它。与DOM一起完成这项工作与完成本地结构完全不同,因此对我而言具有不同的价值。 –