我们有一个数组arr[0 . . . n-1]
。我们应该能够找到从索引l到r的元素总和0 <= l <= r <= n-1
。
一个简单的解决方案是运行从l到r的循环并计算给定范围内的元素总和。该操作需要O(n)
次。
另一种解决方案是创建另一个数组,并在此数组中的第i个索引处存储从start到i的和。现在可以在O(1)
时间内计算给定范围的总和。
在第一个示例中,复杂性为O(n)
,因为它遍历数组的每个元素。但在第二个解决方案中,复杂性是O(1)
。
请帮我理解这一点。
答案 0 :(得分:0)
第二种解决方案包括一个复杂度O(n)
的预处理步骤,以及显然sum[r] - sum[l-1]
的{{1}}计算。总体复杂性为O(1)
。
这些解决方案之间的区别在于查询部分的时间复杂性。第一个解决方案有O(n)
个查询,第二个是O(n)
。如果我们有O(1)
范围查询,那么第一种方法的复杂性将是m
,而第二种方法的复杂性会更好。{/ p}更好。
答案 1 :(得分:0)
提到的复杂性是关于回答查询。在第一种情况下,您将l
迭代到r
,使其O(n)
,但在第二种情况下,sum[l] = arr[0] + ... + arr[l]
和sum[r] = arr[0]+ ... +arr[r]
。要获得[l,r]范围内元素的总和,您必须执行sum[r]-sum[l-1]
{l> 0} ,这只是一个操作。这就是为什么第二种情况的复杂性是O(1)