Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add fibonacci_heap.py by Hardvan · Pull Request #9274 · TheAlgorithms/Python · GitHub
Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
from math import log


class FibonacciNode:
"""
Node in a Fibonacci Heap, containing:
- value
- degree (number of children)
- child (a child node)
- left and right pointers to neighboring nodes
- parent (pointer to the parent node)
- mark (boolean flag to indicate if the node has lost a child)
"""

def __init__(self, val: int) -> None:
"""
Initialize a FibonacciNode with the given value.
"""
self.val = val
self.degree = 0
self.child = None
self.left = self
self.right = self
self.parent = None
self.mark = False

def add_child(self, child):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function add_child

Please provide type hint for the parameter: child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: add_child. If the function does not return a value, please provide the type hint as:def function() -> None:

Please provide type hint for the parameter: child

"""
Add a child to this node.

>>> parent = FibonacciNode(5)
>>> child1 = FibonacciNode(3)
>>> child2 = FibonacciNode(7)
>>> parent.add_child(child1)
>>> parent.child
<__main__.FibonacciNode object at ...>
>>> parent.child.val
3
>>> parent.child.right.val
3
>>> parent.child.left.val
3
>>> parent.child.parent
<__main__.FibonacciNode object at ...>
>>> parent.child.degree
1
>>> parent.add_child(child2)
>>> parent.child.right.val
7
>>> parent.child.left.val
3
>>> child1.parent
<__main__.FibonacciNode object at ...>
>>> child1.left.val
7
>>> child1.right.val
7
>>> child1.degree
0
"""
if self.child is None:
self.child = child
else:
child.right = self.child
child.left = self.child.left
self.child.left.right = child
self.child.left = child
child.parent = self
self.degree += 1

def remove_child(self, child: "FibonacciNode") -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function remove_child

"""
Remove a child from this node's children.
"""
if child == self.child:
if child.right == child:
self.child = None
else:
self.child = child.right
child.left.right = child.right
child.right.left = child.left
child.parent = None
child.mark = False
self.degree -= 1


class FibonacciHeap:
"""
Min-oriented priority queue implemented with the Fibonacci Heap data structure.
It supports:
- Insert element: O(1)
- Find minimum: O(1)
- Merge (meld) heaps: O(1)
- Delete minimum: Amortized O(log n)
- Decrease key: Amortized O(1)
- Delete node: Amortized O(log n)

For more details, refer to the Wikipedia page on [Fibonacci Heap](https://en.wikipedia.org/wiki/Fibonacci_heap).
"""

def __init__(self) -> None:
"""
Initialize an empty Fibonacci Heap.
"""
self.min_node = None
self.root_list = []
self.size = 0

def insert(self, val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function insert

"""
Insert a new element with the given value into the Fibonacci Heap.
"""
new_node = FibonacciNode(val)
if self.min_node is None:
self.min_node = new_node
else:
self._link(self.min_node, new_node)
if val < self.min_node.val:
self.min_node = new_node
self.root_list.append(new_node)
self.size += 1

def _link(self, min_node: FibonacciNode, new_node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _link

"""
Link two nodes in the Fibonacci Heap.
"""
min_node.add_child(new_node)

def find_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function find_min

"""
Find the minimum element in the Fibonacci Heap.
"""
if self.min_node is None:
raise Exception("Heap is empty")
return self.min_node.val

def _consolidate(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _consolidate

"""
Consolidate nodes with the same degree in the Fibonacci Heap.
"""
max_degree = int(2 * log(self.size) / log(1.618))
degree_table = [None] * (max_degree + 1)

current = self.root_list[:]
for node in current:
degree = node.degree
while degree_table[degree]:
other = degree_table[degree]
if node.val > other.val:
node, other = other, node
self._link(other, node)
degree_table[degree] = None
degree += 1
degree_table[degree] = node

self.min_node = None
for node in degree_table:
if node and (self.min_node is None or node.val < self.min_node.val):
self.min_node = node

def delete_min(self) -> int:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_min

"""
Delete the minimum element from the Fibonacci Heap.
"""
if self.min_node is None:
return None

min_val = self.min_node.val

if self.min_node.child:
children = self.min_node.child
while True:
next_child = children.right
children.parent = None
self.root_list.append(children)
if next_child == self.min_node.child:
break
children = next_child

self.root_list.remove(self.min_node)
self._consolidate()
self._update_min_node()
self.size -= 1

return min_val

def decrease_key(self, node: FibonacciNode, new_val: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function decrease_key

"""
Decrease the key of a node in the Fibonacci Heap.
"""
if new_val > node.val:
raise ValueError("New value is greater than current value")
node.val = new_val
parent = node.parent
if parent and node.val < parent.val:
self._cut(node, parent)
self._cascading_cut(parent)
if node.val < self.min_node.val:
self.min_node = node

def _cut(self, node: FibonacciNode, parent: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cut

"""
Cut a node from its parent in the Fibonacci Heap.
"""
parent.remove_child(node)
self.root_list.append(node)
node.mark = False

def _cascading_cut(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _cascading_cut

"""
Perform a cascading cut operation in the Fibonacci Heap.
"""
if parent := node.parent:
if not node.mark:
node.mark = True
else:
self._cut(node, parent)
self._cascading_cut(parent)

def delete_node(self, node: FibonacciNode) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function delete_node

"""
Delete a specific node from the Fibonacci Heap.
"""
self.decrease_key(node, float("-inf"))
self.delete_min()

def _update_min_node(self) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function _update_min_node

"""
Update the minimum node in the Fibonacci Heap.
"""
if not self.root_list:
self.min_node = None
return

min_val = min(node.val for node in self.root_list)
self.min_node = next(node for node in self.root_list if node.val == min_val)

def __str__(self) -> str:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/heap/fibonacci_heap.py, please provide doctest for the function __str__

"""
Return a string representation of the Fibonacci Heap.
"""
if self.min_node is None:
return "Fibonacci Heap (Empty)"
return f"Fibonacci Heap (Minimum: {self.min_node.val})"


if __name__ == "__main__":
import doctest

doctest.testmod()