我在尝试降低算法复杂性时遇到了算法问题。具体问题有以下输入:
结果: 打印N行,每行包含值大于其父节点的子节点(包括低级子节点)的总数。
示例:
Input
8
60
20
50
10
40
10
50
30
1
1
1
2
2
3
4
Output
0
1
0
1
0
0
0
0
这是我的代码,但在最坏的情况下,它必须遍历所有内容,使其复杂度为 O(N^2)。我希望有一个更优化的解决方案来降低复杂性。
import sys
from collections import deque
def calculate(N, values, relations):
tree = {i: [] for i in range(1, N + 1)}
for i, parent in enumerate(relations, start=2):
tree[parent].append(i)
result = [0] * N
for i in range(1, N + 1):
stack = deque([(i, values[i - 1])])
while stack:
node, parent_value = stack.pop()
for child in tree[node]:
if values[child - 1] > parent_value:
result[i - 1] += 1
stack.append((child, parent_value))
return result
N = int(sys.stdin.readline())
values = [int(sys.stdin.readline()) for _ in range(N)]
relations = [int(sys.stdin.readline()) for _ in range(N - 1)]
for result in calculate(N, values, relations):
print(result)
您是正确的,您当前的算法的最坏情况时间复杂度为 O(N^2),这对于大 N 来说并不理想。以下是一些提高复杂度的方法: *优化遍历。 *利用记忆。 *改善亲子关系表征。 *预处理数据。 看看是否有任何方法有效并解决您的问题。