zakładając Mam następującą tablicę:Ruby przeliczalny odwrotnej wykryć
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' }
]
zakładając tablicy jest sortowana według viewed_at
Jeśli chcę odzyskać ostatnią hash widok w poglądów tablica dla konkretny user_id, mógłbym wykonać następujące czynności:
views.reverse.detect { |view| view[:user_id] == 1 }
gdzie wykryje, że zwróci pierwszy element w liczbie wyliczeniowej, gdzie blok jest prawdziwy.
Moje pytanie brzmi: Zakładam, że jest O(n)
koszt metody odwrotnej, więc jak mogę wykryć w odwrotnej bez konieczności odwrócenia tablicy? Czy jest to metoda odwrócona, a nie ?
czy naprawdę mają '17: 77' jako czas? –
Po łańcuchu metod zawsze chcesz łączyć moduły wyliczające. Łańcuch enumeratorów tylko iteruje obiekt raz i jest O (n). Najczęstszym przykładem jest '" hello ".each_char.map {| x | x.succ}' – texasbruce
@texasbruce: to będzie całkowicie prawdziwe z Ruby 2.0, gdzie wszystkie rodzaje leniwych operacji będą możliwe (teraz wiele operacji zwraca tablice, a nie enumeratory) – tokland