我正在进行转弯基础游戏,以文明为例。地图上的所有单位都是Agent类的实例。我正在设计一个AgentQueue类来控制单位的顺序'每一回合的行动。
我可以为模型库提出两个选项,一个是NSMutableArray,另一个是NSMutableDictionary。
计划A:
NSMutableArray包含对每个代理实例的引用。
如何获取下一个代理:按此数组中的索引顺序。
插入和删除代理:使用NSMutableArray的方法在给定索引处插入或删除对象。
当在一个回合中调用所有索引时,将重置该标志并从索引0开始新转弯。
B计划:
NSMutableDictionary包含对每个代理的引用。密钥是代理ID,将在插入新代理时按顺序或随机生成。每个Agent实例都有两个名为PreviousAgent和NextAgent的引用。
如何获取下一个代理:使用currentAgent.NextAgent
插入和删除代理:在字典中添加/删除代理实例,并修改相关代理的PreviousAgent / NextAgent(实际上只修改三个代理:添加/删除的代理,前一个代理和下一个代理)
在开始时选择一个代理作为最后一个代理。当这个被调用时,完成一个转弯并开始新的转弯。
我计划使用计划A,但考虑到整个阵列/字典将包含大约400到90000个代理,并且会发生大量插入和删除,效率非常重要。 NSMutableArray将修改每个后续对象'添加或删除不是最后一个对象的索引。这对我来说听起来很贵。使用Array可以快速找到具有给定键的对象,但是使用给定键在字典中查找对象也不慢(我读过该字典实际上是一个哈希表,查找速度非常快)。然后我提出了计划B,它避免修改其他对象。
请帮我弄清楚哪一个在效率方面更好。如果我在设计过程中有正确的想法,请告诉我。谢谢!
答案 0 :(得分:0)
您对NSMutableArray如何工作的假设是错误的。
从NSMutableArray插入或删除项目所需的时间与到阵列的开始或结束的距离成比例,以较短者为准。在接近开始或接近结束时添加或删除很快。
但是当然你假设在数组中找到一个对象很快也是错误的。它与数组起点的距离是线性的(如果对象不存在,则为完全搜索)。如果你想快速访问,那就是NSDictionary。这是一个哈希表。