Haszowanie w strukturze danych: funkcja, techniki [z przykładami]
Opublikowany: 2021-05-02Spis treści
Wstęp
Haszowanie to ważna struktura danych zaprojektowana w celu rozwiązania problemu wydajnego wyszukiwania i przechowywania danych w tablicy. Na przykład, jeśli masz listę 20000 numerów i podałeś numer do przeszukania na tej liście - będziesz skanować każdy numer na liście, aż znajdziesz dopasowanie.
Przeszukanie całej listy i zlokalizowanie tego konkretnego numeru wymaga znacznej ilości czasu. Ten ręczny proces skanowania jest nie tylko czasochłonny, ale także nieefektywny. Dzięki haszowaniu w strukturze danych możesz zawęzić wyszukiwanie i znaleźć liczbę w ciągu kilku sekund.
Ten blog da ci głębsze zrozumienie metody haszowania, tabel haszowania i sondowania liniowego z przykładami.
Co to jest haszowanie w strukturze danych?
Haszowanie w strukturze danych to technika mapowania dużej porcji danych na małe tabele za pomocą funkcji mieszającej. Jest również znany jako funkcja skrótu wiadomości. Jest to technika, która jednoznacznie identyfikuje określony przedmiot ze zbioru podobnych przedmiotów.
Używa tablic mieszających do przechowywania danych w formacie tablicy. Każda wartość w tablicy ma przypisany unikalny numer indeksu. Tabele mieszające wykorzystują technikę generowania tych unikalnych numerów indeksów dla każdej wartości przechowywanej w formacie tablicy. Ta technika nazywa się techniką mieszania.
Musisz tylko znaleźć indeks żądanego elementu, a nie znaleźć dane. Dzięki indeksowaniu możesz szybko przeskanować całą listę i pobrać żądany element. Indeksowanie pomaga również w operacjach wstawiania, gdy trzeba wstawić dane w określonej lokalizacji. Bez względu na to, jak duża lub mała jest tabela, możesz aktualizować i pobierać dane w ciągu kilku sekund.
Haszowanie w strukturze danych to proces dwuetapowy.
- Funkcja skrótu konwertuje element na małą liczbę całkowitą lub wartość skrótu. Ta liczba całkowita jest używana jako indeks do przechowywania oryginalnych danych.
- Przechowuje dane w tablicy mieszającej. Możesz użyć klucza skrótu, aby szybko zlokalizować dane.
Przykłady haszowania w strukturze danych
Poniżej znajdują się rzeczywiste przykłady mieszania w strukturze danych –
- W szkołach nauczyciel przypisuje każdemu uczniowi unikalny numer listy. Później nauczyciel używa tego numeru rzutu, aby uzyskać informacje o tym uczniu.
- Biblioteka ma nieskończoną liczbę książek. Każdej księdze bibliotekarz nadaje unikalny numer. Ten unikalny numer pomaga w identyfikacji pozycji książek na półce.
Zamówienie: sortowanie w strukturze danych
Funkcja skrótu
Funkcja skrótu w strukturze danych mapuje dowolny rozmiar danych na dane o stałym rozmiarze. Zwraca następujące wartości: małą wartość całkowitą (znaną również jako wartość skrótu), kody skrótu i sumy skrótu.
hash = hashfunc(klucz)
index = hash % array_size
Funkcja has musi spełniać następujące wymagania:
- Dobra funkcja mieszająca jest łatwa do obliczenia.
- Dobra funkcja skrótu nigdy nie blokuje się w klastrowaniu i rozprowadza klucze równomiernie w tabeli skrótów.
- Dobra funkcja skrótu pozwala uniknąć kolizji, gdy dwa elementy lub elementy zostaną przypisane do tej samej wartości skrótu.
Tabela haszowania
Haszowanie w strukturze danych wykorzystuje tabele haszujące do przechowywania par klucz-wartość. Tablica mieszająca używa następnie funkcji mieszającej do wygenerowania indeksu. Funkcja mieszania używa tego unikalnego indeksu do wykonywania operacji wstawiania, aktualizowania i wyszukiwania.
Jak działa haszowanie w strukturze danych?
W mieszaniu funkcja mieszająca mapuje ciągi lub liczby na małą wartość całkowitą. Tabele haszujące pobierają element z listy za pomocą funkcji haszującej. Celem techniki haszowania jest równomierne rozłożenie danych w całej macierzy. Haszowanie przypisuje wszystkim elementom unikalny klucz. Tablica mieszająca używa tego klucza, aby uzyskać dostęp do danych na liście.
Tablica mieszająca przechowuje dane w parze klucz-wartość. Klucz działa jako wejście do funkcji mieszającej. Funkcja mieszająca generuje następnie unikalny numer indeksu dla każdej przechowywanej wartości. Numer indeksu przechowuje wartość odpowiadającą temu kluczowi. Funkcja skrótu zwraca małą wartość całkowitą jako dane wyjściowe. Dane wyjściowe funkcji mieszającej nazywa się wartością skrótu.
Rozumiemy hashowanie w strukturze danych na przykładzie. Wyobraź sobie, że musisz przechowywać niektóre elementy (ułożone w parę klucz-wartość) w tabeli mieszającej z 30 komórkami.
Wartości są następujące: (3,21) (1,72) (40,36) (5,30) (11,44) (15,33) (18,12) (16,80) (38,99)
Tablica mieszająca będzie wyglądać następująco:
Numer seryjny | Klucz | Haszysz | Indeks tablicy |
1 | 3 | 3%30 = 3 | 3 |
2 | 1 | 1%30 = 1 | 1 |
3 | 40 | 40%30 = 10 | 10 |
4 | 5 | 5%30 = 5 | 5 |
5 | 11 | 11%30 = 11 | 11 |
6 | 15 | 15%30 = 15 | 15 |
7 | 18 | 18%30 = 18 | 18 |
8 | 16 | 16%30 = 16 | 16 |
9 | 38 | 38%30 = 8 | 8 |
Przeczytaj także: Rodzaje struktur danych w Pythonie
Techniki rozwiązywania kolizji
Haszowanie w strukturze danych wchodzi w kolizję, jeśli dwa klucze mają przypisany ten sam numer indeksu w tablicy mieszającej. Kolizja stwarza problem, ponieważ każdy indeks w tablicy mieszającej powinien przechowywać tylko jedną wartość. Haszowanie w strukturze danych wykorzystuje kilka technik rozwiązywania kolizji do zarządzania wydajnością tablicy mieszającej.
Sondy liniowe
Mieszanie w strukturze danych powoduje, że indeks tablicy jest już zajęty do przechowywania wartości. W takim przypadku haszowanie wykonuje operację wyszukiwania i sonduje liniowo następną pustą komórkę.
Przykład sondowania liniowego
Wyobraź sobie, że zostałeś poproszony o przechowywanie niektórych elementów w tabeli mieszania o rozmiarze 30. Elementy są już posortowane według formatu pary klucz-wartość. Podane wartości to: (3,21) (1,72) (63,36) (5,30) (11,44) (15,33) (18,12) (16,80) (46,99) .
Hash(n) to indeks obliczany za pomocą funkcji mieszającej, a T to rozmiar tabeli. Jeśli indeks slotu = ( hash(n) % T) jest pełny, szukamy następnego indeksu slotu, dodając 1 ((hash(n) + 1) % T). Jeśli (hash(n) + 1) % T też jest pełny, wtedy próbujemy (hash(n) + 2) % T. Jeśli (hash(n) + 2) % T też jest pełny, wtedy próbujemy (hash( n) + 3) % T.
Tablica mieszająca będzie wyglądać następująco:
Numer seryjny | Klucz | Haszysz | Indeks tablicy | Indeks tablicy po sondowaniu liniowym |
1 | 3 | 3%30 = 3 | 3 | 3 |
2 | 1 | 1%30 = 1 | 1 | 1 |
3 | 63 | 63%30 = 3 | 3 | 4 |
4 | 5 | 5%30 = 5 | 5 | 5 |
5 | 11 | 11%30 = 11 | 11 | 11 |
6 | 15 | 15%30 = 15 | 15 | 15 |
7 | 18 | 18%30 = 18 | 18 | 18 |
8 | 16 | 16%30 = 16 | 16 | 16 |
9 | 46 | 46%30 = 8 | 16 | 17 |
Podwójne haszowanie
Technika podwójnego haszowania wykorzystuje dwie funkcje haszujące. Druga funkcja skrótu jest używana, gdy pierwsza powoduje kolizję. Zapewnia indeks przesunięcia do przechowywania wartości.
Wzór na technikę podwójnego haszowania jest następujący:
(firstHash(key) + i * secondHash(key)) % sizeOfTable
Gdzie i jest wartością przesunięcia. Ta wartość przesunięcia jest zwiększana, dopóki nie znajdzie pustego gniazda.
Na przykład masz dwie funkcje skrótu: h1 i h2. Aby znaleźć wolne miejsce, musisz wykonać następujące czynności:
- Sprawdź, czy hash1 (klucz) jest pusty. Jeśli tak, zapisz wartość w tym slocie.
- Jeśli hash1(key) nie jest pusty, znajdź inne gniazdo za pomocą hash2(key).
- Sprawdź, czy hash1(klucz) + hash2(klucz) jest pusty. Jeśli tak, zapisz wartość w tym slocie.
- Kontynuuj zwiększanie licznika i powtarzaj z hash1(key)+2hash2(key), hash1(key)+3hash2(key) i tak dalej, aż znajdzie puste miejsce.
Przykład podwójnego haszowania
Wyobraź sobie, że musisz przechowywać niektóre elementy w tablicy mieszającej o rozmiarze 20. Podane wartości to: (16, 8, 63, 9, 27, 37, 48, 5, 69, 34, 1).
h1(n)=n%20
h2(n)=n%13
nh(n, i) = (h1 (n) + ih2(n)) mod 20
n | h(n,i) = (h'(n) + i 2 ) %20 |
16 | I = 0, h(n,0) = 16 |
8 | I = 0, h(n,0) = 8 |
63 | I = 0, h(n,0) = 3 |
9 | I = 0, h(n,0) = 9 |
27 | I = 0, h(n,0) = 7 |
37 | I = 0, h(n,0) = 17 |
48 | I = 0, h(n,0) = 8 I = 0, h(n,1) = 9 I = 0, h(n,2) = 12 |
5 | I = 0, h(n,0) = 5 |
69 | I = 0, h(n,0) = 9 I = 0, h(n,1) = 10 |
34 | I = 0, h(n,0) = 14 |
1 | I = 0, h(n,0) = 1 |
Wniosek
Podwójne mieszanie wiąże się z wysokimi kosztami obliczeniowymi, ale przeszukuje następny wolny slot szybciej niż metoda sondowania liniowego. Przykłady podane w artykule mają jedynie charakter wyjaśniający. Możesz modyfikować powyższe oświadczenia zgodnie z własnymi wymaganiami. Na tym blogu poznaliśmy pojęcie haszowania w strukturze danych .
Możesz wypróbować ten przykład, aby wzmocnić swoją wiedzę o strukturze danych. Jeśli chcesz dowiedzieć się więcej o strukturze danych , zapoznaj się z kursem UpGrad Executive PG Program in Full Stack Development . Ten kurs jest przeznaczony dla pracujących profesjonalistów i oferuje rygorystyczne szkolenia i pośrednictwo pracy w najlepszych firmach.
Co to jest tablica mieszająca?
Tablica mieszająca to implementacja tablicy asocjacyjnej, struktury używanej w programowaniu komputerowym do implementacji abstrakcyjnego typu danych (ADT). W abstrakcyjnym typie danych programista nie musi znać szczegółów implementacji typu danych (takich jak sposób przechowywania danych w pamięci), tylko operacje, które można wykonać na typie danych. Tablica mieszająca wykorzystuje funkcję mieszającą do obliczenia indeksu w tablicy segmentów lub przedziałów, z których można znaleźć żądaną wartość. Tabele mieszające są używane do implementowania struktur danych przypominających mapy. Tabele haszujące są bardzo często używane w nowoczesnych komputerach do implementacji takich rzeczy jak słowniki (jak w pythonie), tablice asocjacyjne (jak w php), tablice haszujące java itp. Tabele haszujące są zwykle implementowane w językach jako tablica wartości posortowana według ich kluczy . Dzięki temu operacje wyszukiwania i wstawiania/usuwania są bardzo szybkie, ponieważ dane są systematycznie przechowywane w pamięci.
Jakie są zastosowania funkcji mieszających?
Funkcje mieszające są używane w kilku zastosowaniach w informatyce, na przykład w kryptografii i odciskach palców dokumentów. Głównym celem funkcji mieszającej jest mapowanie dużych ilości danych wejściowych do danych wyjściowych o stałej długości. W kryptografii hashowanie służy do upewnienia się, że wiadomość lub dokument nie zostały naruszone. Jeśli dokument lub wiadomość zostanie w jakikolwiek sposób zmieniony (nawet pojedynczy znak), zmieni się również wartość skrótu. Dlatego prawie niemożliwe jest stworzenie dokumentu lub wiadomości o określonej wartości skrótu.
Jakie są techniki rozwiązywania kolizji w mieszaniu?
Techniki rozwiązywania kolizji w mieszaniu są używane do rozwiązywania kolizji w mieszaniu. Techniki rozwiązywania kolizji to adresowanie łańcuchowe lub adresowanie otwarte. W łańcuchu zachowujemy stary element na miejscu i wstawiamy nowy element w następnym dostępnym miejscu. Jest to prosta metoda rozwiązywania kolizji, ale jej wadą jest niska wydajność. W adresowaniu otwartym zastępujemy stary element nowym elementem i oznaczamy stary element jako kolizję.