authorgravatar for bsvasan92@icloud.comBhargav Srinivasan <bsvasan92@icloud.com> 2020-09-21 22:47:10-07:00
committergravatar for bsvasan92@icloud.comBhargav Srinivasan <bsvasan92@icloud.com> 2020-09-21 23:09:22-07:00
log26de64be138e6d53212ec1b362796d890dd42c7b
treee6468d25cb3e58f041318291d6be9e6f63b092a5
parent58ee5f4e61cd9b7a9ba65798e2214efa3753a733

adding a function to update the priority of an element


1 files changed, 88 insertions(+), 0 deletions(-)

lib/std/priority_queue.zig+88
......@@ -190,6 +190,31 @@ pub fn PriorityQueue(comptime T: type) type {
190190 self.len = new_len;
191191 }
192192
193 fn binarySearch(items: []const T, target: T) usize {
194 var left: usize = 0;
195 var right: usize = items.len-1;
196
197 while(left <= right) {
198 const mid = left + (right - left) / 2;
199 if (items[mid] == target) {
200 return mid;
201 } else if (items[mid] < target) {
202 left= mid+1;
203 } else {
204 right= mid-1;
205 }
206 }
207
208 return 0;
209 }
210
211 pub fn update(self: *Self, elem: T, new_elem: T) !void {
212 var update_index: usize = binarySearch(self.items, elem);
213 assert (update_index >= 0 and update_index < self.items.len);
214 _ = self.removeIndex(update_index);
215 try self.add(new_elem);
216 }
217
193218 pub const Iterator = struct {
194219 queue: *PriorityQueue(T),
195220 count: usize,
......@@ -437,3 +462,66 @@ test "std.PriorityQueue: iterator while empty" {
437462
438463 expectEqual(it.next(), null);
439464}
465
466test "std.PriorityQueue: update min heap" {
467 var queue = PQ.init(testing.allocator, lessThan);
468 defer queue.deinit();
469
470 try queue.add(55);
471 try queue.add(44);
472 try queue.add(11);
473 try queue.update(55, 5);
474 try queue.update(44, 4);
475 try queue.update(11, 1);
476 expectEqual(@as(u32, 1), queue.remove());
477 expectEqual(@as(u32, 4), queue.remove());
478 expectEqual(@as(u32, 5), queue.remove());
479}
480
481
482test "std.PriorityQueue: update same min heap" {
483 var queue = PQ.init(testing.allocator, lessThan);
484 defer queue.deinit();
485
486 try queue.add(1);
487 try queue.add(1);
488 try queue.add(2);
489 try queue.add(2);
490 try queue.update(1, 5);
491 try queue.update(2, 4);
492 expectEqual(@as(u32, 1), queue.remove());
493 expectEqual(@as(u32, 2), queue.remove());
494 expectEqual(@as(u32, 4), queue.remove());
495 expectEqual(@as(u32, 5), queue.remove());
496}
497
498test "std.PriorityQueue: update max heap" {
499 var queue = PQ.init(testing.allocator, greaterThan);
500 defer queue.deinit();
501
502 try queue.add(55);
503 try queue.add(44);
504 try queue.add(11);
505 try queue.update(55, 5);
506 try queue.update(44, 1);
507 try queue.update(11, 4);
508 expectEqual(@as(u32, 5), queue.remove());
509 expectEqual(@as(u32, 4), queue.remove());
510 expectEqual(@as(u32, 1), queue.remove());
511}
512
513test "std.PriorityQueue: update same max heap" {
514 var queue = PQ.init(testing.allocator, greaterThan);
515 defer queue.deinit();
516
517 try queue.add(1);
518 try queue.add(1);
519 try queue.add(2);
520 try queue.add(2);
521 try queue.update(1, 5);
522 try queue.update(2, 4);
523 expectEqual(@as(u32, 5), queue.remove());
524 expectEqual(@as(u32, 4), queue.remove());
525 expectEqual(@as(u32, 2), queue.remove());
526 expectEqual(@as(u32, 1), queue.remove());
527}
\ No newline at end of file