【问题标题】:What is the fastest way to generate all subarrays of a given array in less than O(n^2)?在小于 O(n^2) 的时间内生成给定数组的所有子数组的最快方法是什么?
【发布时间】:2017-06-30 12:58:03
【问题描述】:

我想在一个数组中生成所有可能的子数组。我尝试了一个复杂度为 O(n^2) 的算法。

    for(i=1;i<=N;++i){
    if(S[i]==k)
      return 1;
    x=S[i];
    for(j=i+1;j<=N;++j){
        x^=S[j];
        if(x==k)
          return 1;
    }
}

【问题讨论】:

  • 在一个大小为 n 的数组中有 n^2 个可能的子数组。您不能在小于 O(n^2) 的时间内生成大小为 n^2 的输出。
  • 更不用说复制每个数组所需的 O(n) 时间
  • @spug:实际上,如果您安排您的子阵列由原始阵列支持 - 例如,这可以治愈。 subList-s 是 Java 中的 ArrayList,C 中的(指针、长度)对。

标签: arrays algorithm


【解决方案1】:

从代码看来,您的函数正在尝试:

如果存在与目标值 k 异或的子数组,则返回 1,否则返回 0。

geeksforgeeks 描述了解决此问题的更有效方法:

一个有效的解决方案在 O(n) 时间内解决了上述问题。让我们将 [i+1, j] 范围内的所有元素的 XOR 称为 A,将 [0,i] 范围内的所有元素称为 B,并将 [0,j] 范围内的所有元素称为 C。如果我们对 B 进行 XOR对于 C,B 和 C 中 [0,i] 中的重叠元素归零,我们得到 [i+1,j] 范围内所有元素的异或,即 A。由于 A = B XOR C,我们有 B = A XOR C. 现在,如果我们知道 C 的值并将 A 的值作为 m,我们将 A 的计数作为满足该关系的所有 B 的计数。本质上,我们得到了每个 C 具有 XOR-sum m 的所有子数组的计数。当我们对所有 C 求和时,我们得到了答案。

那里的代码实际上更进一步,并返回具有目标值的子数组的总数,但如果计数大于 0,您可以通过返回 1 来转换它以匹配您的问题。

【讨论】:

  • 我在 geeksforgeeks 上看到了代码,但我无法理解那里的逻辑。你能解释一下它背后的逻辑吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多