/ Časová zložitosť konštrukcie binárneho stromu z inorder a preorder ciest - c ++, c, algoritmus

Časová zložitosť konštrukcie binárneho stromu z inorder a preorder traversals - c ++, c, algoritmus

daný Tu je kód pre konštrukciu stromu zpresuny a objednávanie. Nemôžem prísť na to, ako dospeli k časovej zložitosti O (n ^ 2). Nejaké nápady? Vidím, že hľadanie indexu v sekvencii inorder by bolo O (n), ako sa počíta zvyšok programu?

odpovede:

6 pre odpoveď č. 1

Na O(N^2) zložitosť vyplýva zo skutočnosti, že pre každú položku v Preorder prechodu (z ktorej existuje N), musíte hľadať jeho oddiel v priečnom režime Inorder (opäť tam sú N z nich).

Hrubo povedané, tento algoritmus je možné považovať za umiestnenie uzlov na mriežku, kde priechod Inorder poskytuje súradnice x a prechádzka Preorder poskytuje súradnice y:

Vezmite príklad, ktorý dali, s nasledujúcimi priechodmi (Inorder then Preorder).

Inorder: DBEAFC
Preorder: ABDECF

Teraz je to mriežka, na ktorú sa kladú:

     D    B    E    A    F    C
A    +    +    +    A    |    |
|    +--------------+    |
B|F  +    B    |         F    |
+---------+         -----+
DE|C D         E              C

Teraz algoritmus potrebuje vedieť, kde v mriežke umiestniť každý uzol, ktorý robí jednoducho tým, že uzol v pozícii v mriežke, kde sú súradnice x a y rovnaké.

Vyzerá to, že veľkosť mriežky je v skutočnosti NlogN v tomto prípade, čo by malo za následok NlogN zložitosť prechodu siete (a tak NlogN časová zložitosť algoritmu) ale tento strom je vyvážený, V najhoršom prípade môže byť váš strom v skutočnosti prepojeným zoznamom.

Napr. zvážte tento strom, v ktorom sú predbežné a iniciálne putovanie rovnaké:

Inorder: DBEAFC
Preorder: DBEAFC

D    B    E    A    F    C
D    D    |    |    |    |    |
-----+    |    |    |    |
B         B    |    |    |    |
-----+    |    |    |
E              E    |    |    |
-----+    |    |
A                   A    |    |
-----+    |
F                        F    |
-----+
C                             C

Toto je najhorší prípad, a vidíte, mriežka má N*N kontrolných pozícií. Takže v najhoršom prípade existuje N*N časovej zložitosti.


0 pre odpoveď č. 2

prechádzate celým preorder pole vnútri rekurzie av každom rámci zásobníka hľadáte číslo v inorder traversal array. tak O(N*N) = o(N^2).