A Finger Tree is a data structure that supports efficient access and updates at both ends of a sequence (like a deque) and allows efficient range queries and updates.
It’s often used for sequences where you need to access both ends and perform frequent insertions and deletions.
Steps:
The finger tree has a finger (a pointer) to a specific position in the sequence, which enables efficient access to both ends and arbitrary positions.
Insertion/Deletion: The structure supports logarithmic-time operations to add/remove elements from both ends.
Time Complexity:
Access/Insertion/Deletion: O(log n)
Query: O(log n) for general operations, O(1) for accessing ends.
class FingerTreeNode: def __init__(self, value=None, left=None, right=None): self.value = value self.left = left self.right = rightclass FingerTree: def __init__(self): self.root = None def insert_left(self, value): new_node = FingerTreeNode(value=value) if self.root: new_node.right = self.root self.root.left = new_node self.root = new_node def insert_right(self, value): new_node = FingerTreeNode(value=value) if self.root: current = self.root while current.right: current = current.right current.right = new_node new_node.left = current else: self.root = new_node def get_left(self): return self.root.value if self.root else None def get_right(self): current = self.root while current and current.right: current = current.right return current.value if current else None# Example usagefinger_tree = FingerTree()finger_tree.insert_left(10)finger_tree.insert_right(20)print("Left end:", finger_tree.get_left()) # Output: 10print("Right end:", finger_tree.get_right()) # Output: 20