Skip to content

Commit a8a5835

Browse files
committed
Added LeonardoHeapHelper.java
1 parent ba730d0 commit a8a5835

File tree

4 files changed

+125
-60
lines changed

4 files changed

+125
-60
lines changed

src/main/java/com/thealgorithms/datastructures/heaps/LeonardoHeap.java

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private void decreaseLevelTracker() {
2626
}
2727

2828
private void increaseLevelTracker() {
29-
ArrayList<Integer> consecutiveTreeIndices = findConsecutiveTreeIndices(levelTracker);
29+
ArrayList<Integer> consecutiveTreeIndices = LeonardoHeapHelper.findConsecutiveTreeIndices(levelTracker);
3030
if (consecutiveTreeIndices.get(0) != -1) {
3131
// if 0th or 1st index is -1 that implies there are no concequtive trees
3232
levelTracker = SingleBitOperations.clearBit(levelTracker, consecutiveTreeIndices.get(0));
@@ -76,7 +76,7 @@ private void shiftRootAndRestoreHeap() {
7676
return;
7777
}
7878

79-
Integer[] currentTreeLevels = findAllTreeIndices();
79+
Integer[] currentTreeLevels = LeonardoHeapHelper.findAllTreeIndices(levelTracker);
8080
int previousTreeSizeCumulative = 0;
8181
ArrayList<Integer> rootNodeIndices = new ArrayList<Integer>();
8282

@@ -151,46 +151,12 @@ private int getRightMostTree() {
151151
return position;
152152
}
153153

154-
private static ArrayList<Integer> findConsecutiveTreeIndices(int num) {
155-
int prevOneIndex = -1;
156-
int currentLevel;
157-
158-
ArrayList<Integer> answer = new ArrayList<Integer>();
159-
answer.add(-1);
160-
answer.add(-1);
161-
162-
for (int i = 0; num > 0; i++) {
163-
currentLevel = num & 1;
164-
if (currentLevel == 1) {
165-
if (prevOneIndex != -1) {
166-
answer.set(0, prevOneIndex);
167-
answer.set(1, i);
168-
}
169-
prevOneIndex = i;
170-
} else {
171-
prevOneIndex = -1;
172-
}
173-
num >>>= 1;
174-
}
175-
return answer;
176-
}
177-
178154
private void swap(int i, int j) {
179155
T temp = heap.get(i);
180156
heap.set(i, heap.get(j));
181157
heap.set(j, temp);
182158
}
183159

184-
private Integer[] findAllTreeIndices() {
185-
List<Integer> setBitIndexes = new ArrayList<>();
186-
for (int i = Integer.SIZE - 1; i >= 0; i--) {
187-
if ((levelTracker & (1 << i)) != 0) {
188-
setBitIndexes.add(i);
189-
}
190-
}
191-
return setBitIndexes.toArray(new Integer[0]);
192-
}
193-
194160
public void addElement(T element) {
195161
increaseLevelTracker();
196162
heap.add(element);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.thealgorithms.datastructures.heaps;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
// TODO: CHeck file name. Check if the file needs to be here or in bitwose operations.
7+
public final class LeonardoHeapHelper {
8+
9+
private LeonardoHeapHelper() {
10+
}
11+
12+
public static ArrayList<Integer> findConsecutiveTreeIndices(int num) {
13+
int prevOneIndex = -1;
14+
int currentLevel = 0;
15+
16+
ArrayList<Integer> answer = new ArrayList<Integer>();
17+
answer.add(-1);
18+
answer.add(-1);
19+
20+
for (int i = 0; num > 0; i++) {
21+
currentLevel = num & 1;
22+
if (currentLevel == 1) {
23+
if (prevOneIndex != -1) {
24+
answer.set(0, prevOneIndex);
25+
answer.set(1, i);
26+
}
27+
prevOneIndex = i;
28+
} else {
29+
prevOneIndex = -1;
30+
}
31+
num >>>= 1;
32+
}
33+
return answer;
34+
}
35+
36+
public static Integer[] findAllTreeIndices(int num) {
37+
List<Integer> setBitIndexes = new ArrayList<>();
38+
for (int i = Integer.SIZE - 1; i >= 0; i--) {
39+
if ((num & (1 << i)) != 0) {
40+
setBitIndexes.add(i);
41+
}
42+
}
43+
return setBitIndexes.toArray(new Integer[0]);
44+
}
45+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.thealgorithms.datastructures.heaps;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import org.junit.jupiter.api.Test;
9+
10+
// TODO: CHeck file name. Check if the file needs to be here or in bitwose operations.
11+
public class LeonardoHeapHelperTest {
12+
13+
@Test
14+
public void testConsecutiveTreeIndicesForZero() {
15+
ArrayList<Integer> arrayList = LeonardoHeapHelper.findConsecutiveTreeIndices(0);
16+
ArrayList<Integer> expectedList = new ArrayList<>(Arrays.asList(-1, -1));
17+
18+
assertEquals(expectedList, arrayList);
19+
}
20+
21+
@Test
22+
public void testConsecutiveTreeIndicesForEleven() {
23+
ArrayList<Integer> arrayList = LeonardoHeapHelper.findConsecutiveTreeIndices(11);
24+
ArrayList<Integer> expectedList = new ArrayList<>(Arrays.asList(0, 1));
25+
26+
assertEquals(expectedList, arrayList);
27+
}
28+
29+
@Test
30+
public void testConsecutiveTreeIndicesForSixteen() {
31+
ArrayList<Integer> arrayList = LeonardoHeapHelper.findConsecutiveTreeIndices(16);
32+
ArrayList<Integer> expectedList = new ArrayList<>(Arrays.asList(-1, -1));
33+
34+
assertEquals(expectedList, arrayList);
35+
}
36+
37+
@Test
38+
public void testConsecutiveTreeIndicesForTwentyFour() {
39+
ArrayList<Integer> arrayList = LeonardoHeapHelper.findConsecutiveTreeIndices(24);
40+
ArrayList<Integer> expectedList = new ArrayList<>(Arrays.asList(3, 4));
41+
42+
assertEquals(expectedList, arrayList);
43+
}
44+
45+
@Test
46+
public void testfindAllTreeIndicesForZero() {
47+
Integer[] array = LeonardoHeapHelper.findAllTreeIndices(0);
48+
assertEquals(0, array.length);
49+
}
50+
51+
@Test
52+
public void testfindAllTreeIndicesForEleven() {
53+
Integer[] array = LeonardoHeapHelper.findAllTreeIndices(11);
54+
Integer[] expectedArray = new Integer[] {3, 1, 0};
55+
56+
assertTrue(Arrays.equals(expectedArray, array));
57+
}
58+
59+
@Test
60+
public void testfindAllTreeIndicesForSixteen() {
61+
Integer[] array = LeonardoHeapHelper.findAllTreeIndices(16);
62+
Integer[] expectedArray = new Integer[] {4};
63+
64+
assertTrue(Arrays.equals(expectedArray, array));
65+
}
66+
67+
@Test
68+
public void testfindAllTreeIndicesForTwentyFour() {
69+
Integer[] array = LeonardoHeapHelper.findAllTreeIndices(24);
70+
Integer[] expectedArray = new Integer[] {4, 3};
71+
72+
assertTrue(Arrays.equals(expectedArray, array));
73+
}
74+
}

src/test/java/com/thealgorithms/datastructures/heaps/LeonardoHeapTest.java

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -85,31 +85,11 @@ public void testAlwaysCurrentMaxElementIsRemoved() {
8585
@Test
8686
public void testForCompareChildAndSwap() {
8787
LeonardoHeap<Integer> heap = new LeonardoHeap<>();
88+
Integer[] elements = {5, 33, 40, 28, 95, 29, 88, 94, 12, 84, 15, 33, 2, 52, 37, 62, 48, 13, 61, 59};
8889

89-
heap.addElement(5);
90-
heap.addElement(33);
91-
heap.addElement(40);
92-
heap.addElement(28);
93-
94-
heap.addElement(95);
95-
heap.addElement(29);
96-
heap.addElement(88);
97-
heap.addElement(94);
98-
99-
heap.addElement(12);
100-
heap.addElement(84);
101-
heap.addElement(15);
102-
heap.addElement(33);
103-
104-
heap.addElement(2);
105-
heap.addElement(52);
106-
heap.addElement(37);
107-
heap.addElement(62);
108-
109-
heap.addElement(48);
110-
heap.addElement(13);
111-
heap.addElement(61);
112-
heap.addElement(59);
90+
for (Integer element : elements) {
91+
heap.addElement(element);
92+
}
11393

11494
// Assert the top 4 elemets are extracted correctly
11595
assertEquals(95, heap.removeElement());

0 commit comments

Comments
 (0)