algorithm - 2D 线段树更新/修改步骤复杂度
问题描述
我无法理解https://www.geeksforgeeks.org/two-dimensional-segment-tree-sub-matrix-sum/中“修改查询”的复杂性。它在文章底部声明复杂度为 O(2 * n * log n * log m)。为什么不只是 O(log n * log m)?额外的线性项 n 是从哪里来的?
解决方案
检查他们的更新实施
def update(pos, low, high, x, y, val):
if (low == high) :
finalUpdate(1, 1, 4, x, val, pos)
else :
mid = (low + high) // 2
if (low <= y and y <= mid) :
update(2 * pos, low, mid, x, y, val)
else :
update(2 * pos + 1, mid + 1,
high, x, y, val)
for i in range(1, size):
fin_seg[pos][i] = (fin_seg[2 * pos][i] +
fin_seg[2 * pos + 1][i])
请注意,在组合步骤结束时,它遍历数组的所有列并更新相应树的所有项。这就是它的n
来源。但我会说复杂度是 O(n * log(m) + log(n) , because final update is called only once and does only
log(n)` 变化
没有n
因素的实现
仅重新计算依赖于已更改元素的节点的实现将具有复杂性O(log(n)*log(m))
。这可以通过跟踪finalUpdate
.
def finalUpdate(pos, low, high, x, val, node):
if (low == high) :
fin_seg[node][pos] = val
return [pos]
else :
mid = (low + high) // 2
if (low <= x and x <= mid) :
changes = finalUpdate(2 * pos, low, mid,
x, val, node)
else :
changes = finalUpdate(2 * pos + 1, mid + 1,
high, x, val, node)
changes.append(pos);
fin_seg[node][pos] = (fin_seg[node][2 * pos] +
fin_seg[node][2 * pos + 1])
return changes
这finalUpdate
是一种二分搜索,因此称为log(m)
递归,每次调用都会更改一个元素,因此更改将是 log(m)。
def update(pos, low, high, x, y, val):
if (low == high) :
changes = finalUpdate(1, 1, 4, x, val, pos)
else :
mid = (low + high) // 2
if (low <= y and y <= mid) :
changes = update(2 * pos, low, mid, x, y, val)
else :
changes = update(2 * pos + 1, mid + 1,
high, x, y, val)
for i in changes:
fin_seg[pos][i] = (fin_seg[2 * pos][i] +
fin_seg[2 * pos + 1][i])
return changes;
更新进行二分查找并被调用log(n)
次数,每次调用都会重新计算log(m)
节点。
推荐阅读
- flutter - CupertinoTabView onGenerateRoute 不起作用
- sql - BigQuery SQL 语法我需要项目名称和数据集吗?`projectName.dataSet.tableName.fieldName`
- git - Github 提交日期和作者日期
- r - 创建范围和单个项目的子集
- angular - 如何使用 mat-paginator 处理多个请求而不是先请求所有数据?
- javascript - 当用户在输入类型=文件中取消弹出窗口时保存旧值
- python - 我收到“MatplotlibDeprecationWarning”,但不知道如何解决
- ruby-on-rails - 有没有一种简单的方法可以找到慢速规格
- java - 有没有办法在不使用嵌套循环的情况下查找数组中是否存在特定总和?(爪哇)
- javascript - ajax调用后全局变量不断重置为null