【问题标题】:How to sum the largest two elements in an array如何对数组中最大的两个元素求和
【发布时间】:2013-10-13 21:31:52
【问题描述】:

使用 Ruby 获取数组中两个最大值之和的适当方法是什么?

我知道array.sortarray.maxinject(:+),但我不知道如何组合它们。

【问题讨论】:

标签: ruby


【解决方案1】:

我强烈支持更简单、更快速的方法:

array.max(2).reduce(:+)

排序是不必要的,扫描数组更新大小为 K 的最大堆就足够了。使用Array#max(K) 你可以实现 O(N x log(K)) 渐近时间复杂度与 O(N x log(N) ) 的排序。

【讨论】:

  • 完美使用max
  • array.max(2).sum 更短
  • 长度较短。在您进入大阵列或循环数千次之前,这几乎是一种洗涤速度。 Fruity 说它“相似”。
【解决方案2】:
[9, 4, 5, 1].sort.last(2).sum
=> 14

【讨论】:

  • 酷。不知道最后的争论。 sum 虽然是 Rails 方法。他将问题标记为 RoR,但询问了 Ruby 解决方案。不清楚他是否需要香草溶液。
  • 我添加了基准来测试各种解决方案。见stackoverflow.com/a/38809082/128421
  • Ruby 将在version 2.4 中获得Enumerable#sum
【解决方案3】:
[1,2,3,4].sort[-2..-1].inject(:+)

如果您正在寻找更有效的解决方案,那么您会更好:

[1,2,3,4].inject([0, 0]) do |largest, el|
  if largest[0] < el
    largest[1] = largest[0]
    largest[0]  = el
  elsif largest[1] < el
    largest[1] = el
  end
  largest
end.inject(:+)

如果您熟悉算法复杂性,那么您可以看到第一个是 nlognn^2,这取决于 Ruby 排序算法,其中第二个解决方案只是 n,因为它通过数组一次。

【讨论】:

  • “高效”不是描述差异的好词。第一个更短、清晰且易于理解,运行速度比第二个快约 50 倍。尝试执行此任务时,它也是惯用的 Ruby。
  • 更进一步@theTinMan 的观点,渐近比较通常是无关紧要的。你需要测试。特别是,当一种方法在 C 中进行了优化(例如 sort)而另一种方法没有优化时,前者通常更快,有时甚至快一英里。
【解决方案4】:

你可以试试这样的

array = [13, 2, 21, 36, 4, 9]

array.reverse.first(2).reduce(:+)

在这种方法中,我们对数组进行反向排序,即从最高到最低排序。这会将最大的数字放在数组的首位。 reduce 方法返回这些数字的总和。在这种情况下,36 和 21 的和是 57。

57

【讨论】:

  • 由于这是一个 Rails 问题,sum 将优先于 reduce(:+)
  • array.reverse.first(2).reduce(:+) # =&gt; 13。您根本没有对数组进行排序。检查你的工作总是好的。
【解决方案5】:

有一些基准来看看什么是完成某事的最快方法总是好的:

require 'active_support/core_ext/enumerable'
require 'fruity'

ARRAY = (0..1000).to_a.shuffle

compare do

  adriano { ARRAY.max(2).reduce(:+)       }
  mori    { ARRAY.sort.last(2).sum        }
  edgars  { ARRAY.sort[-2..-1].inject(:+) }

end


# >> Running each test 64 times. Test will take about 1 second.
# >> adriano is faster than edgars by 50.0% ± 10.0%
# >> edgars is similar to mori

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2020-04-10
    相关资源
    最近更新 更多