147 lines
3.6 KiB
Java
147 lines
3.6 KiB
Java
package net.minecraft.world.level.pathfinder;
|
|
|
|
import java.util.Arrays;
|
|
|
|
public class BinaryHeap {
|
|
private Node[] heap = new Node[128];
|
|
private int size;
|
|
|
|
public Node insert(Node p_77085_) {
|
|
if (p_77085_.heapIdx >= 0) {
|
|
throw new IllegalStateException("OW KNOWS!");
|
|
} else {
|
|
if (this.size == this.heap.length) {
|
|
Node[] anode = new Node[this.size << 1];
|
|
System.arraycopy(this.heap, 0, anode, 0, this.size);
|
|
this.heap = anode;
|
|
}
|
|
|
|
this.heap[this.size] = p_77085_;
|
|
p_77085_.heapIdx = this.size;
|
|
this.upHeap(this.size++);
|
|
return p_77085_;
|
|
}
|
|
}
|
|
|
|
public void clear() {
|
|
this.size = 0;
|
|
}
|
|
|
|
public Node peek() {
|
|
return this.heap[0];
|
|
}
|
|
|
|
public Node pop() {
|
|
Node node = this.heap[0];
|
|
this.heap[0] = this.heap[--this.size];
|
|
this.heap[this.size] = null;
|
|
if (this.size > 0) {
|
|
this.downHeap(0);
|
|
}
|
|
|
|
node.heapIdx = -1;
|
|
return node;
|
|
}
|
|
|
|
public void remove(Node p_164682_) {
|
|
this.heap[p_164682_.heapIdx] = this.heap[--this.size];
|
|
this.heap[this.size] = null;
|
|
if (this.size > p_164682_.heapIdx) {
|
|
if (this.heap[p_164682_.heapIdx].f < p_164682_.f) {
|
|
this.upHeap(p_164682_.heapIdx);
|
|
} else {
|
|
this.downHeap(p_164682_.heapIdx);
|
|
}
|
|
}
|
|
|
|
p_164682_.heapIdx = -1;
|
|
}
|
|
|
|
public void changeCost(Node p_77087_, float p_77088_) {
|
|
float f = p_77087_.f;
|
|
p_77087_.f = p_77088_;
|
|
if (p_77088_ < f) {
|
|
this.upHeap(p_77087_.heapIdx);
|
|
} else {
|
|
this.downHeap(p_77087_.heapIdx);
|
|
}
|
|
}
|
|
|
|
public int size() {
|
|
return this.size;
|
|
}
|
|
|
|
private void upHeap(int p_77083_) {
|
|
Node node = this.heap[p_77083_];
|
|
float f = node.f;
|
|
|
|
while (p_77083_ > 0) {
|
|
int i = p_77083_ - 1 >> 1;
|
|
Node node1 = this.heap[i];
|
|
if (!(f < node1.f)) {
|
|
break;
|
|
}
|
|
|
|
this.heap[p_77083_] = node1;
|
|
node1.heapIdx = p_77083_;
|
|
p_77083_ = i;
|
|
}
|
|
|
|
this.heap[p_77083_] = node;
|
|
node.heapIdx = p_77083_;
|
|
}
|
|
|
|
private void downHeap(int p_77090_) {
|
|
Node node = this.heap[p_77090_];
|
|
float f = node.f;
|
|
|
|
while (true) {
|
|
int i = 1 + (p_77090_ << 1);
|
|
int j = i + 1;
|
|
if (i >= this.size) {
|
|
break;
|
|
}
|
|
|
|
Node node1 = this.heap[i];
|
|
float f1 = node1.f;
|
|
Node node2;
|
|
float f2;
|
|
if (j >= this.size) {
|
|
node2 = null;
|
|
f2 = Float.POSITIVE_INFINITY;
|
|
} else {
|
|
node2 = this.heap[j];
|
|
f2 = node2.f;
|
|
}
|
|
|
|
if (f1 < f2) {
|
|
if (!(f1 < f)) {
|
|
break;
|
|
}
|
|
|
|
this.heap[p_77090_] = node1;
|
|
node1.heapIdx = p_77090_;
|
|
p_77090_ = i;
|
|
} else {
|
|
if (!(f2 < f)) {
|
|
break;
|
|
}
|
|
|
|
this.heap[p_77090_] = node2;
|
|
node2.heapIdx = p_77090_;
|
|
p_77090_ = j;
|
|
}
|
|
}
|
|
|
|
this.heap[p_77090_] = node;
|
|
node.heapIdx = p_77090_;
|
|
}
|
|
|
|
public boolean isEmpty() {
|
|
return this.size == 0;
|
|
}
|
|
|
|
public Node[] getHeap() {
|
|
return Arrays.copyOf(this.heap, this.size);
|
|
}
|
|
} |