Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何';比较并找出最好的';最佳做法_Ruby_Algorithm_Code Design - Fatal编程技术网

Ruby 如何';比较并找出最好的';最佳做法

Ruby 如何';比较并找出最好的';最佳做法,ruby,algorithm,code-design,Ruby,Algorithm,Code Design,假设我有这样的东西: def find_the_best(array) temp = 15435435435 # sufficiently large number value = 0 array.each do |element| some_var = function_does_something_complex_and_returns_value(element) some_var < temp ? value = element[0] end end

假设我有这样的东西:

def find_the_best(array)
  temp = 15435435435 # sufficiently large number
  value = 0
  array.each do |element|
    some_var = function_does_something_complex_and_returns_value(element)
    some_var < temp ? value = element[0]
  end
end
def查找最佳(数组)
温度=15435435#足够大的数值
值=0
数组。每个do |元素|
some_var=函数做某事,复杂,返回值(元素)
有什么?值=元素[0]
结束
结束

这个足够大的数字解决方案是可行的,但它似乎有点黑客。处理这个问题的最佳方法是什么,特别是在ruby中,但通常也是这样。问题是,它确实应该设置为0,然后分配第一个值,然后只有当值较小时才应采用该值之后的每个值。

您要查找的是
sort\u by
例程,该例程根据一些任意标准对对象列表进行排序:

best = array.sort_by do |element|
  function_does_something_complex_and_returns_value(element)
end.first

您可能需要使用
first
last
,具体取决于您是希望从最高到最低还是从最低到最高。

您要查找的是
sort\u by
例程,该例程根据一些任意条件对对象列表进行排序:

best = array.sort_by do |element|
  function_does_something_complex_and_returns_value(element)
end.first
array.min_by{|e| function_does_something_complex_and_returns_value(e) }
您可能需要使用
first
last
,具体取决于您希望从最高到最低还是从最低到最高

array.min_by{|e| function_does_something_complex_and_returns_value(e) }


这看起来不像是排序问题,而是基于标准的最佳匹配

您正在寻找最小的值,不需要临时值(除非您没有告诉我们)

只需假设第一个值是最好的,然后继续检查

best_value = array[0];
foreach( element in array )
{
    if( best_value > element )
        best_value = element;
}

这看起来不像是排序问题,而是基于标准的最佳匹配

您正在寻找最小的值,不需要临时值(除非您没有告诉我们)

只需假设第一个值是最好的,然后继续检查

best_value = array[0];
foreach( element in array )
{
    if( best_value > element )
        best_value = element;
}


你说得对。此外,它还可以找到一条路径的最佳匹配,因此,如果我将三个节点深入到一条路径中,并且知道它是一条松散的路径,我可以在该路径上退出,然后转到下一条路径。在Ruby中使用
foreach
是非常不寻常的。我认为你是对的。我看到
for
很少被使用,我甚至记不起上一次是什么时候了,而且忘记了
foreach
在Ruby中根本不存在。我认为我们不应该投票反对他使用JS,正如我明确说过的,任何语言都是可以接受的。很抱歉,我只是展示了一些伪代码,并将重点放在了手头的问题上,而不是语言细节上,以确保@NoahClark理解我所指出的差异。你是对的。此外,它还可以找到一条路径的最佳匹配,因此,如果我将三个节点深入到一条路径中,并且知道它是一条松散的路径,我可以在该路径上退出,然后转到下一条路径。在Ruby中使用
foreach
是非常不寻常的。我认为你是对的。我看到
for
很少被使用,我甚至记不起上一次是什么时候了,而且忘记了
foreach
在Ruby中根本不存在。我认为我们不应该投票反对他使用JS,正如我明确说过的,任何语言都是可以接受的。我的道歉-我只是展示了一些伪代码,并将重点放在手头的问题上,而不是语言细节上,以确保@NoahClark理解我所指出的差异。请注意,
inject
版本不正确,因为它返回了最高的计算值,不是生成该计算值的对象。使用
min\u by
是一个好主意。捕捉得好。我想我可以通过查看数组的第一项来修复它。一般来说,我不太喜欢inject版本,它效率低下。从性能的角度来看,
inject
并没有本质上的低效,但正确使用它可能比使用更专业的方法要复杂得多。我指的是我使用
inject
的实现,一般不
inject
。代码块创建一个表示内存分配的数组,然后调用函数调用
min
。两者都是无用的开销。当然,对于小型阵列来说,这是一个没有实际意义的问题。小型阵列的开销非常小。还要注意,不带参数的
inject
只使用第一个元素作为种子。将
array.first
放入其中不仅是冗余的,而且是不正确的,因为您在第一次迭代中测试了元素0到元素0。请注意,此处的
inject
版本不正确,因为它返回的是最高的计算值,而不是产生该计算值的对象。使用
min\u by
是一个好主意。捕捉得好。我想我可以通过查看数组的第一项来修复它。一般来说,我不太喜欢inject版本,它效率低下。从性能的角度来看,
inject
并没有本质上的低效,但正确使用它可能比使用更专业的方法要复杂得多。我指的是我使用
inject
的实现,一般不
inject
。代码块创建一个表示内存分配的数组,然后调用函数调用
min
。两者都是无用的开销。当然,对于小型阵列来说,这是一个没有实际意义的问题。小型阵列的开销非常小。还要注意,不带参数的
inject
只使用第一个元素作为种子。将
array.first
放入其中不仅是冗余的,而且是不正确的,因为您在第一次迭代中测试了元素0到元素0。我们如何知道运行排序比简单的循环查找最小值更有效?代码更少,但在后台执行更多。我们如何知道运行排序比简单的循环查找最小值更有效?代码更少,但在后台执行更多。