Zastanawiam się, co jest notacją big-O dla iteracji poprzez NSSet. Odpowiedzią na NSArray jest oczywiście O (n) - ale jaka jest odpowiedź dla NSSet? Ponadto - zakładam, że ta sama odpowiedź miałaby zastosowanie do NSDictionary?Co to jest notacja big-O dla iteracji przez NSSet i NSDictionary
Odpowiedz
Można się zorientować w złożoności obliczeniowej struktur danych Apple, patrząc na komentarze w nagłówkach ich zmostkowanych odpowiedników Core Foundation (ponieważ w zasadzie używają tego samego kodu pod maską).
ciekawe, złożoność czas CFArray
jest nie faktycznie gwarancją O (n):
złożoność obliczeniowa
Czas dostępu do wartości w tablicy gwarantuje się w najgorszy O (lg N) dla każdego wdrożenia, bieżącego i przyszłego, ale będzie często być O (1) (stały czas). Liniowe operacje wyszukiwania podobnie mają najgorszy przypadek złożoności O (N * lg N), chociaż zwykle granice są bardziej rygorystyczne i tak dalej. Operacje wstawiania lub usuwania będą zwykle liniowe pod względem liczby wartości w tablicy, ale może być wyraźnie O (N * lg N) w najgorszym przypadku w niektórych implementacjach. Nie ma preferowanych pozycji w tablicy dla wydajności; oznacza to, że niekoniecznie jest szybszy dostęp do wartości o niskich indeksach lub wstawianie lub usuwanie wartości z wysokimi indeksami lub cokolwiek.
te zawiłości czasu sugerują, że CFArray
(a więc NSArray
) może być faktycznie realizowane w postaci drzewa (badania wskazują, że może to być nawet przełączanie pomiędzy wieloma podstawowych struktur danych).
Podobnie do CFDictionary
, granice podane mają dość szeroki zakres:
złożoność obliczeniowa
Czas dostępu do wartości w słowniku jest gwarantowana w najgorszym O (n) w przypadku dowolna implementacja, obecna i przyszła, ale będzie często być O (1) (stały czas). Operacje wstawiania lub usuwania zwykle będą również stałym czasem, ale w niektórych implementacjach są O (N * N) w najgorszym przypadku . Dostęp do wartości za pomocą klucza jest szybszy niż bezpośredni dostęp do wartości (jeśli istnieją takie operacje ). Słowniki będą zwykle używać znacznie więcej pamięci niż tablica o tej samej liczbie wartości.
nie byłem w stanie znaleźć podobny komentarz w nagłówkach Fundacji rdzenia dla CFSet
, ale inspekcja kodu źródłowego wskazuje, że jest ona oparta na CFBasicHash
, czyli tabeli mieszania, więc złożoność czas byłoby tak typowe dla tabeli mieszania - O (1) wstawianie, usuwanie i testowanie zazwyczaj i O (n) w najgorszym przypadku.
Jeśli naprawdę chcesz dowiedzieć się, jak działają te struktury danych, Core Foundation ma otwarte oprogramowanie źródłowe, więc możesz przeczytać kod źródłowy pod numerem Apple's website.
- 1. Co to jest BigO regresji liniowej?
- 2. NSDictionary allKeys zwraca NSArray, zamiast NSSet
- 3. Co to jest notacja kropkowa między nazwami klas i co to znaczy?
- 4. Co to jest odpowiednik NSDictionary w języku C#?
- 5. Jaki jest najskuteczniejszy sposób sortowania NSSet?
- 6. Co to jest move_iterator dla
- 7. Co to jest notacja Big O dla funkcji str.replace w Pythonie?
- 8. Co to jest metoda generatywna?
- 9. C i wskaźnik notacja
- 10. Co to jest Thread.CurrentPrincipal i co robi?
- 11. Co to jest S_ISREG() i co robi?
- 12. Co to jest python dla BigDecimal Java?
- 13. Co to jest WebIDL i (dlaczego) jest to ważne?
- 14. Co to jest Big O of linq .where?
- 15. Co to jest POI i co to znaczy?
- 16. Co to jest czasownik = "*"?
- 17. Co to jest CompileC?
- 18. Co to jest _GLIBCXX_VISIBILITY?
- 19. Co to jest wstawianie?
- 20. Swift - jak przechodzić przez NSDictionary
- 21. co to jest alloc.h?
- 22. Co to jest przenośna wartość dla UINT_MIN?
- 23. Co to jest ?
- 24. Co to jest skrótu javascript dla tego?
- 25. Co to jest _mh_execute_header?
- 26. Co to jest odpowiednik WPF dla ControlPaint.Light?
- 27. Co to jest jQuery dla Document.createElementNS()?
- 28. Co to jest "matryca" dla raphael
- 29. Co to jest pakiet GSF dla Androida?
- 30. Co to jest alternatywa dla Singleton
Jeśli zależy Ci na wydajności, upewnij się, że używasz "szybkiego wyliczenia" lub bloków. Nie używaj zwykłej pętli C 'for' lub' while'. https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Collections/Articles/Enumerators.html –
To pytanie jest raczej tematem ciekawości niż faktycznym pytaniem. – YogevSitton
Rozumiem. Cóż, wtedy odpowiedź zależy od tego, co jest w zestawie. NSSet nie jest prostą klasą, nie zdziwiłbym się, gdyby implementacja była dziesiątkami tysięcy tysięcy linii kodu. Na początek nie ma nawet prawdziwej klasy o nazwie "NSSet". To tylko nazwa używana do łączenia wszystkich klas, które wchodzą w skład zestawów, która to klasa jest faktycznie używana, zmienia się w zależności od zawartości zestawu i wzorców używanych przez twój kod w celu uzyskania dostępu do zestawu. Ogólnie rzecz biorąc, zestaw z 5 przedmiotami będzie miał znacznie inną charakterystykę wydajności niż zestaw zawierający 5 miliardów przedmiotów. I tak, może obsłużyć tyle danych. –