Nie ma dostępnego podsumowania dużej notacji O do operacji na najpopularniejszych strukturach danych, w tym tablicach, połączonych listach, tabelach mieszających itp.Jaka jest złożoność czasowa indeksowania, wstawiania i usuwania z typowych struktur danych?
Odpowiedz
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).
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ć.
Co to jest Big-O wstawiania N elementów do zestawu hash? Pomyśl dwa razy. –
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. –
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
Red-Black drzew:
- Insert - O (log n)
- Pobierz - O (log n)
- Usuń - O (log n)
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ń .
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.
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. –
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? –
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
- 1. Jaka jest złożoność czasowa inicjowania macierzy?
- 2. Złożoność czasowa podłoży Javy()
- 3. Złożoność czasowa tabeli mieszania
- 4. Złożoność czasowa liczenia sortowania
- 5. Złożoność czasowa metod HashMap
- 6. Złożoność czasowa random.sample
- 7. Złożoność czasowa Math.Sqrt()?
- 8. Złożoność czasowa funkcji permutacji
- 9. Złożoność czasowa operacji zestawu Pythona?
- 10. Jaka jest złożoność czasu A * i jak jest uzyskiwana?
- 11. Złożoność czasowa detektora krawędzi Canny
- 12. Złożoność czasowa indeksu javascriptJeśli chodzi o metodę
- 13. Złożoność czasowa wyszukiwania binarnego dla nieposortowanej tablicy
- 14. Złożoność czasowa algorytmu wykresu głębi-pierwszego
- 15. Transakcje w typowych zestawach danych
- 16. Czy złożoność czasowa tego algorytmu Θ (n)?
- 17. Jaka jest asymptotyczna złożoność operacji GroupBy?
- 18. Asymptotyczna złożoność czasowa wstawiania n elementów do binarnych stert zawierających już elementy n
- 19. Jaka jest domyślna strefa czasowa w java.util.Date
- 20. Jaka jest złożoność tego kodu manipulacji ciągami?
- 21. Jaka jest złożoność czasu HashMap.containsValue() w java?
- 22. Nieoczekiwana złożoność typowych metod (rozmiaru) w Java Collections Framework?
- 23. Jaka jest złożoność set_intersection w C++?
- 24. Jaka jest złożoność złożonych lin zrównoważonych?
- 25. Jaka jest najgorsza złożoność sortowania kubełków?
- 26. Różne struktury danych i Złożoność
- 27. Jaka jest złożoność czasu przeglądarek HTML DOM
- 28. Jaka jest złożoność czasu HashMap.containsKey() w java?
- 29. Jaka jest złożoność Morris Traversal o (n)?
- 30. Jaka jest najlepsza złożoność zagadek N-Queens?
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) –
, zapomniałem dodać części iteratora. Dzięki za wskazanie go –
@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