asumiendo Tengo la siguiente matriz:Rubí enumerables inversa detectar
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' }
]
suponiendo que la matriz está ordenada por viewed_at
Si quiero recuperar la última vista de hash en los vistas matriz para un particular user_id, podría hacer lo siguiente:
views.reverse.detect { |view| view[:user_id] == 1 }
donde detecta devolvería el primer elemento en un enumerable donde el bloque se evalúa como verdadero.
Mi pregunta es: Asumo que es O(n)
costo para el método inverso, así que ¿cómo puedo detectar en sentido inverso sin tener que invertir la matriz? ¿O es el método inverso no O(n)
?
lo que realmente tienen '17: 77' como un tiempo? –
Cuando encadena métodos, siempre desea encadenar enumeradores. La cadena del enumerador solo itera el objeto una vez y es O (n). El ejemplo más común es '" hola ".each_char.map {| x | x.succ}' – texasbruce
@texasbruce: eso será totalmente cierto con Ruby 2.0, donde todo tipo de operaciones perezosas serán posibles (ahora vuelven muchas operaciones) matrices, no enumeradores) – tokland