Dotaz na režim rozsahu - Range mode query

v datové struktury, problém s režimem rozsahu žádá o vybudování datové struktury na některých vstupních datech, aby efektivně odpovídal na dotazy žádající o režimu jakékoli po sobě jdoucí podmnožiny vstupu.

Problémové prohlášení

Vzhledem k řadě , chceme odpovědět na dotazy formuláře , kde . Způsob libovolného pole je prvek taková, že frekvence je větší nebo roven frekvenci . Například pokud , pak protože se vyskytuje třikrát, zatímco všechny ostatní hodnoty se vyskytují méněkrát. V tomto problému se dotazy ptají na režim dílčích polí formuláře .

Věta 1

Nechat a být kdokoli multisety. Li je režim a , pak je režim .

Důkaz

Nechat být módem a být jeho frekvence v . Předpokládejme to není režim . Existuje tedy prvek s frekvencí to je režim . Od té doby je režim a to , pak . Tím pádem, by měl být režim což je rozpor.

Výsledek

ProstorČas dotazuOmezeníZdroj
[1]
je velikost slova[1]
[2]
[2]

Dolní mez

Libovolná datová struktura pomocí buňky bity každý potřebuje čas odpovědět na dotaz v režimu rozsahu.[3]

To kontrastuje s jinými problémy s dotazem na rozsah, jako je například dotaz na minimální rozsah, který má řešení nabízející čas dotazu na konstantní čas a lineární prostor. To je způsobeno tvrdostí problému režimu, protože i když režim známe a režim , neexistuje jednoduchý způsob výpočtu režimu . Libovolný prvek nebo může být režim. Například pokud a jeho frekvence je , a a jeho frekvence je také , mohl by tam být prvek s frekvencí v a frekvence v . , ale jeho frekvence v je větší než frekvence a , který dělá lepší kandidát na než nebo .

Struktura dat v lineárním prostoru s časem druhé odmocniny

Tato metoda od Chan et al.[1] používá prostor a čas dotazu. Nastavením , dostaneme a hranice prostoru a času dotazu.

Předběžné zpracování

Nechat být pole a být pole, které obsahuje odlišné hodnoty A, kde je počet odlišných prvků. Definujeme být pole takové, že pro každého , obsahuje hodnost (pozici) v . Pole lze vytvořit lineárním skenováním .

Pole jsou také vytvořeny tak, aby pro každého , . Poté vytvoříme pole , tak, že pro všechny , obsahuje hodnost v . Opět lineární sken stačí k vytvoření polí a .

Nyní je možné odpovědět na dotazy ve formuláři „je frekvence v alespoň "v konstantním čase kontrolou, zda .

Pole je rozděleno na B bloky , každý o velikosti . Tedy blok překlenuje . Režim a frekvence každého bloku nebo sady po sobě jdoucích bloků budou předem vypočítány ve dvou tabulkách a . je režim nebo ekvivalentně režim , a ukládá odpovídající frekvenci. Tyto dvě tabulky lze uložit do prostoru a lze je vyplnit skenováním krát, výpočet řady pokaždé s následujícím algoritmem:

algoritmus computeS_Sprime je    vstup: Pole B = [0: n - 1], pole D = [0: Delta - 1], celé číslo s    výstup: Tabulky S a Sprime    nechat S ← Tabulka (0: n - 1, 0: n - 1) let Sprime ← Tabulka (0: n - 1, 0: n - 1) let první Výskyt ← Pole (0: Delta - 1) pro všechny i v {0, ..., Delta - 1} dělat        firstOccurence [i] ← -1 konec pro    pro i ← 0: s - 1 dělat            nechat j ← i × t nechat C ← 0 let fc ← 0 let noBlock ← nechám block_start ← j nech block_end ← min {(i + 1) × t - 1, n - 1} zatímco j dělat                -li firstOccurence [B [j]] = -1 pak                firstOccurence [B [j]] ← j skončit, pokud		            -li atLeastQInstances (firstOccurence [B [j]], block_end, fc + 1) pak                c ← B [j] fc ← fc + 1 skončit, pokud		            -li j = block_end pak                S [i * s + noBlock] ← c Sprime [i × s + noBlock] ← fc noBlock ← noBlock + 1 block_end ← min {block_end + t, n - 1} skončit, pokud        skončit chvíli        pro všechny j v {0, ..., Delta - 1} dělat            firstOccurence [j] ← -1 konec pro    konec pro

Dotaz

Definujeme algoritmus dotazu přes pole . To lze přeložit jako odpověď , protože pro všechny , je režim pro kdyby a jen kdyby je režim pro . Můžeme převést odpověď na na odpověď pro v konstantním čase při pohledu dovnitř nebo na odpovídajícím indexu.

Byl zadán dotaz , je dotaz rozdělen do tří částí: prefix, span a přípona. Nechat a . Ty označují indexy prvního a posledního bloku, které jsou zcela obsaženy v . Rozsah těchto bloků se nazývá rozpětí. Předpona je pak (sada indexů před rozpětím) a přípona je (sada indexů po rozpětí). Předpona, přípona nebo rozpětí mohou být prázdné, druhé je if .

Pro rozpětí režim je již uložen v . Nechat být frekvence režimu, ve kterém je uložen . Pokud je rozpětí prázdné, nechte . Připomeňme, že podle věty 1 je režim je buď prvek předpony, rozpětí nebo přípony. Přes každý prvek v předponě a v příponě se provádí lineární sken, aby se zkontrolovalo, zda je jeho frekvence větší než aktuální kandidát , v jakém případě a jsou aktualizovány na novou hodnotu. Na konci skenování obsahuje režim a jeho frekvence.

Postup skenování

Postup je podobný pro předponu i příponu, takže stačí spustit tento postup pro obě:

Nechat být index aktuálního prvku. Existují tři případy:

  1. Li , pak byl přítomen v a jeho frekvence již byla spočítána. Přechod na další prvek.
  2. Jinak zkontrolujte, zda je frekvence v je alespoň (To lze provést v konstantním čase, protože je to ekvivalent kontroly ).
    1. Pokud tomu tak není, přejděte na další prvek.
    2. Pokud ano, pak vypočítat skutečnou frekvenci z v lineárním skenováním (počínaje indexem ) nebo binární vyhledávání v . Soubor a .

Toto lineární skenování (kromě frekvenčních výpočtů) je omezeno velikostí bloku , protože předpona ani přípona nesmí být větší než . Další analýza lineárních skenů provedených pro frekvenční výpočty ukazuje, že je také omezena velikostí bloku.[1] Čas dotazu tedy je .

Subkvadratická datová struktura prostoru s konstantním časem dotazu

Tuto metodu [2] používá prostor pro dotaz v konstantním čase. Můžeme pozorovat, že pokud je požadována konstantní doba dotazu, je to lepší řešení než řešení navržené Chanem a kol.,[1] protože druhý dává prostor pro konstantní čas dotazu, pokud .

Předběžné zpracování

Nechat být pole. Předzpracování se provádí ve třech krocích:

  1. Rozdělte pole v bloky , kde je velikost každého bloku . Postavte stůl velikosti kde je režim . Celkový prostor pro tento krok je
  2. Pro jakýkoli dotaz , nechť být blok, který obsahuje a být blok, který obsahuje . Nechť rozpětí je sada bloků zcela obsažených v . Způsob bloku lze načíst z . Podle věty 1 může být režim buď prvkem předpony (indexy před začátkem rozpětí), prvek přípony (indexy po skončení rozpětí), nebo . Velikost předpony plus velikost přípony je ohraničena , tedy poloha režimu je uložena jako celé číslo v rozsahu od na , kde označuje pozici v předponě / příponě a označuje, že režim je režimem rozsahu. Existují možné dotazy týkající se bloků a , takže tyto hodnoty jsou uloženy v tabulce velikostí . Kromě toho existují takové tabulky, takže celkový prostor potřebný pro tento krok je . Pro přístup k těmto tabulkám je kromě režimu v tabulce přidán ukazatel pro každou dvojici bloků.
  3. Zpracování dotazů kde a jsou ve stejném bloku, všechna taková řešení jsou předpočítána. Existují z nich jsou uloženy v trojrozměrné tabulce této velikosti.

Celkový prostor využívaný touto datovou strukturou je , což se snižuje na pokud vezmeme .

Dotaz

Byl zadán dotaz , zkontrolujte, zda je zcela obsažen uvnitř bloku, v takovém případě je odpověď uložena v tabulce . Pokud dotaz zahrnuje přesně jeden nebo více bloků, odpověď je uvedena v tabulce . Jinak použijte ukazatel uložený v tabulce v poloze , kde jsou indexy bloků, které obsahují a , najít stůl který obsahuje polohy režimu pro tyto bloky a pomocí této polohy vyhledejte režim v . To lze provést v konstantním čase.

Reference

  1. ^ A b C d E Chan, Timothy M .; Durocher, Stephane; Larsen, Kasper Green; Morrison, Jason; Wilkinson, Bryan T. (2013). „Datové struktury v lineárním prostoru pro dotaz v režimu rozsahu v polích“ (PDF). Teorie výpočetních systémů. Springer: 1–23.
  2. ^ A b C Krizanc, Danny; Morin, Pat; Smid, Michiel H. M. (2003). "Režim rozsahu a střední rozsah dotazů na seznamy a stromy" (PDF). ISAAC: 517–526.
  3. ^ Greve, M; Jørgensen, A .; Larsen, K .; Truelsen, J. (2010). Msgstr "Dolní hranice a aproximace sondy buňky pro režim dosahu". Automaty, jazyky a programování: 605–616.