【问题标题】:Which Map data structure in Java for getting highest element most efficiently?Java中哪种Map数据结构最有效地获取最高元素?
【发布时间】:2014-11-07 11:58:04
【问题描述】:

TreeMap 具有 O(log n) 性能(最佳情况),但是,因为我需要以下 operations 有效:

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

其他可能性是使用以下内容创建PriorityQueue

  • 使用“index”元素作为优先队列的顺序
  • equals 实现只检查“索引”元素是否相等 但这将是一个 hack,因为“equals”方法容易出错(如果在 PriorityQueue 之外使用)。

有更好的结构吗?

下面的更多细节你可能会跳过,因为第一个答案为这个细节提供了很好的答案,但是,我在理论讨论中保持活跃。

注意:我可以使用非标准数据结构,在这个项目中我已经在使用UnrolledLinkedList,因为它很可能是其他用途最有效的结构。

这是一个用例(如果你感兴趣的话):我正在为一个电脑游戏构建人工智能

  OffensiveNessHistory myOffensiveNess = battle.pl[orderNumber].calculateOffensivenessHistory();

可能的实现:

public class OffensiveNessHistory {
  PriorityQueue<OffensiveNessHistoryEntry> offensivenessEntries = new PriorityQueue<OffensiveNessHistoryEntry>();
..

public class OffensiveNessHistory {
  TreeMap<Integer, OffensiveNessHistoryEntry> offensivenessEntries = new TreeMap();
..

我想检查第一名球员的进攻和防守历史,以计算出我应该打出最具进攻性还是防守性的预测。

【问题讨论】:

  • 您说的是Map,但是键和值应该是什么?
  • 补充说抱歉,保留理论意见的问题。

标签: java data-structures


【解决方案1】:

首先,您应该考虑结构的大小(只优化几个条目可能不值得)和操作的频率。

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

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

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

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

【讨论】:

  • 很好的答案 Thomas...因为这个数组的平均大小为 200 这并不重要...我只想要非常快的后端,这样我就可以运行数百万(甚至数十亿)次 AI 战斗(AI vs AI)在合理的时间内,试图让游戏在不同策略之间得到适当的平衡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多