Python中的树形数据结构: Range Tree
Range Tree是一种树形数据结构,用于解决一维或多维区间查询问题。它可以用来快速查找一个区间内的所有元素,或者查找与一个给定区间重叠的所有元素。
Python中的Range Tree可以通过实现一个二叉查找树来实现。每个节点都代表一个区间,并存储了区间的起点和终点。每个节点都有一个指向左子树的指针和一个指向右子树的指针,以及一个指向覆盖该节点的所有区间的指针。
以下是一个简单的Python实现:
class RangeNode: def __init__(self, start, end): self.start = start self.end = end self.left = None self.right = None self.covered_ranges = [] class RangeTree: def __init__(self, ranges): self.root = self.construct_tree(ranges) def construct_tree(self, ranges): if not ranges: return None mid = len(ranges) // 2 node = RangeNode(ranges[mid][0], ranges[mid][1]) node.left = self.construct_tree(ranges[:mid]) node.right = self.construct_tree(ranges[mid+1:]) node.covered_ranges = [node] if node.left: node.covered_ranges += node.left.covered_ranges if node.right: node.covered_ranges += node.right.covered_ranges return node def search(self, start, end): return self.search_helper(start, end, self.root) def search_helper(self, start, end, node): if not node: return [] if end < node.start: return self.search_helper(start, end, node.left) if start > node.end: return self.search_helper(start, end, node.right) return [r for r in node.covered_ranges if r.start <= end and r.end >= start]
在这个实现中,我们定义了一个RangeNode类来表示每个节点,每个节点包含其区间的起始和结束点,以及指向左子树和右子树的指针。它还有一个包含所有覆盖该节点的区间的列表。
我们还定义了一个RangeTree类来管理整个树,它调用construct_tree方法来构建树。该方法接受一个二维列表,其中每个元素包含一个区间的起始和结束点。树的根节点是该列表的中间元素。左子树是列表的左半部分构造的树,右子树是列表的右半部分构造的树。每个节点的覆盖区间是其子节点的覆盖区间的并集。
我们还定义了一个search方法来查找与给定区间重叠的所有区间。它调用search_helper方法来查找与给定区间重叠的所有区间。如果给定的区间没有重叠,则返回一个空列表。
下面是一个简单的例子,演示了如何在Range Tree中查找与一个给定区间重叠的所有区间:
ranges = [(1,5), (3,7), (6,10), (8,12), (11,15)] rt = RangeTree(ranges) result = rt.search(4, 9) print(result) # [(1, 5), (3, 7), (6, 10), (8, 12)]
在这个例子中,我们首先定义了一个包含多个区间的列表。然后我们创建了一个Range Tree,将这些区间传递给它。最后,我们调用search方法,查找与给定区间(4,9)重叠的所有区间,并将结果打印出来。
相关文章