import std.algorithm.comparison : equal;import std.range : take;auto maxHeap = heapify([4, 7, 3, 1, 5]);assert(maxHeap.take(3).equal([7, 5, 4]));auto minHeap = heapify!"a > b"([4, 7, 3, 1, 5]);assert(minHeap.take(3).equal([1, 3, 4]));
BinaryHeap(Store, alias less = "a < b") if (isRandomAccessRange!Store || isRandomAccessRange!(typeof(Store.init[])));BinaryHeap will refer to the underlying range orcontainer as thestore of the heap.BinaryHeap defines a so-called max-heap that optimizesextraction of thelargest elements. To define a min-heap,instantiate BinaryHeap with"a > b" as its predicate.Simply extracting elements from aBinaryHeap container istantamount to lazily fetching elements ofStore in descendingorder. Extracting elements from theBinaryHeap to completionleaves the underlying store sorted in ascending order but, again,yields elements in descending order.IfStore is a range, theBinaryHeap cannot grow beyond thesize of that range. IfStore is a container that supportsinsertBack, theBinaryHeap may grow by adding elements to thecontainer.import std.algorithm.comparison : equal;int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];auto h = heapify(a);// largest elementwriteln(h.front);// 16// a has the heap propertyassert(equal(a, [ 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 ]));
BinaryHeap implements the standard input range interface, allowinglazy iteration of the underlying range in descending order.import std.algorithm.comparison : equal;import std.range : take;int[] a = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7];auto top5 = heapify(a).take(5);assert(top5.equal([16, 14, 10, 9, 8]));
s, size_tinitialSize = size_t.max);s into a heap. IfinitialSize is specified, only the firstinitialSize elements ins are transformed into a heap, after which the heap can grow up tor.length (ifStore is a range) or indefinitely (ifStore is a container withinsertBack). PerformsΟ(min(r.length, initialSize)) evaluations ofless.acquire(Stores, size_tinitialSize = size_t.max);s may makethe heap work incorrectly.assume(Stores, size_tinitialSize = size_t.max);release();empty();dup();dup method is available only if theunderlying store supports it.length();capacity();front();clear();insert(ElementType!Storevalue);value into the store. If the underlying store is a rangeandlength == capacity, throws an exception.removeFront();popFront = removeFront;removeAny();replaceFront(ElementType!Storevalue);value.conditionalInsert(ElementType!Storevalue);value into the store andreturnstrue. Otherwise, ifless(value, front), callsreplaceFront(value) and returns againtrue. Otherwise, leavesthe heap unaffected and returnsfalse. This method is useful inscenarios where the smallestk elements of a set of candidatesmust be collected.conditionalSwap(ref ElementType!Storevalue);heapify(alias less = "a < b", Store)(Stores, size_tinitialSize = size_t.max);s andinitialSize.import std.conv : to;import std.range.primitives;{// example from "Introduction to Algorithms" Cormen et al., p 146int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];auto h =heapify(a); h =heapify!"a < b"(a); writeln(h.front);// 16 writeln(a);// [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]auto witness = [ 16, 14, 10, 9, 8, 7, 4, 3, 2, 1 ];for (; !h.empty; h.removeFront(), witness.popFront()) {assert(!witness.empty); writeln(witness.front);// h.front }assert(witness.empty);}{int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];int[] b =newint[a.length]; BinaryHeap!(int[]) h = BinaryHeap!(int[])(b, 0);foreach (e; a) { h.insert(e); } writeln(b);// [16, 14, 10, 8, 7, 3, 9, 1, 4, 2]}
import std.stdio;import std.algorithm.comparison : equal;import std.container.binaryheap;int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];auto h =heapify(a);// Internal representation of Binary Heap treeassert(a.equal([16, 14, 10, 8, 7, 9, 3, 2, 4, 1]));h.replaceFront(30);// Value 16 was replaced by 30assert(a.equal([30, 14, 10, 8, 7, 9, 3, 2, 4, 1]));// Making changes to the Store will be seen in the Heapa[0] = 40;writeln(h.front());// 40// Inserting a new element will reallocate the Store, leaving// the original Store unchanged.h.insert(20);assert(a.equal([40, 14, 10, 8, 7, 9, 3, 2, 4, 1]));// Making changes to the original Store will not affect the Heap anymorea[0] = 60;writeln(h.front());// 40