Strom (datová struktura) - Tree (data structure)

v počítačová věda, a strom je široce používán abstraktní datový typ který simuluje hierarchické stromová struktura, s kořenovou hodnotou a podstromy dětí s a nadřazený uzel, představovaný jako sada propojených uzly.
Lze definovat stromovou datovou strukturu rekurzivně jako kolekce uzlů (počínaje kořenovým uzlem), kde každý uzel je datová struktura skládající se z hodnoty, společně se seznamem odkazů na uzly („podřízené“), s omezeními, že žádný odkaz není duplikován, a nikdo neukazuje na kořen.
Alternativně lze strom definovat abstraktně jako celek (globálně) jako objednaný strom, s hodnotou přiřazenou každému uzlu. Obě tyto perspektivy jsou užitečné: zatímco strom lze analyzovat matematicky jako celek, je-li ve skutečnosti reprezentován jako datová struktura, je obvykle reprezentován a pracuje se s ním samostatně podle uzlu (spíše než jako sada uzlů a seznam sousedství hran mezi uzly, protože jeden může představovat a digraf, například). Například při pohledu na strom jako celek lze hovořit o „nadřazeném uzlu“ daného uzlu, ale obecně jako datovou strukturu obsahuje daný uzel pouze seznam jeho podřízených prvků, ale neobsahuje odkaz na jeho rodič (pokud existuje).
Běžné použití
- Zastupování hierarchický údaje jako:
- Abstraktní syntaxové stromy pro počítačové jazyky
- Analyzovat stromy pro lidské jazyky
- Modely objektů dokumentu z XML a HTML dokumenty
- JSON a YAML zpracovávané dokumenty
- Prohledejte stromy ukládat data efektivním způsobem vyhledávací algoritmus možné prostřednictvím traversal strom
- A binární vyhledávací strom je typ binární strom
- Zastupování seřazené seznamy dat
- Jako pracovní postup pro skládání digitální obrázky pro vizuální efekty[Citace je zapotřebí ]
- Skladování Barnes-Hut stromy používané k simulaci galaxií
Terminologie
A uzel je struktura, která může obsahovat hodnotu nebo podmínku, nebo představuje samostatnou datovou strukturu (což může být vlastní strom). Každý uzel ve stromu má nulu nebo více podřízené uzly, které jsou pod stromem (podle konvence jsou stromy nakresleny rostoucí dolů). Uzel, který má dítě, se nazývá dítě nadřazený uzel (nebo nadřízený ). Uzel má maximálně jednoho rodiče, ale možná mnoho uzly předků, například rodič rodiče. Podřízené uzly se stejným rodičem jsou sourozenecké uzly.
An vnitřní uzel (také známý jako vnitřní uzel, inode zkrátka nebo uzel větve) je libovolný uzel stromu, který má podřízené uzly. Podobně an externí uzel (také známý jako vnější uzel, listový uzelnebo koncový uzel) je libovolný uzel, který nemá podřízené uzly.
Nejvyšší uzel ve stromu se nazývá kořenový uzel. V závislosti na definici může být vyžadováno, aby strom měl kořenový uzel (v takovém případě jsou všechny stromy neprázdné), nebo může být povoleno, aby byl prázdný, v takovém případě nemusí nutně mít kořenový uzel. Jako nejvyšší uzel nebude mít kořenový uzel rodiče. Je to uzel, ve kterém začínají algoritmy na stromě, protože jako datovou strukturu lze předávat pouze od rodičů k dětem. Všimněte si, že některé algoritmy (jako je hledání po objednávce do hloubky první) začínají v kořenovém adresáři, ale první návštěva uzlů listu (přístup k hodnotě listových uzlů), návštěva kořene pouze jako poslední (tj. První přístup k dětem kořene , ale pouze přístup k hodnotě root naposledy). Všechny ostatní uzly lze z něj získat pomocí následujícího postupu hrany nebo Odkazy. (Ve formální definici je každá taková cesta také jedinečná.) V diagramech je kořenový uzel konvenčně nakreslen nahoře. Na některých stromech, jako např hromady, kořenový uzel má speciální vlastnosti. Každý uzel ve stromu lze považovat za kořenový uzel podstromu zakořeněného v tomto uzlu.
The výška uzlu je délka nejdelší sestupné cesty k listu z tohoto uzlu. Výška kořene je výška stromu. The hloubka uzlu je délka cesty k jeho kořenu (tj. jeho kořenová cesta). To je běžně nutné při manipulaci s různými samovyvažovacími stromy, Stromy AVL zejména. Kořenový uzel má nulovou hloubku, listové uzly mají nulovou výšku a strom pouze s jedním uzlem (tedy kořen i list) má hloubku a výšku nula. Prázdný strom (strom bez uzlů, pokud jsou povoleny) má obvykle výšku -1.
A podstrom stromu T je strom skládající se z uzlu v T a všichni jeho potomci v T.[A][1] Uzly tedy odpovídají podstromům (každý uzel odpovídá podstromu sebe sama a všem jeho potomkům) - podstrom odpovídající kořenovému uzlu je celý strom a každý uzel je kořenem uzlu podstromu, který určuje; podstrom odpovídající kterémukoli jinému uzlu se nazývá a řádný podstrom (analogicky k a správná podmnožina ).
Další termíny používané se stromy:
- Soused
- Rodič nebo dítě.
- Předek
- Uzel dosažitelný opakovaným postupem od dítěte k rodiči.
- Potomek
- Uzel dosažitelný opakovaným postupem od rodiče k dítěti. Také známý jako vnuk.
- Uzel větve
- Interní uzel
- Uzel s alespoň jedním dítětem.
- Stupeň
- Pro daný uzel jeho počet dětí. List je nutně stupeň nula. Stupeň stromu je stupeň jeho kořene.
- Stupeň stromu
- Stupeň kořene.
- Vzdálenost
- Počet hran podél nejkratší cesty mezi dvěma uzly.
- Úroveň
- 1 + počet hran mezi uzlem a kořenem, tj. (hloubka + 1)[pochybný ]
- Šířka
- Počet uzlů na úrovni.
- Šířka
- Počet listů.
- Les
- Sada n ≥ 0 nesouvislých stromů.
- Objednaný strom
- Kořenový strom, ve kterém je pro děti každého vrcholu určeno pořadí.
- Velikost stromu
- Počet uzlů ve stromu.
Předběžná definice





Strom je nelineární datová struktura ve srovnání s poli, propojenými seznamy, zásobníky a frontami, které jsou lineárními datovými strukturami. Strom může být prázdný bez uzlů nebo strom je struktura skládající se z jednoho uzlu zvaného root a nulového nebo jednoho nebo více podstromů.
Kreslení stromů
Stromy jsou často kresleny v rovině. Uspořádané stromy mohou být v rovině zastoupeny v podstatě jedinečně, a proto se nazývají platany, takto: pokud jeden zafixuje konvenční pořadí (řekněme proti směru hodinových ručiček) a uspořádá podřízené uzly v tomto pořadí (první příchozí nadřazená hrana, pak první podřízená hrana atd.), získá se vložení stromu do roviny, jedinečné až do okolní izotopy. Naopak takové vložení určuje uspořádání podřízených uzlů.
Pokud někdo umístí kořen nahoře (rodiče nad dětmi, jako v a rodokmen ) a umístí všechny uzly, které jsou v dané vzdálenosti od kořene (z hlediska počtu hran: „úroveň“ stromu) na danou vodorovnou čáru, získá se standardní výkres stromu. Vzhledem k binárnímu stromu je první dítě vlevo („levý uzel“) a druhé dítě vpravo („pravý uzel“).
Běžné operace
Graf a strom vyhledávací algoritmy |
---|
Výpisy |
|
související témata |
- Výčet všech položek
- Výčet části stromu
- Hledání položky
- Přidání nové položky na určité místo ve stromu
- Odstranění položky
- Prořezávání: Odstranění celé části stromu
- Roubování: Přidání celé sekce do stromu
- Nalezení kořene pro jakýkoli uzel
- Nalezení nejnižší společný předek dvou uzlů
Traverz a metody vyhledávání
Krokování mezi položkami stromu pomocí spojení mezi rodiči a dětmi se nazývá chůze po stromu, a akce je Procházka stromu. Často může být provedena operace, když ukazatel dorazí na konkrétní uzel. Procházka, při které se každý nadřazený uzel prochází, než se jeho děti nazývají a předobjednávka Procházka; procházka, při které se děti procházejí dříve, než se projdou jejich rodiče, se nazývá a na objednávku Procházka; procházka, při které se prochází levým podstromem uzlu, poté samotným uzlem a nakonec jeho pravým podstromem, se nazývá v pořádku traverz. (Tento poslední scénář, odkazující na přesně dva podstromy, levý podstrom a pravý podstrom, předpokládá konkrétně binární strom.) A pořadí na úrovni chůze efektivně provádí a vyhledávání na šířku přes celý strom; uzly jsou procházeny úrovní po úrovni, kde je nejprve navštíven kořenový uzel, poté jeho přímé podřízené uzly a jejich sourozence, následované uzly jeho vnouče a jejich sourozenci atd., dokud nebudou překročeny všechny uzly ve stromu.
Zastoupení
Existuje mnoho různých způsobů, jak reprezentovat stromy; společné reprezentace představují uzly jako dynamicky přiděleno záznamy s ukazateli na jejich děti, jejich rodiče nebo obojí, nebo jako položky v pole, přičemž vztahy mezi nimi jsou určeny jejich polohami v poli (např. binární hromada ).
Binární strom lze skutečně implementovat jako seznam seznamů (seznam, kde jsou hodnoty seznamy): vedoucí seznamu (hodnota prvního členu) je levé dítě (podstrom), zatímco ocas (seznam druhého a následujících termínů) je správné dítě (podstrom). To lze upravit tak, aby umožňovalo hodnoty, stejně jako v Lispu S-výrazy, kde hlava (hodnota prvního členu) je hodnota uzlu, hlava ocasu (hodnota druhého členu) je levé dítě a ocas ocasu (seznam třetího a následujících členů) je pravý dítě.
Obecně uzel ve stromu nebude mít ukazatele na své rodiče, ale tyto informace lze zahrnout (rozšíření datové struktury tak, aby zahrnovaly také ukazatel na nadřazeného) nebo uložit samostatně. Alternativně mohou být vzestupné odkazy zahrnuty v datech podřízeného uzlu, jako v a závitový binární strom.
Zobecnění
Digrafy
Pokud jsou hrany (do podřízených uzlů) považovány za odkazy, pak je strom zvláštním případem digrafu a datovou strukturu stromu lze zobecnit tak, aby představovala řízené grafy odstraněním omezení, která může mít uzel maximálně u jednoho rodiče, a že nejsou povoleny žádné cykly. Hrany jsou stále abstraktně považovány za dvojice uzlů, nicméně termíny rodič a dítě jsou obvykle nahrazeny odlišnou terminologií (například zdroj a cílová). Odlišný implementační strategie existují: digraf může být reprezentován stejnou místní datovou strukturou jako strom (uzel s hodnotou a seznamem podřízených), za předpokladu, že „seznam podřízených“ je seznam odkazů, nebo globálně takovými strukturami jako seznamy sousedství.
v teorie grafů, a strom je připojená acyklická skupina graf; pokud není uvedeno jinak, v teorii grafů se stromy a grafy považují za neorientované. Mezi takovými stromy a stromy jako datovou strukturou neexistuje vzájemná korespondence. Můžeme vzít libovolný neorientovaný strom, libovolně vybrat jeden z jeho vrcholy jako vykořenit, aby všechny jeho hrany směřovaly tak, že budou směřovat od kořenového uzlu - vytvoří se stromovost - a přiřadit objednávku všem uzlům. Výsledek odpovídá stromové datové struktuře. Výběr jiného kořene nebo jiné řazení vytvoří jiný.
Vzhledem k tomu, že uzel ve stromu definuje jeho podřízený les (sjednocení podstromů daných všemi podřízenými nebo ekvivalentní převzetí podstromu samotného uzlu a vymazání kořene). Stejně jako podstromy jsou přirozené pro rekurzi (jako při hledání v hloubce), jsou lesy přirozené korekční (jako při vyhledávání na šířku).
Přes vzájemná rekurze, les lze definovat jako seznam stromů (představovaných kořenovými uzly), kde uzel (stromu) sestává z hodnoty a lesa (jeho podřízených):
f: [n [1], ..., n [k]] n: v f
Datový typ versus datová struktura
Existuje rozdíl mezi stromem jako abstraktním datovým typem a jako konkrétní datovou strukturou, analogicky k rozdílu mezi a seznam a a spojový seznam.
Jako datový typ má strom hodnotu a děti a děti jsou samy stromy; hodnota a podřízené prvky stromu jsou interpretovány jako hodnota kořenového uzlu a podstromů podřízených kořenového uzlu. Chcete-li povolit konečné stromy, musíte buď povolit, aby byl seznam dětí prázdný (v takovém případě může být vyžadováno, aby stromy byly neprázdné, místo toho byl „prázdný strom“ reprezentován lesem s nulovými stromy), nebo umožněte stromům být prázdné, v takovém případě může mít seznam dětí pevnou velikost (větvící faktor, zejména 2 nebo „binární“), pokud je to požadováno.
Jako datová struktura je propojený strom skupina uzly, kde každý uzel má hodnotu a seznam Reference do ostatních uzlů (jejích podřízených). Existuje také požadavek, aby žádné dva „sestupné“ odkazy neukazovaly na stejný uzel. V praxi uzly ve stromu běžně zahrnují i další data, například další / předchozí odkazy, odkazy na jejich nadřazené uzly nebo téměř cokoli jiného.
Z důvodu použití Reference stromům v propojené stromové datové struktuře jsou stromy často diskutovány implicitně za předpokladu, že jsou reprezentovány odkazy na kořenový uzel, protože tak se často implementují. Například místo prázdného stromu může mít nulový odkaz: strom je vždy neprázdný, ale odkaz na strom může mít nulovou hodnotu.
Rekurzivní
Rekurzivně je jako datový typ definován strom jako hodnota (nějakého datového typu, případně prázdná), společně se seznamem stromů (případně prázdný seznam), podstromů jejích podřízených; symbolicky:
- t: v [t [1], ..., t [k]]
(Strom t se skládá z hodnoty proti a seznam dalších stromů.)
Elegantněji prostřednictvím vzájemná rekurze, jehož jedním z nejzákladnějších příkladů je strom, lze definovat jako les (seznam stromů), kde se strom skládá z hodnoty a lesa (podstromů jeho podřízených):
- f: [t [1], ..., t [k]]
- t: v f
Všimněte si, že tato definice je z hlediska hodnot a je vhodná v funkční jazyky (předpokládá se referenční průhlednost ); různé stromy nemají žádné spojení, protože jsou to jednoduše seznamy hodnot.
Jako datovou strukturu je strom definován jako uzel (kořen), který sám o sobě sestává z hodnoty (nějakého datového typu, případně prázdné), spolu se seznamem odkazů na jiné uzly (seznam možná prázdný, odkazy případně null ); symbolicky:
- n: v [& n [1], ..., & n [k]]
(Uzel n se skládá z hodnoty proti a seznam odkazů na další uzly.)
Tato datová struktura definuje směrovaný graf,[b] a aby to byl strom, je třeba přidat podmínku jeho globální struktury (jeho topologie), a to, že nanejvýš jeden odkaz může ukazovat na jakýkoli daný uzel (uzel má nanejvýš jednoho nadřazeného) a žádný uzel ve stromu přejděte na kořen. Ve skutečnosti musí mít každý uzel (jiný než root) přesně jednoho rodiče a root nesmí mít žádné rodiče.
Ve skutečnosti, vzhledem k seznamu uzlů a pro každý uzel seznam odkazů na jeho podřízené prvky, nelze určit, zda je tato struktura stromem nebo ne, aniž by analyzoval její globální strukturu a že je ve skutečnosti topologicky stromem, jak je definováno níže.
Teorie typů
Jako abstraktní datový typ, abstraktní typ stromu T s hodnotami nějakého typu E je definován pomocí abstraktního typu lesa F (seznam stromů), podle funkcí:
- hodnota: T → E
- děti: T → F
- nula: () → F
- uzel: E × F → T
s axiomy:
- hodnota (uzel (E, F)) = E
- děti (uzel (E, F)) = F
Ve smyslu teorie typů, strom je indukční typ definované konstruktory nula (prázdný les) a uzel (strom s kořenovým uzlem s danou hodnotou a potomky).
Matematická terminologie
Z celkového pohledu je stromová datová struktura objednaný strom, obvykle s hodnotami připojenými ke každému uzlu. Konkrétně to je (pokud je požadováno, aby nebylo prázdné):
- A zakořeněný strom se směrem „od kořene“ (užší termín je „stromovost "), význam:
- A řízený graf,
- jehož podkladové neorientovaný graf je strom (libovolné dva vrcholy jsou spojeny přesně jednou jednoduchou cestou),
- s rozlišujícím kořenem (jeden vrchol je označen jako kořen),
- který určuje směr na okrajích (šipky směřují od kořene; vzhledem k hraně se uzel, ze kterého hrana ukazuje, nazývá rodič a uzel, na který hrana ukazuje, se nazývá dítě),
dohromady s:
- uspořádání na podřízených uzlech daného uzlu a
- hodnotu (nějakého datového typu) v každém uzlu.
Stromy mají často pevné (přesněji ohraničené) větvící faktor (překonat ), zejména vždy s dvěma podřízenými uzly (tedy pravděpodobně prázdnými) nejvíce dva neprázdný podřízené uzly), tedy „binární strom“.
Povolení prázdných stromů činí některé definice jednoduššími, některé komplikovanějšími: kořenový strom musí být neprázdný, a proto, pokud jsou prázdné stromy povoleny, výše uvedená definice se místo toho stane „prázdným stromem nebo kořenovým stromem takovým ...“. Na druhou stranu prázdné stromy zjednodušují definování fixního faktoru větvení: s povolenými prázdnými stromy je binární strom strom, takže každý uzel má přesně dvě děti, z nichž každý je strom (případně prázdný). Kompletní sady operací ve stromu musí zahrnovat operaci vidlice.
Matematická definice
![]() | Tato sekce může obsahovat nadměrné množství složitých detailů, které mohou zajímat pouze konkrétní publikum.Srpna 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Neuspořádaný strom
Matematicky, an neuspořádaný strom[2] (nebo „algebraický strom“)[3] lze definovat jako algebraická struktura (X, rodič) kde X je neprázdná sada dopravců uzly a rodič je funkce na X který přiřazuje každý uzel X jeho "nadřazený" uzel, rodič(X). Struktura podléhá podmínce, že každý neprázdný subalgebra musí mít totéž pevný bod. To znamená, že musí existovat jedinečný „kořenový“ uzel r, takový, že rodič(r) = r a pro každý uzel X, nějaká iterativní aplikace rodič (rodič (⋯ rodič (X)⋯)) rovná se r.
Existuje několik ekvivalentních definic.
Jako nejbližší alternativu lze definovat neuspořádané stromy jako částečný algebry (X, rodič) které se získají z celkového počtu algeber popsaných výše lettováním rodič(r) být nedefinováno. To je kořen r je jediný uzel, na kterém rodič funkce není definována a pro každý uzel X, kořen je dosažitelný z X v řízený graf (X, rodič). Tato definice je ve skutečnosti shodná s definicí anti-arborescence. The TAoCP kniha používá termín orientovaný strom.[4]
An neuspořádaný strom je struktura (X, ≺) kde X je sada uzly a ≺ je dítě k rodiči vztah mezi uzly takový, že: | |
(1) | X není prázdný. |
---|---|
(2) | X je slabě připojeno v ≺. |
(3) | ≺ je funkční. |
(4) | ≺ splňuje ACC: neexistuje nekonečná sekvence X1 ≺ X2 ≺ X3 ≺ ⋯. |
Rámeček vpravo popisuje částečnou algebru (X, rodič) jako relační struktura (X, ≺). Pokud je (1) nahrazeno
- X obsahuje přesně jednu ≺-maximální uzel.
pak se podmínka (2) stane nadbytečnou.
Pomocí této definice lze poskytnout vyhrazenou terminologii pro zobecnění neuspořádaných stromů, které odpovídají odlišným podmnožinám uvedených podmínek:
- (1,2,3) – řízený pseudostrom,
- (3) – řízený pseud les,
- (3,4) - neuspořádaný les (jehož součástí jsou neuspořádané stromy),
- (4) – směrovaný acyklický graf, předpokládal X je konečný,
- (1 ', 4) - acyklický přístupný špičatý graf (potom podmínka (2) platí implicitně).
Další ekvivalentní definice neuspořádaného stromu je definice a set-teoretický strom která je zakořeněná jednotlivě a jejíž výška je nanejvýš ω (strom „konečný-ish“).[5] To znamená algebraické struktury (X, rodič) jsou ekvivalentní k dílčí objednávky (X, ≤) které mají horní prvek r a jehož každý ředitel naštvaný (aka hlavní filtr ) je konečný řetěz. Abych byl přesný, měli bychom mluvit o inverzní množinově-teoretický strom, protože množinově-teoretická definice obvykle používá opačné uspořádání.
Korespondence mezi (X, rodič) a (X, ≤) je stanovena reflexivní přechodné uzavření / snížení, přičemž redukce vyústila v „částečnou“ verzi bez kořenového cyklu.
Definice stromy v deskriptivní teorii množin (DST) využívá reprezentaci dílčích objednávek (X, ≥) tak jako předpona objednávky mezi konečnými sekvencemi. Ukázalo se, že až izomorfismus existuje vzájemná korespondence mezi (inverzní) stromy DST a dosud definované stromové struktury.
Můžeme odkázat na čtyři ekvivalentní charakterizace jako strom jako algebra, strom jako částečná algebra, strom jako částečná objednávka, a strom jako pořadí předpon. Existuje také pátá ekvivalentní definice - definice a graficky teoreticky zakořeněný strom což je pouze připojená acyklika zakořeněný graf.
Výraz stromů jako (částečné) algebry (nazývané také funkční grafy ) (X, rodič) přímo sleduje implementaci stromových struktur pomocí nadřazené ukazatele. Obvykle se používá částečná verze, ve které kořenový uzel nemá definovaného rodiče. V některých implementacích nebo modelech však i rodič(r) = r je stanovena oběžnost. Pozoruhodné příklady:
- Linux VFS kde "Kořenová dentry má d_parent, který ukazuje na sebe".[6].
- Koncept instanční strom[7][8][9]
z objektově orientované programování. V tomto případě je kořenový uzel horní metaclass - jediný třída to je přímá instance sama o sobě.
Všimněte si, že výše uvedená definice připouští nekonečný stromy. To umožňuje popis nekonečných struktur podporovaných některými implementacemi prostřednictvím líné hodnocení. Pozoruhodným příkladem je nekonečný regres z vlastní třídy z Rubín objektový model.[10] V tomto modelu byl strom vytvořen prostřednictvím nadtřída
vazby mezi nekoncovými objekty jsou nekonečné a mají nekonečnou větev (jedna nekonečná větev objektů „šroubovice“ - viz diagram ).
Sourozenecké soupravy
V každém neuspořádaném stromu (X, rodič) existuje rozlišující rozdělit sady X uzlů do sourozenecké sady. Dva non-root uzly X, y patří do stejné sourozenecké sady, pokud rodič(X) = rodič (y). Kořenový uzel r tvoří jedináček sourozenecká sada {r}.[C] Říká se, že je strom místně konečné nebo konečně větvení pokud je každá z jejích sourozeneckých sad konečná.
Každá dvojice odlišných sourozenců je nesrovnatelný v ≤. To je důvod, proč slovo neuspořádaný se používá v definici. Taková terminologie může být zavádějící, když jsou všechny sourozenecké množiny singletony, tj. Když množina X všech uzlů je úplně objednané (a tudíž dobře uspořádané ) od ≤ V takovém případě bychom mohli mluvit o a jednotlivě větvící se strom namísto.
Používání sady zahrnutí
Jako u každé částečně seřazené množiny, stromové struktury (X, ≤) může být reprezentován pořadí zařazení - od nastavit systémy ve kterém ≤ je shodný s ⊆, indukované zařazení objednat. Zvažte strukturu (U, ℱ) takhle U je neprázdná množina a ℱ je sada podmnožin U tak, aby byly splněny následující podmínky (do Vnořená sada kolekce definice):
- ∅ ∉ ℱ. (To znamená, (U, ℱ) je hypergraf.)
- U ∈ ℱ.
- Pro každého X, Y z ℱ, X ∩ Y ∈ {∅, X, Y}. (To znamená, ℱ je laminární rodina.)[11]
- Pro každého X z ℱ, je jich jen konečně mnoho Y z ℱ takhle X ⊆ Y.
Pak struktura (ℱ, ⊆) je neuspořádaný strom, jehož kořen se rovná U. Naopak, pokud (U, ≤) je neuspořádaný strom a ℱ je sada {↓X | X ∈ U} ze všech hlavní ideály z (U, ≤) pak nastavený systém (U, ℱ) splňuje výše uvedené vlastnosti.

Nastavený systémový pohled na stromové struktury poskytuje výchozí sémantický model - ve většině nejpopulárnějších případů představují stromové datové struktury hierarchie omezení. To také nabízí zdůvodnění směru objednávky s kořenem nahoře: Kořenový uzel je a větší kontejner než kterýkoli jiný uzel. Pozoruhodné příklady:
- Struktura adresářů souborového systému. Adresář obsahuje podadresáře.
- Strom DOM. Části dokumentu odpovídající uzlům DOM jsou v dílčí relaci podle stromového pořadí.
- Jediné dědictví v objektově orientovaném programování. Instance třídy je také instancí nadtřídy.
- Hierarchická taxonomie tak jako Deweyova desetinná klasifikace s úseky rostoucí specificity.
- BSP stromy, čtyřkolky, oktávy, R. stromy a další stromové datové struktury používané pro rekurzivní rozdělení prostoru.
Dobře založené stromy
Neuspořádaný strom (X, ≤) je opodstatněný pokud je přísná částečná objednávka < je opodstatněný vztah. Zejména je každý konečný strom opodstatněný. Za předpokladu, že axiom závislé volby strom je opodstatněný, právě když nemá nekonečnou větev.
Dobře založené stromy mohou být definováno rekurzivně - formováním stromů z nesouvislého spojení menších stromů. Pro přesnou definici předpokládejme, že X je sada uzlů. Za použití reflexivita částečných objednávek můžeme identifikovat jakýkoli strom (Y, ≤) na podmnožinu X v částečném pořadí (≤) - podmnožina X × X. Sada ℛ všech vztahů R které tvoří dobře založený strom (Y, R) na podmnožinu Y z X je definována po etapách ℛi, aby ℛ = ⋃ {ℛi | i je pořadové číslo}. Pro každého pořadové číslo i, nechť R patří k i-tá fáze ℛi kdyby a jen kdyby R je rovný
- ⋃ℱ ∪ ((dom (⋃ℱ) ∪ {X}) × {X})
kde ℱ je podmnožinou ⋃ {ℛk | k < i} takové, že prvky ℱ jsou párově disjunktní a X je uzel, který nepatří do dom (⋃ℱ). (Používáme dom (S) označit doména vztahu S.) Všimněte si, že nejnižší stupeň ℛ0 sestává z jednouzlových stromů {(X,X)} protože pouze prázdné ℱ je možné. V každé fázi (případně) nové stromy R jsou postaveny lesem ⋃ℱ s komponenty ℱ z nižších stupňů a připojení nového kořene X na vrcholu ⋃ℱ.
Na rozdíl od stromu výška což je maximálně ω, hodnost fundovaných stromů je neomezené,[12] zobrazit vlastnosti „odvíjející se ".
Použití rekurzivních párů
Ve výpočtech je běžným způsobem, jak definovat fundované stromy, rekurzivní uspořádané páry(F, X): strom je les F společně s „čerstvým“ uzlem X.[13] A les F zase je možná prázdná sada stromů s párově disjunktními sadami uzlů. Pro přesnou definici postupujte podobně jako při konstrukci jména používá se v množinově-teoretické technice vynucení. Nechat X být množinou uzlů. V nástavba přes X, definovat množiny T, ℱ stromů a lesů a mapa uzly: T → ℘(X) přiřazení každého stromu t základní sadu uzlů tak, aby:
(stromy přes X) t ∈ T ↔ t je pár (F, X) z ℱ × X takové, že pro všechny s ∈ F,
X ∉ uzly (s),(lesy nad X) F ∈ ℱ ↔ F je podmnožinou T tak, že pro každého s,t ∈ F, s ≠ t,
uzly (s) ∩ uzly (t) = ∅ }},(uzly stromů) y ∈ uzly (t) ↔ t = (F, X) ∈ T a
buď y = X nebo y ∈ uzly (s) pro některé s ∈ F }}.
Obvody ve výše uvedených podmínkách lze eliminovat stratifikací každého z nich T, ℱ a uzly do fází jako v předchozí podsekci. Následně definujte vztah „podstromu“ ≤ na T jako reflexivní přechodné uzavření vztahu „okamžitý podstrom“ ≺ definováno mezi stromy pomocí
s ≺ t ↔ s ∈ π1(t)
kde π1(t) je projekce z t na první souřadnici; tj. je to les F takhle t = (F, X) pro některé X ∈ X. To lze pozorovat (T, ≤) je multitree: pro každého t ∈ T, hlavní ideál ↓t objednáno někým ≤ je fundovaný strom jako částečná objednávka. Navíc pro každý strom t ∈ T, jeho struktura "uzlů" (uzly (t), ≤t) darováno X ≤t y jen tehdy, jsou-li tam lesy F, G ∈ ℱ takové, že oba (F, X) a (G, y) jsou podstromy t a (F, X) ≤ (G, y).
Pomocí šipek
Další formalizace i zobecnění neuspořádaných stromů lze získat pomocí reifying páry uzlů rodič-dítě. Každý takto uspořádaný pár lze považovat za abstraktní entitu - „šipku“. Výsledkem je a multidigraf (X, A, s, t) kde X je sada uzlů, A je sada šipky, a s a t jsou funkce od A na X přiřazení každé šipky jeho zdroj a cílová, resp. Struktura podléhá následujícím podmínkám:
- (A, s ○ t–1) je neuspořádaný strom jako úplná algebra.
- The t mapa je a bijekce mezi šipkami a uzly.
V (1) má být symbol kompozice ○ interpretován zleva doprava. Podmínka říká, že inverzní posloupnost šipek[d] je celková mapa od dítěte k rodiči. Nechte tuto nadřazenou mapu mezi šipkami označit p, tj. p = s ○ t−1. Pak také máme s = p ○ t, tedy multidigraf vyhovující (1,2) lze také axiomatizovat jako (X, A, p, t)s nadřazenou mapou p namísto s jako definiční složka. Všimněte si, že kořenová šipka je nutně smyčka, tj. Její zdroj a cíl se shodují.
Důležité zobecnění výše uvedené struktury je zajištěno povolením cílové mapy t být více ku jedné. To znamená, že (2) je oslaben na
- (2 ') t mapa je surjektivní - každý uzel je terčem nějaké šipky.
Podmínka (1) tvrdí, že stejný cíl smí mít pouze listové šipky. Toto je omezení z t do rozsah z p je stále injekční.
Multidigrafy vyhovující (1,2 ') lze nazvat "stromy šípů" - jejich vlastnosti stromu jsou uloženy spíše na šipkách než na uzlech. Tyto struktury lze považovat za nejzásadnější abstrakci linuxového VFS, protože odrážejí pevnou strukturu souborových systémů. Uzly jsou volány inody, šipky jsou dentries (nebo pevné odkazy ). Mateřská a cílová mapa p a t jsou příslušně reprezentovány d_parent
a d_inode
pole ve struktuře dat dentry.[14] Každému inodu je přiřazen pevný typ souboru, z nichž adresář typ hraje zvláštní roli „navržených rodičů“:
- pouze inodes adresáře se mohou objevit jako zdroj pevného odkazu a
- inode adresáře se nemůže objevit jako cíl více než jednoho pevného odkazu.
Použití přerušovaného stylu pro první polovinu kořenové smyčky naznačuje, že podobně jako nadřazená mapa existuje částečný verze pro zdrojovou mapu s ve kterém je zdroj kořenové šipky nedefinovaný. Tato varianta se používá pro další zobecnění, viz #Použití cest v multidigrafu.
Použití cest v digrafu
Neuspořádané stromy přirozeně vznikají „rozvinutím“ přístupné špičaté grafy.[15]
Nechat ℛ = (X, R, r) být špičatá relační struktura, tj. takové, že X je sada uzlů, R je vztah mezi uzly (podmnožina X × X), a r je rozlišující "kořenový" uzel. Předpokládejme dále ℛ je přístupné, což znamená, že X rovná se preimage z {r} pod reflexivním přechodným uzávěrem Ra nazvat takovou strukturu přístupný špičatý graf nebo apg ve zkratce. (⁎) Pak lze odvodit další apg ℛ '= (X', R', r') - odvíjející se z ℛ - jak následuje:
- X' je sada obrácených cesty na r, tj. množina neprázdných konečných sekvencí p uzlů (prvky X) tak, že a) po sobě jdoucí členové p jsou inverzní R- související a (b) první člen p je kořen r,
- R ' je vztah mezi cestami z X' takové cesty p a q jsou R '- související, pokud a jen pokud p = q ⁎ [X] pro nějaký uzel X (tj. q je maximální řád předpona z p„prasklo " p), a
- r ' je sekvence jednoho prvku [r].
Zdá se, že struktura (X', R') je neuspořádaný strom ve verzi "částečné algebry": R ' je částečná mapa, která souvisí s každým jiným než kořenovým prvkem X' na jeho rodiče vyskakováním cesty. Kořenový prvek je samozřejmě r '. Kromě toho jsou splněny následující vlastnosti:
- ℛ je izomorfní vzhledem k jeho vývoji ℛ ' kdyby a jen kdyby ℛ je strom (⁑). (Rozvíjení je zejména idempotentní, až do izomorfismu.)
- Rozvíjení zachovává opodstatněnost: Pokud R je opodstatněná, pak také je R '.
- Rozvíjení zachovává hodnost: Pokud R je potom opodstatněný R a R ' shodovat se.
Poznámky:
- (⁎) Vytvořit shodu mezi R a rodič mapa, používá uvedená definice obráceně přístupnost: r je dosažitelný z libovolného uzlu. V původní definici by P. Aczel[15], každý uzel je dosažitelný z r (tedy místo slova „preimage“ platí slovo „image“).[E]
- (⁑) Implicitně jsme zavedli definici neuspořádaných stromů jako apgs: zavolej apg ℛ = (X, R, r) A strom pokud redukce (X, R) je neuspořádaný strom jako částečná algebra. To lze přeložit jako: Každý uzel je přístupný přesně jednou cestou.
Použití cest v multidigrafu
Jak ukazuje příklad pevné struktury souborových systémů, umožňuje to mnoho datových struktur ve výpočetní technice násobek vazby mezi uzly. Proto, aby se řádně projevil výskyt neuspořádaných stromů mezi datovými strukturami, je nutné zobecnit přístupné špičaté grafy na multidigraf nastavení. Pro zjednodušení terminologie používáme tento výraz toulec což je zavedené synonymum pro „multidigraf“.
Nechť přístupný špičatý toulec nebo apq zkráceně lze definovat jako strukturu
- ℳ = (X, A, s, t)
kde
- X je sada uzly,
- A je sada šipky,
- s je částečný funkce od A na X (dále jen zdroj mapa) a
- t je celková funkce od A na X (dále jen cílová mapa).
Tím pádem, ℳ je „částečný multidigraf“.
Struktura podléhá následujícím podmínkám:
- Existuje právě jedna „kořenová“ šipka, Ar, jehož zdroj s(Ar) není definováno.
- Každý uzel X ∈ X je dosažitelný přes konečnou sekvenci po sobě jdoucích šipek počínaje kořenovou šipkou Ar.
ℳ se říká, že je strom pokud cílová mapa t je bijekce mezi šipkami a uzly odvíjející se z ℳ je tvořen sekvencemi uvedenými v bodě (2) - kterými jsou cesty přístupnosti (srov. Path algebra ). Jako apq lze rozvinutí zapsat jako
- ℳ '= (X', A', s', t')
kde
- X' je sada přístupových cest,
- A' se shoduje s X',
- s ' se shoduje s objevováním cesty a
- t ' je identita na X'.
Stejně jako u apgs je rozvinutí idempotentní a vždy vede ke stromu.
The základní apg se získá jako struktura
- (X, R, t(Ar))
kde
- R = {(t(A),s(A)) | A ∈ A {Ar}}.
Výše uvedený diagram ukazuje příklad apq s šipkami 1 + 14. v JavaScript, Krajta nebo Rubín, strukturu lze vytvořit pomocí následujícího (přesně stejného) kódu:
r = {}; r[1] = {}; r[2] = r[1]; r[3] = {}; r[4] = {}; r[1][5] = {}; r[1][14] = r[1][5];r[3][7] = {}; r[3][8] = r[3][7]; r[3][13] = {};r[4][9] = r[4]; r[4][10] = r[4]; r[4][11] = {};r[3][7][6] = r[3]; r[3][7][12] = r[1][5];
Používání jmen
Neuspořádané stromy a jejich zobecnění tvoří podstatu systémy pojmenování Existují dva prominentní příklady pojmenovacích systémů: souborové systémy a (vnořené) asociativní pole. Poskytnuté struktury založené na multidigrafu z předchozích podsekcí anonymní abstrakce pro oba případy. Chcete-li získat možnosti pojmenování, šipky musí být vybaveny jména tak jako identifikátory Název musí být místně jedinečný - v každé sourozenecké sadě šipek[F] může existovat maximálně jedna šipka označená křestním jménem.
zdroj | název | cílová |
---|---|---|
s(A) | σ(A) | t(A) |
To lze formalizovat jako strukturu
- ℰ = (X, Σ, A, s, σ, t)
kde
- X je sada uzly,
- Σ je sada jména,
- A je sada šipky,
- s je částečná funkce z A na X,
- σ je částečná funkce z A na Σ, a
- t je celková funkce od A na X.
Pro šíp A, složky trojitého (s(A), σ(A), t(A)) jsou příslušně Aje zdroj, název a cílová. Struktura podléhá následujícím podmínkám:
- Redukce (X, A, s, t) je přístupný špičatý toulec (apq), jak je definováno dříve.
- Funkce názvu σ je nedefinováno pouze pro kořenovou šipku bez zdroje.
- Funkce názvu σ je injektivní v omezení pro každou sourozeneckou sadu šípů, tj. pro všechny šípy jiných uživatelů než root A, b, pokud s(A) = s(b) a σ(A) = σ(b) pak A = b.
Tuto strukturu lze nazvat a vnořený slovník nebo pojmenované apq. Ve výpočtech jsou takové struktury všudypřítomné. Tabulka výše ukazuje, že šipky lze za sadu považovat za „neregistrované“ A' = {(s(A), σ (A), t(A)) | A ∈ A {Ar}} trojnásobek zdroj-název-cíl. To vede k relační struktuře (X, Σ, A') které lze zobrazit jako relační databáze stůl. Podtrhuje v zdroj
a název
naznačit primární klíč.
Strukturu lze přeformulovat jako deterministickou označený přechodový systém: X je sada „stavů“, Σ je sada „štítků“, A' je sada „označených přechodů“. (Navíc kořenový uzel r = t(Ar) je „počáteční stav“ a podmínka přístupnosti znamená, že každý stav je dosažitelný z počátečního stavu.)
Diagram vpravo ukazuje vnořený slovník ℰ který má stejný podkladový multidigraf jako příklad v předchozí podsekci. Strukturu lze vytvořit pomocí níže uvedeného kódu. Stejně jako dříve platí pro JavaScript, Python a Ruby přesně stejný kód.
Nejprve, a spodní konstrukce, ℰ0, je vytvořen jediným přiřazením a doslovný {...}
na r
. Tato struktura, znázorněná plnými čarami, ješipka strom "(proto se jedná o kostra ). Doslov se zase jeví jako JSON serializace ℰ0.
Následně jsou zbývající šipky vytvořeny přiřazením již existujících uzlů. Šipky, které způsobují cykly, jsou zobrazeny modře.
r = {"A":{"A":5,„b“:5},"C":{"A":{"w":5},"C":{}},"d":{"w":1.3}}r[„b“] = r["A"]; r["C"][„b“] = r["C"]["A"]r["C"]["A"][„p“] = r["C"]; r["d"]["E"] = r["d"]["já"] = r["d"]
V systému Linux VFS název funkce σ je reprezentován d_name
pole ve struktuře dat dentry.[14] The ℰ0 Struktura výše ukazuje korespondenci mezi strukturami reprezentujícími JSON a strukturami pevných odkazů souborových systémů. V obou případech existuje pevná sada předdefinovaných typů „uzlů“, z nichž jeden typ je typ kontejneru, kromě toho, že v JSON existují ve skutečnosti dva takové typy - Objekt a pole. Pokud je ten druhý ignorován (stejně jako rozdíl mezi jednotlivými primitivními datovými typy), pak poskytované abstrakce souborových systémů a dat JSON jsou stejné - oba jsou stromy se šipkami vybavené pojmenováním σ a rozlišení uzlů kontejneru.
Cesty
Funkce pojmenování σ vnořeného slovníku ℰ přirozeně sahá od šipek po cesty šipek. Každá sekvence p = [A1, ..., An] následných šipek je implicitně přiřazeno a cesta (srov. Název cesty ) - sekvence σ(p) = [σ(A1), ..., σ(An)] názvů šipek.[G]Local uniqueness carries over to arrow paths: different sibling paths have different pathnames. In particular, the root-originating arrow paths are in one-to-one correspondence with their pathnames. This correspondence provides a "symbolic" representation of the unfolding of ℰ via pathnames – the nodes in ℰ are globally identified via a tree of pathnames.
Objednaný strom
The structures introduced in the previous subsection form just the core "hierarchical" part of tree data structures that appear in computing. In most cases, there is also an additional "horizontal" ordering between siblings. v hledat stromy the order is commonly established by the "key" or value associated with each sibling, but in many trees that is not the case. For example, XML documents, lists within JSON files, and many other structures have order that does not depend on the values in the nodes, but is itself data — sorting the paragraphs of a novel alphabetically would lose information.[pochybný ]
The correspondent expanze of the previously described tree structures (X, ≤) can be defined by endowing each sibling set with a linear order as follows.[17][18]
An alternative definition according to Kuboyama[2] is presented in the next subsection.
An objednaný strom is a structure (X, ≤PROTI, ≤S) kde X is a non-empty set of nodes and ≤PROTI a ≤S are relations on X volala protiertical (nebo také hierarchický[2]) order and sibling order, respectively. The structure is subject to the following conditions:
- (X, ≤PROTI) is a partial order that is an unordered tree as defined in the previous subsection.
- (X, ≤S) is a partial order.
- Distinct nodes are comparable in <S if and only if they are siblings:
- (<S) ∪ (>S) = ((≺PROTI) ○ (≻PROTI)) ∖ idX.
- Every node has only finitely many preceding siblings, i.e. every principal ideal of (X, ≤S) je konečný. (This condition can be omitted in the case of finite trees.)
Conditions (2) and (3) say that (X, ≤S) is a component-wise linear order, each component being a sibling set. Condition (4) asserts that if a sibling set S is infinite then (S, ≤S) je izomorfní s (ℕ, ≤), the usual ordering of natural numbers.
Given this, there are three (another) distinguished partial orders which are uniquely given by the following prescriptions:
(<H) = (≤PROTI) ○ (<S) ○ (≥PROTI) (dále jen horizontal order), (<L⁻) = (>PROTI) ∪ (<H) (dále jen "discordant" linear order), (<L⁺) = (<PROTI) ∪ (<H) (dále jen "concordant" linear order).
This amounts to a "V-S-H-L±" system of five partial orders ≤PROTI, ≤S, ≤H, ≤L⁺, ≤L⁻ on the same set X of nodes, in which, except for the pair { ≤S, ≤H}, any two relations uniquely determine the other three, see the determinacy table.
Notes about notational conventions:
- The relační složení symbol ○ used in this subsection is to be interpreted left-to-right (as ).
- Symboly < a ≤ express the přísný a non-strict versions of a partial order.
- Symboly > a ≥ express the converse relations.
- The ≺ symbol is used for the covering relation z ≤ který je bezprostřední version of a partial order.
This yields six versions ≺, <, ≤, ≻, >, ≥ for a single partial order relation. Až na ≺ a ≻, each version uniquely determines the others. Passing from ≺ na <requires that < be transitively reducible. This is always satisfied for all of <PROTI, <S a <H but might not hold for <L⁺ nebo <L⁻ -li X je nekonečný.
The partial orders ≤PROTI a ≤Hare complementary:
- (<PROTI) ⊎ (>PROTI) ⊎ (<H) ⊎ (>H) = X × X ∖ idX.
As a consequence, the "concordant" linear order <L⁺ je lineární prodloužení z <PROTI. Podobně, <L⁻ is a linear extension of >PROTI.
The covering relations ≺L⁻ a ≺L⁺ odpovídají předobjednat průchod a post-order traversal, resp. Li x ≺L⁻ y then, according to whether y has a previous sibling or not, the X node is either the "rightmost" non-strict descendant of the previous sibling of y or, in the latter case, X is the first child of y. Páry of the latter case form the relation (≺L⁻) ∖ (<H) which is a partial map that assigns each non-leaf node its první dítě uzel. Podobně, (≻L⁺) ∖ (>H) assigns each non-leaf node with finitely many children its poslední child node.
Definition using horizontal order
The Kuboyama's definition of "rooted ordered trees"[2] makes use of the horizontal order ≤H as a definitory relation.[h] (See also Suppes.[19])
Using the notation and terminology introduced so far, the definition can be expressed as follows.
An objednaný strom is a structure (X, ≤PROTI, ≤H) such that conditions (1–5) are satisfied:
- (X, ≤PROTI) is a partial order that is an unordered tree. (The protiertical order.)
- (X, ≤H) is a partial order. (The horizontal order.)
- The partial orders ≤PROTI a ≤H are complementary: (<PROTI) ⊎ (>PROTI) ⊎ (<H) ⊎ (>H) = X × X ∖ idX.
- (That is, pairs of nodes that are nesrovnatelný v (<PROTI) are comparable in (<H) and vice versa.)
- The partial orders ≤PROTI a ≤H are "consistent": (<H) = (≤PROTI) ○ (<H) ○ (≥PROTI).
- (That is, for every nodes X, y takhle X <H y, all descendants of X must precede all the descendants of y.)
- Every node has only finitely many preceding siblings. (That is, for every infinite sibling set S, (S, ≤H) má typ objednávky of the natural numbers.) (Like before, this condition can be omitted in the case of finite trees.)
The sibling order (≤S) získává (<S) = (<H) ∩ ((≺PROTI) ○ (≻PROTI)), i.e. two distinct nodes are in sibling order if and only if they are in horizontal order and are siblings.
Determinacy table
The following table shows the determinacy of the "V-S-H-L±" system. Relational expressions in the table's body are equal to one of <PROTI, <S, <H, <L⁻nebo <L⁺ according to the column. It follows that except for the pair { ≤S, ≤H}, an ordered tree (X, ...) is uniquely determined by any two of the five relations.
<PROTI | <S | <H | <L⁻ | <L⁺ | |
---|---|---|---|---|---|
V,S | (≤PROTI) ○ (<S) ○ (≥PROTI) | ||||
V,H | (<H) ∩ ((≺PROTI)○(≻PROTI)) | (>PROTI) ∪ (<H) | (<PROTI) ∪ (<H) | ||
V,L⁻ | (<L⁻) ∩ ((≺PROTI)○(≻PROTI)) | (<L⁻) ∖ (>PROTI) | |||
V,L⁺ | (<L⁺) ∩ ((≺PROTI)○(≻PROTI)) | (<L⁺) ∖ (<PROTI) | |||
H,L⁻ | (>L⁻) ∖ (<H) | ||||
H,L⁺ | (<L⁺) ∖ (<H) | ||||
L⁻,L⁺ | (>L⁻) ∩ (<L⁺) | (<L⁻) ∩ (<L⁺) | |||
S,L⁻ | X ≺PROTI y ↔ y = infL⁻(Y) kde Y je obraz {X} under (≥S)○(≻L⁻) | ||||
S,L⁺ | X ≺PROTI y ↔ y = supL⁺(Y) kde Y je obraz {X} under (≤S)○(≺L⁺) |
In the last two rows, infL⁻(Y) označuje infimum z Y v (X, ≤L⁻), a supL⁺(Y) označuje supremum z Y v (X, ≤L⁺). In both rows, (≤S) resp. (≥S) can be equivalently replaced by the sibling equivalence (≤S)○(≥S). In particular, the partition into sibling sets together with either of ≤L⁻ nebo ≤L⁺ is also sufficient to determine the ordered tree. The first prescription for ≺PROTI can be read as: the parent of a non-root node X equals the infimum of the set of all immediate predecessors of siblings of X, where the words "infimum" and "predecessors" are meant with regard to ≤L⁻. Similarly with the second prescription, just use "supremum", "successors" and ≤L⁺.
Vztahy ≤S a ≤H obviously cannot form a definitory pair. For the simplest example, consider an ordered tree with exactly two nodes – then one cannot tell which of them is the root.
XPath axes
XPath axis | Vztah |
---|---|
předek | <PROTI |
ancestor-or-self | ≤PROTI |
dítě | ≻PROTI |
potomek | >PROTI |
descendant-or-self | ≥PROTI |
Následující | <H |
following-sibling | <S |
rodič | ≺PROTI |
preceding | >H |
preceding-sibling | >S |
já | idX |
The table on the right shows a correspondence of introduced relations to XPath axes, které se používají v structured document systems to access nodes that bear particular ordering relationships to a starting "context" node. For a context node[20] X, své osa named by the specifier in the left column is the set of nodes that equals the obraz z {X} under the correspondent relation. Do XPath 2.0, the nodes are "returned" in document order, which is the "discordant" linear order ≤L⁻. A "concordance" would be achieved, if the vertical order ≤PROTI was defined oppositely, with the bottom-up direction outwards the root like in set theory in accordance to natural stromy.[i]
Traversal maps
Below is the list of partial maps that are typically used for ordered tree traversal.[21] Each map is a distinguished funkční subrelation of ≤L⁻ or of its opposite.
- ≺PROTI ... parent-node partial map,
- ≻S ... previous-sibling partial map,
- ≺S ... next-sibling partial map,
- (≺L⁻) ∖ (<H) ... first-child partial map,
- (≻L⁺) ∖ (>H) ... last-child partial map,
- ≻L⁻ ... previous-node partial map,
- ≺L⁻ ... next-node partial map.
Generating structure
The traversal maps constitute a partial unary algebra[22] (X, parent, previousSibling, ..., nextNode) that forms a basis for representing trees as propojené datové struktury. At least conceptually,there are parent links, sibling adjacency links, and first / last child links. This also applies to unordered trees in general, which can be observed on the dentry data structure in the Linux VFS.[23]
Similarly to the "V-S-H-L±" system of partial orders, there are pairs of traversal maps that uniquely determine the whole ordered tree structure. Naturally, one such generating structure is (X, PROTI, S) which can be transcribed as (X, parent, nextSibling) – the structure of parent and next-sibling links. Another important generating structure is (X, firstChild, nextSibling) známý jako binární strom levého a pravého sourozence. This partial algebra establishes a one-to-one correspondence between binární stromy and ordered trees.
Definition using binary trees
The correspondence to binary trees provides a concise definition of ordered trees as partial algebras.
An objednaný strom is a structure kde X is a non-empty set of nodes, and lc, rs are partial maps on X volala left-Child a right-sibling, resp. The structure is subject to the following conditions:
- The partial maps lc a rs are disjoint, i.e. (lc) ∩ (rs) = ∅ .
- Inverzní z (lc) ∪ (rs) is a partial map p such that the partial algebra (X, p) is an unordered tree.
The partial order structure (X, ≤PROTI, ≤S) is obtained as follows:
(≺S) = (rs), (≻PROTI) = (lc) ○ (≤S).
Encoding by sequences
Ordered trees can be naturally encoded by finite sequences of natural numbers.[24][j] Denote ω⁎ the set of all finite sequences of natural numbers. Then any non-empty subset Ž of ω⁎ that is closed under taking předpony gives rise to an ordered tree: take the prefix order for ≥PROTI a lexikografický řád pro ≤L⁻. Conversely, for an ordered tree T = (X, PROTI, ≤L⁻) assign each node X sekvence of sibling indices, i.e. the root is assigned the empty sequence and for every non-root node X, nechť w(X) = w(parent(X)) ⁎ [i] kde i is the number of preceding siblings of X a ⁎ je zřetězení operátor. Dát Ž = {w(X) | X ∈ X}. Pak Ž, equipped with the induced orders ≤PROTI (the inverse of prefix order) and ≤L⁻ (the lexicographical order), is isomorphic to T.
Per-level ordering

As a possible expansion of the "V-S-H-L±" system, another distinguished relations between nodes can be defined, based on the tree's level structure. First, let us denote by ∼E the equivalence relation defined by X ∼E y kdyby a jen kdyby X a y have the same number of ancestors. This yields a partition of the set of nodes into úrovně L0, L1, ... (, Ln) - a coarsement of the partition into sibling sets. Then define relations <E, <B⁻ a <B⁺ podle
It can be observed that <E is a strict partial order and <B⁻ a <B⁺ are strict total orders. Moreover, there is a similarity between the "V-S-L±" and "V-E-B±" systems: <E is component-wise linear and orthogonal to <PROTI, <B⁻ is linear extension of <E a ze dne >PROTI, a <B⁺ is a linear extension of <E a ze dne <PROTI.
Viz také
- Stromová struktura
- Strom (teorie grafů)
- Tree (set theory)
- Cardinal tree a Ordinal tree
- Hierarchie (matematika)
- Dialogový strom
- Jediné dědictví
- Generativní gramatika
- Hierarchické shlukování
- Binary space partition tree
- Rekurze
- Fenwick strom
Jiné stromy
- Trie
- Algoritmus Day – Stout – Warren
- Enfilade
- Left child-right sibling binary tree
- Hierarchická časová paměť
Poznámky
- ^ This is different from the formal definition of subtree used in graph theory, which is a subgraph that forms a tree – it need not include all descendants. For example, the root node by itself is a subtree in the graph theory sense, but not in the data structure sense (unless there are no descendants).
- ^ Properly, a rooted, ordered directed graph.
- ^ Alternatively, a "partial" version can be employed by excluding .
- ^ Arrows A a b se říká, že jsou po sobě, respectively, if t(A) = s(b).
- ^ However, some authors also introduce the definition with reversed reachability.[16]
- ^ Tj. arrows that have the same source node.
- ^ Here we assume that the root arrow Ar není v p.
- ^ Unfortunately, the author uses the term sibling order for the horizontal order relation. This is non-standard, if not a misnomer.
- ^ This would also establish a concordance of the two possible directions of inequality symbols with the categorization of XPath axes into forward axes a reverse axes.
- ^ In general, any abeceda equipped with ordering that is isomorphic to that of natural numbers can be used.
Reference
- ^ Weisstein, Eric W. "Subtree". MathWorld.
- ^ A b C d Tetsuji Kuboyama (2007). "Matching and learning in trees" (PDF). Doctoral Thesis, University of Tokyo.
- ^ "The Linux VFS Model: Naming structure".
- ^ Donald Knuth. Umění počítačového programování, Hlasitost 1: Základní algoritmy, Třetí edice. Addison-Wesley, 1997. Section 2.3.4.2: Oriented trees.
- ^ Unger, Spencer (2012). "Trees in Set Theory" (PDF). Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Bruce Fields. "Notes on the Linux kernel".
- ^ Pierre Cointe (1987). "Metaclasses are First Class: the ObjVlisp Model". Proceeding OOPSLA '87 Conference Proceedings on Object-oriented Programming Systems, Languages and Applications. Severní Holandsko.
- ^ Wolfgang Klas, Michael Schrefl (1995). Metaclasses and Their Application: Data Model Tailoring and Database Integration. Springer.
- ^ "What Is a Metaclass?".
- ^ "The Ruby Object Model: Data structure in detail".
- ^ B. Korte, and J. Vygen (2012). Kombinatorická optimalizace. Springer, Heidelberg.
- ^ Dasgupta, Abhiit (2014). Set theory: with an introduction to real point sets. New York: Birkhäuser.
- ^ Makinson, David (2012). Sets, logic and maths for computing. Springer Science & Business Media. ISBN 9781447124993.
- ^ A b Bovet, Daniel; Cesati, Marco (2005). Understanding the Linux Kernel. O'Reilly. ISBN 9780596554910.
- ^ A b Aczel, Peter (1988), Non-well-founded sets., CSLI Lecture Notes, 14, Stanford, CA: Stanford University, Center for the Study of Language and Information, ISBN 0-937073-22-9, PAN 0940014
- ^ A. S. Daghighi, M. Golshani, J. D. Hamkins, and E. Jeřábek (2014). "The foundation axiom and elementary self-embeddings of the universe". Infinity, Computability, and Metamathematics: Festschrift Celebrating the 60th Birthdays of Peter Koepke and Philip Welch. arXiv:1311.0814. Bibcode:2013arXiv1311.0814S. CiteSeerX 10.1.1.764.742.CS1 maint: používá parametr autoři (odkaz)
- ^ Jan Hidders; Philippe Michiels; Roel Vercammen (2005). "Optimizing sorting and duplicate elimination in XQuery path expressions" (PDF). Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Frithjof Dau; Mark Sifer (2007). "A formalism for navigating and editing XML document structure" (PDF). International Workshop on Databases in Networked Information Systems. Springer, Berlín, Heidelberg.
- ^ Suppes, Patrick (1973). "Semantics of context-free fragments of natural languages". Approaches to Natural Language. Springer, Dordrecht: 370–394. CiteSeerX 10.1.1.398.2289. doi:10.1007/978-94-010-2506-5_21. ISBN 978-90-277-0233-3.
- ^ "XML Path Language (XPath) 3.1". World Wide Web Consortium. 21. března 2017.
- ^ "Document Object Model Traversal". W3C. 2000.
- ^ "Unary Algebras".
- ^ J.T. Mühlberg, G. Lüttgen (2009). "Verifying compiled file system code". Formal Methods: Foundations and Applications: 12th Brazilian Symposium on Formal Methods. Springer, Berlín, Heidelberg. CiteSeerX 10.1.1.156.7781. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ L. Afanasiev; P. Blackburn; I. Dimitriou; B. Gaiffe; E. Goris; M. Marx; M. de Rijke (2005). "PDL for ordered trees" (PDF). Journal of Applied Non-Classical Logics. 15 (2): 115–135. doi:10.3166/jancl.15.115-135. S2CID 1979330.
Další čtení
- Donald Knuth. Umění počítačového programování: Fundamental Algorithms, Třetí edice. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Section 2.3: Trees, pp. 308–423.
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, a Clifford Stein. Úvod do algoritmů, Druhé vydání. MIT Press a McGraw-Hill, 2001. ISBN 0-262-03293-7 . Section 10.4: Representing rooted trees, pp. 214–217. Chapters 12–14 (Binary Search Trees, Red-Black Trees, Augmenting Data Structures), pp. 253–320.
externí odkazy
- Data Trees as a Means of Presenting Complex Data Analysis by Sally Knipe on August 8, 2013
- Popis z Slovník algoritmů a datových struktur
- CRAN - Package data.tree implementation of a tree data structure in the R programming language
- WormWeb.org: Interactive Visualization of the C. elegans Cell Tree – Visualize the entire cell lineage tree of the nematode C. elegans (javascript)
- Binary Trees by L. Allison