【问题标题】:Is there a better way to find the location of a minimum element in an Array?有没有更好的方法来查找数组中最小元素的位置?
【发布时间】:2009-05-13 01:41:09
【问题描述】:

我现在有

def min(array,starting,ending)
  minimum = starting
  for i in starting+1 ..ending
    if array[i]<array[minimum]
      minimum = i
    end    
  end

return minimum
end

Ruby 中是否有更好的“实现”?这个看起来仍然很c-ish。 谢谢。

【问题讨论】:

  • “更好”是什么意思?更高效还是需要更少的代码?
  • 对不起,我的意思是说一个更好的 ruby​​ 实现。

标签: ruby arrays max


【解决方案1】:

如果要查找最小元素的索引,可以使用Enumerable#enum_for 获取一个项目索引对数组,并找到具有Enumerable#min 的数组中的最小值(这也是原始数组的最小值)。

% irb
irb> require 'enumerator'
#=> true
irb> array = %w{ the quick brown fox jumped over the lazy dog }
#=> ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"]
irb> array.enum_for(:each_with_index).min
#=> ["brown", 2]

如果要将其绑定到特定的数组索引:

irb> start = 3
#=> 3
irb> stop = 7
#=> 7
irb> array[start..stop].enum_for(:each_with_index).min
#=> ["fox", 0]
irb> array[start..stop].enum_for(:each_with_index).min.last + start
#=> 3

【讨论】:

    【解决方案2】:

    基本上这是你能做的最好的,虽然你可以写得更简洁一点:

    def minval(arr)
        arr.inject {|acc,x| (acc && acc < x ? acc : x)}
    end
    

    【讨论】:

    • 我认为 OP 想要最小值的索引,而不是值本身。这使得使用注入有点困难。
    • 而且,您甚至不需要使用除:arr.min 以外的任何东西来获得最小值。
    • 虽然这很聪明,但我不能使用它。
    【解决方案3】:

    有一种更简单的方法,它适用于 ruby​​ 1.9.2:

    a = [6, 9, 5, 3, 0, 6]
    a.find_index a.min
    

    【讨论】:

      【解决方案4】:

      这是查找数组中最小元素的标准算法,最好在调用此函数之前对数组进行排序。

      否则我找不到更有效的方法。具体来说,大 O 表示法中的线性时间是我们能做的最好的。

      【讨论】:

      • 对不起,我的意思是说 Ruby 中的相同算法有更好的实现吗?
      【解决方案5】:

      如果这不仅仅是一个学术问题,为什么不直接使用 Ruby 的原生 sort 方法呢?它是使用快速排序算法实现的,被认为非常快。

      a = [3, 4, 5, 1, 7, 5]
      a.sort![0] # => 1
      

      【讨论】:

      • 在“大”列表中,这将更加昂贵。 O(n*log(n)) 而不是 O(n)
      • 时间增加了很多,我无法将子程序集成到其他方法中,例如 Selection_Sort。
      • 同意。我在想,出于某种原因,必须发生某种事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2020-08-31
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多