Овом чланку је потребна лектура текста. То подразумева исправку граматичких, правописних и интерпункцијских грешака или тона. |
Овај чланак је започет или проширен кроз пројекат семинарских радова. Потребно је проверити превод, правопис и вики-синтаксу. Када завршите са провером, допишете да након |проверено=. |
X-fast tree | |
---|---|
Тип | Trie |
Смишљено | 1982 |
Смисллио | Dan Willard |
Asymptotic complexity | |
Простор | O(n log M) |
Претраживање | O(log log M) |
Убацивање | O(log M) amortized |
Брисање | O(log M) amortized |
У рачунарској науци, x-брзо дрво је структура података за чување целих бројева из повезаног домена. Подржава упите и предака и наследника у времену O(log log M), коришћењем O(n log M) простора, где је n број сачуваних вредности и M максимална вредност у домену. Структуру је предложио Dan Willard у 1982,[1] уз компликованије y-брзо дрво, као начин да побољша коришћење van Emde Boas дрвећа, задржавајући O(log log M) време упита.
x-брзо дрво је bitwise trie: бинарно дрво где свако подрво чува вредности чије бинарне репрезентације почињу с истим префиксом. Сваки унутрашњи чвор је означен са честим префиксом вредности у његовом поддрвету и типично, лево дете додаје нулу на крај префикса, док десно дете додаје јединицу. Бинарна репрезентација целих бројева између 0 и M − 1 користи ⌈log2 M⌉ битова, тако да је висина дрвета O(log M).
Све вредности у x-брзом дрвету се чувају на листовима. Унутрашњи чворови се чувају само ако имају листове у њиховом поддрвету. Ако унутрашњи чвор нема лево дете, он чува показивач на најмањи лист у сво поддрвету, који се зове наследнички показивач. Слично, ако нема десно дете, чува показивач на највећи лист у свом левом поддрвету. Сваки лист чува показивач на претка и наследника, и тако формира двоструко повезану листу. Коначно, постоји хеш табела за сваки ниво која садржи све чворове на том нивоу. Заједно, ове хеш табеле из level-search структуре (LSS). Да гарантује времена упита у најгорем случају, ове хеш табеле би користиле динамички савршено хеширање или cuckoo hashing.
Тотално заузимање простора је O(n log M), јер сваки елемент има пут од корена до листа дужине O(log M).
Као van Emde Boas дрвећа, x-брза дрвећа подржавају операције уређеног associative array. Ово укључује уобичајене операције асоцијативног низа, заједно са још две операције сређивања, Successor и Predecessor:
Пронађи вредност повезану са кључем k који је у структури података може да се изврши у константном времену тражећи k у LSS[0], што је хеш табела на свим листовима.[2]
Д би пронашли претка или наследника кључа k, прво тражимо Ak, најнижег наследника k. Ово је чвор чвор у дрвету који има најдужи слични префикс са k. Да би пронашли Ak, изводимо бинарну претрагу на нивоима. Почињемо на нивоу h/2, где је h висина дрвета. На сваком нивоу, користимо одговарајућу хеш табелу у структури са префиксом k одговарајуће дужине. Ако чвор с тим префиксом не постоји, знамо да Ak мора да буде на вишем нивоу и ограничавамо нашу претрагу на њих. Ако чвор с тим префиксом постоји, Ak не може бити на вишем нивоу, премда ограничавамо претрагу на тренутним и нижим нивоима.
Када пронађемо најнижег наследника k, знамо да има листове у неким од својих поддрвећа (у супротном не би били у дрвету) и k би требало да буде у дргом поддрвету. Премда наследнички показивач показује на наследника или претка од k. У зависности од тога који тражим, можда би требало да предузмемо један корак у повезаној листи до претходног или следећег листа.
С обзиром да дрво има висину O(log M), бинарна претрага за најнижег наследника узима време од O(log log M). Посе тога, наследник или предак могу да се пронађу у константном времену, тако да укупно време упиа износи O(log log M).[1]
Да бисмо убацили кључ/вредност пар (k, v), прво тражимо претка и наследника од k. Онда стварамо нови лист за k, убацујемо га у повезану листу на листове између наследника и претка, и дајемо му показивач на v. Даље, идемо од корена до новог листа, стварајући неопходне чворове на путу наниже, убацујући их у респективне хеш табеле и ажурирамо наследничке показиваче ако је неопходно.
Јер морамо да прођемо кроз читаву висину дрвета, процес одузима време од O(log M) .[3]
Да бисмо обрисали кључ k, тражимо лист користећи хеш табел на листовима. Уклањамо је из повезане листе, али памтимо ко су били наследник и предак. Онда се крећемо од листа до корена дрвета, уклањајући све чворове чија су поддрва садржавала k и ажурирамо наследничке показиваче где је потребно. Наследнички показивачи који су коришћени за показивање на k ће сада показивати или на наследника или на претка од k, у зависности од поддрвета које недостаје.
Као убацивање, ово узима O(log M) времена, јер морамо да прођемо кроз сваки ниво дрвета.[3]
Willard је представио x-брзо дрвеће углавном као увод у y-брзо дрвеће, које омогућује исто време упита, користећи само O(n) простора и дозвољавајући убацивања и брисања у времену од O(log log M) .[1]
Техника компресије је слична patricia tries може да се користи да знатно смањи коришћење простора x-брзих дрвећа у пракси.[4]
Коришћењем експоненцијалног претраживања пре бинарног по нивоима и слањем упита не само тренутном префиксу x, него такође његовом наследнику x + 1, x-брзо дрвеће може да одговори на упите предака и наследника у времену од O(log log Δ), где је Δ разлика између вредности упита и његовок претка и наследника.[2]