Tablice są częścią podstawowego biblioteki Ruby. Każda implementacja Ruby ma własną implementację tablic. Specyfikacja języka Ruby określa jedynie zachowanie tablic Ruby, nie określa żadnej konkretnej strategii implementacji. Nie określa nawet żadnych ograniczeń wydajności, które wymuszałyby lub przynajmniej sugerowałyby konkretną strategię wdrażania.
Jednak większość Rubiego pewne oczekiwania dotyczące spełniania charakterystyk tablic, które zmuszają implementację, która nie spełnia je w zapomnienie, bo nikt nie będzie faktycznie używać go:
- wstawianie, poprzedzenie lub dołączanie jako podobnie jak usunięcie elementu ma najgorszy przypadek - stopień złożoności O (n) i amortyzowany najgorszy przypadek - stopień złożoności O (1)
- uzyskiwania dostępu do elementu ma najgorszy możliwy stopień złożoności O (1)
- iteracja wszystkich elementów ma najgorszy możliwy stopień złożoności O (n)
Oznacza to, że tablice muszą być implementowane jako dynamiczne tablice z wykładniczą zmianą rozmiaru, w przeciwnym razie nie można spełnić tych gwarancji wydajności. You może uciec z bardzo szerokim i płytkim drzewem, ale AFAIK nie ma implementacji Ruby.
Oto Rubinius's array implementation, które osobiście uważam za najłatwiejszy ze wszystkich implementacji Rubiego. (Uwaga: tylko podstawowe funkcje są implementowane w C++, większość metod tablicowych jest zaimplementowanych w Ruby, np. W kernel/common/array.rb
).
Set
i SortedSet
są częścią biblioteki set
w pliku stdlib. Stdlib jest dzielony w większości niezmieniony pomiędzy implementacjami Ruby (przynajmniej części, które są faktycznie napisane w Ruby, oczywiście części napisane w innych językach nie mogą być udostępniane), a ponieważ Set
jest napisane w Ruby, możesz oczekiwać tego samego we wszystkich implementacjach Ruby.
Set
jest zaimplementowany jako Hash
, gdzie stosowane są tylko klucze, wartości są po prostu zawsze true
: patrz Set#add
in lib/set.rb
.
SortedSet
jest wspierane przez czerwono-czarne drzewo, które nie jest zaimplementowane w Ruby.
Możesz sprawdzić kod źródłowy, aby zobaczyć, w jaki sposób został zaimplementowany. –