IIUJ Metody Programowania strona: 1 WykÅ‚ad 14. Sortowanie zewnÄ™trzne (sortowanie plików) Sortowanie zewnÄ™trzne, sortowanie plików (ang. external sort) to rodzaj metod sortowania, które sÄ… stosowane, kiedy z pewnych wzglÄ™dów nie jest możliwe jednoczesne umieszczenie wszystkich elementów zbioru sortowanego w pamiÄ™ci operacyjnej, przy zachowaniu wymogu sekwencyjnego dostÄ™pu do pliku. ZakÅ‚adamy, że pamięć zewnÄ™trzna jest podzielona na bloki, a każdy blok jest identyfikowany przez swój adres. Plik jest listÄ… n rekordów (o tym samym formacie). Ponadto zakÅ‚adamy, że każdy plik zajmuje pewnÄ… liczbÄ™ bloków, a każdy blok mieÅ›ci k rekordów. Za operacjÄ™ dominujÄ…cÄ… przyjmujemy przesÅ‚anie jednego bloku miÄ™dzy pamiÄ™ciÄ… operacyjnÄ… a pamiÄ™ciÄ… zewnÄ™trznÄ…. W plikach nieuporzÄ…dkowanych rekordy sÄ… uÅ‚ożone w dowolnej kolejnoÅ›ci. Wykonanie operacji search() wymaga n/k przesÅ‚aÅ„ bloków, a wykonanie operacji insert() i delete() potrzebuje 1+n/k przesÅ‚aÅ„. PodstawowÄ… wadÄ… jest w tym przypadku dÅ‚ugi czas dziaÅ‚ania operacji gdyż rekordy: a , . . . , a pliku sÄ… przetwarzane sekwencyjnie , tzn.: 1 n - aby odczytać a należy bezpoÅ›rednio przedtem odczytać a , . . . ,a , k 1 k-1 - aby zapisać nowÄ… wartość a należy zapisać bezpoÅ›rednio przedtem k a , . . . , a . 1 k-1 JednÄ… z najważniejszych metod sortowania plików jest sortowanie przez Å‚Ä…czenie. AÄ…czenie (lub scalanie) oznacza wiÄ…zanie dwóch (lub wiÄ™cej) ciÄ…gów rekordów uporzÄ…dkowanych w jeden ciÄ…g uporzÄ…dkowany. 1. Metoda zrównoważona (von Neumann) ·ð ð p1, p2, p3, p4 pliki (fizycznie, na ogół, odrÄ™bne urzÄ…dzenia) ·ð ð dane wejÅ›ciowe: n rekordów o kluczach a , . . . . ,a , na pliku p4 1 n ·ð ð pamięć RAM mieÅ›ci m rekordów IIUJ Metody Programowania strona: 2 Krok 1: (sortowanie wstÄ™pne i rozdzielanie). Wczytuj po m kolejnych rekordów do pamiÄ™ci operacyjnej, sortuj i zapisuj posortowane ciÄ…gi dÅ‚ugoÅ›ci m na pliki p1 i p2 na przemian. Krok 2: (scalanie i rozdzielanie). Scalaj po jednym posortowanym ciÄ…gu z p1 i p2 i zapisuj na przemian na pliki p3 i p4 (dÅ‚ugość posortowanych ciÄ…gów podwaja siÄ™). Iteracja: Powtarzaj krok 2 zamieniajÄ…c rolami p1, p2 z p3, p4 aż do osiÄ…gniÄ™cia sytuacji gdy pozostaje jeden plik posortowany zawierajÄ…cy caÅ‚y ciÄ…g. Algorytm scalania posortowanych ciÄ…gów: taki jak dla tablic posortowanych (zamiast dwóch tablic wejÅ›ciowych sÄ… dwa ciÄ…gi posortowane: jeden z jednego, drugi z drugiego pliku). PrzykÅ‚ad. Po kroku 1 mamy 16 ciÄ…gów rosnÄ…cych dÅ‚ugoÅ›ci m rozdzielonych na p1 i p2, przy czym - oznacza k - ty ciÄ…g w kolejnoÅ›ci utworzenia: p1: <1> <3> <5> <7> <9> <11> <13> <15> p2: <2> <4> <6> <8> <10> <12> <14> <16> po kroku 2: p3: (<1>*<2>) (<5>*<6>) (<9>*<10>) (<13>*<14>) p4: (<3>*<4>) (<7>*<8>) (<11>*<12>) (<15>*<16>) (*) - oznacza ciÄ…g powstaÅ‚y ze scalenia posortowanych ciÄ…gów oraz nastÄ™pna iteracja kroku 2 daje: p1: ((<1>*<2>)*(<3>*<4>)) ( (<9>*<10>)*(<11>*<12>)) p2: ((<5>*<6>)*(<7>*<8>)) ((<13>*<14>)*(<15>*<16>)) (ciÄ…gi posortowane sÄ… już 4*m elementowe) IIUJ Metody Programowania strona: 3 nastÄ™pna: p3: (((<1>* <2>)*( <3>* <4>))*(( <5>* <6>)*( <7>* <8>))) p4: (((<9>*<10>)*(<11>*<12>))*((<13>*<14>)*(<15>*<16>))) (po jednym ciÄ…gu dÅ‚ugoÅ›ci n/2 na każdym pliku) i ostatnia daje caÅ‚y ciÄ…g posortowany na pliku p1. JeÅ›li n nie jest potÄ™gÄ… dwójki to pojawiajÄ… siÄ™ ciÄ…gi 'bez pary' które siÄ™ przepisuje. ZÅ‚ożoność mierzy siÄ™ liczbÄ… ·ð ð faz (czyli iteracji kroku 2) - jest ich: éðlog (n/m)Å‚ð ·ð ð odczytów i zapisów rekordów na pliki - w każdej fazie jest n odczytów, n zapisów, oraz nie wiÄ™cej niż n porównaÅ„ kluczy, w sumie zatem: Qð( n log (n/m)) operacji. ·ð ð dodatkowo: sortowanie wstÄ™pne fragmentów m-elementowych, zakÅ‚adajÄ…c sortowanie szybkie: Qð( n/m * m log m) = Qð( n log m) porównaÅ„ Uwagi. 1. Im wiÄ™ksza pamięć RAM (parametr m) tym szybsze sortowanie 2. MajÄ…c 2*k plików, k>2, można wykonywać scalanie równoczeÅ›nie nie dwóch lecz k ciÄ…gów (scalanie k - kierunkowe). Liczba faz maleje do log (n/m). k 3. JeÅ›li k jest duże to można kolejne elementy przy scalaniu wyÅ‚aniać utrzymujÄ…c kopiec (kolejkÄ™ priorytetowÄ…) dÅ‚ugoÅ›ci k zawierajÄ…cy klucz aktualnie czytany z każdego wejÅ›ciowego pliku. Wówczas kolejny element zapisywany na wyjÅ›cie otrzymywany jest w wyniku operacji Extract_min, a "doczytywany" z tego samego pliku wejÅ›ciowego element na miejsce usuniÄ™tego wstawiany jest operacjÄ… Insert (można obie operacje poÅ‚Ä…czyć w jednÄ… "Replace_min"). IIUJ Metody Programowania strona: 4 2. Sortowanie wielofazowe (czasami polifazowe , pod wpÅ‚ywem ang. polyphase sort) algorytm wynaleziony przez R. L. Gilstada DysponujÄ…c k+1 plikami można rozdzielić poczÄ…tkowe ciÄ…gi tak, aby potem we wszystkich etapach móc stosować scalanie k - kierunkowe. Dla k=2 schemat rozdziaÅ‚u ciÄ…gów wg wartoÅ›ci liczb Fibonacciego, np. liczba podciÄ…gów n/m = 13, rozdzielone na 8 i 5 podciÄ…gów: p1: <1> <2> <3> <4> <5> <6> <7> <8> p2: <9> <10> <11> <12> <13> p3: pusty Scalanie podciÄ…gów parami, z dwóch niepustych plików na aktualnie pusty plik, aż jeden ze scalanych plików bÄ™dzie pusty. po fazie 1: p1: <6> <7> <8> p2: pusty p3: (<1>*<9>)( <2>*<10>)( <3>*<11>)( <4>*<12>)( <5>*<13>) po fazie 2: p1: pusty p2: (<6>*<1>*<9>) ( <7>*<2>*<10>) ( <8>*<3>*<11>) p3: (<4>*<12>)( <5>*<13>) po fazie 3: p1: (<4>*<12>*<6>*<1>*<9>) ( <5>*<13>*<7>*<2>*<10>) p2: ( <8>*<3>*<11>) p3: pusty po fazie 4: p1: (<5>*<13>*<7>*<2>*<10>) p2: pusty p3: (<8>*<3>*<11>*<4>*<12>*<6>*<1>*<9>) po fazie 5: p1: pusty p2: (<5>*<13>*<7>*<2>*<10>*<8>*<3>*<11>*<4>*<12>* <6>*<1>*<9>) // caÅ‚y ciÄ…g p3: pusty Metoda daje siÄ™ uogólnić na dowolnÄ… wartość parametru k. IIUJ Metody Programowania strona: 5 3. B-drzewa1 B-drzewa sÄ… szczególnie użyteczne przy organizacji danych w pamiÄ™ci zewnÄ™trznej. PierwszÄ… propozycjÄ™ zastosowania B-drzew jako struktur danych dla pamiÄ™ci zewnÄ™trznej przedstawili R. Bayer i E. Mcreight w 1972 roku. Jak wspomniano wczeÅ›niej aby zapewnić wydajność operacji dostÄ™pu do pamiÄ™ci zewnÄ™trznej dane sÄ… odczytywane i zapisywane blokami (stronami). B-drzewa rzedu m to drzewa, których wÄ™zÅ‚ami sÄ… bloki pamiÄ™ci zewnÄ™trznej zawierajÄ…ce klucze w postaci uporzÄ…dkowanej oraz odsyÅ‚acze, przy czym jeden blok zawiera od m do 2m kluczy (wyjÄ…tkiem jest korzeÅ„, który może zawierać od 1 do 2m) i dlatego bloki sÄ… zawsze przynajmniej na wpół wypeÅ‚nione kluczami. Blok posiadajÄ…cy k kluczy zawsze zawiera k+1 wskazników (potomków - dzieci). Liczba m (np. 1024) jest kluczowa w wydajnoÅ›ci B-drzew, ponieważ wysokość drzewa dla ogromnej iloÅ›ci wÄ™złów liczonej w milionach lub miliardach bÄ™dzie bardzo maÅ‚a. Np. dla m=1024 w B- drzewie o wysokoÅ›ci 2 można umieÅ›cić okoÅ‚o miliona bloków. Definicja B-drzewo rzÄ™du m to drzewo, w którym : - klucze w bloku sÄ… uporzÄ…dkowane niemalejÄ…co, - każdy blok zajmuje pamięć dla 2m kluczy i 2m+1 odsyÅ‚aczy, - każdy blok (nie korzeÅ„) zawiera k kluczy, przy czym m d" k d" 2m. - blok-korzeÅ„ zawiera k kluczy, przy czym 1 d" k d" 2m. - każdy blok-liść o k kluczach ma 0 nastÄ™pników - każdy blok-nie-liść o k kluczach ma k+1 nastÄ™pników - wszystkie bloki-liÅ›cie sÄ… na jednym poziomie. Fakt. JeÅ›li w bloku sÄ… klucze i odsyÅ‚acze: NEXT[0] INFO[1] NEXT[1] INFO[2] NEXT[2] & NEXT[k-1] INFO[k] NEXT[k+1] to wszystkie klucze poddrzewa wskazywanego przez NEXT[i] majÄ… wartoÅ›ci z przedziaÅ‚u ( INFO[i] , INFO[i+1] ); przy czym INFO[0]= -" , INFO[ostatni+1] = +" 1 Na podstawie wykÅ‚adu pana dr Jacka Lembasa ASD: B-drzewa IIUJ Metody Programowania strona: 6 PrzykÅ‚ad: B-drzewo rzÄ™du 2. ( maksymalna pojemność bloku = 4) M * * * | |______________________________________ |____ | ^ ^ E J * * Q T W * | | |______________________ | | | |______________________________ | |_____________ | | | |______________________ | |____ | | | |______________ | | | | | |____ | | | ^ ^ ^ ^ ^ ^ ^ A B C D F G H I K L * * N O P * R S * * U V * * X Y Z * Operacja Search(x) Wyszukiwanie poszukiwanego klucza x w B-drzewie zaczyna siÄ™ od korzenia. Klucze w blokach sÄ… uporzÄ…dkowane niemalejÄ…co. PrzeglÄ…da siÄ™ je liniowo: 1. jeÅ›li znajdzie siÄ™ poszukiwany element w aktualnym bloku taki, że INFO[k]=x, to x jest w B-drzewie. 2. w przeciwnym przypadku, jeÅ›li INFO[k] < x < INFO[k+1] to okreÅ›la siÄ™ wskaznik NEXT[k] i przeszukiwane jest wskazane poddrzewo. 3. jeÅ›li przeszukano już liść, wiÄ™c poddrzewo=null to elementu x nie ma w caÅ‚ym B- drzewie. Operacja Insert(x) Operacja wstawienia zaczyna siÄ™ od znalezienia bloku liÅ›cia do którego pasuje wstawiany element, załóżmy, że znaleziony blok zawiera k kluczy. 1. JeÅ›li k<2m to wstawia siÄ™ element porzÄ…dkujÄ…c blok. 2. Inaczej k=2m (za ciasno) wstaw porzÄ…dkujÄ…c 2m+1 kluczy i równo rozdziel blok, nastÄ™pnie wstaw Å›rodkowy element na poziom wyżej np. wstawiajÄ…c D: BCDEF Ä…ð .---D---. BC** EF** Dalej rekurencyjne wstawianie na kolejny poziom. UWAGA. Wysokość B-drzewa zwiÄ™ksza siÄ™ gdy rozdziela siÄ™ korzeÅ„. IIUJ Metody Programowania strona: 7 PrzykÅ‚ad. Wstawianie danych do B-drzewa rzÄ™du 2. 1. WstawiajÄ…c kolejno: F L D P otrzymamy peÅ‚ny korzeÅ„: D F L P 2. WstawiajÄ…c E - mamy blok peÅ‚ny, dzielimy go na dwie części, Å›rodkowy element dodajemy do bloku na wyższym poziomie D E F L P : F * * * | |_____________ |___ | ^ ^ D E * * L P * * 3. WstawiajÄ…c nastÄ™pne: N I B A otrzymamy F * * * | |_____________ |___ | ^ ^ A B D E I L N P 4. WstawiajÄ…c G mamy F L * * | | |_______________________ | |_____________ | |___ | | ^ ^ ^ A B D E G I * * N P * * 5. WstawiajÄ…c nastÄ™pne: Q R M C J K otrzymamy C F L P | | | | |___________________________________________ | | | |_________________________________ | | | |_______________________ | | | |_____________ | | | |___ | | | | ^ ^ ^ ^ ^ A B * * D E * * G I J K M N * * Q R * * IIUJ Metody Programowania strona: 8 6. WstawiajÄ…c H mamy C F L P | | | | |___________________________________________ | | | |_________________________________ | | | |_______________________ | | | |_____________ | | | |___ | | | | ^ ^ ^ ^ ^ A B * * D E * * G H I J K M N * * Q R * * NastÄ™pnie C F I L P | | | | | |_____________________________________________ | | | | |________________________________________ | | | | |______________________________ | | | | |_______________________ | | | | |_____________ | | | | |___ | | | | | ^ ^ ^ ^ ^ ^ A B * * D E * * G H * * J K * * M N * * Q R * * Dalej I * * * | |_____________ |___ | ^ ^ C F * * L P * * | | | | | |_________________________________________ | | | | |_________________________________ | | | | |_________________________ | | | | |_______________________ | | | | |_____________ | | | | |___ | | | | | ^ ^ ^ ^ ^ ^ A B * * D E * * G H * * J K * * M N * * Q R * * IIUJ Metody Programowania strona: 9 7. WstawiajÄ…c S T otrzymamy I * * * | |_____________ |___ | ^ ^ C F * * L P * * | | | | | |________________________________________ | | | | |________________________________ | | | | |______________________ | | | | |_____________________ | | | | |_____________ | | | | |___ | | | | | ^ ^ ^ ^ ^ ^ A B * * D E * * G H * * J K * * M N * * Q R S T Operacja Delete() UsuwajÄ…c klucz z B-drzewa możemy rozróżnić dwa przypadki: (A). Usuwanie klucza z bloku wewnÄ™trznego (nie-liÅ›cia), wtedy zamienia siÄ™ go z jednym z dwu najbliższych leksykograficznie kluczy, które znajdujÄ… w liÅ›ciach i mogÄ… być Å‚atwo usuniÄ™te: np. po wyrzuceniu G zastÄ…pić należy przez F lub H, które znajdujÄ… siÄ™ w liÅ›ciach CDEF** lub HIJK**. AB.G.L** AB.F.L** AB.H.L** .---| |---. .---| |---. .---| |---. CDEF** HIJK** CDE?** HIJK** CDEF** ?IJK** (B). Usuwanie klucza z bloku-liÅ›cia, który ma k kluczy. JeÅ›li k>m to po wyrzuceniu nadal ke"m, zatem koniec operacji inaczej po wyrzuceniu blok ma m-1 kluczy i wówczas mogÄ… zajść dwa przypadki: 1. JeÅ›li jeden z sÄ…siednich bloków ma p>m kluczy, to m-1+(1)+p>2m , (przy czym (1)- klucz nadrzÄ™dny) czyli blok z sÄ…siadem można zrównoważyć: np. usuwajÄ…c I mamy .---G---. .---E---. ABCDEF HIJ*** ABCD** FGHJ** IIUJ Metody Programowania strona: 10 2. JeÅ›li w sÄ…siednich blokach jest m kluczy, czyli m-1+(1)+m=2m , to blok z sÄ…siadem i wspólnym kluczem nadrzÄ™dnym można poÅ‚Ä…czyć: np. usuwajÄ…c F .---D---. --------- ABC*** EFG*** ABCDEG Dalej rekurencyjne usuwanie D ze bloku nadrzÄ™dnego. Uwaga Wysokość B-drzewa zmniejsza siÄ™ gdy Å‚Ä…czy siÄ™ jedyny klucz korzenia z jego dwoma potomkami. PrzykÅ‚ad. Usuwanie danych z B-Drzewa rzÄ™du 2 I * * * | |_____________ |___ | ^ ^ C F * * L P * * | | | | | |________________________________________ | | | | |________________________________ | | | | |______________________ | | | | |_____________________ | | | | |_____________ | | | | |___ | | | | | ^ ^ ^ ^ ^ ^ A B * * D E * * G H * * J K * * M N * * Q R S T 1. UsuwajÄ…c M mamy - równoważenie bloków .--P--. Razem z nadrzÄ™dnym majÄ… > 2m kluczy -N** QRST I * * * | |_____________ |___ | ^ ^ C F * * L Q * * | | | | | |_____________________________________ | | | | |________________________________ | | | | |_________________________ | | | | |_____________________ | | | | |_____________ | | | | |___ | | | | | ^ ^ ^ ^ ^ ^ A B * * D E * * G H * * J K * * N P * * R S T * IIUJ Metody Programowania strona: 11 2. Usuwamy A - nie da siÄ™ zrównoważyć z sÄ…siadem, ponieważ razem z nadrzÄ™dnym majÄ… 2m kluczy, zatem pozostaje - Å‚Ä…czenie bloków .--C--. *B** DE** I * * * | |_____________ |___ | ^ ^ * F * * L Q * * | | | | |___________________________________ | | | |____________________________ | | | |____________________ | | | |______________________ | | | |____________ | | | | | | | | | ^ ^ ^ ^ ^ B C D E G H * * J K * * N P * * R S T * - konieczne ponowne Å‚Ä…czenie: .--I--. *F** LQ** F I L Q | | | | |_____________________________________________ | | | |_________________________________ | | | |______________________ | | | |_____________ | | | |__ | | | | | | | | | ^ ^ ^ ^ ^ B C D E G H * * J K * * N P * * R S T * 3. UsuwajÄ…c L , zastÄ…pimy go najpierw przez N otrzymujÄ…c F I N Q | | | | |_____________________________________________ | | | |_________________________________ | | | |______________________ | | | |_____________ | | | |__ | | | | | | | | | ^ ^ ^ ^ ^ B C D E G H * * J K * * P * * * R S T * nastÄ™pnie tworzymy poÅ‚Ä…czony blok z bloków J K * * i P * * * oraz N i trzymamy B-drzewo postaci: IIUJ Metody Programowania strona: 12 F I Q | | | | | | | |_________________________________ | | |______________________ | | |_____________ | | |__ | | | | | | | ^ ^ ^ ^ B C D E G H * * J K N P R S T * Minimalna i maksymalna liczba bloków i kluczy B-drzewa rzÄ™du m na kolejnych poziomach: Poziom liczba bloków liczba kluczy (wartoÅ›ci) [min, max] [min, max] P-0: [ 1 ] [ 1 , 2m ] P-1: [ 2 , 2m+1 ] [ 2m , 2m(2m+1) ] P-2: [ 2(m+1), (2m+1)2 ] [ 2m(m+1), 2m(2m+1)2 ] P-3: [ 2(m+1)2, (2m+1)3 ] [ 2m(m+1)2, 2m(2m+1)3 ] ... P-h: [ 2(m+1)h-1, (2m+1)h ] [ 2m(m+1)h-1, 2m(2m+1)h ] StÄ…d liczba n kluczy w B-drzewie rzÄ™du m, wysokoÅ›ci h speÅ‚nia nierównoÅ›ci: 2(m+1)h -1 d" n d" (2m+1)h+1 -1 , czyli (log (n+1)) 1 d" h d" log ((n+1)/2) . (2m+1) (m+1) Przyjmuje siÄ™ mniej dokÅ‚adne oszacowanie: log n d" h d"log n . 2m m PrzykÅ‚ad: m=64=26, n=1000000000=109H"230 Ä…ð h d" 5 .