Skip to content

Commit 652e8af

Browse files
committed
refactor: Enhance docs, add tests in FibonacciHeap
1 parent 5246f63 commit 652e8af

File tree

2 files changed

+115
-3
lines changed

2 files changed

+115
-3
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
package com.thealgorithms.datastructures.heaps;
22

3+
/**
4+
* The {@code FibonacciHeap} class implements a Fibonacci Heap data structure,
5+
* which is a collection of trees that satisfy the minimum heap property.
6+
* This heap allows for efficient merging of heaps, as well as faster
7+
* decrease-key and delete operations compared to other heap data structures.
8+
*
9+
* <p>Key features of the Fibonacci Heap include:
10+
* <ul>
11+
* <li>Amortized O(1) time complexity for insert and decrease-key operations.</li>
12+
* <li>Amortized O(log n) time complexity for delete and delete-min operations.</li>
13+
* <li>Meld operation that combines two heaps in O(1) time.</li>
14+
* <li>Potential function that helps analyze the amortized time complexity.</li>
15+
* </ul>
16+
*
17+
* <p>This implementation maintains additional statistics such as the total number
18+
* of link and cut operations performed during the lifetime of the heap, which can
19+
* be accessed through static methods.
20+
*
21+
* <p>The Fibonacci Heap is composed of nodes represented by the inner class
22+
* {@code HeapNode}. Each node maintains a key, rank, marked status, and pointers
23+
* to its children and siblings. Nodes can be linked and cut as part of the heap
24+
* restructuring processes.
25+
*
26+
* @see HeapNode
27+
*/
328
public class FibonacciHeap {
429

530
private static final double GOLDEN_RATIO = (1 + Math.sqrt(5)) / 2;

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

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,103 @@
66
public class FibonacciHeapTest {
77

88
@Test
9-
void testHeap() {
9+
void testHeapInsertionAndMinimum() {
1010
FibonacciHeap fibonacciHeap = new FibonacciHeap();
1111
fibonacciHeap.insert(5);
1212
fibonacciHeap.insert(3);
1313
fibonacciHeap.insert(1);
1414
fibonacciHeap.insert(18);
1515
fibonacciHeap.insert(33);
1616

17-
Assertions.assertEquals(fibonacciHeap.findMin().getKey(), 1);
17+
Assertions.assertEquals(1, fibonacciHeap.findMin().getKey());
1818
fibonacciHeap.deleteMin();
19-
Assertions.assertEquals(fibonacciHeap.findMin().getKey(), 3);
19+
Assertions.assertEquals(3, fibonacciHeap.findMin().getKey());
20+
}
21+
22+
@Test
23+
void testDeleteMinOnSingleElementHeap() {
24+
FibonacciHeap fibonacciHeap = new FibonacciHeap(10);
25+
Assertions.assertEquals(10, fibonacciHeap.findMin().getKey());
26+
fibonacciHeap.deleteMin();
27+
Assertions.assertTrue(fibonacciHeap.empty());
28+
}
29+
30+
@Test
31+
void testHeapMeld() {
32+
FibonacciHeap heap1 = new FibonacciHeap();
33+
FibonacciHeap heap2 = new FibonacciHeap();
34+
heap1.insert(1);
35+
heap1.insert(2);
36+
heap2.insert(3);
37+
heap2.insert(4);
38+
39+
heap1.meld(heap2);
40+
Assertions.assertEquals(1, heap1.findMin().getKey());
41+
}
42+
43+
@Test
44+
void testHeapSize() {
45+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
46+
Assertions.assertEquals(0, fibonacciHeap.size());
47+
fibonacciHeap.insert(5);
48+
Assertions.assertEquals(1, fibonacciHeap.size());
49+
fibonacciHeap.insert(3);
50+
Assertions.assertEquals(2, fibonacciHeap.size());
51+
fibonacciHeap.deleteMin();
52+
Assertions.assertEquals(1, fibonacciHeap.size());
53+
}
54+
55+
@Test
56+
void testCountersRep() {
57+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
58+
fibonacciHeap.insert(5);
59+
fibonacciHeap.insert(3);
60+
fibonacciHeap.insert(8);
61+
fibonacciHeap.insert(1);
62+
63+
int[] counters = fibonacciHeap.countersRep();
64+
Assertions.assertEquals(4, counters[0]);
65+
Assertions.assertEquals(0, counters[1]);
66+
}
67+
68+
@Test
69+
void testDeleteMinMultipleElements() {
70+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
71+
fibonacciHeap.insert(5);
72+
fibonacciHeap.insert(2);
73+
fibonacciHeap.insert(8);
74+
fibonacciHeap.insert(1);
75+
76+
Assertions.assertEquals(1, fibonacciHeap.findMin().getKey());
77+
fibonacciHeap.deleteMin();
78+
Assertions.assertEquals(2, fibonacciHeap.findMin().getKey());
79+
}
80+
81+
@Test
82+
void testInsertNegativeKeys() {
83+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
84+
fibonacciHeap.insert(-10);
85+
fibonacciHeap.insert(-5);
86+
fibonacciHeap.insert(-20);
87+
88+
Assertions.assertEquals(-20, fibonacciHeap.findMin().getKey());
89+
}
90+
91+
@Test
92+
void testDeleteOnEmptyHeap() {
93+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
94+
Assertions.assertThrows(NullPointerException.class, () -> { fibonacciHeap.delete(fibonacciHeap.findMin()); });
95+
}
96+
97+
@Test
98+
void testPotentialCalculation() {
99+
FibonacciHeap fibonacciHeap = new FibonacciHeap();
100+
fibonacciHeap.insert(10);
101+
fibonacciHeap.insert(20);
102+
103+
Assertions.assertEquals(2, fibonacciHeap.potential()); // 2 trees, no marked nodes
104+
var node = fibonacciHeap.findMin();
105+
fibonacciHeap.delete(node);
106+
Assertions.assertEquals(1, fibonacciHeap.potential());
20107
}
21108
}

0 commit comments

Comments
 (0)