【问题标题】:Find if 2b=a+c in a given array of n elements in O(n*log n)? [duplicate]在 O(n*log n) 的给定 n 个元素的数组中查找 2b=a+c 是否? [复制]
【发布时间】:2018-07-15 01:33:41
【问题描述】:

有人可以提供一个 O(n*log n) 算法,它接受一个长度为 n 的数组,其中的元素在范围内 {1,2,3....n} 作为输入并检查数组是否包含 2b = a+c ?我知道如何在 O(n * n) 中做到这一点,但我需要将其优化为 O(n* log n)。

【问题讨论】:

  • 什么是a、b和c?集合中的元素?
  • 是的,输入集中的元素是 {1,2,3,4....n} 的子集
  • 到目前为止你尝试过什么?分享你的发现!给我们看一些代码!
  • 我得到了 O(n * n) 算法,但我需要 O(n* log n) 时间。
  • 是什么让您觉得存在 O(n* log n) 解决方案?这是家庭作业吗?

标签: algorithm sorting time-complexity


【解决方案1】:

如果您不知道答案,请不要嘲笑这些问题。我自己通过cmets中发布的链接找到了答案。 来源:O(nlogn) Algorithm - Find three evenly spaced ones within binary string

解决办法是, 令 L = [1, 2, 4, 5, 8]。

  1. 现在的问题是在 L 中找到长度为 3 的算术级数,即在 L 中找到不同的 a、b、c,使得 b-a = c-b,或等效地 a+c=2b。对于上面的示例,我们希望找到级数 (2, 5, 8)。

为 L 中的每个 k 创建一个多项式 p,其中项为 xk。对于上面的示例,我们使多项式 p(x) = (x + x2 + x4 + x5+x8)。这一步是O(n)。

使用快速傅里叶变换求多项式 q = p2。对于上面的示例,我们得到多项式 q(x) = x16 + 2x13 + 2x12 + 3x10 + 4x9 + x8 + 2x7 + 4x6 + 2x5 + x4 + 2x3 + x2。这一步是 O(n log n)。

对于 L 中的一些 k,忽略除对应于 x2k 的所有项。对于上面的示例,我们得到项 x16、3x10、x8、x4、x2。这一步是 O(n),如果你选择这样做的话。

这是关键点:L 中 b 的任何 x2b 的系数恰好是 L 中对 (a,c) 的数量,使得 a+c=2b。 [CLRS,前。 30.1-7] 这样的一对总是 (b,b)(所以系数至少为 1),但如果存在任何其他对 (a,c),则系数至少为 3,来自 (a,c ) 和 (c,a)。对于上面的例子,我们有 x10 的系数正好是 3,因为 AP (2,5,8)。 (由于上述原因,这些系数 x2b 将始终为奇数。q 中的所有其他系数将始终为偶数。)

所以总时间复杂度不会超过 O(n* logn)。

谢谢。

【讨论】:

  • 所以这个问题是重复的?
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多