Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
VYHLEDÁVACÍ STROMY AVL strom Operace Find, Insert, Delete
A4B33ALG 2010/04 VYHLEDÁVACÍ STROMY AVL strom Operace Find, Insert, Delete Rotace L, R, LR, RL B-strom
2
AVL strom -- G.M. Adelson-Velskij & E.M. Landis, 1962
A4B33ALG / 06 AVL strom G.M. Adelson-Velskij & E.M. Landis, 1962 AVL strom je BVS s přidanými vlastnostmi, které jej udržují (téměř) vyvážený. AVL má také operace Find, Insert, Delete. 51 2 1 34 76 1 1 13 40 68 92 -1 -1 -1 -1 -1 8 22 45 -1 -1 -1 -1 -1 -1 Každý uzel registruje hloubku svého levého a pravého podstromu, hloubka prázdného stromu je -1. V každém uzlu je rozdíl výšek obou podstromů roven -1, 0, 1. V tomto případě: Výška stromu = hloubka stromu 1
3
Vložení uzlu může způsobit rozvážení AVL stromu.
A4B33ALG / 06 Vložení uzlu může způsobit rozvážení AVL stromu. V každém uzlu má být rozdíl výšek obou podstromů roven -1, 0, 1 !! Insert 30 51 3 1 34 76 2 1 13 40 68 92 1 -1 -1 -1 -1 -1 8 22 45 -1 -1 -1 -1 -1 30 -1 -1 Levý podstrom uzlu 51 je příliš hluboký, strom přestal být AVL. Změněné hloubky 2
4
Náprava rozvážení pomocí rotace
A4B33ALG / 06 Náprava rozvážení pomocí rotace 51 3 1 34 76 Insert 30 2 1 13 40 68 92 1 -1 -1 -1 -1 -1 8 22 45 -1 -1 -1 -1 -1 30 -1 -1 34 Vyvážený strom po pravé jednoduché rotaci, tzv. R rotaci 2 2 13 51 1 1 1 8 22 40 76 -1 -1 -1 -1 45 68 92 30 -1 -1 -1 -1 -1 -1 -1 -1 3
5
Náprava rozvážení pomocí rotace
A4B33ALG / 06 Náprava rozvážení pomocí rotace 51 3 1 34 76 Insert 30 2 1 13 40 68 92 1 -1 -1 -1 -1 -1 8 22 45 -1 -1 -1 -1 -1 Směr rotace 30 -1 -1 34 2 2 R rotace v uzlu 51 13 51 1 1 1 8 22 40 Podstromy beze změn 76 -1 -1 -1 -1 45 68 92 30 -1 -1 -1 -1 -1 -1 -1 -1 4
6
Rotace R obecně Před Po A x+2 x B C x+1 x D E Z -1 -1 B x+1 x+1 A D x
A4B33ALG / 06 Rotace R obecně A x+2 x B C Před x+1 x D E Z -1 -1 B x+1 x+1 A Po D x x C E Z -1 -1 5
7
Rotace L je symetrickým obrazem rotace R, jinak se od ní neliší.
A4B33ALG / 06 Rotace L obecně A x x+2 C B Před x x+1 D E Rotace L je symetrickým obrazem rotace R, jinak se od ní neliší. Z -1 -1 B x+1 x+1 Po A D x x C E Z -1 -1 6
8
Strom pro demonstraci LR rotace
A4B33ALG / 06 AVL strom 51 2 1 34 76 1 1 13 40 68 92 -1 -1 -1 -1 -1 8 36 45 -1 -1 -1 -1 -1 -1 Strom pro demonstraci LR rotace 7
9
Vložení uzlu může způsobit rozvážení stromu.
A4B33ALG / 06 Vložení uzlu může způsobit rozvážení stromu. V každém uzlu má být rozdíl výšek obou podstromů roven -1, 0, 1 !! Insert 38 51 3 1 34 76 1 2 13 40 68 92 -1 1 -1 -1 -1 -1 8 36 45 -1 -1 -1 -1 -1 -1 Změněné hloubky 38 -1 -1 Levý podstrom uzlu 51 je příliš hluboký, strom přestal být AVL. Použití rotace R by nepomohlo, příliš hlubokým by se stal původní pravý podstrom uzlu 34 díky tomu, že by se jeho hloubka vůbec nezměnila a hloubka levého podstromu 51 by klesla. 8
10
Náprava rozvážení pomocí LRrotace
A4B33ALG / 06 Náprava rozvážení pomocí LRrotace 51 3 1 Insert 38 34 76 1 2 13 40 68 92 -1 1 -1 -1 -1 -1 8 36 45 -1 -1 -1 -1 -1 -1 38 -1 -1 40 Vyvážený strom po dvojité LR rotaci 2 2 34 51 1 1 1 13 36 45 76 -1 -1 -1 -1 -1 8 38 68 92 -1 -1 -1 -1 -1 -1 -1 -1 9
11
Náprava rozvážení rotací
A4B33ALG / 06 Náprava rozvážení rotací 51 3 1 Insert 38 34 76 R 1 2 L 13 40 68 92 -1 1 -1 -1 -1 -1 8 36 45 -1 -1 -1 -1 -1 -1 Směry rotace 38 Podstromy beze změn -1 -1 40 2 2 LR rotace v uzlu 34 a 51 34 51 1 1 1 13 36 45 76 -1 -1 -1 -1 -1 8 38 68 92 -1 -1 -1 -1 -1 -1 -1 -1 10
12
Rotace LR obecně Před Po A X+2 x B C x x+1 D E x F G Z -1 -1 E x+1 x+1
A4B33ALG / 06 Rotace LR obecně A X+2 x B C x x+1 D E x Před F G Z -1 -1 E x+1 x+1 B A x x x x Po F G C D Z -1 -1 11
13
Rotace RL je symetrickým obrazem rotace LR, jinak se od ní neliší.
A4B33ALG / 06 Rotace RL obecně A x X+2 C B x+1 x E D x Před G F Rotace RL je symetrickým obrazem rotace LR, jinak se od ní neliší. Z -1 -1 E x+1 x+1 A B x x x x Po C G F D Z -1 -1 12
14
Pravidla pro aplikaci L, R, LR nebo RL rotací
A4B33ALG / 06 Pravidla pro aplikaci L, R, LR nebo RL rotací Od přidaného uzlu postupujeme směrem ke kořeni a aktualizujeme hloubky podstromů v každém navštíveném uzlu. Když narazíme na rozvážený uzel, do kterého jsme bezprostředně došli * dvěma hranami doprava nahoru provedeme v tomto uzlu R rotaci. * dvěma hranami doleva nahoru, provedeme v tomto uzlu L rotaci. * hranami doleva a pak doprava nahoru, provedeme v tomto uzlu LR rotaci. * hranami doprava a pak doleva nahoru, provedeme v tomto uzlu RL rotaci. Po provedení jedné rotace po operaci Insert je AVL strom opět vyvážen. Po provedení jedné rotace po operaci Delete (viz dále) strom vyvážen být nemusí, je nutno kontrolovat a případně aktualizovat vyvážení až ke kořeni včetně. 13
15
Strom pro demonstraci rotace po smazání uzlu
A4B33ALG / 06 Delete v AVL stromu Strom pro demonstraci rotace po smazání uzlu 51 1 2 16 84 -1 1 Delete 16 28 70 93 -1 -1 -1 -1 -1 55 -1 -1 Delete proběhne standardně jako v obyčejném BVS. Poté postupujeme od místa smazání nahoru ke kořeni a aktualizujeme výšky podstromů v každém uzlu. Při rozvážení aplikujeme rotaci podobně jako při vkládání. 14
16
Delete v AVL stromu Delete 16 Změněné hloubky 51 1 2 16 84 -1 1 28 70
A4B33ALG / 06 Delete v AVL stromu 51 1 2 16 84 -1 1 Delete 16 28 70 93 -1 -1 -1 -1 -1 55 -1 -1 51 2 28 84 -1 -1 1 70 93 -1 -1 -1 Změněné hloubky 55 -1 -1 15
17
Z rozváženého uzlu 51 prozkoumáme kořen sousedního podstromu,
A4B33ALG / 06 Delete v AVL stromu 51 L 2 28 84 -1 -1 1 R 70 93 -1 -1 -1 Změněné hloubky 55 -1 -1 Z rozváženého uzlu 51 prozkoumáme kořen sousedního podstromu, než ze kterého jsme přišli, v tomto případě uzel 84. Má-li tento oba své podstromy stejně hluboké použijeme jednoduchou L nebo R rotaci. Má-li je různě hluboké (nejvýše se liší o 1), rozhodneme, zda použijeme L, R, LR, RL rotaci, jako kdyby rozvážení (uzel 51) vzniklo naopak přidáním uzlu do tohoto sousedního podstromu (s kořenem 84). V tomto případě použijeme RL. 16
18
Delete v AVL stromu L Delete 16 R Změněné hloubky Po rotaci RL
A4B33ALG / 06 Delete v AVL stromu 51 L 2 28 84 -1 -1 1 Delete 16 R 70 93 -1 -1 -1 Změněné hloubky 55 -1 -1 70 Po rotaci RL v uzlu 84 a 51 51 84 -1 28 55 93 -1 -1 -1 -1 -1 -1 17
19
Nutnost vícenásobných rotací po operaci Delete.
A4B33ALG / 06 Nutnost vícenásobných rotací po operaci Delete. Příklad. Před operací Delete je AVL strom vyvážený. 1 2 4 3 Vyváženo. 18
20
Find (log(n)) (n) Insert (log(n)) Delete
A4B33ALG / 06 Implementace operací v AVL stromu // homework... Asymptotické složitosti operací Find, Insert, Delete v BVS a AVL BVS s n uzly AVL strom s n uzly Operace Vyvážený Možná nevyvážený Find (log(n)) (n) Insert (log(n)) Delete 19
21
B-strom -- Rudolf Bayer, Edward M. McCreight, 1972
A4B33ALG / 06 B-strom -- Rudolf Bayer, Edward M. McCreight, 1972 Všechny cesty z kořene do listu jsou stejně dlouhé tj. B-strom je ideálně vyvážený. Klíče jsou v uzlu seřazené. Fixní k > 1 pro celý strom určuje velikost všech uzlů. Každý uzel kromě kořene má nejméně k a nejvýše 2k klíčů, každý vnitřní uzel tedy má nejméně k+1 a nejvýše 2k+1 potomků. Kořen může mít libovolný počet klíčů. Není-li zároveň listem, má alespoň 2 potomky. X Y klíče < X X < klíče < Y Y < klíče 20
22
B-strom -- alternativní specifikace
A4B33ALG / 06 B-strom -- alternativní specifikace Cormen et al. 1990: Stupeň B-stromu: Horní a dolní hranice počtu klíčů v uzlu je dána parametrem t 2: a. Každý uzel různý od kořene obsahuje alespoň t1 klíčů. Tudíž každý vnitřní uzel různý od kořene má alespoň t potomků. b. Každý uzel obsahuje nejvýše 2t1 klíčů. Tudíž každý vnitřní uzel má nejvýše 2t potomků. t = 2 t = 5 x x x x x ... x x x x x x x x x x x x x x x x x x x x x x x x x x x x min klíčů = 4 min klíčů = 1 min potomků = 5 min potomků = 2 max klíčů = 9 max klíčů = 3 max potomků = 10 max potomků = 4 21
23
A4B33ALG / 06 B-strom -- Find Najdi 17 18 8 14 26 41 1 2 4 5 10 12 15 16 17 19 20 22 25 27 36 42 45 60 V uzlu se vyhledává sekvenčně (lze také využít půlení intervalu apod). Pokud uzel není listem a klíč v něm není, hledání pokračuje v odpovídajícím potomku. Pokud uzel je listem a klíč v něm není, nenalezeno. 22
24
B-strom -- aktualizační strategie
A4B33ALG / 06 B-strom -- aktualizační strategie Vícefázová a jednofázová strategie 1. Vícefázová strategie: “Řeš problém, až když vznikne”. Nejprve vlož nebo smaž aktuální klíč a teprve potom, pokud je to nutné, uprav strukturu stromu. Může se stát, že pak bude nutno během úprav procházet strom zpět až ke koření. 2. Jednofázová strategie: “Předcházej budoucím problémům”. Postupuj od kořene na místo, kde má být klíč/uzel vložen/smazán a během postupu upravuj strukturu stromu tak, aby po vložení/smazání nebylo nutno vracet se směrem ke kořeni. 23
25
B-strom -- Insert Vícefázová strategie B-strom 8 17 26 2 4 10 12 14 16
A4B33ALG / 06 B-strom -- Insert Vícefázová strategie B-strom 8 17 26 2 4 10 12 14 16 19 22 25 36 41 42 45 Vlož 5 8 17 26 41 2 4 5 10 12 14 16 19 22 25 36 41 42 45 Vlož 20 8 17 26 2 4 5 10 12 14 16 19 20 22 25 36 41 42 45 24
26
B-strom -- Insert Vícefázová strategie Vlož 27 8 17 26 2 4 5 10 12 14
A4B33ALG / 06 B-strom -- Insert Vícefázová strategie Vlož 27 8 17 26 2 4 5 10 12 14 16 19 20 22 25 36 41 42 45 27 Seřaď mimo strom. 27 36 41 42 45 Vyber medián, vyvoř nový uzel, přesuň do něj hodnoty větší než medián. 41 27 36 42 45 8 17 26 41 27 Medián zkus vložit do rodiče. 19 20 22 25 27 36 42 45 Zdařilo se. 25
27
B-strom -- Insert ? Vícefázová strategie Vlož 15 8 17 26 41 2 4 5 10
A4B33ALG / 06 B-strom -- Insert Vícefázová strategie Vlož 15 8 17 26 41 2 4 5 10 12 14 16 19 20 22 25 27 36 42 45 15 Seřaď mimo strom. 10 12 14 15 16 Vyber medián, vyvoř nový uzel, přesuň do něj hodnoty větší než medián. 14 10 12 15 16 ? Medián zkus vložit do rodiče. 14 8 17 26 41 26
28
Rodič je zaplněn – Analogický další postup směrem ke kořeni.
A4B33ALG / 06 B-strom -- Insert Vícefázová strategie Bylo vloženo 15 do listu... ... nutno vložit 14 do rodiče. 8 17 26 41 14 2 4 5 10 12 15 16 19 20 22 25 27 36 42 45 Rodič je zaplněn – Analogický další postup směrem ke kořeni. Seřaď mimo strom. 8 14 17 26 41 Vyber medián, vyvoř nový uzel, přesuň do něj hodnoty větší než medián. 17 8 14 26 41 17 Medián nelze vložit do rodiče, žádný rodič není, tedy se zřídí nový kořen. 8 14 26 41 27
29
B-strom -- Insert Vícefázová strategie Rekapitulace - vlož 15 8 17 26
A4B33ALG / 06 B-strom -- Insert Vícefázová strategie Rekapitulace - vlož 15 8 17 26 41 2 4 5 10 12 14 16 19 20 22 25 27 36 42 45 Vlož 15 17 Uzly beze změny 8 14 26 41 2 4 5 10 12 15 16 19 20 22 25 27 36 42 45 V každém patře přibyl jeden uzel, kromě toho přibyl nový kořen, strom ale roste směrem "vzhůru", zůstává ideálně vyvážený. 28
30
B-strom -- Delete Vícefázová strategie Mazání v dostatčně plném listu.
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Mazání v dostatčně plném listu. 17 Smaž 4 8 14 26 41 2 4 5 10 12 15 16 19 20 22 25 27 36 42 45 60 17 8 14 26 41 2 5 10 12 15 16 19 20 22 25 27 36 42 45 60 29
31
B-strom -- Delete Vícefázová strategie Mazání ve vnitřním uzlu
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Mazání ve vnitřním uzlu Smazaný klíč se nahradí nejbližším větším (menším) klíčem, podobně jako v BVS. 17 Smaž 17 8 14 26 41 19 2 5 10 12 15 16 20 22 25 27 36 42 45 60 Nejbližší větší (menší) klíč je vždy v B-stromu v listu, má-li tento list dostatečný počet klíčů, jsme hotovi. 19 8 14 26 41 2 5 10 12 15 16 20 22 25 27 36 42 45 60 30
32
B-strom -- Delete Vícefázová strategie Mazání v nedostatčně
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Mazání v nedostatčně plném listu. Ale sousední list je dostatečně plný. 19 8 14 26 41 Smaž 27 2 5 10 12 15 16 20 22 25 27 36 42 45 60 Sjednoť klíče s klíči v sousedním listu a s dělícím klíčem v rodiči a seřaď. 26 41 36 42 45 60 36 41 42 45 60 Medián sjednocení vlož na místo původně dělícího klíče, menší a větší klíče než medián rozděl do levého a pravého listu. 26 42 36 41 45 60 31
33
B-strom -- Delete Vícefázová strategie Rekapitulace - smaž 27 19 8 14
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Rekapitulace - smaž 27 19 8 14 26 41 2 5 10 12 15 16 20 22 25 27 36 42 45 60 27 korektně smazáno Uzly beze změny 19 8 14 26 26 42 41 2 5 10 12 15 16 20 22 25 36 27 41 36 42 45 60 45 60 32
34
B-strom -- Delete Vícefázová strategie Mazání v nedostatčně
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Mazání v nedostatčně plném listu. Ani sousední list není dostatečně plný. 19 Smaž 12 8 14 26 26 42 41 2 5 10 12 15 16 20 22 25 27 36 41 36 45 42 45 60 60 8 14 Sjednoť klíče s klíči v sousedním listu a s dělícím klíčem v rodiči a seřaď. Vše vlož do původního listu, sousední list smaž, dělící klíč v rodiči také smaž. 10 12 15 16 8 14 10 14 15 16 33
35
B-strom -- Delete Vícefázová strategie 19 Rodič nesplňuje
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie 19 Rodič nesplňuje podmínku B-stromu Smazáno 12 8 26 26 41 42 2 5 10 14 15 16 20 22 25 36 27 41 36 45 42 45 60 60 Rodič, který poskytl klíč potomku, není dostatečně plný. Aplikujeme na něj (a případně iterativně na jeho rodiče) tentýž postup spojení klíčů a sousedních uzlů a přesun dělícího prvku z rodiče. 19 8 26 41 19 26 42 8 26 26 41 42 8 19 26 42 26 41 34
36
B-strom -- Delete Vícefázová strategie Rekapitulace - smaž 12 19 8 14
A4B33ALG / 06 B-strom -- Delete Vícefázová strategie Rekapitulace - smaž 12 19 8 14 26 26 42 41 2 5 10 12 15 16 20 22 25 36 27 41 36 42 45 45 60 60 Smazáno 12 a strom byl adekvátně restrukturován. Uzly beze změny 26 8 41 19 26 42 2 5 10 14 15 16 20 22 25 36 27 41 36 45 42 60 45 60 35
37
B-strom -- Insert Jednofázová strategie
A4B33ALG / 06 B-strom -- Insert Jednofázová strategie Single phase strategy Příklad: Cormen et al. 1990: t = 3, min stupeň 3, max stupeň = 6, min klíčů v uzlu (kromě kořene) = 2, max klíčů v uzlu = 5. G M P X A C D E J K N O R S T U V Y Z Insert B G M P X A B C D E J K N O R S T U V Y Z Neovlivněné uzly Insert Q G M P T X A B C D E J K N O Q R S U V Y Z 36
38
B-strom -- Insert Jednofázová strategie G M P T X A B C D E J K N O Q
A4B33ALG / 06 B-strom -- Insert Jednofázová strategie Single phase strategy G M P T X A B C D E J K N O Q R S U V Y Z Rozděl kořen, protože je plný, a pokračuj směrem k listu vložit L. Insert L P G M T X A B C D E J K L N O Q R S U V Y Z Neovlivněné uzly Insert F P C G M T X A B D E F J K L N O Q R S U V Y Z 37
39
B-strom -- Delete Jednofázová strategie P Delete F C G M T X A B D E F
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie P Delete F C G M T X A B D E F J K L N O Q R S U V Y Z 1. Když je klíč k v listu X, smaž k v X. P Neovlivněné uzly C G M T X A B D E J K L N O Q R S U V Y Z Další případy 2. a 3. zaručují, že smazání vždy proběhne v uzlu s alespoň t klíči, takže po smazání klíče k nebude nutno nutno list spojovat se sousedy a opravovat strom ve vnitřních uzlech směrem zpět ke kořeni. 38
40
B-strom -- Delete Jednofázová strategie P Delete M C G M T X A B D E J
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie P Delete M C G M T X A B D E J K L N O Q R S U V Y Z 2. Když je klíč k ve vnitřním uzlu X, udělej: 2a. Když má potomek Y vlevo od klíče k v uzlu X alespoň t klíčů, najdi maximální klíč kp v podstromu s kořenem Y. Nahraď v X klíč k klíčem kp and rekurzivně pokračuj mazat kp v podstromu s kořenem Y. (b. Pokud má Y méně než t klíčů, pak zkoumej potomka Z vpravo od klíče k v X a pokud Z má alespoň t klíčů, postupuj analogicky (s hledáním minima) jako ve 2a. P C G L T X A B D E J K N O Q R S U V Y Z 39
41
B-strom -- Delete Jednofázová strategie Delete G P C G L T X A B D E J
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie Delete G P C G L T X A B D E J K N O Q R S U V Y Z 2c. Jinak, t.j. když Y a Z mají jen t1 klíčů, přesuň k a klíče uzlu Z do uzlu Y. Tím v X ubyde klíč k a ukazatel na Z. Uzel Y nově obsahuje 2t1 klíčů. Fyzicky smaž Z and pokračuj rekurzivně smazáním k v Y. P C L T X A B D E J K N O Q R S U V Y Z 40
42
B-strom -- Delete Jednofázová strategie
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie 3. Když vnitřní uzel X neobsahuje klíč k, urči toho potomka X.c uzlu X, který je kořenem podstromu, v němž leží k, pokud se k ve stromu vůbec vyskytuje. Pokud má X.c pouze t1 klíčů, proveď podle okolností krok 3a nebo 3b, aby bylo zaručeno, že z uzlu X bude operace mazání pokračovat v takovém jeho potomku, který má alespoň t klíčů. Poté se přesuň do tohoto potomku a pokračuj rekurzivně. Delete D P C L T X A B D E J K N O Q R S U V Y Z 41
43
B-strom -- Delete Jednofázová strategie P Delete D Merge C L T X A B D
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie P Delete D Merge C L T X A B D E J K N O Q R S U V Y Z 3a. Pokud uzel X.c a oba jeho sousední sourozenci (pokud existují) obsahují t1 klíčů, přesuň klíče z jednoho sourozence do X.c, smaž tohoto sourozence a navíc do X.c přesuň z X klíč, který bude nyní mediánem v X.c. Merged C L P T X A B D E J K N O Q R S U V Y Z C L P T X A B E J K N O Q R S U V Y Z 42
44
B-strom -- Delete Jednofázová strategie Delete B C L P T X A B E J K N
A4B33ALG / 06 B-strom -- Delete Jednofázová strategie Delete B C L P T X A B E J K N O Q R S U V Y Z 3b. Pokud uzel X.c obsahuje t1 klíčů a jeho sousední sourozenec Y obsahuje alespoň t klíčů, přesuň z X do X.c. klíč m rozdělující X.c. a Y. Na bývalé místo m v X přesuň patřičný krajní (největší nebo nejmenší) klíč z Y. Příslušný krajní odkaz v Y na jeho potomka přesuň do X.c ke klíči m. E L P T X A C J K N O Q R S U V Y Z 43
45
B-strom -- asymptotické složitosti operací
A4B33ALG / 06 B-strom -- asymptotické složitosti operací Find O(b ∙ logb n) Insert (b ∙ logb n) Delete (b ∙ logb n) n je počet klíčů ve stromu, b je větvící faktor, tj. řád stromu tj. maximální počet potomků uzlu. Poznámka: Někteří autoři (např. CLRS) definují řád (order) B-stromu jako [b/2], tj. minimální počet potomků vnitřního uzlu různého od kořene. Terminologie není ustálená, je třeba vždy vztahy interpretovat v patřičných souvislostech. 44
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.