Java中哪种Map数据结构能够最有效地获取最高元素?

时间:2014-11-07 11:58:05

标签: java data-structures

TreeMap具有O(log n)性能(最好的情况),但是,因为我需要有效地使用以下operations

  • 获得最高元素
  • 获取XY最高元素
  • 插入

其他可能性是使用以下内容制作PriorityQueue

  • 使用“index”元素作为PriorityQueue的订单
  • 等于实现以仅检查“index”元素相等性 但这将是一个黑客,因为“等于”方法容易出错(如果在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();
..

我想先检查一下球员的进攻和防守历史,然后计算预测我是否应该进行最具攻击性或最具防御性的动作。

1 个答案:

答案 0 :(得分:1)

首先,您应该考虑结构的大小(仅针对少数条目进行优化可能不值得)以及操作的频率。

如果读取比写入更频繁(我假设是这种情况),我会使用一种优化读取成本的结构,例如:排序ArrayList,您在其中插入使用二进制搜索找到的位置。这将是搜索的O(log n)+向右移动其他条目的成本,但意味着良好的缓存一致性和O(1)查找。

标准PriorityQueue内部也使用数组,但需要使用迭代器来获取元素n(例如,如果您需要中间或最低条目)。

可能存在在保持O(1)读取的同时优化写入更多的结构,但除非这些写入非常频繁,否则您可能甚至没有注意到任何性能提升。

最重要的是,你应该尽量不优化猜测,而是首先进行分析。代码的其他部分可能会耗尽性能,并且可能会使数据结构的优化变得无用。