840 likes | 1.05k Views
Univerzální B-stromy (UB-Stromy). V ícerozměrná přístupová metoda. Rudolf Bayer. Michal Krátký, michal.kratky@vsb.cz http://www.cs.vsb.cz/kratky. Obsah. Úvod Vícerozměrná data Principy UB-stromů Algoritmus vkládání bodu Algoritmus výpočtu Z-adresy Algoritmus rozsahového dotazu
E N D
Univerzální B-stromy (UB-Stromy) Vícerozměrná přístupová metoda Rudolf Bayer Michal Krátký, michal.kratky@vsb.cz http://www.cs.vsb.cz/kratky
Obsah • Úvod • Vícerozměrná data • Principy UB-stromů • Algoritmus vkládání bodu • Algoritmus výpočtu Z-adresy • Algoritmus rozsahového dotazu • Práce s nebodovými objekty • Složitosti algoritmů, výhody
Úvod • UB-strom je vícerozměrná přístupová metoda • autorem je Rudolf Bayer, další výzkum Volker Markl • Využívá Z-uspořádání a B-stromů
Vícerozměrná data • Kartézským součinem domén atributů vznikne vícerozměrný prostor • n-tice (řádek, tuple, entita, objekt) je bodem v n-dimenzionálním prostoru a je takto indexován • Prostorová blízkost umožňuje shlukování těchto bodů pro uložení na diskové stránky => snížení počtu přístupů na disk => rychlejší operace • Využití v data warehousingu, GIS, ...
Z-uspořádání Pro x ÎW a binární reprezentaci každého atributu xi= x i,s-1 x i,s-2 ... x i,0 definujeme Z-hodnotuZ(x): • Z(x) počítá pro každou n-tici Z-adresu (tj. jeho pozici na Z-křivce) • Z-hodnoty jsou efektivně počítány tzv. bitovým prokládáním (bit-interleaving)
Z-uspořádání pro univerzum 8x8 0 1 2 3 4 5 6 7 0 1 4 5 16 17 20 21 0 2 3 6 7 18 19 22 23 1 8 9 12 13 24 25 28 29 2 10 11 14 15 26 27 30 31 3 32 33 36 37 48 49 52 53 4 34 35 38 39 50 51 54 55 5 40 41 44 45 56 57 60 61 6 42 43 46 47 58 59 62 63 7 (a) (b)
Z-regiony/UB-stromy 4 20 Z-region [4 : 20] UB-Stromové dělení: [0 : 3],[4 : 20], [21 : 35], [36 : 47], [48 : 63] Z-region [a :b ]je prostor pokrytý intervalem na Z-křivce.
UB-strom V uzlu B-stromu jsou uloženy adresy Z-regionů UB-index UB-soubor V listech B-stromu jsou uloženy n-tice náležící k danému Z-regionu
Algoritmus vkládání bodu Vstup: x: bod, který má být vložen do UB-Stromu Výstup: žádný x = Z(x) find [a : g] in the UB-Tree, such that a Łx Ł g retrieve page(a : g) insert x into page(a : g) if count(a : g) > C choose bÎ[a : g], so that ½C - e Ł count(a : b) Ł ½C + e split page(a : g) into page(a : b) and page(b + 1 : g) end if
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
UB-Strom UB-Strom B-Strom B-Strom Z-adresa Z-adresa
UB-Strom UB-Strom B-Strom B-Strom Z-adresa Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
Zdrojový kód UB-Strom Insert(Tuple tuple) { Zaddress za = Z(tuple); BtreeInsert(za, tuple); } Ubvalue findSplitPoint(Tuple t1, Tuple t2) { /* nalezení optimální Z-adresy mezi t1 a t2 */ } B-Strom Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 1 0 0 1 0 1 1 0 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 1 0 0 1 0 1 1 0 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 10 0 1 0 1 1 0 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 10 0 1 0 11 0 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 1 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 100 1 0 11 0 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 1 0 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 100 1 0 110 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 1 0 0 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 1001 0 110 0 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 1 0 0 1 _ _ _ _ _ _ _ _ _ _ Z-adresa
(25,18) Zdrojový kód UB-strom Zaddress Z(Tuple tuple) { Zaddress za = 0; int pos = 0, bit ; for (bit = 0; bit < maxbits(tuple); bit++) { foreach attribute of tuple do { if (attribute[bit] exists) { if (attribute[bit] is set) ZaddressSetBit(&za, pos); pos++; } } } return za; } Atribut 1 Atribut 2 Z-adresa Atribut 2 Atribut 1 _ _ _ _ _ 1001 0 1100 1 _ _ _ _ _ Bitové řetězce _ _ _ _ _ _ _ _ _ _ 1 1 0 1 0 0 1 0 _ _ _ _ _ _ _ _ _ _ Z-adresa