Biorąc pod uwagę, że mam OGROMNĄ tablicę i wartość z niej. Chcę uzyskać indeks wartości w tablicy. Czy jest inny sposób, zamiast zadzwonić Array#index
po to? Problem wynika z potrzeby utrzymywania naprawdę dużej tablicy i wywoływania Array#index
ogromną liczbę razy.
Po kilku próbach odkryłem, że buforowanie indeksów wewnątrz elementów poprzez przechowywanie struktur z (value, index)
polami zamiast samej wartości daje ogromny skok wydajności (20x wygrana).
Nadal zastanawiam się, czy istnieje wygodniejszy sposób na znalezienie indeksu elementu en bez buforowania (lub jest dobra technika buforowania, która zwiększy wydajność).
ruby
arrays
performance
indexing
gmile
źródło
źródło
Dlaczego nie użyć indeksu lub rindeksu?
źródło
Inne odpowiedzi nie uwzględniają możliwości wielokrotnego wpisu w tablicy. To zwróci skrót, w którym każdy klucz jest unikalnym obiektem w tablicy, a każda wartość jest tablicą indeksów, która odpowiada miejscu, w którym obiekt żyje:
Pozwala to na szybkie wyszukiwanie zduplikowanych wpisów:
źródło
Czy istnieje dobry powód, aby nie używać skrótu? Odnośniki są
O(1)
aO(n)
dla tablicy.źródło
#keys
hash, który zwraca tablicę, której używam. Mimo to mógłbym przemyśleć również moją architekturę ...Jeśli jest to posortowana tablica, możesz użyć algorytmu wyszukiwania binarnego (
O(log n)
). Na przykład rozszerzenie klasy Array o tę funkcjonalność:źródło
Biorąc pod uwagę odpowiedź @ sawy i komentarz tam wymieniony, można zaimplementować indeks „quick” i rindex w klasie tablicy.
źródło
Jeśli twoja tablica ma naturalną kolejność, użyj wyszukiwania binarnego.
Użyj wyszukiwania binarnego.
Wyszukiwanie binarne ma
O(log n)
czas dostępu.Oto kroki, jak korzystać z wyszukiwania binarnego,
bsearch
do znajdowania elementów lub indeksówPrzykład kodu
źródło
Możesz użyć wyszukiwania binarnego (jeśli twoja tablica jest uporządkowana, a wartości, które przechowujesz w tablicy są w jakiś sposób porównywalne). Aby to zadziałało, musisz być w stanie powiedzieć wyszukiwarce binarnej, czy ma ona szukać „w lewo”, czy „w prawo” bieżącego elementu. Ale uważam, że nie ma nic złego w przechowywaniu
index
czasu wstawiania, a następnie używaniu go, jeśli otrzymujesz element z tej samej tablicy.źródło