Skip to content

Commit 7af2b86

Browse files
committed
Fix bulk init
1 parent b5302d6 commit 7af2b86

File tree

5 files changed

+43
-72
lines changed

5 files changed

+43
-72
lines changed

Advanced.Algorithms.Tests/DataStructures/Heap/Max/D-aryMaxHeap_Tests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class AsD_aryMaxTree_Tests
1414
/// A tree test
1515
/// </summary>
1616
[TestMethod]
17-
public void AsD_aryHeap_Test()
17+
public void D_ary_MaxHeap_Test()
1818
{
1919
var rnd = new Random();
2020

Advanced.Algorithms/DataStructures/Heap/Max/BMaxHeap.cs

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,35 +61,28 @@ private void BulkInit(T[] initial)
6161
/// <param name="i"></param>
6262
private void BulkInitRecursive(int i, T[] initial)
6363
{
64+
var parent = i;
65+
6466
var left = 2 * i + 1;
6567
var right = 2 * i + 2;
6668

67-
var Max = i;
68-
var parent = i;
69+
var max = left < initial.Length && right < initial.Length ?
70+
initial[left].CompareTo(initial[right]) > 0 ? left : right
71+
: left < initial.Length ?
72+
left : right < initial.Length ?
73+
right : -1;
6974

70-
if (left < initial.Length
71-
&& initial[left].CompareTo(initial[parent]) > 0)
75+
if (max != -1
76+
&& initial[max].CompareTo(initial[parent]) > 0)
7277
{
73-
var temp = initial[left];
74-
initial[left] = initial[parent];
78+
var temp = initial[max];
79+
initial[max] = initial[parent];
7580
initial[parent] = temp;
76-
Max = left;
77-
}
7881

79-
if (right < initial.Length
80-
&& initial[right].CompareTo(initial[parent]) > 0)
81-
{
82-
var temp = initial[right];
83-
initial[right] = initial[parent];
84-
initial[parent] = temp;
85-
Max = right;
82+
//if min is child then drill down child
83+
BulkInitRecursive(max, initial);
8684
}
8785

88-
//if Max is child then drill down child
89-
if (Max != parent)
90-
{
91-
BulkInitRecursive(Max, initial);
92-
}
9386
}
9487
//o(log(n))
9588
public void Insert(T newItem)

Advanced.Algorithms/DataStructures/Heap/Max/d-aryMaxHeap.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public D_aryMaxHeap(int k, IEnumerable<T> initial = null)
2828

2929
Count = initArray.Length;
3030
BulkInit(initArray);
31-
heapArray = initArray;
3231

3332
}
3433
else
@@ -44,7 +43,7 @@ public D_aryMaxHeap(int k, IEnumerable<T> initial = null)
4443
/// <param name="initial"></param>
4544
private void BulkInit(T[] initial)
4645
{
47-
var i = (initial.Length - K - 1) / K;
46+
var i = (initial.Length - 1) / K;
4847

4948
while (i >= 0)
5049
{
@@ -62,25 +61,18 @@ private void BulkInit(T[] initial)
6261
private void BulkInitRecursive(int i, T[] initial)
6362
{
6463
var parent = i;
65-
var max = parent;
64+
var max = findMaxChildIndex(i, initial);
6665

67-
var maxChild = findMaxChildIndex(i, initial);
68-
if (maxChild !=-1
69-
&& initial[maxChild].CompareTo(initial[parent]) > 0)
66+
if (max !=-1
67+
&& initial[max].CompareTo(initial[parent]) > 0)
7068
{
71-
var temp = initial[maxChild];
72-
initial[maxChild] = initial[parent];
69+
var temp = initial[max];
70+
initial[max] = initial[parent];
7371
initial[parent] = temp;
7472

75-
max = maxChild;
76-
}
77-
78-
79-
//if max is child then drill down child
80-
if (max != parent)
81-
{
8273
BulkInitRecursive(max, initial);
8374
}
75+
8476
}
8577

8678

Advanced.Algorithms/DataStructures/Heap/Min/BMinHeap.cs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,35 +61,29 @@ private void BulkInit(T[] initial)
6161
/// <param name="i"></param>
6262
private void BulkInitRecursive(int i, T[] initial)
6363
{
64-
var left = 2 * i + 1;
65-
var right = 2 * i + 2;
66-
67-
var min = i;
6864
var parent = i;
6965

70-
if (left < initial.Length
71-
&& initial[left].CompareTo(initial[parent]) < 0)
72-
{
73-
var temp = initial[left];
74-
initial[left] = initial[parent];
75-
initial[parent] = temp;
76-
min = left;
77-
}
66+
var left = 2 * i + 1;
67+
var right = 2 * i + 2;
7868

79-
if (right < initial.Length
80-
&& initial[right].CompareTo(initial[parent]) < 0)
69+
var min = left < initial.Length && right < initial.Length ?
70+
initial[left].CompareTo(initial[right]) < 0 ? left : right
71+
: left < initial.Length ?
72+
left : right < initial.Length ?
73+
right : -1;
74+
75+
if(min!=-1
76+
&& initial[min].CompareTo(initial[parent])<0)
8177
{
82-
var temp = initial[right];
83-
initial[right] = initial[parent];
78+
var temp = initial[min];
79+
initial[min] = initial[parent];
8480
initial[parent] = temp;
85-
min = right;
86-
}
8781

88-
//if min is child then drill down child
89-
if (min != parent)
90-
{
82+
//if min is child then drill down child
9183
BulkInitRecursive(min, initial);
9284
}
85+
86+
9387
}
9488
//o(log(n))
9589
public void Insert(T newItem)

Advanced.Algorithms/DataStructures/Heap/Min/d-aryMinHeap.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public D_aryMinHeap(int k, IEnumerable<T> initial = null)
2828

2929
Count = initArray.Length;
3030
BulkInit(initArray);
31-
heapArray = initArray;
3231

3332
}
3433
else
@@ -44,7 +43,7 @@ public D_aryMinHeap(int k, IEnumerable<T> initial = null)
4443
/// <param name="initial"></param>
4544
private void BulkInit(T[] initial)
4645
{
47-
var i = (initial.Length - K - 1) / K;
46+
var i = (initial.Length - 1) / K;
4847

4948
while (i >= 0)
5049
{
@@ -62,25 +61,18 @@ private void BulkInit(T[] initial)
6261
private void BulkInitRecursive(int i, T[] initial)
6362
{
6463
var parent = i;
65-
var min = parent;
64+
var min = findMinChildIndex(i, initial);
6665

67-
var minChild = findMinChildIndex(i, initial);
68-
if (minChild !=-1
69-
&& initial[minChild].CompareTo(initial[parent]) < 0)
66+
if (min !=-1
67+
&& initial[min].CompareTo(initial[parent]) < 0)
7068
{
71-
var temp = initial[minChild];
72-
initial[minChild] = initial[parent];
69+
var temp = initial[min];
70+
initial[min] = initial[parent];
7371
initial[parent] = temp;
7472

75-
min = minChild;
76-
}
77-
78-
79-
//if min is child then drill down child
80-
if (min != parent)
81-
{
8273
BulkInitRecursive(min, initial);
8374
}
75+
8476
}
8577

8678

0 commit comments

Comments
 (0)