Euler tour: level a preorder přes scan

Zdrojový topic: euler-tour-suffix-sums

Navazuje na Euler tour: orientované hrany a Etour.

Vstupní Etour

Použijeme stejný strom:

flowchart TB
  A((A)) --- B((B))
  A --- C((C))
  B --- D((D))
  B --- E((E))

Etour:

A->B, B->D, D->B, B->E, E->B, B->A, A->C, C->A

Výpočet level(v)

Pro hloubku vrcholu nastav váhy:

dopředná hrana = +1
zpětná hrana   = -1

Pak prefix sum po hranách ukazuje hloubku po průchodu danou hranou.

PoziceHranaTypVáhaPrefixČtení levelu
0start v A--0level(A)=0
1A->Bdopředná+11level(B)=1
2B->Ddopředná+12level(D)=2
3D->Bzpětná-11-
4B->Edopředná+12level(E)=2
5E->Bzpětná-11-
6B->Azpětná-10-
7A->Cdopředná+11level(C)=1
8C->Azpětná-10-

Výsledek:

VrcholLevel
A0
B1
C1
D2
E2

Výpočet preorder(v)

Preorder pořadí získáš tak, že započítáš první vstupy do vrcholů.

Jednoduchá váha:

dopředná hrana = 1
zpětná hrana   = 0

Kořen dostane preorder 1. Každá dopředná hrana poprvé vstupuje do potomka.

PoziceHranaTypVáhaPrefixČtení preorderu
0start v A--1preorder(A)=1
1A->Bdopředná12preorder(B)=2
2B->Ddopředná13preorder(D)=3
3D->Bzpětná03-
4B->Edopředná14preorder(E)=4
5E->Bzpětná04-
6B->Azpětná04-
7A->Cdopředná15preorder(C)=5
8C->Azpětná05-

Výsledek pro toto pořadí dětí:

A, B, D, E, C

Prefix vs suffix

Ve zkoušce může být daná funkce SuffixS. Princip je stejný:

  • nastavíš váhy nad orientovanými hranami;
  • scan/suffix sum spočítá kumulované hodnoty;
  • musíš jasně říct, u které hrany čteš hodnotu pro vrchol;
  • podle konvence může být potřeba konstantní korekce nebo opačné znaménko.

Bezpečná formulace:

Pro level(v) čtu hodnotu u první dopředné hrany vstupující do v; kořen nastavím zvlášť na 0. Pokud zadání používá suffix sum v opačném směru, použiji stejnou váhovou logiku, jen hodnotu čtu podle směru daného SuffixS.

Zkoušková odpověď

  1. Vypiš Etour jako orientované hrany.
  2. Označ dopředné a zpětné hrany.
  3. Pro level: váhy +1/-1.
  4. Pro preorder: váhy 1/0 na první vstupy.
  5. Udělej prefix/suffix tabulku.
  6. Uveď, ze které hrany bereš hodnotu vrcholu.
  7. Paralelní scan má hloubku O(log n) a práci O(n).

Časté chyby

  • Číst level na zpětné hraně místo na první dopředné hraně do vrcholu.
  • Zapomenout kořen jako speciální případ.
  • Počítat preorder i na zpětných hranách.
  • Neuvést, jestli indexuješ preorder od 0 nebo od 1.