Próby są bardzo szybkimi strukturami danych. Szukanie słowa zajmuje czas O (sizeofword), podczas gdy std::map
s są samowystarczalnymi drzewami. Dlaczego nie są standardowe szablony map C++ zaimplementowane z próbami. Czy istnieje jakiś szczególny powód? Czy są jakieś kompromisy w używaniu drzewka zamiast drzewa samowyrównującego?Dlaczego mapy C++ nie są implementowane jako próby?
Odpowiedz
Tries może być używany tylko wtedy, gdy klucze do zapisania mogą być przetwarzane cyfra po cyfrze lub znak po znaku. C++ i std::set
są zaprojektowane do pracy z dowolnymi porównywalnymi elementami jak klucze, a zatem nie mogą być zaimplementowane w taki sposób, aby przetwarzać klawisze znak po znaku. Zamiast tego (zwykle) używają zbalansowanych drzewek binarnych, które nie muszą dokonywać introspekcji na kluczach i zamiast tego mogą po prostu używać komparatora do szybkiego wyszukiwania.
Jeśli wiesz na pewno, że niektóre właściwości zawierają klucze, możesz w niektórych przypadkach zrobić to lepiej niż spróbować (przykład: van Emde Boas tree). Jednak projektanci bibliotek muszą zaprojektować wiele przypadków użycia, a zatem mogą potrzebować wybrać opcje, które są wolniejsze od absolutnie najlepszej opcji, ponieważ muszą obsługiwać jak największą liczbę opcji.
Co więcej, jest całkiem możliwe, że zgodna implementacja C++ zawiera specjalizację std::map
lub std::set
, która używa klucza, gdy klucze są ciągami. Nie wierzę, że ktokolwiek to robi, ale teoretycznie jest to możliwe.
Mam nadzieję, że to pomoże!
Dla mniejszych zestawów danych zrównoważone drzewo jest prawdopodobnie bardziej wydajne niż większość powszechnych implementacji trie. Uważam, że triest naprawdę staje się skuteczny tylko w przypadku większych zestawów danych. –
- 1. Dlaczego kompilator C# jawnie deklaruje wszystkie interfejsy implementowane przez typ?
- 2. Dlaczego nie są przechwytywane wyjątki C++?
- 3. Typy niestandardowe jako kluczowe dla mapy - C++
- 4. Mapy Google nie są wyświetlane
- 5. W jaki sposób są implementowane bloki try/catch?
- 6. W jaki sposób interfejsy Java są implementowane wewnętrznie? (vtables?)
- 7. Dlaczego typy szablonów typename nie są domyślnie rozpoznawane jako typy?
- 8. Kręgi mapy Google nie są okrągłe
- 9. Czy margines i dopełnienie są implementowane przez ContentControl?
- 10. W jaki sposób są implementowane lokalne zmienne leniwy Scala?
- 11. Które funkcje Scala są wewnętrznie implementowane za pomocą odbicia?
- 12. W jaki sposób implementowane są Głowy Czatu na Facebooku?
- 13. Dlaczego mapa nie ma metody mapy?
- 14. Dlaczego metody MonoBehaviour nie są zaimplementowane do nadpisania?
- 15. Dlaczego IEnumerable (T) nie są akceptowane jako odbiornik metodę rozszerzenia
- 16. Dlaczego biblioteki Pythona nie są dostarczane jako pyc?
- 17. dlaczego stałe Java są zadeklarowane jako statyczne?
- 18. Dlaczego nie mogę zainicjować mapy <int, String>?
- 19. Korzystanie tablicę jako wartości mapy: nie widzi błędu
- 20. dlaczego konstruktorzy domyślnie nie są jawni?
- 21. Kolekcja Java nie ma mapy jako części zbioru kolekcji
- 22. Dlaczego specyfikacje wyjątków C++ nie są sprawdzane podczas kompilacji?
- 23. Dlaczego znaczniki struct nie są nazwami typów w C?
- 24. Klawisze mapy są obiektami lub nie w Groovy?
- 25. Dlaczego iteratory nie są kopiowalne?
- 26. Dlaczego wartości "Nie liczba" są równe Prawdziwe, gdy są rzutowane jako boolean w Pythonie/Numpy?
- 27. C++ - złożoność nieuporządkowanej mapy
- 28. nie application.css są podawane jako składnik aktywów
- 29. Dlaczego argument typu mapy C++ wymaga pustego konstruktora podczas używania []?
- 30. Dlaczego nie wszystkie typy wartości są zerowe?
Jak używać trieta do przechowywania czegoś, co nie jest łańcuchem (lub co najmniej jak stringiem)? –
Jak masz złożoność O (n) dla trie? – n0rd
@ n0rd: O (n)! = O (sizeofword) ... –