【发布时间】:2011-02-09 10:55:01
【问题描述】:
Ruby 中的 select 方法简单直接。它将选择符合特定条件的数组中的元素。
例如,
>> x = [4,5,7,89,4,5,3,6,8,9,4,45,56,23,2,7,3,5,4,224,234,565,546,345,23,234,234,234,23466,25,54]
x = [4,5,7,89,4,5,3,6,8,9,4,45,56,23,2,7,3,5,4,224,234,565,546,345,23,234,234,234,23466,25,54]
=> [4, 5, 7, 89, 4, 5, 3, 6, 8, 9, 4, 45, 56, 23, 2, 7, 3, 5, 4, 224, 234, 565, 546, 345, 23, 234, 234, 234, 23466, 25, 54]
>> y = x.select{|m| m>20 && m<200}
y = x.select{|m| m>20 && m<200}
=> [89, 45, 56, 23, 23, 25, 54]
这方面的一个问题显然是时间惩罚。 Select 必须遍历该数组中的所有值并进行顺序检查,这将导致在 O(n) 时间内运行。有没有更好的选择来选择在更短的时间内完成它。空间对我来说不是问题。
我说的是重复使用相同选择的情况。如果我要在一个循环中对大小为 n 的数组使用相同的选择条件 1000 次,那么我将不得不执行 1000 * n 次这样的操作。而如果它针对空间进行了优化,我只会做 1000 * 1 次。
谢谢。
【问题讨论】:
-
您想对数组中的所有值进行测试,而不测试数组中的所有值?
-
@The MYYN:在真正的计算机上,这仍然是线性时间,除非我搞砸了我的推理。即使你在 24 个核心上有 24 个工作人员,这也是 O(n/24),相当于 O(n)——它是一个常数因子。获得 O(1) 的唯一方法是假设一台计算机可以一次执行无限数量的任务 (O(n/n) = O(1)),这在物理上是不可能的。
-
哇哇哇.. 可能是我的问题不清楚。为了清楚起见,让我编辑问题
-
据我了解,您正在尝试使用块(可能是procs?)作为键。有什么理由吗?我想说最简单的方法是哈希表,但这不适用于 procs 作为键。
标签: ruby algorithm performance