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