Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中哪种映射数据结构可以最有效地获取最高元素?_Java_Data Structures - Fatal编程技术网

Java中哪种映射数据结构可以最有效地获取最高元素?

Java中哪种映射数据结构可以最有效地获取最高元素?,java,data-structures,Java,Data Structures,TreeMap具有O(logn)性能(最佳情况),但是,因为我需要高效地执行以下操作: 获取最高元素 获取XY最高元素 插入 另一种可能是使用以下内容创建优先队列: 使用“index”元素作为优先级队列的顺序 equals实现只检查“索引”元素的相等性 但这是一种黑客行为,因为“equals”方法容易出错(如果在PriorityQueue之外使用) 有更好的结构吗 由于第一个答案为这一细节提供了很好的答案,因此您可能会跳过下面的更多细节,但是,我会在理论讨论中保持活跃 注意:我可以使用非

TreeMap具有
O(logn)
性能(最佳情况),但是,因为我需要高效地执行以下
操作:

  • 获取最高元素
  • 获取XY最高元素
  • 插入
另一种可能是使用以下内容创建
优先队列

  • 使用“
    index
    ”元素作为优先级队列的顺序
  • equals实现只检查“索引”元素的相等性 但这是一种黑客行为,因为“equals”方法容易出错(如果在
    PriorityQueue
    之外使用)
有更好的结构吗

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

注意:我可以使用非标准的数据结构,在这个项目中,我已经在使用
unrolled链接列表
,因为它很可能是另一个用途中最有效的结构

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

  OffensiveNessHistory myOffensiveNess = battle.pl[orderNumber].calculateOffensivenessHistory();
对于可能的实现:

public class OffensiveNessHistory {
  PriorityQueue<OffensiveNessHistoryEntry> offensivenessEntries = new PriorityQueue<OffensiveNessHistoryEntry>();
..
公共类攻击历史记录{
PriorityQueue offensesentries=new PriorityQueue();
..

公共类攻击历史记录{
树状图攻击中心=新树状图();
..

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

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

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

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

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


最后也是最重要的一点是,您不应该尝试根据猜测进行优化,而应该首先进行概要分析。您的代码中可能还有其他部分可能会消耗性能,这可能会使数据结构的优化变得毫无用处。

您指的是一个
映射,但键和值应该是什么?添加了抱歉,保留了问题理论上的观点仍然是正确的。答案很好,托马斯…因为这个阵列的平均大小将是200,这并不重要…我只需要非常快的后端,这样我就可以在合理的时间内运行数百万(甚至数十亿)的人工智能战斗(人工智能对人工智能),尝试在不同的策略之间获得适当的平衡。
public class OffensiveNessHistory {
  TreeMap<Integer, OffensiveNessHistoryEntry> offensivenessEntries = new TreeMap();
..