python - 获取 N 叉树中较大祖先的数量
问题描述
我们有一棵树,其节点编号从1
到N
。vals
它以 3 个数组, edge1
,的格式提供给我们edge2
。vals[i] 的值为 node i + 1
。从 edge1[i] 到 edge2[i] 有一条边。树的根为 1。
我想为树中的每个节点计算大于当前节点值的祖先的数量,并将它们返回到一个数组中。
这是一个有效的算法:
def get_larger_ancestors(vals, edge1, edge2):
tree = defaultdict(set)
for u, v in zip(B, C):
tree[u].add(v)
tree[v].add(u)
parents = {1:None}
que = deque([1])
seen = set()
while que:
current = que.popleft()
seen.add(current)
for node in tree[current]:
if node not in seen:
parents[node] = current
que.append(node)
result = [None] * len(A)
for val in tree:
count = 0
target = A[val - 1]
p = val
while p:
p = parents[p]
if p is None: break
if A[p - 1] > target:
count += 1
result[val - 1] = count
return result
上述算法的时间复杂度在最坏情况下是二次的。它必须在大约 10^6 个节点上运行。
如何提高时间复杂度?
解决方案
对于您的算法的某些图的复杂性,例如来自节点的O(n)
树有根节点的直接子节点。对于某些图,它是,例如,有一条长腿的树。然后就是。m
m-1
O(n^2)
1+2+3+..+(n-1)
您可以做的不是遍历所有父母,而是将它们存储在平衡树中,并以对数时间而不是当前线性时间查找每个下一个孩子的位置。通过此更改,您的最坏时间将从二次减少到O(n*log(n))
。有关对数求和公式,请参见此处。
推荐阅读
- javascript - Jest 中的模拟模块
- python - 在 Python 中绘制多个日期和值对列
- sql-server - 查询将数据从一个数据库传输到另一个数据库
- javascript - 文档未定义
- excel - Excel 冻结窗格在使用自定义视图和清除过滤器时起作用
- cluster-computing - 我遇到了 sklearn.cluster 和 KMeans 的问题
- python - 包含以下字典的文件
并且没有逗号分隔字典,需要加载到 pandas 以轻松创建 csv 文件 - javascript - 我正在使用媒体记录器捕获屏幕并从 blob 制作视频,但该视频未显示其持续时间
- spring-boot - Spring Cloud Stream:没有allowOverride,无法连接到2个rabbitmq集群
- python - 算法排序的实际时间