Często słyszałam ludzi mówiących o hashach i hash mapach i tablicach hash. Chciałem wiedzieć, czym są i gdzie najlepiej można z nich korzystać.Co to jest mapa skrótów w programowaniu i gdzie można go używać
Odpowiedz
najpierw ty Shoud może odczytać to article.
Podczas korzystania z list i szukania specjalnego elementu zwykle trzeba przejrzeć całą listę. Jest to bardzo drogie, gdy masz duże listy.
Hafter może być dużo szybszy, w najlepszych okolicznościach dostaniesz przedmiot, którego szukasz tylko jednym dostępem.
Jak to działa? Podobnie jak słownik ... kiedy szukasz słowa "hashtable" w słowniku, nie zaczynasz od pierwszego słowa pod "a". Ale raczej idziesz prosto do litery "h". Następnie do "ha", "ma" i tak dalej, aż znalazłeś słowo. Używasz indeksu w słowniku, aby przyspieszyć wyszukiwanie.
Hafter robi zasadniczo to samo. Każdy przedmiot otrzymuje unikalny indeks (tzw. hash
). Ten skrót jest używany do wyszukiwania. Hash może być indeksem na normalnie połączonej liście. Na przykład twój hash może być liczbą podobną do 2130, co oznacza, że powinieneś spojrzeć na pozycję 2130 na liście. Wyszukiwanie znanego indeksu w ramach normalnej listy jest bardzo łatwe i szybkie.
Problemem całego podejścia jest tak zwana hash function
, która przypisuje ten indeks do każdego elementu. Kiedy szukasz przedmiotu, powinieneś być w stanie obliczyć indeks z góry. Podobnie jak w prawdziwym słowniku, gdzie widzisz, że słowo "hashtable" zaczyna się od litery "h" i dlatego znasz przybliżoną pozycję.
Dobra funkcja haszowania zapewnia hashcodes, które są równomiernie rozproszone w przestrzeni wszystkich możliwych kodów hash. I oczywiście próbuje uniknąć collisions
. Kolizja ma miejsce, gdy dwa różne elementy otrzymują ten sam kod skrótu.
W języku C# na przykład każdy obiekt ma metodę GetHashcode()
, która zapewnia jego skrót (niekoniecznie unikalny). Można go użyć do wyszukiwania i sortowania w słowniku.
Po rozpoczęciu używania tablic asocjacyjnych zawsze należy pamiętać, że poprawnie obsługuje kolizje. Zdarza się to dość łatwo w dużych hashtables, że dwa obiekty mają ten sam skrót (może twoje przeciążenie GetHashcode() jest wadliwe, może coś innego się stało).
Zasadniczo, HashMap pozwala na przechowywanie przedmiotów z identyfikatorami. Są one przechowywane w formacie tabeli z hasłem mieszanym przy użyciu algorytmu mieszania.
Zazwyczaj są one bardziej wydajne, aby odzyskać przedmioty niż drzew wyszukiwania itp
może okazać się pomocne: http://www.relisoft.com/book/lang/pointer/8hash.html
Nadzieja pomaga,
Chris
Hashing (w sensie niekryptograficznym) jest terminem zbiorczym do pobrania danych wejściowych, a następnie tworzenia danych wyjściowych w celu identyfikacji. Trywialny przykładem mieszania dodaje sumę liter sznurku, a mianowicie:
f(abc) = 6
pamiętać, że ten banalny schemat hash stworzyłoby kolizję między strunami abc, BCA, ae itp efektywny program hashowy w naturalny sposób wytworzyłby różne wartości dla każdego ciągu.
Hashmapy i hashtables to dane strukturalne (takie jak tablice i listy), które korzystają z funkcji mieszania do przechowywania danych. W hashtable, hash jest tworzony (albo z dostarczonego klucza, albo z samego obiektu), który określa, gdzie w tabeli obiekt jest przechowywany. Oznacza to, że tak długo jak użytkownik hashtable jest świadomy klucza, pobieranie obiektu jest niezwykle szybkie.
Na liście, w porównaniu, musisz w jakiś sposób przeszukać listę, aby znaleźć poszukiwany obiekt. Reprezentuje to również tyłkę hashtables, która polega na tym, że bardzo trudno znaleźć w niej obiekt bez znajomości klucza, ponieważ miejsce, w którym obiekt jest przechowywany w tabeli, nie ma żadnego znaczenia dla jego wartości ani kiedy zostało wprowadzone.
Hashmapy są podobne do hashtables, ale przechowywany jest w nich tylko jeden przykład każdego obiektu (stąd nie ma potrzeby podawania klucza, sam obiekt jest kluczem).
Jest to oczywiście bardzo proste wytłumaczenie, więc sugeruję, abyś przeczytał dogłębnie od tego miejsca. Mam nadzieję, że nie popełniłem żadnych głupich błędów. =)
Hashmap służy do przechowywania danych w parach wartości kluczy. Możemy użyć hashmap do przechowywania obiektów w aplikacji i używać go dalej w tej samej aplikacji do przechowywania, aktualizacji, usuwania wartości. Hashmap i wartości są przechowywane w wiadrze do określonego wpisu, ta lokalizacja wpisu jest określana za pomocą funkcji Hashcode. Ta funkcja hashcode określa wartość mieszania, w której zapisana jest wartość. Szczegółowy opis działania funkcji działający jest opisany w tym filmie: https://youtu.be/iqYC1odZSNo
- 1. Co to jest uwierzytelnianie skrótów?
- 2. Co to jest kontrola skrótów klawiaturowych?
- 3. Co to jest NHibernate i dlaczego powinienem go używać?
- 4. co to jest MVVM i czy powinniśmy go używać?
- 5. Co to jest pyximport i jak mam go używać?
- 6. Co to jest indeks pełnotekstowy i kiedy powinienem go używać?
- 7. Co to jest publiczne, prywatne i chronione w programowaniu obiektowym?
- 8. Co to jest mapa bitowa w C?
- 9. Co to jest Manifest w Scali i kiedy go potrzebujesz?
- 10. Co to są opcje skrótów?
- 11. Co to są urządzenia w programowaniu?
- 12. Co to jest err. (* Os.PathError) w Go?
- 13. Co to jest protokół TDS w wersji 8.0 i dlaczego powinienem go używać?
- 14. Co to jest "najczęstszy subskrybent" i jak go obliczyć?
- 15. co to jest Request.InputStream i kiedy go użyć?
- 16. Co to jest el/element? Jak tego używać? I dlaczego?
- 17. Co to jest NSConcreteData i gdzie jest on zdefiniowany?
- 18. Co to jest php.ini i gdzie się znajduje w CentOS
- 19. Co to są przejściowe atrybuty factory_girl? Dlaczego miałbym go używać?
- 20. W jaki sposób jest zaimplementowana mapa skrótów JavaScript?
- 21. iTemplate co to jest i miejsce, gdzie można dostać dobry przykład w C#
- 22. Co to jest uint_fast32_t i dlaczego powinno się go używać zamiast zwykłych int i uint32_t?
- 23. Co to jest wyrażenie regularne MM/DD/RRRR i jak używać go w php?
- 24. Co to jest "zadanie" (proces potomny) w systemie Windows i kiedy go używać?
- 25. Co to jest typ złożony w strukturze encji i kiedy go używać?
- 26. Co to jest uwierzytelnianie dwuetapowe?
- 27. Co to jest SAPI i kiedy go użyjesz?
- 28. Co to jest __declspec i kiedy należy go użyć?
- 29. Co to jest Ninject i kiedy go używasz?
- 30. Co to jest NPM i dlaczego go potrzebuję?
Dobrze wyjaśniona odpowiedź –
Co masz na myśli mówiąc "należy prawidłowo obsługiwać kolizje"? O ile wiem, powinniśmy po prostu starać się minimalizować kolizje, pisząc dobre funkcje mieszające (dla lepszej wydajności). Ale nie ma potrzeby "obsługi kolizji". Jeśli zdarzają się konflikty, po prostu ucieknie się do następnego poziomu sprawdzania, wykonując porównanie równań. – Teddy
@Deddy: Funkcje skrótu po prostu wykonaj haszowanie. Nie ma "następnego poziomu". To właśnie miałem na myśli przez "zająć się kolizjami". Jeśli jest więcej niż jeden mecz, musisz wybrać np. równe porównanie. – tanascius