AyStar: Reduce redundant GetElement calls in BinaryHeap

pull/491/head
Jonathan G Rennison 1 year ago
parent 88d7a8ea13
commit b7a82e0f29

@ -80,26 +80,23 @@ bool BinaryHeap::Push(uint32 item, int priority)
}
/* Add the item at the end of the array */
this->GetElement(this->size + 1).priority = priority;
this->GetElement(this->size + 1).item = item;
BinaryHeapNode &new_item = this->GetElement(this->size + 1);
new_item.priority = priority;
new_item.item = item;
this->size++;
/* Now we are going to check where it belongs. As long as the parent is
* bigger, we switch with the parent */
{
BinaryHeapNode temp;
int i;
int j;
i = this->size;
int i = this->size;
while (i > 1) {
/* Get the parent of this object (divide by 2) */
j = i / 2;
int j = i / 2;
/* Is the parent bigger than the current, switch them */
if (this->GetElement(i).priority <= this->GetElement(j).priority) {
temp = this->GetElement(j);
this->GetElement(j) = this->GetElement(i);
this->GetElement(i) = temp;
BinaryHeapNode &elem_i = this->GetElement(i);
BinaryHeapNode &elem_j = this->GetElement(j);
if (elem_i.priority <= elem_j.priority) {
std::swap(elem_i, elem_j);
i = j;
} else {
/* It is not, we're done! */
@ -135,15 +132,13 @@ bool BinaryHeap::Delete(uint32 item, int priority)
/* Now the only thing we have to do, is resort it..
* On place i there is the item to be sorted.. let's start there */
{
uint j;
BinaryHeapNode temp;
/* Because of the fact that Binary Heap uses array from 1 to n, we need to
* increase i by 1
*/
i++;
for (;;) {
j = i;
uint j = i;
/* Check if we have 2 children */
if (2 * j + 1 <= this->size) {
/* Is this child smaller than the parent? */
@ -158,9 +153,7 @@ bool BinaryHeap::Delete(uint32 item, int priority)
/* One of our children is smaller than we are, switch */
if (i != j) {
temp = this->GetElement(j);
this->GetElement(j) = this->GetElement(i);
this->GetElement(i) = temp;
std::swap(this->GetElement(i), this->GetElement(j));
} else {
/* None of our children is smaller, so we stay here.. stop :) */
break;
@ -180,11 +173,11 @@ uint32 BinaryHeap::Pop()
if (this->size == 0) return UINT32_MAX;
/* The best item is always on top, so give that as result */
uint32 result = this->GetElement(1).item;
BinaryHeapNode result = this->GetElement(1);
/* And now we should get rid of this item... */
this->Delete(this->GetElement(1).item, this->GetElement(1).priority);
this->Delete(result.item, result.priority);
return result;
return result.item;
}
/**

Loading…
Cancel
Save