【问题标题】:Generalizing a simple linear-time algorithm推广一个简单的线性时间算法
【发布时间】:2011-03-14 19:15:28
【问题描述】:

我正在尝试编写一个线性时间算法 O(n),它给定一个表 A[0..n-1] (用升序的自然值填充) 检查是否存在对 A[i], A[j] 满足 f(A[i], A[j]) = C (C 是一个预定义的常数).

假设 f(a,b) = a+b 算法将是:

Algo Paires(A[0..N-1], C)
in: Tab A[0..n-1] and C a constant
out : Boolean
Init indice ← 0
For i ← 0..n-1 do 
    if indice ≠ i & A[indice] + A[i] = C 
      return true
    else if i = n-1 & indice ≤ n-2 
      indice++; i ← 0;
End for
return False

但是如果:

那么算法是什么?有什么建议吗?

【问题讨论】:

  • 听起来您希望我们为您做作业。
  • 我只是在寻求帮助,我认为我在正确的地方......我自己编写了算法,现在我想概括它,但不幸的是我无法弄清楚如何。 ..我不想让你帮我做,但请帮我一些提示或建议....
  • 它在indice上迭代n次,在每次迭代中它在i上迭代n次。
  • 嗯,这是真的:/关于如何将执行时间更改为 O(n) 的任何建议?
  • @aaz:对不起,我投票赞成 Mooh 的评论,但现在我实际查看了解决方案,我认为您是正确的;它是 O(n²)。 @Mooh:但是,它仍然可以简单地在 O(n) 中完成(提示:一种方法需要两个索引,它们并不都从 0 开始......)

标签: algorithm data-structures


【解决方案1】:

提示:假设有一个 2D 矩阵,其行和列都已排序,并且给您一个数字 x,您需要找到它...

【讨论】:

  • 看起来我们不再寻找线性算法了,因为这个答案和示例中的伪代码都是二次的。鉴于此,我们可以在 O(1) 空间中计算答案吗?
  • @efficieny:为什么你认为这是二次方?
  • @efficiencyIsBliss:正如我上面提到的,虽然伪代码是二次的,但它肯定可以在线性时间内完成(当然也可以)。
  • @Moron 为了确定是否存在这样的配对,我们是否必须(在最坏的情况下)计算二维数组中的所有条目?
  • @BlueRaja 我读了你的 cmets 并且我同意伪代码可以在线性时间内完成,尽管我似乎无法弄清楚这也可以在线性时间内完成。跨度>
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
相关资源
最近更新 更多