Odpowiedź Joe jest bardzo dobra i zawiera wszystkie ważne słowa kluczowe.
Należy pamiętać, że zwięzłe badania struktury danych są wciąż na wczesnym etapie, a wiele wyników jest w dużej mierze teoretycznych. Wiele proponowanych struktur danych jest dość skomplikowanych do wdrożenia, ale większość złożoności wynika z faktu, że musisz zachować asymptotyczną złożoność zarówno w odniesieniu do wielkości wszechświata, jak i liczby przechowywanych elementów. Jeśli którykolwiek z nich jest względnie stały, wówczas znaczna część złożoności zanika.
Jeśli kolekcja jest półstatyczna (to znaczy wstawki są rzadkie lub co najmniej niewielkie), to z pewnością warto rozważyć łatwą do wdrożenia statyczną strukturę danych (sdarray Sadakane'a jest dobrym wyborem) w połączeniu z aktualizacją Pamięć podręczna. Zasadniczo rejestrujesz aktualizacje w tradycyjnej strukturze danych (np. B-drzewo, trie, tablica skrótu) i okresowo aktualizujesz zbiorczo „główną” strukturę danych. Jest to bardzo popularna technika wyszukiwania informacji, ponieważ indeksy odwrócone mają wiele zalet wyszukiwania, ale trudno je zaktualizować w miejscu. Jeśli tak jest, proszę dać mi znać w komentarzu, a ja poprawię tę odpowiedź, aby podać kilka wskazówek.
Jeśli wstawki są częstsze, sugeruję zwięzłe haszowanie. Podstawowy pomysł jest wystarczająco prosty, aby wyjaśnić tutaj, więc zrobię to.
Tak więc podstawowe informacje teoretyczne Powoduje to, że jeśli jesteś przechowywania elementów z uniwersum elementów i nie ma innych informacji (np brak korelacji między elementami), a następnie Need You bity do przechowywania. (Wszystkie logarytmy są oparte na podstawie 2, chyba że podano inaczej). Potrzebujesz tak wielu bitów. Nie można tego obejść.nulog(un)+O(1)
Teraz trochę terminologii:
- Jeśli masz strukturę danych, która może przechowywać dane i wspierać twoje operacje w bitach przestrzeni, nazywamy to niejawną strukturą danych.log(un)+O(1)
- Jeśli masz strukturę danych, która może przechowywać dane i wspierać twoje operacje w bitów przestrzeni, nazywamy to zwartą strukturą danych. Należy zauważyć, że w praktyce oznacza to, że względny narzut (w stosunku do teoretycznego minimum) mieści się w stałej. Może to być 5% narzutu, 10% narzutu lub 10 razy narzutu.log(un)+O(log(un))=(1+O(1))log(un)
- Jeśli masz strukturę danych, która może przechowywać dane i wspierać twoje operacje w bitów przestrzeni, nazywamy to zwięzłą strukturą danych.log(un)+o(log(un))=(1+o(1))log(un)
Różnica między zwięzłą a zwartą polega na różnicy między małą a dużą. Ignorując przez chwilę rzecz o wartości bezwzględnej ...
- g(n)=O(f(n)) oznacza, że istnieje stała i liczba taka, że dla wszystkich , .cn0n>n0g(n)<c⋅f(n)
- g(n)=o(f(n)) oznacza, że dla wszystkich stałych istnieje liczba taka, że dla wszystkich , .cn0n>n0g(n)<c⋅f(n)
Nieoficjalnie, zarówno duże, jak i małe, są „w ramach stałego współczynnika”, ale w przypadku dużego „o” stała jest wybierana dla ciebie (przez projektanta algorytmu, producenta procesora, prawa fizyki itp.), Ale z niewielkim -oh sam wybierasz stałą i może być tak mała, jak chcesz . Innymi słowy, w zwięzłych strukturach danych względny narzut staje się arbitralnie mały wraz ze wzrostem wielkości problemu.
Oczywiście rozmiar problemu może być ogromny, aby zrozumieć względny narzut, jaki chcesz, ale nie możesz mieć wszystkiego.
OK, mając to pod naszymi paskami, podajmy numery problemu. Załóżmy, że klucze są bitowymi liczbami całkowitymi (więc rozmiar wszechświata wynosi ), i chcemy przechowywać tych liczb całkowitych. Załóżmy, że możemy magicznie zaaranżować wyidealizowany stół haszujący z pełnym obłożeniem i bez strat, tak że potrzebujemy dokładnie szczelin.n2n2m2m
Operacja wyszukiwania spowoduje haszowanie klawisza bit, maskowanie bitów, aby znaleźć gniazda haszowania, a następnie sprawdzenie, czy wartość w tabeli pasuje do klucza. Na razie w porządku.nm
Taka tablica skrótów wykorzystuje bitów. Czy możemy to zrobić lepiej?n2m
Załóżmy, że funkcja skrótu jest odwracalna. Wówczas nie musimy przechowywać całego klucza w każdym polu mieszania. Lokalizacja szczeliny mieszającej daje bitów wartości skrótu, więc jeśli zachowałeś tylko pozostałe bity , możesz zrekonstruować klucz z tych dwóch informacji (lokalizacja szczeliny skrótu i przechowywana tam wartość). Tak więc potrzebujesz tylko bitów pamięci.hmn−m(n−m)2m
Jeśli jest małe w porównaniu z , przybliżenie Stirlinga i mała arytmetyka (dowód to ćwiczenie!) Ujawniają, że:2m2n
(n−m)2m=log(2n2m)+o(log(2n2m))
Tak więc ta struktura danych jest zwięzła.
Istnieją jednak dwa połowy.
Pierwszym haczykiem jest zbudowanie „dobrych” odwracalnych funkcji skrótu. Na szczęście jest to o wiele łatwiejsze niż się wydaje; kryptografowie cały czas tworzą funkcje odwracalne, tylko nazywają je „szyframi”. Możesz na przykład oprzeć funkcję skrótu na sieci Feistel, która jest prostym sposobem na zbudowanie odwracalnych funkcji skrótu na podstawie nieodwracalnych funkcji skrótu.
Drugi haczyk polega na tym, że prawdziwe tabele skrótów nie są idealne dzięki paradoksowi urodzin. Więc chcesz użyć bardziej wyrafinowanego typu tabeli mieszającej, która zbliży Cię do pełnego obłożenia bez rozlewania. Mieszanie kukułki jest do tego idealne, ponieważ pozwala ci dowolnie zbliżyć się do ideału w teorii i całkiem blisko w praktyce.
Mieszanie kukułki wymaga wielu funkcji skrótu i wymaga, aby wartości w gniazdach mieszania były oznaczone przy użyciu funkcji skrótu. Na przykład, jeśli używasz czterech funkcji skrótu, musisz przechowywać dodatkowe dwa bity w każdym gnieździe skrótu. Jest to nadal zwięzłe, gdy rośnie, więc nie jest to problemem w praktyce i wciąż przewyższa przechowywanie całych kluczy.m
Och, możesz też chcieć spojrzeć na drzewa van Emde Boasa.
WIĘCEJ MYŚLI
Jeśli jest gdzieś w pobliżu , to to w przybliżeniu , więc (jeszcze raz) zakładając, że nie ma dalszej korelacji między wartościami, w zasadzie nie możesz nic zrobić lepszy niż nieco wektor. Zauważysz, że powyższe rozwiązanie haszujące skutecznie degeneruje się w tym przypadku (kończy się to zapisywaniem jednego bitu na szczelinę haszującą), ale taniej jest po prostu użyć klucza jako adresu niż funkcji haszującej.nu2log(un)u
Jeśli jest bardzo bliskie , cała zwięzła literatura na temat struktur danych zaleca odwrócenie sensu słownika. Przechowuj wartości, które nie występują w zestawie. Jednak teraz musisz skutecznie wspierać operację usuwania i aby zachować zwięzłe zachowanie, musisz także być w stanie zmniejszyć strukturę danych w miarę dodawania kolejnych elementów. Rozszerzanie tabeli skrótów jest dobrze zrozumiałą operacją, ale jej nie jest.nu