1
1
package com .thealgorithms .datastructures .heaps ;
2
2
3
- import java .util .ArrayList ;
4
- import java .util .Arrays ;
5
- import java .util .Collections ;
6
- import java .util .List ;
7
-
8
3
import com .thealgorithms .bitmanipulation .SingleBitOperations ;
9
4
import com .thealgorithms .maths .LeonardoNumber ;
5
+ import java .util .ArrayList ;
6
+ import java .util .List ;
10
7
8
+ /**
9
+ * Wikipedia: https://en.wikipedia.org/wiki/Smoothsort
10
+ */
11
11
public class LeonardoHeap <T extends Comparable <T >> {
12
12
13
13
private int leonardoLevelTracker ;
14
14
private int leonardoHeapSize ;
15
- private final List <T > leonardoHeap ;
15
+ private final List <T > leonardoHeap ;
16
16
17
17
public LeonardoHeap () {
18
18
this .leonardoHeap = new ArrayList <T >();
19
19
this .leonardoLevelTracker = 0 ;
20
20
this .leonardoHeapSize = 0 ;
21
21
}
22
22
23
- public static Integer [] getLeonardoNumbers () {
24
- Integer [] leonardoNumbers = {1 , 1 , 3 , 5 , 9 , 15 , 25 , 41 , 67 , 109 , 177 , 287 , 465 , 753 , 1219 , 1973 , 3193 , 5167 , 8361 , 13529 , 21891 , 35421 , 57313 , 92735 , 150049 , 242785 , 392835 , 635621 , 1028457 , 1664079 , 2692537 , 4356617 , 7049155 , 1405773 , 18454929 , 29860703 , 48315633 , 78176337 , 126491971 ,
25
- 204668309 , 331160281 , 535828591 };
26
-
27
- return leonardoNumbers ;
28
- }
29
-
30
23
public int getHeapsize () {
31
24
return this .leonardoHeapSize ;
32
25
}
@@ -41,12 +34,12 @@ private void decreaseLeonardoLevelTracker() {
41
34
}
42
35
43
36
private void increaseLeonardoLevelTracker () {
44
- Integer [] consecutiveTreeIndices = findConsecutiveLeonardoTreeIndices (leonardoLevelTracker );
45
- if (consecutiveTreeIndices [ 0 ] != -1 ) {
37
+ ArrayList < Integer > consecutiveTreeIndices = findConsecutiveLeonardoTreeIndices (leonardoLevelTracker );
38
+ if (consecutiveTreeIndices . get ( 0 ) != -1 ) {
46
39
// if 0th or 1st index is -1 that implies there are no concequtive trees
47
- leonardoLevelTracker = SingleBitOperations .clearBit (leonardoLevelTracker , consecutiveTreeIndices [ 0 ] );
48
- leonardoLevelTracker = SingleBitOperations .clearBit (leonardoLevelTracker , consecutiveTreeIndices [ 1 ] );
49
- leonardoLevelTracker = SingleBitOperations .setBit (leonardoLevelTracker , consecutiveTreeIndices [ 1 ] + 1 );
40
+ leonardoLevelTracker = SingleBitOperations .clearBit (leonardoLevelTracker , consecutiveTreeIndices . get ( 0 ) );
41
+ leonardoLevelTracker = SingleBitOperations .clearBit (leonardoLevelTracker , consecutiveTreeIndices . get ( 1 ) );
42
+ leonardoLevelTracker = SingleBitOperations .setBit (leonardoLevelTracker , consecutiveTreeIndices . get ( 1 ) + 1 );
50
43
} else if ((leonardoLevelTracker & 2 ) == 0 ) {
51
44
leonardoLevelTracker = SingleBitOperations .setBit (leonardoLevelTracker , 1 );
52
45
} else {
@@ -102,7 +95,6 @@ private void shiftRootAndRestoreHeap() {
102
95
Integer [] currentLeonardoTreeLevels = findAllLeonardoTreeIndices ();
103
96
int previousTreeSizeCumulative = 0 ;
104
97
ArrayList <Integer > rootNodeIndices = new ArrayList <Integer >();
105
- Collections .reverse (Arrays .asList (currentLeonardoTreeLevels )); // To get the Levels in decreasing order of levels
106
98
107
99
// The number of roots are going to be same the the number of levels
108
100
// iterate over the currentLeonardoTreeLevels and get roots
@@ -114,7 +106,7 @@ private void shiftRootAndRestoreHeap() {
114
106
115
107
int rootNodeIndexForHeapify = rootNodeIndices .getLast ();
116
108
int leonardoTreeLevelforHeapify = currentLeonardoTreeLevels [currentLeonardoTreeLevels .length - 1 ];
117
- boolean swaped =false ;
109
+ boolean swaped = false ;
118
110
119
111
for (int i = 1 ; i < rootNodeIndices .size (); i ++) {
120
112
@@ -144,27 +136,24 @@ private void shiftRootAndRestoreHeap() {
144
136
swaped = true ;
145
137
}
146
138
j = j - 1 ;
147
- if (j > 0 ) {
139
+ if (j > 0 ) {
148
140
currentRootNodeIndex = rootNodeIndices .get (j );
149
141
prevRootNodeIndex = rootNodeIndices .get (j - 1 );
150
- }
151
- else {
142
+ } else {
152
143
// j = 0 reached the left most tree
153
144
break ;
154
145
}
155
146
}
156
-
157
- if (swaped ) {
147
+
148
+ if (swaped ) {
158
149
maxHeapifyLeonardoTree (rootNodeIndexForHeapify , leonardoTreeLevelforHeapify );
159
150
swaped = false ;
160
151
}
161
-
162
152
}
163
153
164
154
maxHeapifyLeonardoTree (rootNodeIndexForHeapify , leonardoTreeLevelforHeapify ); // In case of insert and no swap.
165
-
166
155
}
167
-
156
+
168
157
private int getRightMostTree () {
169
158
// Isolate the rightmost set bit
170
159
int isolatedBit = leonardoLevelTracker & -leonardoLevelTracker ;
@@ -178,17 +167,20 @@ private int getRightMostTree() {
178
167
return position ;
179
168
}
180
169
181
- private static Integer [] findConsecutiveLeonardoTreeIndices (int num ) {
170
+ private static ArrayList < Integer > findConsecutiveLeonardoTreeIndices (int num ) {
182
171
int prevOneIndex = -1 ;
183
172
int currentLevel ;
184
173
185
- Integer [] answer = new Integer [] {-1 , -1 };
174
+ ArrayList <Integer > answer = new ArrayList <Integer >();
175
+ answer .add (-1 );
176
+ answer .add (-1 );
177
+
186
178
for (int i = 0 ; num > 0 ; i ++) {
187
179
currentLevel = num & 1 ;
188
180
if (currentLevel == 1 ) {
189
181
if (prevOneIndex != -1 ) {
190
- answer [ 0 ] = prevOneIndex ;
191
- answer [ 1 ] = i ;
182
+ answer . set ( 0 , prevOneIndex ) ;
183
+ answer . set ( 1 , i ) ;
192
184
}
193
185
prevOneIndex = i ;
194
186
} else {
@@ -205,34 +197,24 @@ private void swap(int i, int j) {
205
197
leonardoHeap .set (j , temp );
206
198
}
207
199
208
- // TODO use lists
209
200
private Integer [] findAllLeonardoTreeIndices () {
210
- int setBitCount = 0 ;
211
- for (int i = 0 ; i < Integer .SIZE ; i ++) {
212
- if ((leonardoLevelTracker & (1 << i )) != 0 ) {
213
- setBitCount ++;
214
- }
215
- }
216
-
217
- Integer [] setBitIndexes = new Integer [setBitCount ];
218
- int index = 0 ;
219
- for (int i = 0 ; i < Integer .SIZE ; i ++) {
201
+ List <Integer > setBitIndexes = new ArrayList <>();
202
+ for (int i = Integer .SIZE - 1 ; i >= 0 ; i --) {
220
203
if ((leonardoLevelTracker & (1 << i )) != 0 ) {
221
- setBitIndexes [ index ++] = i ;
204
+ setBitIndexes . add ( i ) ;
222
205
}
223
206
}
224
- return setBitIndexes ;
207
+ return setBitIndexes . toArray ( new Integer [ 0 ]) ;
225
208
}
226
209
227
-
228
- public void insertElement (T element ) {
210
+ public void addElement (T element ) {
229
211
increaseLeonardoLevelTracker ();
230
212
leonardoHeap .add (element );
231
213
increaseHeapSize ();
232
214
shiftRootAndRestoreHeap ();
233
215
}
234
216
235
- public T deleteElement () {
217
+ public T removeElement () {
236
218
decreaseLeonardoLevelTracker ();
237
219
decreaseHeapSize ();
238
220
T element = leonardoHeap .removeLast ();
0 commit comments