Istnieje kilka technik, które gwarantują, że wyszukiwanie zawsze będzie wymagało operacji O (1), nawet w najgorszym przypadku.
Jak mogę ustalić, czy tabela skrótów ma szansę na wykonanie operacji O (1) i ewentualnie jakich technik użyć w funkcji skrótu?
Najgorszy przypadek ma miejsce, gdy jakiś złośliwy atakujący (Mallory) celowo przekazuje dane, które Mallory specjalnie wybrał, aby spowolnić działanie systemu.
Po wybraniu określonej funkcji skrótu prawdopodobnie zbyt optymistyczne jest założenie, że Mallory nigdy nie dowie się, którą funkcję skrótu wybrałeś. Gdy Mallory odkryje, którą funkcję skrótu wybrałeś, jeśli pozwolisz Mallory'emu dać ci dużo danych, które chcesz wstawić do swojej tabeli skrótów za pomocą tej funkcji skrótu, to jesteś skazany: Mallory może wewnętrznie szybko wygenerować miliardy elementów danych, mieszając je z twoim funkcja skrótu, aby znaleźć, które elementy danych mogą się zderzyć, a następnie nakarmić miliony jeden na tysiąc elementów danych, które mogą się zderzyć, co prowadzi do wyszukiwania, które działają znacznie wolniej niż O (1).
Wszystkie techniki gwarantujące „O (1) wyszukiwanie nawet w najgorszym przypadku” pozwalają uniknąć tego problemu, wykonując trochę dodatkowej pracy przy każdym wstawieniu, aby zagwarantować, że w przyszłości każde możliwe wyszukiwanie może zakończyć się sukcesem w O (1) czasie . W szczególności zakładamy (w najgorszym przypadku), że Mallory prędzej czy później odkryje, której funkcji skrótu używamy; ale dostaje on tylko szansę na wstawienie kilku elementów danych, zanim wybieramy inną funkcję skrótu - skrót tabulacji lub inny uniwersalny skrót - taki, który specjalnie wybieramy, aby wszystkie dane, które do tej pory mogliśmy przeglądać, w 2 lub 3 sondy - tj. O (1). Ponieważ losowo wybieramy tę funkcję, możemy być całkiem pewni, że Mallory przez jakiś czas nie będzie wiedział, którą funkcję wybraliśmy. Nawet jeśli Mallory natychmiastdaje nam dane, które nawet przy tej nowej funkcji skrótu kolidują z poprzednimi danymi, możemy następnie wybrać kolejną świeżą nową funkcję skrótu, dzięki której po ponownym skróceniu wszystkie poprzednie dane, które on i wszyscy inni nam karmili, można teraz wyszukać w 2 lub 3 sondach w najgorszym przypadku - tj. wyszukiwania O (1) w najgorszym przypadku.
Dosyć łatwo jest losowo wybrać nową funkcję skrótu i powtarzać całą tabelę wystarczająco często, aby zagwarantować, że każde wyszukiwanie ma zawsze wartość O (1). Chociaż gwarantuje to, że każde wyszukiwanie ma zawsze wartość O (1), techniki te, wstawiając N-ty element do tablicy mieszającej, która już zawiera N-1 elementy, mogą czasami wymagać O (N) czasu na wstawienie. Możliwe jest jednak zaprojektowanie systemu w taki sposób, że nawet jeśli Mallory celowo poda nowe dane, które przy użyciu nowej funkcji skrótu kolidują z poprzednimi danymi, system może zaakceptować wiele przedmiotów od Mallory i innych, zanim będzie musiał zrobić pełna odbudowa O (N). Techniki tabeli mieszania, które wybierają nową funkcję i powtarzają, aby zagwarantować wyszukiwanie O (1), nawet w najgorszym przypadku, obejmują:
- kukułka mieszaja gwarantuje, że każdy klawisz wyszukiwanie powiedzie się z co najwyżej 2 obliczeń hash i 2 wyszukiwań stołowych.
- mieszanie klasy gra w karty gwarantuje, że każde wyszukiwanie klucza zakończy się powodzeniem po sprawdzeniu małej liczby H (być może H = 32) kolejnych wpisów w tabeli.
- dynamiczne idealne haszowanie - artykuł Dietzfelbinger z 1994 r. jest pierwszym, który przeczytałem, w którym zwróciłem uwagę, że mimo że „przerabia” często, aby zagwarantować, że każde wyszukiwanie klucza zawsze kończy się 2 obliczeniami skrótu i 2 przeglądami, jest to możliwe aby wykonać pełne powtórzenie tak rzadko, że chociaż każde pełne powtórzenie wykorzystuje czas O (n), oczekiwany średni koszt wstawiania i usuwania jest amortyzowany przez O (1).
Struktury danych / tabele skrótów