Skip to content

Commit 5d6c530

Browse files
committed
consolidate min/max heaps
1 parent 6b81e9e commit 5d6c530

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+841
-2709
lines changed

README.md

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,8 @@ Supports
6161
### Queue
6262

6363
- [X] Queue (using [dynamic array](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/ArrayQueue.cs) and optionally using [doubly linked list](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/LinkedListQueue.cs)) ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/Queue.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Queues/Queue_Tests.cs))
64+
- [X] Min/Max priority queue ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/PriorityQueue.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Queues/PriorityQueue_Tests.cs))
6465

65-
#### Priority queue
66-
67-
- [X] Min priority queue ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/PriorityQueue/MinPriorityQueue.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Queues/PriorityQueue/MinPriorityQueue_Tests.cs))
68-
- [X] Max priority queue ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Queues/PriorityQueue/MaxPriorityQueue.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Queues/PriorityQueue/MaxPriorityQueue_Tests.cs))
69-
7066
### Linked list
7167

7268
- [X] Singly linked list ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/LinkedList/SinglyLinkedList.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/LinkedList/SinglyLinkedList_Tests.cs))
@@ -75,21 +71,11 @@ Supports
7571

7672
### Heap
7773

78-
#### Min
79-
80-
- [X] Binary min heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Min/BMinHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Min/BMinHeap_Tests.cs))
81-
- [X] d-ary min heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Min/d-aryMinHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Min/D-aryMinHeap_Tests.cs))
82-
- [X] Binomial min heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Min/BinomialMinHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Min/BinomialMinHeap_Tests.cs))
83-
- [X] Fibornacci min heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Min/FibornacciMinHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Min/FibornacciMinHeap_Tests.cs))
84-
- [X] Pairing min heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Min/PairingMinHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Min/PairingMinHeap_Tests.cs))
85-
86-
#### Max
87-
88-
- [X] Binary max heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Max/BMaxHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Max/BMaxHeap_Tests.cs))
89-
- [X] d-ary max heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Max/d-aryMaxHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Max/D-aryMaxHeap_Tests.cs))
90-
- [X] Binomial max heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Max/BinomialMaxHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Max/BinomialMaxHeap_Tests.cs))
91-
- [X] Fibornacci max heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Max/FibornacciMaxHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Max/FibornacciMaxHeap_Tests.cs))
92-
- [X] Pairing max heap ([implementation](https://github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/Max/PairingMaxHeap.cs) | [tests](https://github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/Max/PairingMaxHeap_Tests.cs))
74+
- [X] Binary min/max heap ([implementation](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/BHeap.cs) | [tests](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/BHeap_Tests.cs))
75+
- [X] d-ary min/max heap ([implementation](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/d-aryHeap.cs) | [tests](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/D-aryHeap_Tests.cs))
76+
- [X] Binomial min/max heap ([implementation](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/BinomialHeap.cs) | [tests](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/BinomialHeap_Tests.cs))
77+
- [X] Fibornacci min/max heap ([implementation](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/FibornacciHeap.cs) | [tests](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/FibornacciHeap_Tests.cs))
78+
- [X] Pairing min/max heap ([implementation](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/src/Advanced.Algorithms/DataStructures/Heap/PairingHeap.cs) | [tests](https:/github.com/justcoding121/Advanced-Algorithms/blob/master/tests/Advanced.Algorithms.Tests/DataStructures/Heap/PairingHeap_Tests.cs))
9379

9480
Note: It is observed that among the implementations here in practice, with the exclusion of DecrementKey/IncrementKey operation regular Binary Heap & d-ary Heap outperforms other in theory superiors. Likely because it don't have pointer juggling overhead and hey arrays are faster!
9581

src/Advanced.Algorithms/Advanced.Algorithms.Docs.csproj

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,20 @@
8080
<Compile Include="DataStructures\HashSet\OpenAddressHashSet.cs" />
8181
<Compile Include="DataStructures\HashSet\OrderedHashSet.cs" />
8282
<Compile Include="DataStructures\HashSet\SeparateChainingHashSet.cs" />
83-
<Compile Include="DataStructures\Heap\BinomialHeapNode.cs" />
84-
<Compile Include="DataStructures\Heap\FibornacciHeapNode.cs" />
85-
<Compile Include="DataStructures\Heap\Max\BinomialMaxHeap.cs" />
86-
<Compile Include="DataStructures\Heap\Max\BMaxHeap.cs" />
87-
<Compile Include="DataStructures\Heap\Max\d-aryMaxHeap.cs" />
88-
<Compile Include="DataStructures\Heap\Max\FibornacciMaxHeap.cs" />
89-
<Compile Include="DataStructures\Heap\Max\PairingMaxHeap.cs" />
90-
<Compile Include="DataStructures\Heap\Min\BinomialMinHeap.cs" />
91-
<Compile Include="DataStructures\Heap\Min\BMinHeap.cs" />
92-
<Compile Include="DataStructures\Heap\Min\d-aryMinHeap.cs" />
93-
<Compile Include="DataStructures\Heap\Min\FibornacciMinHeap.cs" />
94-
<Compile Include="DataStructures\Heap\Min\PairingMinHeap.cs" />
95-
<Compile Include="DataStructures\Heap\PairingHeapNode.cs" />
83+
<Compile Include="DataStructures\Heap\BHeap.cs" />
84+
<Compile Include="DataStructures\Heap\BinomialHeap.cs" />
85+
<Compile Include="DataStructures\Heap\d-aryHeap.cs" />
86+
<Compile Include="DataStructures\Heap\FibornacciHeap.cs" />
87+
<Compile Include="DataStructures\Heap\PairingHeap.cs" />
88+
<Compile Include="DataStructures\Heap\Shared\BinomialHeapNode.cs" />
89+
<Compile Include="DataStructures\Heap\Shared\FibornacciHeapNode.cs" />
90+
<Compile Include="DataStructures\Heap\Shared\HeapComparer.cs" />
91+
<Compile Include="DataStructures\Heap\Shared\PairingHeapNode.cs" />
9692
<Compile Include="DataStructures\LinkedList\CircularLinkedList.cs" />
9793
<Compile Include="DataStructures\LinkedList\DoublyLinkedList.cs" />
9894
<Compile Include="DataStructures\LinkedList\SinglyLinkedList.cs" />
9995
<Compile Include="DataStructures\List\ArrayList.cs" />
10096
<Compile Include="DataStructures\List\SkipList.cs" />
101-
<Compile Include="DataStructures\Queues\ArrayQueue.cs" />
102-
<Compile Include="DataStructures\Queues\LinkedListQueue.cs" />
103-
<Compile Include="DataStructures\Queues\PriorityQueue\MaxPriorityQueue.cs" />
104-
<Compile Include="DataStructures\Queues\PriorityQueue\MinPriorityQueue.cs" />
105-
<Compile Include="DataStructures\Queues\Queue.cs" />
10697
<Compile Include="DataStructures\Set\BloomFilter.cs" />
10798
<Compile Include="DataStructures\Set\DisJointSet.cs" />
10899
<Compile Include="DataStructures\Set\SparseSet.cs" />

src/Advanced.Algorithms/Compression/HuffmanCoding.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public Dictionary<T, byte[]> Compress(T[] input)
1616
{
1717
var frequencies = computeFrequency(input);
1818

19-
var minHeap = new BMinHeap<FrequencyWrap>();
19+
var minHeap = new BHeap<FrequencyWrap>();
2020

2121
foreach (var frequency in frequencies)
2222
{
@@ -26,8 +26,8 @@ public Dictionary<T, byte[]> Compress(T[] input)
2626

2727
while (minHeap.Count > 1)
2828
{
29-
var a = minHeap.ExtractMin();
30-
var b = minHeap.ExtractMin();
29+
var a = minHeap.Extract();
30+
var b = minHeap.Extract();
3131

3232
var newNode = new FrequencyWrap(
3333
default(T), a.Frequency + b.Frequency);
@@ -38,7 +38,7 @@ public Dictionary<T, byte[]> Compress(T[] input)
3838
minHeap.Insert(newNode);
3939
}
4040

41-
var root = minHeap.ExtractMin();
41+
var root = minHeap.Extract();
4242

4343
var result = new Dictionary<T, byte[]>();
4444

src/Advanced.Algorithms/DataStructures/Heap/Min/BMinHeap.cs renamed to src/Advanced.Algorithms/DataStructures/Heap/BHeap.cs

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,41 @@
66
namespace Advanced.Algorithms.DataStructures
77
{
88
/// <summary>
9-
/// A binary min heap implementation.
9+
/// A binary heap implementation.
1010
/// </summary>
11-
public class BMinHeap<T> : IEnumerable<T> where T : IComparable
11+
public class BHeap<T> : IEnumerable<T> where T : IComparable
1212
{
13+
private readonly bool isMax;
14+
1315
private T[] heapArray;
1416
private readonly IComparer<T> comparer;
1517

1618
public int Count { get; private set; }
1719

18-
public BMinHeap()
19-
: this(null, null) { }
20+
public BHeap(bool isMax = false)
21+
: this(isMax, null, null) { }
2022

21-
public BMinHeap(IEnumerable<T> initial)
22-
: this(initial, null) { }
23+
public BHeap(bool isMax, IEnumerable<T> initial)
24+
: this(isMax, initial, null) { }
2325

24-
public BMinHeap(IComparer<T> comparer)
25-
: this(null, comparer) { }
26+
public BHeap(bool isMax, IComparer<T> comparer)
27+
: this(isMax, null, comparer) { }
2628

2729
/// <summary>
2830
/// Time complexity: O(n) if initial is provided. Otherwise O(1).
2931
/// </summary>
3032
/// <param name="initial">The initial items in the heap.</param>
31-
public BMinHeap(IEnumerable<T> initial, IComparer<T> comparer)
33+
public BHeap(bool isMax, IEnumerable<T> initial, IComparer<T> comparer)
3234
{
35+
this.isMax = isMax;
36+
3337
if (comparer != null)
3438
{
35-
this.comparer = comparer;
39+
this.comparer = new HeapComparer<T>(isMax, comparer);
3640
}
3741
else
3842
{
39-
this.comparer = Comparer<T>.Default;
43+
this.comparer = new HeapComparer<T>(isMax, Comparer<T>.Default);
4044
}
4145

4246
if (initial != null)
@@ -82,18 +86,18 @@ private void bulkInitRecursive(int i, T[] initial)
8286
var left = 2 * i + 1;
8387
var right = 2 * i + 2;
8488

85-
var min = left < initial.Length && right < initial.Length ? comparer.Compare(initial[left], initial[right]) < 0 ? left : right
89+
var minMax = left < initial.Length && right < initial.Length ? comparer.Compare(initial[left], initial[right]) < 0 ? left : right
8690
: left < initial.Length ? left
8791
: right < initial.Length ? right : -1;
8892

89-
if (min != -1 && comparer.Compare(initial[min], initial[parent]) < 0)
93+
if (minMax != -1 && comparer.Compare(initial[minMax], initial[parent]) < 0)
9094
{
91-
var temp = initial[min];
92-
initial[min] = initial[parent];
95+
var temp = initial[minMax];
96+
initial[minMax] = initial[parent];
9397
initial[parent] = temp;
9498

95-
//if min is child then drill down child
96-
i = min;
99+
//drill down to child
100+
i = minMax;
97101
continue;
98102
}
99103

@@ -134,24 +138,24 @@ public void Insert(T newItem)
134138
/// <summary>
135139
/// Time complexity: O(log(n)).
136140
/// </summary>
137-
public T ExtractMin()
141+
public T Extract()
138142
{
139143
if (Count == 0)
140144
{
141145
throw new Exception("Empty heap");
142146
}
143147

144-
var min = heapArray[0];
148+
var minMax = heapArray[0];
145149

146150
delete(0);
147151

148-
return min;
152+
return minMax;
149153
}
150154

151155
/// <summary>
152156
/// Time complexity: O(1).
153157
/// </summary>
154-
public T PeekMin()
158+
public T Peek()
155159
{
156160
if (Count == 0)
157161
{
@@ -204,22 +208,22 @@ private void delete(int parentIndex)
204208
var leftChild = heapArray[leftIndex];
205209
var rightChild = heapArray[rightIndex];
206210

207-
var leftIsMin = false;
211+
var leftIsMinMax = false;
208212

209213
if (comparer.Compare(leftChild, rightChild) < 0)
210214
{
211-
leftIsMin = true;
215+
leftIsMinMax = true;
212216
}
213217

214-
var minChildIndex = leftIsMin ? leftIndex : rightIndex;
218+
var minMaxChildIndex = leftIsMinMax ? leftIndex : rightIndex;
215219

216-
if (comparer.Compare(heapArray[minChildIndex], parent) < 0)
220+
if (comparer.Compare(heapArray[minMaxChildIndex], parent) < 0)
217221
{
218222
var temp = heapArray[parentIndex];
219-
heapArray[parentIndex] = heapArray[minChildIndex];
220-
heapArray[minChildIndex] = temp;
223+
heapArray[parentIndex] = heapArray[minMaxChildIndex];
224+
heapArray[minMaxChildIndex] = temp;
221225

222-
if (leftIsMin)
226+
if (leftIsMinMax)
223227
{
224228
parentIndex = leftIndex;
225229
}

0 commit comments

Comments
 (0)