Vypuštění řízení na strom binárního vyhledávání

hlasů
7

Zvážit postup mazání na BST, když uzel smazat, má dvě děti. Řekněme, že jsem vždy jej nahradit uzel drží minimální klíč v pravém podstromu.

Otázka zní: je tento postup komutativní? To znamená, že smazání x a y má stejný výsledek, než mazání první y a pak X?

Myslím, že odpověď je ne, ale nemohu najít protipříklad, ani přijít na jakýkoli platný uvažování.

UPRAVIT:

Možná, že já mám být jasnější.

Předpokládejme transplant(node x, node y)postupu: nahradit x s y (a jeho podstromu). Takže, když chci vymazat uzel (řekněme x), která má dvě děti i jej nahradit uzel drží minimální klíč v pravém podstromu:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Otázkou bylo, jak dokázat, postup výše není komutativní.

Položena 07/06/2010 v 15:46
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
17

Delece (obecně) není komutativní. Zde je protipříklad:

    4
   / \
  3   7
     /
    6

Co kdybychom smazat 4 a poté 3?

Když jsme se odstranit 4, dostaneme 6 jako nový kořen:

   6
  / \
 3   7

Mazání 3 nemění strom, ale dává nám to:

  6
   \
    7

Co kdybychom smazat 3 a poté 4?

Když jsme se odstranit 3 strom se nemění:

 4
  \
   7
  /
 6

Nicméně, když jsme se odstranit 4, nový kořenový stává 7:

  7
 /
6

Dva výsledné stromy nejsou stejné, a proto odstranění není komutativní.

AKTUALIZACE

Nečetl jsem omezení, že to je, když budete vždy smazat uzel se 2 dětmi. Moje řešení je pro obecný případ. Budu aktualizovat v případě, / když najdu pult-příklad.

DALŠÍ UPDATE

Nemám konkrétní důkaz, ale budu hádat:

V obecném případě, zvládnout odstranění různě v závislosti na tom, zda máte dvě děti, jedno dítě, nebo žádné děti. V oblasti boje proti příkladu I za předpokladu, jsem nejprve odstranit uzel se dvěma dětmi a potom uzel s jedním dítětem. Za to, že jsem vymazat uzel s žádnými dětmi a pak další uzel s jedním dítětem.

Ve zvláštním případě, že odstraňujete pouze uzly se dvěma dětmi, budete chtít vzít v úvahu případ, kdy oba uzly jsou ve stejném sub-tree (protože to by nebylo jedno, jestli jsou v různých dílčích stromů, můžete si být jisti, že celková struktura nebude měnit v závislosti na pořadí delece). To, co opravdu potřebujeme, aby prokázal, zda pořadí vymazání uzlů ve stejném sub-strom, kde každý uzel má dvě děti, záležitosti.

Vezměme si dva uzly A a B, kde A je předek B. Pak můžete dále upřesnit otázku takto:

Je vypuštění komutativní když uvažujete o odstranění dvou uzlů z strom binárního vyhledávání, které mají předek-potomek vztah k sobě (to by znamenalo, že jsou ve stejném sub-tree)?

Při odstranění uzlu (řekněme), můžete procházet správný sub-strom najít minimální prvek. Tento uzel bude koncový uzel a nikdy nemůže být stejná jako B (protože B má dvě děti a nemůže být koncový uzel). Ty by pak nahraďte hodnotu s hodnotou tohoto listu uzlu. To znamená, že jediná strukturální změna stromu je nahrazení hodnotu, kterou je s hodnotou listu uzlu, a ztráta listového uzlu.

Stejný postup se podílí na B. To znamená, že jste nahradit hodnotu uzlu a nahradit list uzel. Takže obecně, když odstraníte uzel se dvěma dětmi, jediná strukturální změna je změna v hodnotě uzlu, který odstraňujete a vypuštění listového uzlu, kdo je hodnota, kterou používáte jako náhrada .

Takže otázka je dále rafinovaný:

Můžete zaručit, že budete vždy mít stejný náhradní uzel bez ohledu na pořadí delece (pokud jste vždy smazání uzlu se dvěma dětmi)?

Odpověď (myslím) je ano. Proč? Zde je několik pozorování:

  • Řekněme, že jste odstranit potomek uzlu první a předek uzlu sekundu. Sub-tree, který byl změněn, pokud jste odstranili uzel potomek je to v levém podstromu pravého dítěte předek uzlu. To znamená, že sub-tree zůstává nedotčeno. Co to také znamená, že je bez ohledu na pořadí delece dva různé dílčí stromy jsou upraveny, a proto je operace komutativní.
  • Opět platí, že řekněme, že odstranit potomek uzlu první a předek uzlu sekundu. Sub-tree, který byl změněn, pokud jste odstranili uzel potomek je v levém podstromu pravého dítěte předek uzlu. Ale i tady, není žádný přesah. Důvodem je, když odstraníte uzel potomek Nejprve se podíváme na levém sub-strom potomka uzlu pravé dítě. Když se pak odstraňte uzel předka, budete nikdy jít dolů, že sub-tree, protože budete vždy jít doleva po zadání předek uzlu pravá dítěte levé sub-strom. Takže znovu, bez ohledu na to, co smažete první měníte různé sub-stromy, a tak se zdá, pořadí nezáleží.
  • Dalším případem je, když odstraníte uzel předka jako první a vy zjistíte, že minimální uzel je potomkem potomka uzlu. To znamená, že potomek uzlu skončí s jedním dítětem a vymazání jedno dítě je triviální. Nyní uvažujme případ, kdy v tomto případě nejprve odstraněné potomek uzlu. Pak byste měli nahradit hodnotu potomka uzlu s jeho pravého potomka a odstranit ten správný dítě. Pak, když odstraníte uzel předka, můžete skončit najít stejnou minimální uzel (vlevo dítě starého odstraněného uzlu, který je také levý dítě vyměněné uzlu). Ať tak či onak, můžete skončit s stejnou strukturu.

Nejedná se o přísný důkaz; To jsou jen některé postřehy které jsem udělal. Všemi prostředky, neváhejte hrabat díry!

Odpovězeno 07/06/2010 v 18:32
zdroj uživatelem

hlasů
0

I reagují zde druhé aktualizaci Vivin je.

Myslím, že to je dobrý přepracování na otázku:

Je vypuštění komutativní když uvažujete o odstranění dvou uzlů z strom binárního vyhledávání, které mají předek-potomek vztah k sobě (to by znamenalo, že jsou ve stejném sub-tree)?

ale tento odvážný věta dole není pravda:

Při odstranění uzlu (řekněme), můžete procházet správný sub-strom najít minimální prvek. Tento uzel bude koncový uzel a nikdy nemůže být stejná jako B

Od minimální prvek v pravém podstromu Áčka může mít právo dítě . Takže to není list. Říkejme minimální prvek v pravém podstromu jedničky successor(A). Nyní, to je pravda, že B nemůže být successor(A), ale to může být v pravém podstromu. Tak, to je nepořádek.

Snažím se shrnout.

hypotéza :

  1. A a B mají každý dvě děti.
  2. A a B jsou ve stejném podstromu.

Ostatní věci můžeme odvodit z hypotézy:

  1. B není successor(A)ani A je successor(B).

Nyní, vzhledem k tomu, myslím, že tam jsou 4 různé případy (jako obvykle, nechť je předkem B):

  1. B se nachází v levém podstromu jedničky
  2. B je předek successor(A)
  3. successor(A) je předek B
  4. B a nástupce (A) nemají žádný vztah. (Ty jsou v různých podstromů společnosti A)

Myslím, že (ale samozřejmě nemohu to dokázat), že případy 1, 2 a 4 nevadí. Takže, jen v případě, že successor(A)je předek B procesem odstranění nemůže být komutativní. Nebo snad ano?

I přihrát:)

Pozdravy.

Odpovězeno 11/06/2010 v 18:45
zdroj uživatelem

hlasů
2

Zdá se mi, že protipříklad uvedeno v Vivin odpověď je jediný případ porušení commutativity, a že je skutečně eliminováno tím omezením, že pouze uzlů se dvěma dětmi může být smazán.

Ale může to být také odstraněny, pokud bychom vyřadit, co se zdá být jedním z Vivin je prostor, který je, že bychom měli přejít správnou podstrom tak málo, jak je to možné najít žádnou přijatelnou nástupce. Pokud namísto toho jsme vždy podporovat nejmenší uzel v pravém podstromu jako nástupce, bez ohledu na to, jak daleko se ukáže být umístěna, pak i kdybychom uvolnit omezení vymazání uzlů s méně než dvěma dětmi, Vivin je výsledkem

    7
   /
  6
není nikdy dosaženo, jestliže začneme u

    4
   / \
  3 7
     /
    6

Místo toho se nejprve odstranit 3 (bez nástupce) a odstranit 4 (s 6 jako nástupce), čímž se získá

    6
     \
      7

který je stejný jako v případě, že pořadí delece byly obráceny.

Vypuštění by pak komutativní, a myslím, že je vždy komutativní, s ohledem na předpoklad jsem pojmenoval (nástupce je vždy nejmenší uzel v pravém podstromu odstraněny uzlu).

Nemám formální důkaz nabídnout, pouhý výčet případů:

  1. V případě, že dva uzly mají být odstraněny, jsou v různých podstromů, pak delece jednoho nemá vliv na ostatní. Pouze v případě, že jsou ve stejné cestě může pořadí delece případně vliv na výsledek.

    Takže jakýkoli vliv na commutativity může přijít pouze v případě předchůdce uzel a jeden z jeho potomků jsou oba odstraněny. Nyní, jak se jejich vertikální vztah ovlivní commutativity?

  2. Potomek v levém podstromu předka. Tato situace nebude mít vliv commutativity protože nástupce pochází z pravého podstromu a nemůže mít vliv na levé subtree vůbec.

  3. Potomek v pravém podstromu předka. Pokud nástupce předkem je vždy nejmenší uzel v pravém podstromu, pak pořadí smazání nelze změnit volbu nástupce, bez ohledu na to, co potomek je odstraněna před nebo po předka. I kdyby se nástupcem předchůdce vyklube potomek uzel, který je také třeba odstranit, aby potomek příliš nahrazen příští největší uzel k němu, a že potomek nemůže mít zbývající vlastní levé subtree, které mají být řešeny , Takže výmaz předchůdce a všechny pravé podstromu potomek bude vždy komutativní.

Odpovězeno 06/04/2011 v 19:34
zdroj uživatelem

hlasů
0

Myslím, že existují dva stejně životaschopné způsoby, jak odstranit uzel, když to má 2 děti:
Skok na CASE 4 ...

Případ 1: odstranit 3 (Leaf node)
 2 3
 / \ -> / \
1 3 1


Případ 2: vymazat 2 (Levá podřízený uzel)
 2 3
 / \ -> / \
1 3 1


Případ 3: vymazat 2 (vpravo podřízený uzel)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Případ 4: vymazat 2 (levý a pravý podřízené uzly)
 2 2 3
 / \ -> / \ nebo / \      
1 3 1 3
oba pracují a mají různé výsledné stromy :) ______________________________________________________________________
Jak zde vysvětlen algoritmus: http: // www .mathcs.emory.edu / ~ Cheung / Courses / 323 / Osnova / stromy / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Odpovězeno 10/10/2016 v 01:02
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more