- Załóżmy, że mamy bardzo duży NSDictionary, gdy chcemy wywołać metodę objectForKey, sprawi, że wiele operacji w rdzeniu, aby uzyskać wartość? Czy może wskaże wartość w pamięci bezpośrednio?
- Jak to działa w rdzeniu?
Odpowiedz
Sekcja CFDictionary z Collections Programming Topics for Core Foundation (który należy przyjrzeć się, jeśli chcesz poznać więcej) stwierdza:
Słownik-Przedmiotem CFDictionary typu, to mieszania oparte kolekcja, której klucze dostęp do jego wartości jest arbitralny, programowo zdefiniowane fragmenty danych (lub wskaźniki do danych). Chociaż kluczem jest zwykle ciąg (lub, w Core Foundation, obiekt CFString), to może to być dowolna wartość mieszcząca się w rozmiarze wskaźnika - liczba całkowita, odniesienie do obiektu Core Foundation, nawet wskaźnik do struktury danych (jest to mało prawdopodobne).
To co wikipedia ma do powiedzenia na temat tabel hash:
Idealnie, funkcja mieszania należy mapować każdy możliwy klucz do wyjątkowej indeksu szczeliny, ale ten ideał jest rzadko osiągalne w praktyce (chyba hash keys są ustalone, tzn. Nowe wpisy nigdy nie są dodawane do tabeli po jej utworzeniu). Zamiast tego, większość projektów tabel mieszania zakłada, że zderzenia mieszania o wartości - różne klucze, które odwzorowują tę samą wartość mieszania - wystąpią i muszą zostać w jakiś sposób uwzględnione. W dobrze zwymiarowanej tabeli mieszania średni koszt (liczba instrukcji) dla każdego wyszukiwania wynosi niezależnie od liczby elementów przechowywanych w tabeli. Wiele projektów tabeli mieszania umożliwia również dowolne wstawianie i usuwanie par klucz-wartość o wartościach stałych , przy stałym średnim (w rzeczywistości, zamortyzowanym) koszcie na operację .
Wydajność zależy więc od jakości skrótu. Jeśli jest dobry, dostęp do elementów powinien być operacją O (1) (tj. Nie zależy od liczby elementów).
EDIT:
W rzeczywistości po przeczytaniu ponadto Kolekcje Programowanie tematy dla Fundacji Core apple daje odpowiedź na pytanie:
Czas dostępu do wartości w obiekcie CFDictionary jest gwarantowane być w najgorszym O (log N) dla każdej implementacji, ale często jest O (1) (stały czas). Operacje wstawiania lub usuwania są zwykle również w stałym czasie, ale w najgorszych przypadkach są O (N * log N). Jest to szybszy dostęp do wartości za pomocą klucza niż bezpośredni dostęp do nich. Słowniki mają tendencję do używania znacznie większej ilości pamięci niż tablica z numerem o tej samej liczbie wartości.
NSDictionary
jest w zasadzie strukturą tabeli mieszania, więc Big-O dla wyszukiwania to O (1). Jednakże, aby uniknąć ponownego przydzielania (i uzyskania złożoności O (1)), należy użyć dictionaryWithCapacity:
, aby utworzyć nowy słownik o odpowiednim rozmiarze w odniesieniu do rozmiaru zbioru danych.
Korzystanie ze słownikaWithCapacity będzie w normalnym przypadku zapewniać minimalny wzrost wydajności. W rzeczywistości doktorzy Apple mówią, że to tylko wskazówka. Porównałem z NSArray rozmiarami od 10 do 10 000 000 i nie znalazłem znaczącej przewagi. Główną wadą jest czas i myślenie o wydatkach na kalkulację, która jest lepsza. – zaph
Nie można zagwarantować, że nie będzie kolizji w tabeli, niezależnie od wielkości stołu. –
- 1. Sprawdź, czy NSDictionary jest pusty
- 2. NSUserDefaults objectForKey czasem zero
- 3. Przechodzenie kluczy/wartości NSDictionary, jest enumerateKeysAndObjectsUsingBlock bardziej wydajne niż zapętlanie kluczy i wywoływanie objectForkey :?
- 4. Dlaczego Function.prototype.bind jest wolny?
- 5. Jaka jest różnica między valueforKey :, objectForKey :, a valueForKeyPath :?
- 6. Czy chromes "appendChild" jest naprawdę wolny?
- 7. Czy użycie pamięci jest lepsze w przypadku jednego dużego procesu lub wielu małych procesów?
- 8. Czy Selen jest wolny, czy mój kod jest nieprawidłowy?
- 9. Doxygen jest wolny
- 10. SonarLint jest super wolny
- 11. Czy klucze i wartości w zamówionym NSDictionary?
- 12. NSDictionary wartości dostępu skrót
- 13. Git Clone jest zbyt wolny
- 14. Czy jest coś takiego jak NSDictionary w systemie Android?
- 15. Widok CouchDB jest bardzo wolny.
- 16. Dlaczego plyr jest taki wolny?
- 17. Android TextureView.getBitmap() jest bardzo wolny
- 18. Pakiet `Piątek` jest bardzo wolny
- 19. dlaczego valarray jest taki wolny?
- 20. tf.nn.depthwise_conv2d jest zbyt wolny. Jest to normalne?
- 21. Czy mogę umieścić SelectiveC @ selektor w NSDictionary?
- 22. NSDictionary z wartością pustą
- 23. Jak poprawnie ustawić wartość całkowitą w NSDictionary?
- 24. Dlaczego plik numpy.absolute() jest tak wolny?
- 25. Czy Redis jest zbyt wolny dla produkcji Railsów I18n?
- 26. Visual Studio 2010 - Czy jest wolny dla innych?
- 27. Czy Graphics.DrawImage jest zbyt wolny dla większych obrazów?
- 28. Jak zdobyć obiekt dla klucza z NSDictionary?
- 29. Jak uzyskać dane NSDictionary w UITableView
- 30. Dlaczego cv :: resize jest tak wolny?
Wyczyść! Dzięki! ;) –
Fakt, że pokazuje O (log N) lub O (1) sprawia, że zastanawiam się, czy mają implementację czerwonego drzewa czarnego, czy też log N powoduje duplikowanie łańcucha. –
@JustinMeiners Najgorszy przypadek dotyczy konfliktów hashowych – JustSid