【问题标题】:O(n) algorithm that returns array indexes if condition is true如果条件为真,则返回数组索引的 O(n) 算法
【发布时间】:2016-04-10 22:52:04
【问题描述】:

我正在尝试编写一个采用线性数组的算法,从最低到最高排序。如果 arr[i] - arr[j] = 160,它应该返回值的位置。

我的问题是运行时间应该是 O(n)。

如果我使用从最高到最低数组元素的 for 循环来执行此操作,并且使用二进制搜索为每个元素搜索适当的数组元素,则运行时间仍然是 O(n log2 n)。

如何将复杂度降低到 O(n)?

【问题讨论】:

  • 也许您可以更详细地向我们展示您的尝试以及您对如何改进解决方案的想法。这听起来很像一个家庭作业问题,所以人们可能更愿意一起帮助你,而不是为你编写程序。另请参阅stackoverflow.com/help/mcve(现在阿米特很快就回答了这个问题,但对于未来的问题,请查看该链接)。
  • @dfri 恕我直言,这个问题很好。他确实展示了一个尝试过的解决方案 + 分析了它的复杂性,并得出结论它还不够好。只有到那时,他才问如何改进它。对我来说似乎很好。
  • 这个问题可能更适合cs.stackexchange.com

标签: algorithm search


【解决方案1】:

可以用两个迭代器i,j来完成,这样i > j总是,如果arr[i] - arr[j] > 160你增加i,如果arr[i] - arr[j] < 160增加j(如果它等于160,你中止)。

i = 1
j = 0
while (i < n):
   if (arr[i] - arr[j] == 160:
      // found it!
   else if (arr[i] - arr[j] < 160):
      i++
   else:
      j++

【讨论】:

  • @pabrams Homework questions are fine here。不过,所有问题都需要展示研究成果,而这个问题确实做到了——通过指出解决方案、分析其复杂性并观察问题所在。这个问题很好恕我直言。
  • 我并不是说这里违反了任何规则,只是对他来说似乎太容易了。通过自己解决 IMO,他会学到更多。
  • 谢谢你,这不是家庭作业问题,我只是想了解编写快速算法的概念,我想太多了,而不是像你一样想简单的解决方案:D
  • @njok 公平地说,这个解决方案并不是真的那么简单。它被称为“双指针方法”(或“技术”)。仅仅因为它需要很少的代码,并不意味着它很容易:)
  • 解释错误地描述了算法 - 如果差异 >160,则增加 i,如果 与应该做的完全相反(代码是正确的)。如果 diff 正好为 160,也不要中止,只需打印/输出 i&j,检查以下位置是否有重复值(并打印所有组合,例如 j、i+1 或 j+1、i),然后同时增加 i 和 j到具有更大值的新位置,然后继续。
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2011-09-03
  • 2022-01-04
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多