最大堆和最小堆初始化(java)优先级队列

hsgswve4  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(384)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
两者之间的区别是什么:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
  PriorityQueue<Integer> minHeap = new PriorityQueue<>();

PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
  PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> a - b);

我做了一些leetcode问题,似乎第一个通过的测试用例比下面的多。

lx0bsm1f

lx0bsm1f1#

作为一个 compare 功能, a - b 以及 b - a 在下列情况下不要给出正确的结果 a 以及 b 距离太远了。是因为一个叫溢出的小东西。
考虑 a - b ,假定的整数的“自然顺序”比较函数。看起来应该有用,对吧?我们来举几个例子:
a==2 以及 b==5 . 自然顺序比较器应该返回一个负数,以表示 a < b . a - b -> 2 - 5 -> -3 . 量化宽松。
a==345 以及 b==-197 ; a > b ,所以我们希望比较器的结果是肯定的。 a - b -> 245 - (-197) -> 245 + 197 -> 442 . 量化宽松。
a==100 以及 b==100 . 比较器应返回零以指示 a == b . a - b -> 100 - 100 -> 0. 量化宽松。
到目前为止,还不错,是吗?
现在试试这个:让 a==Integer.MIN_VALUE (-2_147_483_648)和 b==1 . 很明显, a < b ,所以比较器应该返回一个负数。 a - b -> -2_147_483_648 - 1 -> -2_147_483_649 . qed,对吧?
错了!结果实际上是正的2∗147∗483∗647!为什么?溢出,这就是原因。一 int 可以容纳32位,而-2_147_483_649的实际答案需要33位来表示它。实际答案的多余位被丢弃,剩下的32位表示值2_147_483_647。所以我们的compare函数返回一个正结果,从而错误地指出 a > b .

相关问题