2008-09-23 11 views

Odpowiedz

14

Domyślam się, że zacznę od złożoności czasowej połączonej listy:

indeksowania ----> o (n)
wstawiania/usuwania w celu ----> o (1) lub o (n)
wstawiania/usuwania w środkowy ---> o (1) z iteratorem O (n) bez kompresji

Złożoność czasu dla wstawiania na końcu dep kończy się, jeśli masz lokalizację ostatniego węzła, jeśli to zrobisz, będzie to O (1) w przeciwnym razie będziesz musiał przeszukać listę połączoną, a złożoność czasu przeskoczy do O (n).

+0

Złożoność włożeniu do połowy ** ** z pojedynczo połączonej listy jest O (n). Jeśli lista jest podwójnie powiązana i wiesz, że węzeł, który chcesz wstawić, to O (1) –

+0

, zapomniałem dodać części iteratora. Dzięki za wskazanie go –

+2

@Rob: może to głupie wątpliwości, ale nie jestem w stanie zrozumieć, jak można wstawić na podwójnie połączonej liście w O (1)? jeśli mam '1 4' i jeśli muszę wstawić 5 między 3 i 4, a wszystko, co mam jest wskaźnikiem do węzła głowy (tj. 1) muszę przejść w O (n). czy czegoś brakuje? – Bhushan

1

zamortyzowanego Big-O dla hashtables:

  • Insert - O (1)
  • Pobierz - O (1)
  • Usuń - O (1)

Należy pamiętać, że istnieje jest stałym czynnikiem dla algorytmu mieszającego, a amortyzacja oznacza, że ​​rzeczywista zmierzona wydajność może się znacznie różnić.

+0

Co to jest Big-O wstawiania N elementów do zestawu hash? Pomyśl dwa razy. –

+0

Amortyzowany, to N. Możliwe, że masz problemy z zmienianiem rozmiaru tablicy. Ponadto zależy to od metody rozwiązywania konfliktów. Jeśli używasz łańcuchów, a algorytm wstawiania łańcuchów jest N (jak na końcu listy pojedynczo połączonej), może przejść na N^2. –

+1

To jest złe. Masz błędną definicję "amortyzowania". Amortyzacja oznacza całkowity czas wykonania kilku operacji podzielony przez liczbę operacji. Najgorszym rozwiązaniem do wstawiania N przedmiotów jest zdecydowanie O (N^2), a nie O (N). Zatem powyższe operacje są nadal O (n) w najgorszym przypadku, zamortyzowane lub nie. Mylicie to ze "przeciętną" złożonością czasu przy założeniu pewnego rozkładu funkcji skrótu, który jest O (1). – newacct

2

Red-Black drzew:

  • Insert - O (log n)
  • Pobierz - O (log n)
  • Usuń - O (log n)
4

Należy pamiętaj, że jeśli nie piszemy własnej struktury danych (np. połączonej listy w C), może ona dramatycznie zależeć od implementacji struktur danych w wybranym języku/strukturze. Jako przykład, spójrz na benchmarks of Apple's CFArray over at Ridiculous Fish. W tym przypadku typ danych, CFArray z CoreFoundation firmy Apple, faktycznie zmienia struktury danych w zależności od tego, ile obiektów faktycznie znajduje się w tablicy - zmieniając od liniowego czasu do stałego czasu na około 30 000 obiektów.

To jest rzeczywiście jednym z najpiękniejszych rzeczy na temat programowania obiektowego - nie trzeba znać jak działa tylko że to działa, a „jak to działa” może się zmieniać w zależności od wymagań .

58

Informacja na ten temat jest już dostępna na Wikipedii pod adresem: Search data structure

+----------------------+----------+------------+----------+--------------+ 
|      | Insert | Delete | Search | Space Usage | 
+----------------------+----------+------------+----------+--------------+ 
| Unsorted array  | O(1)  | O(1)  | O(n)  | O(n)   | 
| Value-indexed array | O(1)  | O(1)  | O(1)  | O(n)   | 
| Sorted array   | O(n)  | O(n)  | O(log n) | O(n)   | 
| Unsorted linked list | O(1)* | O(1)*  | O(n)  | O(n)   | 
| Sorted linked list | O(n)* | O(1)*  | O(n)  | O(n)   | 
| Balanced binary tree | O(log n) | O(log n) | O(log n) | O(n)   | 
| Heap     | O(log n) | O(log n)** | O(n)  | O(n)   | 
| Hash table   | O(1)  | O(1)  | O(1)  | O(n)   | 
+----------------------+----------+------------+----------+--------------+ 

* The cost to add or delete an element into a known location in the list (i.e. if you have an iterator to the location) is O(1). If you don't know the location, then you need to traverse the list to the location of deletion/insertion, which takes O(n) time. 
** The deletion cost is O(log n) for the minimum or maximum, O(n) for an arbitrary element. 
+0

Istnieje pewne zamieszanie w usuwaniu w tablicy. Niektórzy mówią, że znalezienie czasu, który chcesz usunąć, zajmuje O (n) czas. Następnie, aby go usunąć, należy przesunąć wszystkie elementy z prawej strony o jedno pole w lewo. Jest to również O (n), więc całkowita złożoność jest liniowa. A także niektórzy mówią, nie ma potrzeby wypełniania pustej przestrzeni, może to być wypełnione przez ostatni element. –

+0

Co jeśli chcemy wstawić element do tablicy na pierwszej pozycji? Czy nie spowoduje to przesunięcia całej tablicy? Więc czy nie powinienem być O (n) czasem wstawienia tablicy? –

+0

Pamiętaj, że musisz * rozróżnić * między ** nieposortowaną ** i ** posortowaną tablicą **. Przesuwanie/wypełnianie elementów tablicy jest jedynie kwestią tablicy posortowanej, a więc liniowej złożoności zamiast 'O (1)' w nieposortowanej tablicy. Jeśli chodzi o twoje przemyślenia na temat znalezienia elementu, który chcesz usunąć, musisz jeszcze raz odróżnić ** znalezienie ** elementu i ** usunięcie ** go. Złożoność usuwania zakłada, że ​​już znasz element, który zamierzasz usunąć, dlatego masz 'O (n)' na tablicy posortowanej (wymaga zmiany) i 'O (1)' na tablicy nieposortowanej. – Mobiletainment

Powiązane problemy