8

Poszukuję funkcjonalnej struktury danych, która reprezentuje skończone bije między dwoma typami, co oznacza oszczędność miejsca i oszczędność czasu.Efektywna struktura danych funkcjonalnych dla skończonych biografii

Przykładowo chęcią jeśli rozważa bijection F o wielkości n:

  • rozciągającą F nową parę elementów ma złożoność O (ln n)
  • zapytań f (x) lub f^1 (x) złożoność o (ln n)
  • wewnętrzna reprezentacja f jest bardziej skuteczny niż przestrzeń o skończonej 2 mapy (reprezentujący f i jego odwrotność)

i znam wydajna reprezentacja permutacji s, jak this paper, ale to nie rozwiązuje mojego problemu.

+10

Posiadanie dwóch skończonych map jest dość efektywne pod względem przestrzeni ... to jest przestrzeń O (n). Nie mogę sobie wyobrazić, że możesz zrobić coś lepszego. –

+4

Zacznij od dwóch skończonych map i martw się o coś bardziej sprytnego, gdy zabraknie Ci pamięci. Mapy Hashmaps są dobre, jeśli możesz mieszać te dwa typy. – augustss

+3

Wygląda na to, że jeśli twoja funkcja jest ściśle monotonna, możesz przeszukać to samo drzewo dla funkcji i odwrotności. Myślę, że to długi strzał. –

Odpowiedz

10

Proszę spojrzeć na my answer dla stosunkowo podobnego pytania. The provided code może obsługiwać ogólne relacje NxM, ale także specjalizuje się tylko w bijections (podobnie jak w przypadku binarnego drzewa wyszukiwania).

Wklejenie odpowiedzi tutaj dla kompletności:

Najprostszym sposobem jest użycie parę jednokierunkowych mapach. Koszt jest niewielki, ale nie osiągniesz znacznie lepszego poziomu (możesz uzyskać nieco lepsze wykorzystanie dedykowanych drzew binarnych, ale masz ogromny koszt złożoności, jeśli musisz go wdrożyć samodzielnie). Zasadniczo wyszukiwania będą równie szybkie, ale dodawanie i usuwanie będzie dwa razy wolniejsze. Co nie jest takie złe dla operacji logarytmicznej. Kolejną zaletą tej techniki jest to, że możesz użyć wyspecjalizowanych typów map dla typu klucza lub wartości, jeśli masz taką możliwość. Nie uzyskasz takiej elastyczności dzięki określonej strukturze danych ogólnych.

Innym rozwiązaniem jest użycie quadtree (zamiast rozważania relacji NxN jako pary relacji 1xN i Nx1, postrzegasz to jako zestaw elementów w produkcie kartezjańskim (Key * Value) twoich typów, które jest przestrzenną płaszczyzną), ale nie jest dla mnie jasne, że czas i koszty pamięci są lepsze niż przy dwóch mapach. Przypuszczam, że to musi być przetestowane.

+0

Twoja struktura danych wydaje się podobna w duchu do [kd-tree] (https://en.wikipedia.org/wiki/Kd-tree). – esope

5

Chociaż nie spełnia trzeciego wymogu, wydaje się, że jest to droga, którą należy przejść. (Po prostu tworzą dwie skończone mapy, jedną w każdym kierunku, wygodną w użyciu.)