我正在学习Java中的PriorityQueue
当我查看offer
方法时,无法找出在(k - 1) >>> 1
方法中使用siftUpComparable
的原因。
这是源代码:
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
if (i >= queue.length)
grow(i + 1);
size = i + 1;
if (i == 0)
queue[0] = e;
else
siftUp(i, e);
return true;
}
private void siftUp(int k, E x) {
if (comparator != null)
siftUpUsingComparator(k, x);
else
siftUpComparable(k, x);
}
private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1; // what's the purpose of this line?
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}
答案 0 :(得分:2)
由于保证k > 0
,该行也可以(k - 1) >> 1
。 >>
和>>>
运算符右移右侧操作数给出的位数。向下移动与除以2完全相同,因此这是计算parent = (k - 1) / 2
(使用整数截断),但执行速度更快。
>>
和>>>
之间的区别在于负数:>>
在左侧填充符号位的当前值,而>>>
总是填充零。
答案 1 :(得分:1)
它获取二进制堆中k-th
元素的父元素的索引。
这是用于说话的改变方式
int parent = (k-1)/2