TreeMap具有O(log n)
性能(最好的情况),但是,因为我需要有效地使用以下operations
:
其他可能性是使用以下内容制作PriorityQueue
:
index
”元素作为PriorityQueue的订单PriorityQueue
之外使用)。这有更好的结构吗?
下面有更多详细信息,您可以跳过,因为第一个答案为这些细节提供了很好的答案,但是,我将其保持活跃,以便进行理论讨论。
注意:我可以使用非标准数据结构,在这个项目中我已经使用UnrolledLinkedList
,因为它很可能是另一种用途的最有效结构。
这是使用案例(如果你感兴趣的话):我正在为电脑游戏构建AI
OffensiveNessHistory myOffensiveNess = battle.pl[orderNumber].calculateOffensivenessHistory();
可能的实施:
public class OffensiveNessHistory {
PriorityQueue<OffensiveNessHistoryEntry> offensivenessEntries = new PriorityQueue<OffensiveNessHistoryEntry>();
..
或
public class OffensiveNessHistory {
TreeMap<Integer, OffensiveNessHistoryEntry> offensivenessEntries = new TreeMap();
..
我想先检查一下球员的进攻和防守历史,然后计算预测我是否应该进行最具攻击性或最具防御性的动作。
答案 0 :(得分:1)
首先,您应该考虑结构的大小(仅针对少数条目进行优化可能不值得)以及操作的频率。
如果读取比写入更频繁(我假设是这种情况),我会使用一种优化读取成本的结构,例如:排序ArrayList
,您在其中插入使用二进制搜索找到的位置。这将是搜索的O(log n)+向右移动其他条目的成本,但意味着良好的缓存一致性和O(1)查找。
标准PriorityQueue
内部也使用数组,但需要使用迭代器来获取元素n(例如,如果您需要中间或最低条目)。
可能存在在保持O(1)读取的同时优化写入更多的结构,但除非这些写入非常频繁,否则您可能甚至没有注意到任何性能提升。
最重要的是,你应该尽量不优化猜测,而是首先进行分析。代码的其他部分可能会耗尽性能,并且可能会使数据结构的优化变得无用。