Ruby-Enumerable Reverse Detect

7

vorausgesetzt, ich habe das folgende Array:

%Vor%

unter der Annahme, dass das Array nach viewed_at

geordnet ist

Wenn ich den letzten Ansichts-Hash im views -Array für eine bestimmte user_id abrufen möchte, könnte ich Folgendes tun:

%Vor%

Dabei gibt erkennen das erste Element in einem Aufzählungszeichen zurück, für das der Block den Wert true hat.

Meine Frage lautet: Ich gehe davon aus, dass die Methode reverse O(n) costs enthält. Wie kann ich also rückwärts erkennen, ohne das Array umzukehren? Oder ist die Methode reverse nicht O(n) ?

    
Patrick Klingemann 29.06.2012, 21:23
quelle

2 Antworten

18

Methode Array#reverse ist O (n) in Zeit und Raum. Da Sie das ganze umgekehrte Array nicht benötigen, können Sie Array # verwenden. reverse_each , das wäre O (1) im Raum. In der Praxis ist das nur für wirklich große Arrays relevant.

%Vor%     
tokland 29.06.2012, 21:25
quelle
1

Dies wird den Index von dem letzten Objekt erhalten, für das der Block wahr ist (oder Null, wenn keiner übereinstimmt).

%Vor%

Nach dem Benchmarking @toklands reverse_each ist (überraschend für mich) viel schneller:

%Vor%     
steenslag 29.06.2012 21:36
quelle