Skip to content

Added Fibonacci_Heap for DSA #9285

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 8 commits into from
101 changes: 101 additions & 0 deletions data_structures/heap/fibonacci_heap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
class FibonacciNode:
def __init__(self, key):

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: key

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: key

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: key

self.key = key
self.children = []
self.marked = False
self.degree = 0
self.parent = None


class FibonacciHeap:
def __init__(self):

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

Copy link
Contributor Author

Choose a reason for hiding this comment

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

class FibonacciNode:
def init(self, key) -> None:
self.key = key
self.children = []
self.marked = False
self.degree = 0
self.parent = None

class FibonacciHeap:
def init(self) -> None:
self.trees = []
self.least = None
self.count = 0

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

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: __init__. If the function does not return a value, please provide the type hint as: def function() -> None:

self.trees = []
self.least = None
self.count = 0

def insert(self, key):

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: insert. 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 insert

Please provide type hint for the parameter: key

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

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

Please provide type hint for the parameter: key

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

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

Please provide type hint for the parameter: key

new_node = FibonacciNode(key)
self.trees.append(new_node)
self.count += 1
if self.least is None or key < self.least.key:
self.least = new_node

def extract_min(self):

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: extract_min. 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 extract_min

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 extract_min

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

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 extract_min

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

if self.count == 0:
raise ValueError("Heap is empty")

min_node = self.least
self.trees.remove(min_node)

for child in min_node.children:
child.parent = None
self.trees.append(child)

self.count -= 1

if self.least is min_node:
self.least = None
for node in self.trees:
if self.least is None or node.key < self.least.key:
self.least = node

self.consolidate()
return min_node.key

def consolidate(self):

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: consolidate. 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 consolidate

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

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

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

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

degree_counts = [None] * (2 * len(self.trees))

for node in self.trees[:]:
degree = node.degree
while degree_counts[degree] is not None:
other_node = degree_counts[degree]
if node.key > other_node.key:
node, other_node = other_node, node # Swap nodes
self.link(other_node, node)
degree_counts[degree] = None
degree += 1
degree_counts[degree] = node

self.trees = [node for node in degree_counts if node is not None]

def link(self, node1, node2):

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: link. 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 link

Please provide type hint for the parameter: node1

Please provide type hint for the parameter: node2

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

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

Please provide type hint for the parameter: node1

Please provide type hint for the parameter: node2

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

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

Please provide type hint for the parameter: node1

Please provide type hint for the parameter: node2

self.trees.remove(node2)
node1.children.append(node2)
node2.parent = node1
node1.degree += 1
node2.marked = False

def decrease_key(self, node, new_key):

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: decrease_key. 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 decrease_key

Please provide type hint for the parameter: node

Please provide type hint for the parameter: new_key

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

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

Please provide type hint for the parameter: node

Please provide type hint for the parameter: new_key

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

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

Please provide type hint for the parameter: node

Please provide type hint for the parameter: new_key

if new_key > node.key:
raise ValueError("New key must be less than or equal to old key")

node.key = new_key

if node == self.least:
self.update_least()

parent = node.parent
if parent is not None and node.key < parent.key:
self.cut(node, parent)
self.cascading_cut(parent)

def cut(self, node, parent):

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: cut. 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 cut

Please provide type hint for the parameter: node

Please provide type hint for the parameter: parent

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

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

Please provide type hint for the parameter: node

Please provide type hint for the parameter: parent

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

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

Please provide type hint for the parameter: node

Please provide type hint for the parameter: parent

parent.children.remove(node)
parent.degree -= 1
self.trees.append(node)
node.parent = None
node.marked = False

def cascading_cut(self, node):

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: cascading_cut. 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 cascading_cut

Please provide type hint for the parameter: node

Copy link
Contributor Author

Choose a reason for hiding this comment

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

class FibonacciNode:
def init(self, key) -> None:
self.key = key
self.children = []
self.marked = False
self.degree = 0
self.parent = None

class FibonacciHeap:
def init(self) -> None:
self.trees = []
self.least = None
self.count = 0

# ... (other methods)

def cascading_cut(self, node: FibonacciNode) -> None:
    """
    Perform cascading cuts to handle marked nodes and maintain heap properties.

    :param node: The node on which cascading cuts are applied.
    """
    parent = node.parent
    if parent is not None:
        if not node.marked:
            node.marked = True
        else:
            self.cut(node, parent)
            self.cascading_cut(parent)

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

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

Please provide type hint for the parameter: node

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

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

Please provide type hint for the parameter: node

if (parent := node.parent) is not None:
if not node.marked:
node.marked = True
else:
self.cut(node, parent)
self.cascading_cut(parent)

def update_least(self):

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: update_least. 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 update_least

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_least

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

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_least

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

self.least = None
for node in self.trees:
if self.least is None or node.key < self.least.key:
self.least = node
28 changes: 28 additions & 0 deletions data_structures/heap/metropolish_hasting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import numpy as np

def metropolis_hastings(target_distribution, proposal_distribution, num_samples, initial_state):

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/metropolish_hasting.py, please provide doctest for the function metropolis_hastings

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

Please provide type hint for the parameter: target_distribution

Please provide type hint for the parameter: proposal_distribution

Please provide type hint for the parameter: num_samples

Please provide type hint for the parameter: initial_state

samples = [initial_state]
current_state = initial_state

for _ in range(num_samples):
proposed_state = proposal_distribution(current_state)
acceptance_ratio = min(1, target_distribution(proposed_state) / target_distribution(current_state))

if np.random.rand() < acceptance_ratio:
current_state = proposed_state

samples.append(current_state)

return samples[1:]

def target_distribution(x):

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/metropolish_hasting.py, please provide doctest for the function target_distribution

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

Please provide type hint for the parameter: x

Please provide descriptive name for the parameter: x

return np.exp(-x**2 / 2) / np.sqrt(2 * np.pi)

def proposal_distribution(x):

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/metropolish_hasting.py, please provide doctest for the function proposal_distribution

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

Please provide type hint for the parameter: x

Please provide descriptive name for the parameter: x

return x + np.random.normal(0, 1)

if __name__ == "__main__":
num_samples = 10000
initial_state = 0

samples = metropolis_hastings(target_distribution, proposal_distribution, num_samples, initial_state)