【问题标题】:To find sum of all consecutive sub-array of length k in a given array求给定数组中长度为 k 的所有连续子数组的总和
【发布时间】:2017-06-25 23:07:18
【问题描述】:

我想找出所有长度为K的连续子数组的总和 对于给定的长度数组n,给定k < n。例如,设给定数组为arr[6]={1,2,3,4,5,6}k=3,则答案为(6,9,12,15)。 可以这样得到:

(1+2+3)=6,
(2+3+4)=9,
(3+4+5)=12,
(4+5+6)=15.

我已经尝试过使用长度为k 的滑动窗口,但它的时间复杂度是O(n)。是否有任何需要更少时间的解决方案,例如O(log n)

【问题讨论】:

  • 没有。想想看,你必须扫描整个阵列。你不能比 O(n) 更好。您只能优化线性运行时的系数。
  • 您不能在少于O(n) 的时间内查看n 数字。
  • 如果我只是想从得到的答案中找出 sum 的最大值?
  • 如果你计算一个新数组sums,其中sums[i] = arr[0] + ... + arr[i]你可以在O(n - k)中返回结果
  • 结果的大小为 n - k + 1。如果 k 是常数,在 O(log n) 时间内生成 n - k + 1 个数字似乎是不可能的。

标签: c++ c algorithm sliding sub-array


【解决方案1】:

除非您知道数组的某些特定属性(例如元素的顺序、数组中包含的元素的范围等),否则您需要检查每个单独的值,从而导致O(n) 复杂性.

如果,例如,您知道数组中的值的总和是T(可能是因为您知道T 本身或被指定了范围),那么您可以考虑除了第一个和最后一个 (K-1) 元素之外的所有元素都将包含在 K 不同的总和中。这将意味着 T.K 的总和减去一些数量,并且您可以适当地减少第一个和最后一个 K 值的值,从而产生复杂度 O(K) 的算法。

但请注意,为了实现与此类似的策略,您必须了解有关数组中值的其他一些特定信息,可能是它们的范围或它们的总和。

【讨论】:

  • 如果我只想从得到的答案中找出最大值?
  • @Enigma 数组中的最大值,还是连续子数组和中的最大和?实际上,从我刚刚问的问题开始,因为在这两种情况下,您都需要额外的信息才能避免检查数组中的每个值,这意味着如果您没有任何额外的,您需要 O(n) 时间有关数组或其中包含的值的信息。
  • 总和的最大值。
  • @Enigma Maximum sum continuous sub-array 是一个经过充分研究的问题,您可以考虑使用它的特殊版本来找出您要问的问题。尽管如此,如果没有一些额外的信息(即对于 any 通用数组),该问题的已知有效解决方案具有O(n) 的复杂性。正如我反复提到的,您需要有一些额外的信息避免查看数组的每个元素并获得更好的复杂性
【解决方案2】:

你可以使用分段树数据结构,虽然构建它需要 O(n log n),但是你可以在 O(log n) 中找到任何区间的总和,并在 O(log n) 中修改数组的每个元素n) https://en.wikipedia.org/wiki/Segment_tree

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多