Aby rozpocząć z uproszczeniem:
Istnieje kilka podstawowych rodzajów struktur danych: tablic, listach i drzew. Cała reszta może być złożona przy użyciu różnych typów tych dwóch struktur (na przykład tablica haszująca może być zaimplementowana z tablicą dla wartości mieszania i jedną listą dla każdej wartości mieszania dla obsługi kolizji).
Z tych struktur tablice są statyczne (tj. Ich ślad pamięci nie zmienia się w czasie, gdy wykonywane są na nich operacje), a wszystko inne jest dynamiczne (tj. W ogólnym przypadku zmienia się ślad pamięci).
Różnice między tymi dwoma rodzajami struktur może pochodzić z powyższym:
- Static potrzebuje maksymalny rozmiar być znany wcześniej, natomiast dynamiczny można przystosować na bieżąco
- Static nie realokacji Pamięć nie ma znaczenia, więc możesz mieć zagwarantowane wymagania pamięciowe:
Istnieją również inne różnice, które jednak mogą wejść w grę tylko w przypadku sortowania danych. Nie mogę podać obszernej listy, ponieważ istnieje wiele dynamicznych struktur danych, które wykazują różne charakterystyki wydajności dla różnych operacji ("dodaj", "usuń", "znajdź"), a więc nie mogą być umieszczone pod tym samym dachem.
bardzo widoczna różnica jest taka, że posortowane tablice wymagają ruchu (ewentualnie) wiele rzeczy wokół w pamięci dla każdej operacji innych niż „znaleźć”, podczas gdy konstrukcje dynamiczne ogólnie wykonać mniej pracy.
Tak więc, aby podsumować:
- Jeśli potrzebujesz gwarancji na maksymalne wykorzystanie pamięci, nie ma innej opcji niż tablicy.
- Jeśli masz twardy górny limit dla rozmiaru danych, rozważ użycie tablicy. Tablice mogą być dobrym rozwiązaniem problemów, które wymagają głównie operacji dodawania/usuwania (zachowaj nieposortowaną tablicę) oraz tych, które wymagają głównie operacji znajdowania (zachowaj sortowaną tablicę), ale nie dla obu jednocześnie.
- Jeśli nie masz twardą górną granicę, lub jeśli wymagają wszystko dodaj/usuń/znaleźć się szybko, należy użyć odpowiedniego rodzaju dynamicznej struktury.
Edit: nie wspominając wykresy, inny rodzaj dynamicznej struktury danych, które prawdopodobnie nie może składać się z prostych elementów (z definicji, drzewo ma dokładnie jeden odnośnik dzieje „na” dowolnego węzła z wyjątkiem korzenia, podczas gdy wykresy mogą mieć więcej niż jeden). Jednak wykresów nie można tak naprawdę porównać z innymi strukturami w scenariuszu "co byłoby lepiej używać", ponieważ albo trzeba użyć wykresu, albo nie (inne struktury mogą wykazywać różne wyniki, ale w końcu wszystkie wspierają ten sam zestaw operacji).
Na pewnym poziomie lista jest tylko zdegenerowanym drzewem. Można powiedzieć, że istnieją dwa rodzaje struktur danych, blokowane i oparte na węzłach (i różne hybrydy z tych dwóch). –
Ponadto nie zgadzam się z 1). Nie ma powodu, dla którego nie mógłbyś napisać klasy "BoundedList", która wygenerowałaby błąd (lub cokolwiek innego) po dodaniu elementu N + 1. Zgadzam się jednak, że nie jest to dokładnie podstawowa struktura danych - bardziej hack. –
@ Drew: masz rację w obu liczbach. Prawdę mówiąc, zacząłem pisać o dwóch rodzajach struktur, zostawiając z nich drzewa i wykresy, ale uważałem za pewne, że ktoś mnie poprawi. Wygląda na to, że nie możesz tego obejść :-).Jeśli chodzi o ograniczoną listę, myślę, że zgodzisz się, że ktoś na poziomie wiedzy implikowanym przez pierwotne pytanie nie ma nic do zyskania na tym, że został poinformowany o tej technice. – Jon