我在基于box2d的游戏中实现了一个简单的池化系统来生成/取消/预池化所有对象。所讨论的对象是以设定半径创建的所有圆。例如,当我预存池时,我创建了10 x 2m,5 x 5m,5 x 10m的圆圈。
现在我使用一个简单的链表来存储池化的对象,所以当我需要获取一个半径为x的对象时,它可能直到列表的末尾才能找到具有正确半径的主体,或者根本找不到它。这显然很麻烦,而且随着我汇集更多的对象,情况只会变得更糟。
我在考虑使用哈希表,这样我就可以使用半径作为散列的关键字,并快速访问适当的对象,但我担心的是,半径值因值和使用它们的对象数量的不同而有很大差异。例如,我可能在2m上有50个哈希,在100m上有5个哈希,这会导致创建交易浪费空间,对吧?
我在使用数据结构方面缺乏经验,我想了解更多,那么哪种类型的数据结构最适合有效地处理这样的系统?为什么?
谢谢!
发布于 2013-05-07 14:21:31
对于这类问题,哈希表是一个完美的解决方案。您需要的是将直径作为关键字,并将圆的矢量作为值。当一个具有新键的新项被添加到表中时,应该构造一个新的向量来保存该值以及任何其他值。如果要将新项添加到表中,但它没有唯一的键,则获取该键的现有向量,并将新项添加到该向量中。
这不会浪费空间。每个半径值恰好链接到一个包含具有该半径的项的向量。关于“例如,我可能在2m时有50个哈希,在100m时有5个哈希,这将导致创建一笔浪费空间的交易,对吧?”我不明白为什么这会是一个问题。如果您对此主题感兴趣,请查看通过链接解决冲突的哈希。
发布于 2013-05-07 19:12:33
使用std::multimap,并将radius作为关键字,object作为值。它将为你提供log N搜索,插入和删除的复杂性。http://www.cplusplus.com/reference/map/multimap/
https://stackoverflow.com/questions/16410224
复制相似问题