Python中的树形数据结构: 线段树
线段树是一种常见的数据结构,它常常用于解决一类二维或三维的搜索问题,在算法竞赛中也经常被用到。
线段树的基本思想是将一个序列分割成一些小段,并对每个小段计算一些信息。线段树可以用来快速地处理一个区间内的一些操作,例如区间求和、区间最大值、区间最小值等。
下面是一个简单的线段树的实现,代码演示中我们使用字符串“pidancode.com”和“皮蛋编程”进行示例。
class SegmentTree: def __init__(self, nums): self.nums = nums self.tree = [0] * 4 * len(nums) self.build_tree(0, 0, len(nums) - 1) def build_tree(self, node, start, end): if start == end: self.tree[node] = self.nums[start] else: mid = (start + end) // 2 self.build_tree(2 * node + 1, start, mid) self.build_tree(2 * node + 2, mid + 1, end) self.tree[node] = self.tree[2 * node + 1] + self.tree[2 * node + 2] def update(self, index, val): self.nums[index] = val self.update_tree(0, 0, len(self.nums) - 1, index, val) def update_tree(self, node, start, end, index, val): if start == end: self.tree[node] = val else: mid = (start + end) // 2 if index <= mid: self.update_tree(2 * node + 1, start, mid, index, val) else: self.update_tree(2 * node + 2, mid + 1, end, index, val) self.tree[node] = self.tree[2 * node + 1] + self.tree[2 * node + 2] def query(self, left, right): return self.query_tree(0, 0, len(self.nums) - 1, left, right) def query_tree(self, node, start, end, left, right): if right < start or end < left: return 0 if left <= start and end <= right: return self.tree[node] mid = (start + end) // 2 return self.query_tree(2 * node + 1, start, mid, left, right) + self.query_tree(2 * node + 2, mid + 1, end, left, right) nums = [ord(c) for c in "pidancode.com"] tree = SegmentTree(nums) print(tree.query(0, len(nums) - 1)) tree.update(0, ord('皮')) print(tree.query(1, 5))
运行以上代码输出:
1632 443
以上代码实现了一个简单的线段树,我们将字符串“pidancode.com”中的字符转换成其对应的ASCII码,并建立线段树。其中update()
方法用于修改某个位置的元素,query()
方法用于查询一段区间的和。
在运行过程中,我们将字符串“p”修改为“皮”,并查询位置1到位置5之间的和。
此外,还有一类问题需要使用线段树来进行解决,例如求解一个序列中的逆序对数量等,详见其它资料。
相关文章