查找映射数据的最小值

时间:2013-05-10 15:42:30

标签: ruby map

给定一系列复杂对象,一个用于将每个映射到Comparable值的算法,以及找到最小值的愿望,是一个内置库方法这将在一次通过中做到这一点?

有效但不是完美有效的解决方案:

# Iterates through the array twice
min = objects.map{ |o| make_number o }.min

# Calls make_number one time more than is necessary
min = make_number( objects.min_by{ |o| make_number o } )

高效但冗长的解决方案:

min = nil
objects.each{ |o| n=make_number(o); min=n if !min || n<min }

1 个答案:

答案 0 :(得分:5)

不,不存在此类库方法。

我真的没有看到两个原始解决方案中的任何一个问题。枚举器代码用C语言编写,通常非常快。您始终可以对其进行基准测试,并查看特定数据集和代码的最快速度(尝试https://github.com/acangiano/ruby-benchmark-suite

但是,如果您确实需要一次通过,则可以使用#each简化#reduce版本:

min = objects.reduce(Float::INFINITY){ |min, o|
  n = make_number(o)
  min > n ? n : min
}

如果您的对象已经是某种形式的数字,则可以省略Float::INFINITY。否则,为了确保我们只是比较数字值,您需要添加它。