如何降低程序的时间复杂度?

时间:2015-10-10 19:18:00

标签: python algorithm time-complexity

我正在解决一个问题,该问题说明如下: 有一排桶从1到n编号。园丁以特定的方式填充这个桶。他填充两端l和r之间的桶,包括l和r,其中1 <= 1 <= r <= n。他这样做了k次。我们需要找到水桶等于水桶中的体积中位数。我正在使用时间复杂度的程序来解决这个问题。输入如下:第一行包含空格分隔的n和k,下一个k行包含每个浇水过程的对l和r。我正在使用nklgn的算法来解决这个问题,如下所示:

while True:
nk = input().split(' ')
n = int(nk[0])
k = int(nk[1])
a = input().split(' ')
for z in range(len(a)):
    a[z] = int(a[z])
if n==0 and k==0: break

for mn in range(k):
    (x, y) = input().split(' ')
    x = int(x)-1
    y = int(y)-1
    for z in range(x, y+1):
        a[z] += 1
    print(sorted(a)[int(len(a)/2)])

请帮助我使用更好的算法解决这个问题,我遇到了一个非常类似的问题至少3到4次。如果不是整个代码,你可以在答案中给我一些提示。

2 个答案:

答案 0 :(得分:1)

我认为你应该使用Segment Tree。此数据结构用于在O(log(n))时间内更新和检索特定查询。

您可以通过以下方式更新树:首先找到覆盖范围[l,r]的节点,然后将更新的值存储在这些节点中。处理所有这样的查询 - 仅在顶级节点中存储更新的值而不更改原始节点。在此之后,在预订遍历中,您可以在O(n)时间内更新所有必需的节点。我认为这将是一个非常合理的优化。

如果你不了解这个数据结构,那么我建议你先阅读一下,然后尝试理解我的答案。

答案 1 :(得分:0)

首先,在最后一行中,当您只需要一个元素时,无需对列表进行完整的排序。