假设我有以下数组:

views = [
  { :user_id => 1, :viewed_at => '2012-06-29 17:03:28 -0400' },
  { :user_id => 1, :viewed_at => '2012-06-29 17:04:28 -0400' },
  { :user_id => 2, :viewed_at => '2012-06-29 17:05:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:06:28 -0400' },
  { :user_id => 1, :viewed_at => '2012-06-29 17:07:28 -0400' },
  { :user_id => 1, :viewed_at => '2012-06-29 17:08:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:09:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:16:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:26:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:36:28 -0400' },
  { :user_id => 1, :viewed_at => '2012-06-29 17:47:28 -0400' },
  { :user_id => 2, :viewed_at => '2012-06-29 17:57:28 -0400' },
  { :user_id => 3, :viewed_at => '2012-06-29 17:67:28 -0400' },
  { :user_id => 1, :viewed_at => '2012-06-29 17:77:28 -0400' }
]

假设数组是由排序的,在排序的

如果要检索特定 user_id View 数组中的最后一个 View 哈希,则可以执行以下操作:
views.reverse.detect { |view| view[:user_id] == 1 }

其中,检测到会返回该枚举为true的可枚举中的第一项。

我的问题是:我假设反向方法要花O(n)的费用,所以如何在不必反向数组的情况下进行反向检测?还是反向方法不是O(n)

最佳答案

方法Array#reverse在时间和空间上为O(n)。由于不需要整个反向数组,因此可以使用Array#reverse_each,它在空间中为O(1)。实际上,这仅与真正的大型阵列有关。

views.reverse_each.detect { |view| view[:user_id] == 1 }
#=> {:user_id=>1, :viewed_at=>"2012-06-29 17:77:28 -0400"}

关于Ruby枚举反向检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11269154/

10-12 05:09