Trvalé pole - Persistent array

v počítačová věda a přesněji v datová struktura, atrvalé pole je perzistentní datová struktura withperperties similar to a (non-persistent) pole. To znamená, že po aktualizaci hodnoty v trvalém poli existují dvě trvalá pole. Jedno trvalé pole, ve kterém je brána v úvahu aktualizace, a jedno, které se rovná poli před aktualizací.

Rozdíl mezi trvalými poli a poli

Pole je datová struktura s pevným počtem n prvků . Očekává se, že vzhledem k poli ar a anindex , hodnota lze rychle načíst. Tato operace se nazývá avzhlédnout. Dále vzhledem k poli arindex a nová hodnota proti, nové pole ar2 bez obsahu lze vytvořit rychle. Tato operace se nazývá Aktualizace. Hlavní rozdíl mezi trvalými a neperzistentními poli je ten, že v neperzistentních polích je pole ar je zničen během vytváření ar2.

Zvažte například následující pseudokód.

pole = [0, 0, 0]updated_array = pole.update (0, 8)other_array = pole.update (1, 3)last_array = updated_array.update (2, 5)

Na konci provedení hodnota pole je stále [0, 0, 0], hodnota update_array je [8, 0, 0], hodnota other_arrayje [0, 3, 0] a hodnota last_array je [0, 8, 5].

Existují dva druhy trvalých polí. Trvalé pole může být buď částečně nebo plně vytrvalý. Plně perzistentní pole může být aktualizováno libovolně několikrát, zatímco částečně perzistentní pole může být aktualizováno maximálně jednou. V našem předchozím příkladu, pokud pole byly jen částečně trvalé, vytvořeníother_array by bylo zakázáno, ale vytvoření last_array by bylo stále platné. Vskutku, updated_array je pole odlišné od pole a nebyl nikdy aktualizován před vytvořením last_array.

Implementace

Existuje mnoho implementací trvalých polí. V této části je kladné přirozené číslo n bude vždy velikost trvalého pole.

Níže jsou popsány tři implementace. První z nich je nejjednodušší implementovat, zatímco poslední jsou efektivnější.

Pomocí čistě funkčních datových struktur

Nejjednodušší implementace plně perzistentního pole velikosti nspočívá v použití libovolné trvalé mapy, jejíž vstupem jsou čísla z 0 na n-1. Takovou datovou strukturou může být například a vyvážený strom. Vyhledání prvku v takové struktuře adata by však trvalo logaritmický čas. Jedním z hlavních zájmů pole je to, že operace jsou prováděny v konstantním čase. I když je nemožné vytvořit datové struktury, ve kterých každá operace trvá konstantní čas[1], následující operace by umožnily efektivnější vyhledávání, alespoň na poslední verzi struktur.

Pomocí pole a stromu úprav

Plně perzistentní pole lze implementovat pomocí pole a takzvaného Backerova triku[2] Tato implementace se používá v OCaml modul parray.ml[3] Jean-Christophe Filliâtre.

Aby bylo možné definovat tuto implementaci, je třeba uvést několik dalších definic. An počáteční pole je pole, které není generováno aktualizací na jiném poli. A dítě pole ar je pole formy ar.update (i, v), a ar je rodičz ar.update (i, v). A potomek pole ar je buďar nebo potomek dítěte ar. The počáteční polepole ar je buď ar -li ar je počáteční, nebo je to počáteční pole rodiče ar. To znamená, že počáteční polear je jedinečné pole inic takhle , s ar inicialand libovolná posloupnost indexů a libovolný sled hodnot. Arodina of array is teda a set of arrays containing an initialarray and all of its descendants. A konečně, strom rodiny polí je strom jejichž uzly jsou paprsková pole as hranou E z ar každému jeho dítětiar.update (i, v).

Trvalé pole využívající Backerův trik se skládá do dvojice se skutečným názvem pole pole a strom polí. Toto treeadmits libovolný kořen - ne nutně počáteční pole. Theroot může být přesunut do libovolného uzlu stromu. Změna kořene z vykořenit do libovolného uzlu ar trvá čas úměrný hloubce ar. To znamená ve vzdálenosti mezi vykořenit aar. Podobně vyhledávání hodnoty vyžaduje čas úměrný vzdálenosti mezi polem a kořenem jeho rodiny. Pokud tedy stejné pole ar může být vyhledávání vícekrát, je efektivnější přesunout root na ar před provedením vyhledávání. Nakonec aktualizace pole trvá pouze konstantní čas.

Technicky vzato, vzhledem k dvěma sousedním polím ar1 a ar2, sar1 blíže ke kořenu než ar2, hrana z ar1 naar2 je označen (i, ar2 [i]), kde i jediná poloha, mezi nimiž se liší hodnota ar1 a ar2.

Přístup k prvku i pole ar se provádí následovně. Liar je tedy kořen ar [i] rovná se kořen [i]. Jinak nechteE hrana odchází ar směrem ke kořenu. Pokud je na štítku Eje (i, v) pak ar [i] rovná se proti. Jinak nechte ar2 druhý uzel hrany E. Pak ar [i] rovná sear2 [i]. Výpočet ar2 [i] probíhá rekurzivně pomocí stejné definice.

Vytvoření ar.update (i, v) spočívá v přidání nového uzluar2 ke stromu a hraně E z ar na ar2 označeno (i, v).

Nakonec přesuneme kořen do uzlu ar se provádí následovně. Liar je již root, není co dělat. Jinak nechteE hrana odchází ar směrem k aktuálnímu kořenu, (i, v) jeho štítek a ar2 druhý konec E. Přesunutí kořene do ar je hotovo nejprve přesunutím root do ar2, změna štítku Ena (i, ar2 [i])a mění se pole [i] na proti.

Log-log-time

Existuje implementace plně perzistentních polí, ve kterých lze provádět vyhledávání a aktualizace-čas a prostor, s m počet polí a n potom počet prvků v poli[1]. Tato implementace je optimální pro vyhledávání podle takzvaného modelu buňky-sondy.

Všimněte si však, že tato implementace je mnohem složitější než výše uvedená, a proto nebude v tomto článku popsána.

Reference

  1. ^ A b Straka e, Milan (2013). Funkční datové struktury a algoritmy. Praha,. str. 87–90.CS1 maint: extra interpunkce (odkaz)
  2. ^ Fillâtre, Jean-Christophe; Conchon, Sylvain (2007). Trvalá unijní vyhledávací datová struktura (PDF). New York, NY, USA: ACM. 37 až 46. ISBN  978-1-59593-676-9.
  3. ^ Filliâtre, Jean-Christophe. "Implementace trvalého pole".

.