java最大最小值交换位置_java-在数据结构中找到最大值最小值和最大...

一种可能的方法是维护两个索引:一个用于时间,另一个用于优先级.让我们以恒定时间的firstKey()/ lastKey()操作获取两个平衡的搜索树.我将使用TreeMap的接口,但是它应该具有类似于c的std :: map的实现(它仅在更新过程中维护对第一个和最后一个元素的迭代器).

第一地图将是地图.任务,第二个-Map< Priority,Integer>.优先事项.每个现有优先级值的第二个映射存储具有该优先级值的任务数.因此,您可以将任务用于第四个查询,将优先级用于第三个查询.

> UpdateTask(t,p)

Priority oldp = tasks.put(t, p);

if (oldp != null) {

decreasePriority(oldp);

}

increasePriority(p);

复杂度:O(log(n))

> DeleteTask(t)

if (tasks.containsKey(t)) {

Priority oldp = tasks.get(t);

tasks.remove(t);

decreasePriority(oldp);

}

复杂度:O(log(n))

> GetMaximumPriority(),GetMinimumPriority()

return priorities.lastKey();

return priorities.firstKey();

复杂度:O(1)(具有正确的lastKey()/ firstKey()实现,带有java.util.TreeMap的O(log(n))).

> GetPriorityofTaskAtMaximumTime()

return tasks.lastEntry().getValue();

复杂度:O(1)(具有正确的lastEntry()实现,带有java.util.TreeMap的O(log(n)))

void increasePriority(p) {

if (priorities.hasKey(p)) {

priorities.put(p, priorities.get(p) + 1);

} else {

priorities.put(p, 1);

}

}

void decreasePriority(p) {

int count = priorities.get(p);

if (count > 1) {

priorities.put(p, count - 1);

} else {

priorities.remove(p);

}

}

结果,您将避免操作中的线性复杂性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值