1 | package astar;
|
---|
2 |
|
---|
3 | import java.util.ArrayList;
|
---|
4 |
|
---|
5 | public class BinaryHeap
|
---|
6 | {
|
---|
7 | public ArrayList<AStarNode> arr;
|
---|
8 |
|
---|
9 | public BinaryHeap() {
|
---|
10 | this.arr = new ArrayList<AStarNode>();
|
---|
11 | }
|
---|
12 |
|
---|
13 | private int index(final int i) {
|
---|
14 | return i - 1;
|
---|
15 | }
|
---|
16 |
|
---|
17 | public boolean isEmpty() {
|
---|
18 | return this.arr.size() == 0;
|
---|
19 | }
|
---|
20 |
|
---|
21 | public void add(final AStarNode c) {
|
---|
22 | this.arr.add(c);
|
---|
23 | int pos = this.arr.size();
|
---|
24 | c.openListPos = pos;
|
---|
25 | while (this.index(pos) > 0 && this.arr.get(this.index(pos)).compareTo((AStarNode)this.arr.get(this.index(pos / 2))) < 0) {
|
---|
26 | final AStarNode temp = this.arr.get(this.index(pos / 2));
|
---|
27 | this.arr.set(this.index(pos / 2), this.arr.get(this.index(pos)));
|
---|
28 | this.arr.set(this.index(pos), temp);
|
---|
29 | this.arr.get(this.index(pos)).openListPos = pos;
|
---|
30 | pos /= 2;
|
---|
31 | }
|
---|
32 | this.arr.get(this.index(pos)).openListPos = pos;
|
---|
33 | }
|
---|
34 |
|
---|
35 | public AStarNode removeSmallest() {
|
---|
36 | final AStarNode smallest = this.arr.get(0);
|
---|
37 | this.arr.set(0, this.arr.get(this.arr.size() - 1));
|
---|
38 | this.arr.get(0).openListPos = 1;
|
---|
39 | this.arr.remove(this.arr.size() - 1);
|
---|
40 | int pos = 1;
|
---|
41 | boolean done = false;
|
---|
42 | while (this.index(pos) < this.arr.size() && !done) {
|
---|
43 | int smallestIndex = -1;
|
---|
44 | if (this.index(pos * 2) < this.arr.size() && this.arr.get(this.index(pos * 2)).compareTo((AStarNode)this.arr.get(this.index(pos))) < 0) {
|
---|
45 | smallestIndex = pos * 2;
|
---|
46 | }
|
---|
47 | if (this.index(pos * 2 + 1) < this.arr.size() && this.arr.get(this.index(pos * 2 + 1)).compareTo((AStarNode)this.arr.get(this.index(pos))) < 0 && (smallestIndex == -1 || this.arr.get(this.index(pos * 2 + 1)).compareTo((AStarNode)this.arr.get(this.index(pos * 2))) < 0)) {
|
---|
48 | smallestIndex = pos * 2 + 1;
|
---|
49 | }
|
---|
50 | if (smallestIndex == -1) {
|
---|
51 | done = true;
|
---|
52 | }
|
---|
53 | else {
|
---|
54 | final AStarNode temp = this.arr.get(this.index(pos));
|
---|
55 | this.arr.set(this.index(pos), this.arr.get(this.index(smallestIndex)));
|
---|
56 | this.arr.set(this.index(smallestIndex), temp);
|
---|
57 | this.arr.get(this.index(pos)).openListPos = pos;
|
---|
58 | this.arr.get(this.index(smallestIndex)).openListPos = smallestIndex;
|
---|
59 | pos = smallestIndex;
|
---|
60 | }
|
---|
61 | }
|
---|
62 | return smallest;
|
---|
63 | }
|
---|
64 |
|
---|
65 | public void update(final AStarNode o) {
|
---|
66 | int pos = o.openListPos;
|
---|
67 | for (int parent = pos / 2; parent != 0 && this.arr.get(this.index(pos)).compareTo((AStarNode)this.arr.get(this.index(parent))) < 0; pos = parent, parent /= 2) {
|
---|
68 | final AStarNode temp = this.arr.get(this.index(parent));
|
---|
69 | this.arr.set(this.index(parent), this.arr.get(this.index(pos)));
|
---|
70 | this.arr.set(this.index(pos), temp);
|
---|
71 | this.arr.get(this.index(pos)).openListPos = pos;
|
---|
72 | }
|
---|
73 | this.arr.get(this.index(pos)).openListPos = pos;
|
---|
74 | }
|
---|
75 | }
|
---|