aboutsummaryrefslogtreecommitdiff
path: root/lib/std/priority_queue.zig
diff options
context:
space:
mode:
authorBhargav Srinivasan <bsvasan92@icloud.com>2020-09-22 02:12:35 -0700
committerBhargav Srinivasan <bsvasan92@icloud.com>2020-09-22 02:12:35 -0700
commita5140cc9020f4e3649ccc14ca4317829ea289306 (patch)
tree7fdddc09806c08110b1d2b59ecc29712dd404f0a /lib/std/priority_queue.zig
parent1345f87f4efb7444516fceb76b1d60ec18ddebc1 (diff)
downloadzig-a5140cc9020f4e3649ccc14ca4317829ea289306.tar.gz
zig-a5140cc9020f4e3649ccc14ca4317829ea289306.zip
implemented efficient heapreplace
Diffstat (limited to 'lib/std/priority_queue.zig')
-rw-r--r--lib/std/priority_queue.zig9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/std/priority_queue.zig b/lib/std/priority_queue.zig
index 6e0e47dd05..9c6545c4e1 100644
--- a/lib/std/priority_queue.zig
+++ b/lib/std/priority_queue.zig
@@ -204,8 +204,13 @@ pub fn PriorityQueue(comptime T: type) type {
pub fn update(self: *Self, elem: T, new_elem: T) !void {
var update_index: usize = linearSearch(elem, self.items);
assert (update_index >= 0 and update_index < self.items.len);
- _ = self.removeIndex(update_index);
- try self.add(new_elem);
+ // Heapreplace:
+ // replace the item: self.items[update_index]= new_elem;
+ // swap the new item to the top of the heap: std.mem.swap(heap[0], heap[update_index]);
+ // sift up or down: which has been generically implemented as sift down: siftDown(self, 0)
+ self.items[update_index] = new_elem;
+ std.mem.swap(T, &self.items[0], &self.items[update_index]);
+ siftDown(self, 0);
}
pub const Iterator = struct {