【问题标题】:Performance of select method in RubyRuby 中 select 方法的性能
【发布时间】: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


【解决方案1】:

我不知道有一种方法可以比线性时间更好地对数组中的每个元素执行操作——这个想法听起来自相矛盾。如果您需要在同一个数组上多次执行相同的计算以在后续运行中用空间换取恒定时间性能,您可以记住结果,但我认为 O(n) 与其他情况一样好。

【讨论】:

  • 在 select 只有一个条件的情况下可能有 O(1)。我将使用条件作为哈希的键,通过这种方式,它直接转换为 O(1)。我想知道当条件增加时这怎么可能。
  • @Bragboy:使用条件作为哈希键的含义并不清楚。您是否使用哈希作为一种记忆器?
  • @MAK: 是的,这就是将任何数组转换为哈希的方式
  • @Bragboy:如何将数组转换为 O(1) 中的散列?您不必遍历所有元素吗?
  • @MAK:我的意思是第一次(在构造哈希时),是的,我必须这样做。但连续时间订单将在 O(1)
猜你喜欢
  • 2014-06-25
  • 2011-09-22
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2011-09-27
相关资源
最近更新 更多