Donald E. Knuth
Sztuka programowania Tom 3 Sortowanie i wyszukiwanie Z angielskiego przełożyli:
Krzysztof Diks Adam Malinowski
OD REDAKCJI Udostępniane polskim Czytelnikom wielkie dzieło Donalda E. K nutha Sztuka programowania składa się obecnie z trzech tomów. W przedmowie do tom u 1 Autor wspomina o tomach 4 - 7 , które nie zostały jeszcze opublikowane. Czytel nik nie powinien się więc dziwić, gdy w treści znajdzie odwołania do zagadnień zawartych w planowanych tomach. Autor zamieścił w swoim dziele wiele cytatów literackich. Niektóre z nich są m ottam i rozdziałów, a inne stanowią podsumowanie treści zawartych w podroz działach lub mniejszych partiach tekstu. Część z nich byliśmy zmuszeni pozosta wić w wersji oryginalnej. Przekład na język polski nie oddawałby bowiem gry słów wyrażającej myśli Autora. Podobnie postąpiliśmy z cytatam i nieangielskimi przytoczonymi przez A utora w oryginalnym brzmieniu. Kilka dzieł, z których pochodzą m otta, zostało przełożonych na język polski. Gdy jednak tłum aczenie literackie nie oddawało intencji A utora i nie zawierało słów, na użyciu których Mu zależało, zdecydowaliśmy się przytoczyć nowe tłumaczenie. Niektóre z oznaczeń m atem atycznych stosowanych przez A utora różnią się nieco od spotykanych w tradycyjnych książkach matematycznych. Ponieważ za leżało nam na tym, by polskie wydanie dzieła było pod każdym względem jak najbardziej zbliżone do oryginału, pozostawiliśmy je bez zmiany.
PRZEDMOWA Gotowanie je s t sztuką, szlachetną nauką; kucharze to dżentelmeni. — T IT U S LIV IU S, Ab Urbe Condita X X X IX .v i (R o b ert Burton, A natom y o f Melancholy 1 .2 .2 .2 )
M ateriał zawarty w tym tomie to dalszy ciąg rozdziału 2 z tom u 1, poświęconego strukturom danych. Do innych strukturalnych pojęć tam omawianych dodaję pojęcie liniowo uporządkowanych danych. T ytuł „Sortowanie i wyszukiwanie” mógłby sugerować, że ta książka jest przeznaczona tylko dla programistów systemowych, których zadaniem jest przygotowanie programów sortujących ogólnego przeznaczenia lub aplikacji do wyszukiwania informacji. W rzeczywistości jednak problem atyka sortowania i wyszukiwania idealnie nadaje się do omówienia kilku ważnych zagadnień natury ogólnej: • • • •
W jaki sposób tworzyć dobre algorytmy? W jaki sposób poprawiać istniejące programy i algorytmy? W jaki sposób matem atycznie analizować efektywność algorytmów? Jak dokonywać racjonalnego wyboru między różnymi algorytmam i dla tego samego zadania? • Co to znaczy, że algorytm jest „najlepszy z możliwych”? • Jak oddziałują na siebie teoria i praktyka? • W jaki sposób efektywnie wykorzystywać pamięci zewnętrzne, tak jak taśmy, bębny i dyski, w dużych bazach danych? Rzeczywiście wierzę, że każdy naprawdę ważny aspekt programowania daje o so bie znać gdzieś w kontekście sortowania i wyszukiwania! Ten tom zawiera rozdziały 5 i 6 całego dzieła. Rozdział 5 jest poświęcony sortowaniu. Jest to obszerny tem at, który podzieliłem na dwie części: sorto wanie wewnętrzne i sortowanie zewnętrzne. Dodatkowo są tu jeszcze podroz działy, w których omawiam zagadnienia dotyczące perm utacji (podrozdział 5.1) i optymalnych m etod sortowania (podrozdział 5.3). Rozdział 6 dotyczy problemu wyszukiwania w tablicach lub plikach. Omawiam w nim m etody wyszukiwania li niowego, za pomocą porównywania kluczy, wykorzystujące własności numeryczne wyszukiwanych elementów oraz haszowanie. Na koniec rozważam najtrudniejszy IX
X
PRZEDMOWA
problem wyszukiwania względem kluczy wtórnych. Zaskakująco dużo łączy te dwa rozdziały. W tym tomie, w uzupełnieniu do rozdziału 2, omawiam też dwie ważne struktury danych: kolejki priorytetowe (punkt 5.2.3) i listy liniowe reprezentowane jako drzewa zrównoważone (punkt 6.2.3). Tom ten, podobnie jak poprzednie, zawiera wiele m ateriału, który nie wy stępuje gdzie indziej. Wiele osób dzieliło się ze m ną swoimi pomysłami. Mam nadzieję, że przedstawiając je własnymi słowami, nie wypaczyłem ich sensu. Nie miałem czasu, żeby systematycznie śledzić patenty. W rzeczywistości jednak nie zgadzam się z obecnie panującym zwyczajem patentowania algo rytmów (zobacz punkt 5.4.5). Jeśli ktoś prześle mi kopię stosownego patentu, który nie jest cytowany w tej książce, zobowiązuję się zamieścić odwołanie do niego w kolejnych wydaniach. Zachęcam jednak wszystkich do kontynuowania starej m atem atycznej tradycji publicznego udostępniania nowo odkrywanych algorytmów. Istnieją lepsze sposoby zarabiania na życie niż ograniczanie innym dostępu do własnych rozwiązań. Kiedy jeszcze uczyłem, wykorzystywałem tę książkę jako podręcznik do wykładów ze stru k tu r danych na poziomie średniozaawansowanym i zaawansowa nym, pom ijając większość m ateriału matematycznego. M atem atyczną część tej książki wykorzystywałem na zaawansowanych zajęciach z analizy algorytmów. Szczególnie przydatne były podrozdział 5.1, punkt 5.2.2 i podrozdziały 6.3 i 6.4. Do w ykładu z konkretnej złożoności obliczeniowej można by wykorzystać także podrozdział 5.3, punkt 5.4.4 oraz punkty 4.3.3, 4.6.3 i 4.6.4 z tomu 2. Książka ta jest w większej części niezależna, z wyjątkiem rozważań związa nych z m aszyną MIX omówioną w tomie 1. D odatek B zawiera wykaz stosowanych oznaczeń matematycznych; niektóre z nich różnią się nieco od tych spotykanych w tradycyjnych książkach m atem atycznych.
Przedmowa do drugiego wydania To nowe wydanie pasuje do trzecich wydań tomów 1 i 2, w wypadku których świętowałem zakończenie prac nad systemami T^jK i METR FONT przez wyko rzystanie ich do przygotowania publikacji, a zatem do czegoś, do czego zostały zaprojektowane. Przejście na form at elektroniczny umożliwiło mi przejrzenie każdego słowa tekstu i każdego znaku przestankowego. Starałem się zachować młodzieńczy styl pierwotnych sformułowań, tu i ówdzie dodając czasem kilka dojrzałych sądów. Dołożyłem masę nowych ćwiczeń; do mnóstwa starych podopisywałem nowe, poprawione odpowiedzi. Zmiany są wszędzie, ale najwięcej jest ich w punkcie 5.1.4 (o perm utacjach i tableaux), w podrozdziale 5.3 (o optymalnym sortowa niu), w punktach 5.4.9 (o sortowaniu na dyskach) i 6.2.2 (o entropii), w podroz działach 6.4 (o haszowaniu uniwersalnym) i 6.5 (o drzewach wielowymiarowych i drzewach trie).
PRZEDMOWA
XÍ
Rozbudowa dzieła Sztuka programowania trwa! B adania nad sortowaniem i wyszukiwaniem rozszerzają się w niesłychanym tempie. Z tego powodu nie które części są oznaczone znakiem „Uwaga, prace budowlane!” ostrzegającym, że tekst nie został zaktualizowany. Dla przykładu, gdybym w ykładał dziś struktury danych, z pewnością omówiłbym struktury zrandomizowane, takie jak drzewa o nazwie treap. Tutaj jednak mogłem tylko zacytować podstawowe prace na ten tem at i zapowiedzieć powstanie nowego punktu 6.2.5 (zobacz strona 514). Moje archiwum puchnie od materiałów, które zamierzam zamieścić w ostatecznym, wspaniałym, trzecim wydaniu tom u 3, być może za 17 lat; najpierw muszę jednak skończyć tomy 4 i 5, a nie chciałbym odwlekać opublikowania ich dłużej niż to konieczne. Jestem niezmiernie wdzięczny wielu setkom osób, które przez ostatnich 35 lat pomagały mi zbierać i ulepszać przedstawiony tu m ateriał. Większość czar nej roboty związanej z przygotowaniem nowego wydania wykonali Phyllis W in kler (która zapisała tekst z pierwszego wydania w formacie T^jK), Silvio Levy (który go zredagował i pomógł przygotować wiele ilustracji) i Jeffrey Oldham (który przekonwertował ponad 250 oryginalnych ilustracji na form at programu METRP05T). Jak zwykle niezmiernie uczynni okazali się pracownicy działu pro dukcyjnego wydawnictwa Addison-Wesley. Poprawiłem wszystkie błędy, które uważni Czytelnicy znaleźli w wydaniu pierwszym (jak również błędy, których, mimo wszystko, nikt nie znalazł). Sta rałem się też uniknąć błędów w nowych partiach m ateriału. Spodziewam się jednak, że jakieś usterki pozostały i chciałbym jak najszybciej je poprawić. Z tego powodu bez żalu wypłacę 2,56 USD każdemu pierwszemu znalazcy dowolnego błędu technicznego, typograficznego lub historycznego*. Listę wszystkich zgła szanych mi na bieżąco poprawek można znaleźć w witrynie W W W wymienionej na stronie vi niniejszego tomu. Stanford, Kalifornia Luty 1998
D. E. K.
M am nadzieję, że nie ma powodu kwestionować tego, że każdy autor ma pewne przywileje. W szczególności ten, że ta m , gdzie nie je s t rozumiany, należy wyciągnąć wniosek, że chciał przekazać coś pożytecznego i ważnego. — J O N A T H A N S W IF T , Tale o f a Tub, Preface (1 7 0 4 )
* Dotyczy to niestety tylko angielskiego oryginału (przyp. tłum .).
UWAGI DO ĆWICZEŃ Ćwiczenia zawarte w tym dziele zostały opracowane z myślą o Czytelnikach samokształcących się lub biorących udział w zajęciach grupowych. Jest rzeczą niezmiernie trudną, o ile w ogóle możliwą, by nauczyć się czegoś, wyłącznie o tym czytając - nie sprawdzając nabytej wiedzy na konkretnych problemach, a co za tym idzie, nie będąc zmuszonym do myślenia o tym, co się przeczytało. Poza tym najlepiej uczymy się tego, co sami dla siebie odkrywamy. Z tych powodów ćwiczenia stanowią znaczną część książki. A utor dołożył wszelkich starań, by zawrzeć w nich jak najwięcej informacji i wybrać problemy ciekawe, a zarazem kształcące. W wielu książkach proste ćwiczenia są wymieszane z bardzo trudnym i. Jest to zła praktyka, gdyż Czytelnik chce z góry wiedzieć, ile czasu zajmie mu rozwią zanie danego problemu, a przy braku tej informacji może zdecydować się na pomi nięcie wszystkich ćwiczeń. Klasycznym przykładem takiej książki jest Dynamie Programming Richarda Bellmana. To ważna, pionierska praca, w której zadania są umieszczone pod wspólnym tytułem „Ćwiczenia i problemy badawcze” na koń cu niektórych rozdziałów. Skrajnie proste pytania występują w tej książce między trudnymi, nierozwiązanymi problemami. Plotka głosi, że dr Bellman zapytany kiedyś, jak odróżnić ćwiczenia od problemów badawczych, odpowiedział: „To, co dasz radę rozwiązać, jest ćwiczeniem, a co nie - problemem badawczym” . Można znaleźć dobre argum enty za zamieszczeniem w książce zarówno ćwi czeń, jak i problemów badawczych. Aby zatem uwolnić Czytelnika od konieczno ści rozstrzygania, które są którymi, autor wprowadził oceny punktowe wskazujące skalę trudności. Oceny m ają następujące znaczenie: Ocena
Interpretacja
00 Skrajnie proste ćwiczenie, które można rozwiązać natychm iast, jeżeli zrozumiało się tekst. Zazwyczaj takie ćwiczenie można zrobić w pamięci. 10 Prosty problem, który zmusza do przemyślenia przeczytanego tekstu. Czytelnik powinien poradzić sobie z rozwiązaniem takiego ćwiczenia w najgorszym razie w ciągu minuty. Przyda się kartka i ołówek. 20 Przeciętny problem, umożliwiający sprawdzenie podstawowego opano wania m ateriału. Rozwiązanie go zajmie od piętnastu do dwudziestu minut. 30 Problem o umiarkowanym stopniu trudności i/lu b złożoności. Rozwią zanie go może zająć ponad dwie godziny. Przy włączonym telewizorze nawet więcej. xiii
x iv
UWAGI DO ĆWICZEŃ
40 Dość trudny lub pracochłonny problem, nadający się na kolokwium semestralne. Student powinien sobie z nim poradzić w rozsądnym czasie, ale rozwiązanie jest nietrywialne. 50 Problem badawczy, którego według informacji autora nikt zadowalająco nie rozwiązał, choć próbowało wielu. Czytelnik, który znajdzie rozwią zanie, powinien je opublikować. Ponadto autor będzie wdzięczny za jak najszybsze poinformowanie go o rozwiązaniu (o ile jest poprawne). Inne oceny są wyznaczane przez interpolację powyższej „logarytmicznej” skali. Ocena 17 wskazuje na przykład ćwiczenie, które jest nieco prostsze od przeciętnego. Problemy z oceną 50, które zostały ostatnio rozwiązane przez Czytelników, mogą w następnych wydaniach (oraz w erracie publikowanej w In ternecie, zobacz strona vi) pojawić się już z oceną 45. Reszta z dzielenia oceny punktowej przez 5 oznacza ilość szczegółowej pracy do wykonania. Stąd rozwiązywanie ćwiczenia ocenionego na 2Ą może zająć więcej czasu niż ćwiczenia ocenionego na 25, ale to drugie będzie wymagało więcej pomysłowości. A utor starał się właściwie dobrać oceny, ale osobie, która wymyśla zadanie, trudno stwierdzić, jak pracochłonne będzie znalezienie rozwiązania. Przy tym różnym osobom rozwiązywanie niektórych typów problemów przychodzi łatwiej, a innych trudniej. Pozostaje mieć nadzieję, że oceny punktowe zadowalająco przybliżają poziom trudności. Należy je jednak traktować raczej jako ogólne wskazówki co do stopnia trudności niż dokładne miary trudności. Książka ta została napisana dla Czytelników o różnym stopniu m atematycz nej biegłości i wyrafinowania. Skutkiem tego niektóre ćwiczenia są przeznaczone dla osób o zacięciu m atem atycznym . Ocena punktowa trudności ćwiczenia jest poprzedzona literą M, jeżeli dotyczy ono m atem atyki bardziej zaawansowanej niż potrzebna do pisania programów. Ćwiczenie jest oznaczone literami HM, jeżeli jego rozwiązanie wymaga znajomości analizy matematycznej lub matem atyki wyższej nie przedstawionej w książce. Oznaczenie HM nie musi świadczyć o tym, że ćwiczenie jest trudne. Niektóre ćwiczenia są poprzedzone strzałką są one wyjątkowo pouczają ce i wyjątkowo polecane. Oczywiście po żadnym studencie/czytelniku nie należy się spodziewać, że rozwiąże wszystkie ćwiczenia; dlatego też zostały wyróżnione te najcenniejsze. (Nie oznacza to jednak wcale, że pozostałymi nie warto się zaj mować!) Każdy Czytelnik powinien przynajmniej spróbować rozwiązać wszystkie ćwiczenia z oceną 10 lub niższą; strzałki są przy tych z trudniejszych problemów, za które należałoby się zabrać w pierwszej kolejności. Rozwiązania większości ćwiczeń są zamieszczone w oddzielnej części zaty tułowanej „Odpowiedzi do ćwiczeń” . Należy korzystać z nich mądrze, to znaczy nie podglądać odpowiedzi, dopóki naprawdę nie spróbuje się rozwiązać zadania samodzielnie, i nie udawać, że nie m a się czasu. Odpowiedź może się okazać pouczająca i pomocna, ale dopiero po samodzielnym rozwiązaniu ćwiczenia lub po uczciwej próbie zrobienia tego. Podane rozwiązanie jest zazwyczaj krótkie, a jego szczegóły są omówione raczej pobieżnie. Autor zakłada bowiem, że Czy
UWAGI DO ĆWICZEŃ
XV
telnik próbował samodzielnie zrobić ćwiczenie. Czasami rozwiązanie nie stanowi pełnej odpowiedzi na postawione pytanie, a czasami zawiera aż nadto informacji. Całkiem możliwe, że Czytelnik znajdzie lepsze rozwiązanie od tego opublikowa nego w książce albo znajdzie w rozwiązaniu błąd. W takim wypadku autor będzie wdzięczny za podanie wszystkich szczegółów. Kolejne wydania książki będą za wierały poprawione rozwiązania opatrzone nazwiskami pogromców błędów. Przy rozwiązywaniu danego ćwiczenia można posługiwać się rozwiązaniami poprzednich ćwiczeń, chyba że tekst wyraźnie tego zabrania. Ponieważ autor uwzględnił taką sytuację przy doborze ocen punktowych, może się okazać, że ćwiczenie n + 1 ma niższą ocenę niż ćwiczenie n, choć rozwiązanie ćwiczenia n wynika z ogólniejszego wyniku uzyskanego w ćwiczeniu n + 1 .
Zestawienie oznaczeń:
► Polecane M Dla zainteresowanych matematyką HM Wymaga znajomości matematyki wyższej
00 10 20 30 40 50
Trywialne Proste (minuta) Średnie (kwadrans) Umiarkowanie trudne Na egzamin Problem badawczy
ĆW ICZENIA ► 1. 2.
[00] Co oznacza ocena „M2 0 ”? [10] Co mogą dać Czytelnikowi ćwiczenia?
3. [HMĄ5] Udowodnij, że dla całkowitychn, n > 2, równanie x n -f y n — z n nie ma rozwiązań w dodatnich liczbach całkowitych y,z.
Dwie godziny ćwiczeń dziennie . . . wystarczająco, żeby utrzym ać wierzchowca w kondycji. — M. H. M A H O Ń , The Handy Horse Book (1 8 6 5 )
SPIS TREŚCI
R ozd ział 5 — S o r t o w a n i e .........................................................................................
1
*5.1. Kombinatoryczne własności p e r m u ta c ji.......................................................... *5.1.1. In w ersje......................................... *5.1.2. Permutacje m u ltiz b io r ó w ...................................................................... *5.1.3. S e k w e n s y .................................................................................................... *5.1.4. Tableaux i i n w o lu c j e ............................................................................... 5.2. Sortowanie w e w n ę tr z n e ........................................................................................ 5.2.1. Sortowanie przez w sta w ia n ie ................................................................... 5.2.2. Sortowanie przez zamienianie ............................................................... 5.2.3. Sortowanie przez w y b ie r a n ie ................................................................... 5.2.4. Sortowanie przez s c a l a n i e ........................................................................ 5.2.5. Sortowanie przez rozrzucanie................................................................... 5.3. Sortowanie op tym aln e............................................................................................ 5.3.1. Sortowanie z minimalną liczbą p o r ó w n a ń ......................................... *5.3.2. Scalanie za pomocą minimalnej liczby p o r ó w n a ń ............................ *5.3.3. Wybór z minimalną liczbą p o r ó w n a ń ................................................. *5.3.4. Sieci s o r t u j ą c e ............................................................................................ 5.4. Sortowanie z e w n ę t r z n e ........................................................................................ 5.4.1. Scalanie wielowejściowe i wybór z p o d m ia n ą .................................... *5.4.2. Scalanie w ie lo fa z o w e ............................................................................... *5.4.3. Scalanie k ask ad ow e................................................................................... *5.4.4. Odczytywanie taśmy w s t e c z .................................................................. *5.4.5. Sortowanie o s c y la c y j n e .......................................................................... *5.4.6. Praktyczne aspekty scalania ta śm o w e g o ............................................. *5.4.7. Zewnętrzne sortowanie p o zy cy jn e ......................................................... *5.4.8. Sortowanie na dwóch t a ś m a c h ............................................................. *5.4.9. Dyski i b ę b n y ........................................................................................... 5.5. Podsumowanie, historia i b ib lio g r a fia ..............................................................
11 11 23 36 49 76 83 110 145 166 178 190 190 208 219 232 263 267 284 306 318 332 338 366 372 381 408
R ozd ział 6 — W y s z u k iw a n ie ....................................................................................
421
Wyszukiwanie lin io w e ............................................................................................ Wyszukiwanie przez porównywanie k lu c z y ...................................................... 6.2.1. Wyszukiwanie w tablicy uporządkowanej ........................................ 6.2.2. Wyszukiwanie w drzewach b in a r n y c h ................................................. 6.2.3. Drzewa zrównoważone.............................................................................. 6.2.4. Drzewa wyższych s t o p n i..........................................................................
425 439 439 457 492 517
6.1. 6.2.
xvi
SPIS TREŚCI
x v ii
6.3. Wyszukiwanie cyfrowe ........................................................................ 6.4. H a s z o w a n ie .......................................... 6.5. Wyszukiwanie względem kluczy w tó r n y c h .......................................................
528 552 602
Odpowiedzi do ćwiczeń
.............................................................................
629
Dodatek A — Tabele wielkości nu m erycznych ...............................................
807
1. Podstawowe stałe (w systemie d z ie siętn y m )............................................... 2. Podstawowe stałe (w systemie ósem kow ym )............................................... 3. Liczby harmoniczne, liczby Bernoułliego, liczby Fibonacciego . . . .
807 808 809
Dodatek B — Wykaz oznaczeń Skorowidz ze słownikiem
.............................................................................
811 816
ROZDZIAŁ
PIĄTY
SORTOWANIE Nic nie je s t tak trudne ani tak ryzykowne, ani też tak niepewne, ja k zaprowadzanie nowych porządków. „Ale nie jesteś w stanie przejrzeć jednocześnie wszystkich pozwoleń” , zaprotestował Drake. „Nie musimy tego robić, Paul. Po prostu uporządkujemy je i poszukamy duplikatów” . — P E R R Y M A S O N , in The Case o f the Angry M ourner (1 9 5 1 ) K om puter „Treesort” - Korzystając z tej nowej komputerowej metody, można szybko rozpoznać ponad 260 różnych gatunków drzew rosnących w Stanach, na Alasce i w Kanadzie, ja k również palmy, drzewa pustynne i inne egzotyczne drzewa. Żeby określić, ja k i to gatunek drzewa, wystarczy ty i ko włożyć igłę. — Catalog of Edmund Scientific Company (1 9 6 4 )
Ten rozdział poświęcimy zagadnieniu, które często występuje w programowaniu: rozmieszczaniu danych w porządku rosnącym bądź malejącym. W yobraźmy so bie, jak trudne byłoby posługiwanie się słownikiem, gdyby zawarte w nim słowa nie były uporządkowane alfabetycznie! Podobnie sposób, w jaki przechowujemy dane w pamięci kom putera, ma często ogromny wpływ na szybkość i prostotę algorytmów, które operują na tych danych. Chociaż w słownikach języka angielskiego „sortowanie” (sorting) definiuje się jako proces segregowania lub rozdzielania rzeczy na grupy według podobieństwa określonych cech, programiści komputerowi, tradycyjnie już, używają tego słowa na określenie procesu ustawiania obiektów (rzeczy) w porządku rosnącym lub malejącym. Taki proces powinien być może nazywać się porządkowaniem ( orde ring), a nie sortowaniem, ale każdy, kto spróbuje używać słowa „porządkowanie” , szybko będzie miał wątpliwości z powodu wielu różnych znaczeń, jakie m a to słowo. Jest tak w szczególności w języku angielskim. Rozważmy na przykład zdanie w języku angielskim: „Since only two of our tape drives were in working order, I was ordered to order more tape units in short order, in order to order the data several order of m agnitude faster” . W swobodnym tłum aczeniu na język polski zdanie to ma postać: „Ponieważ tylko dwa z naszych napędów taśmowych były w porządku, polecono mi zamówić szybko więcej jednostek taśmowych, tak żeby przyśpieszyć porządkowanie danych o kilka wielkości” . Słówko „order” pojawia się też bardzo często w angielskiej terminologii m atem atycznej. Mówimy 1
2
SORTOWANIE
5
„order of a group” (rząd grupy), „order of a perm utation” (rząd perm utacji), „the order of a branch point” (stopień punktu podziału), „relations of order” (relacje porządku) itd., itd. Tak więc angielskie słowo „order” może rzeczywi ście doprowadzić do niejednoznaczności. Dlatego do określenia komputerowego porządkowania używa się w języku angielskim słowa „sorting” , a za jego polski odpowiednik przyjmiemy słowo „sortowanie” . Na nazwę procesu sortowania proponowano też term in „sekwencjonowanie” (sequencing), czyli ustawianie jeden po drugim. W ydaje się jednak, że to słowo rzadko jest kojarzone z procesem porządkowania, w szczególności gdy pojaw iają się takie same elementy. Sporadycznie też jest ono w sprzeczności z innymi term inam i. Jest też prawdą, że samo słowo „sortowanie” jest nadużywane, ale mimo to zagościło ono już na stałe w języku informatyki. Dlatego też będziemy używali słowa „sortowanie” jako nazwy procesu porządkowania i nie zamierzamy się więcej z tego tłumaczyć. Najważniejszymi zastosowaniami sortowania są: a) Rozwiązanie problemu „grupowania”, w którym wszystkie elementy o tych samych identyfikatorach są zbierane razem. Przypuśćmy, że mamy 10000 elemen tów w dowolnym porządku, a wiele z nich ma te same wartości. Naszym celem jest takie rozmieszczenie tych elementów, żeby wszystkie o tej samej wartości występowały kolejno obok siebie. To jest w istocie problem sortowania w pier wotnym znaczeniu tego słowa i można go rozwiązać, sortując dane wejściowe w nowym znaczeniu, tak żeby elementy występowały w porządku niemalejącym v\ < V2 < • • * < ^ioooo- Ten przykład wyjaśnia w pełni nowe znaczenie słowa „sortowanie” . b) Kojarzenie elementów z dwóch lub więcej ciągów. Jeśli kilka ciągów danych zostało posortowanych w tym samym porządku, możliwe jest odnalezienie wspól nych elementów tylko w jednym przebiegu. Taką m etodą posłużył się Perry Mason w śledztwie (zobacz cytat na początku rozdziału). Zazwyczaj dużo szyb ciej można przetworzyć plik informacji, gdy przetwarzamy go sekwencyjnie od początku do końca, zamiast po nim „skakać” (chyba, że cały plik zmieści się w pamięci operacyjnej). Sortowanie umożliwia stosowanie sekwencyjnego dostę pu do dużych plików, jako wygodnego sposobu adresowania bezpośredniego. c) Wyszukiwanie informacji za pomocą kluczy. Sortowanie jest pomocne rów nież w wyszukiwaniu, o czym się przekonamy w rozdziale 6 . Tak więc jest przy datne w tworzeniu łatwych do odbierania przez ludzi danych wyjściowych. Praw dę mówiąc lista, która została ułożona w porządku alfabetycznym, często wyglą da bardziej m iarodajnie, jeśli nawet podane na niej wartości numeryczne zostały źle obliczone. Chociaż sortowanie tradycyjnie było głównie wykorzystywane w przetwa rzaniu danych biznesowych, to tak naprawdę jest ono narzędziem, o którym powinien pam iętać każdy program ista i którego można użyć w wielu sytuacjach. W ćwiczeniu 2.3.2-17 omówiliśmy jego zastosowanie w upraszczaniu wyrażeń algebraicznych. Poniższe ćwiczenia ilustrują różnorodność typowych zastosowań sortowania.
5
SORTOWANIE
3
Jednym z pierwszych dużych programów komputerowych, ukazujących wszechstronność sortowania, był kom pilator LARC Scientific Compiler opra cowany w 1960 roku przez J. Erdwinna, D. E. Fergusona oraz ich partnerów z Computer Sciences Corporation. Ten optymalizujący kom pilator rozszerzonego języka FORTRAN bardzo często korzystał z sortowania, tak aby różne algorytmy wykorzystywane w procesie kompilacji pojaw iały się z właściwymi częściami programu źródłowego w dobrej kolejności. Pierwszym przebiegiem kom pilatora była analiza leksykalna, w której kod źródłowy program u w języku FORTRAN był dzielony na pojedyncze leksemy, każdy reprezentujący identyfikator lub stałą, lub operator itd. Każdemu leksemowi przypisywano kilka numerów porządkowych; po posortowaniu po identyfikatorach i odpowiednich numerach porządkowych wszystkie wystąpienia danego identyfikatora ukazywały się razem. Identyfikatory definiowane przez użytkownika, takie jak nazwy funkcji, param etry, zmienne tablicowe, dostawały małe numery porządkowe, tak aby mogły pojawić się jako pierwsze wśród leksemów o tym samym identyfikatorze; ułatw iało to wykrywanie nieprawidłowości w używaniu tych samych identyfikatorów, jak i alokację pamięci zgodnej z deklaracjami EQUIVALENCE. Tak zebrane informacje o każdym identy fikatorze były dołączane do każdego leksemu; w ten sposób nie było potrzeby utrzymywać w szybkiej pamięci wewnętrznej „tablicy symboli” . Zmodyfikowane leksemy były następnie sortowane względem innego num eru porządkowego, co w zasadzie doprowadzało program źródłowy do początkowej postaci, z tym że sposób numerowania został tak sprytnie skonstruowany, aby wyrażenia ary t metyczne występowały w wygodniejszej „notacji polskiej” . Sortowanie było również wykorzystywane w dalszych fazach kompilacji do optymalizacji pętli, do tworzenia listy błędów itd. Krótko mówiąc, kompilator został zaprojektowany tak, że w zasadzie całe przetwarzanie mogło być wykonywane sekwencyjnie na podstawie plików przechowywanych w pomocniczej pamięci bębnowej, ponieważ odpowiednie numery porządkowe były przydzielone danym tak, aby mogły być sortowane na różne potrzebne sposoby. W latach sześćdziesiątych producenci komputerów szacowali, biorąc pod uwagę wszystkich klientów, że sortowanie zajmuje ponad 25 procent czasu pracy komputerów. Faktycznie w wielu instalacjach sortowanie zajmowało ponad po łowę czasu pracy. Z tych danych statystycznych można wyciągnąć wnioski, że albo (i) sortowanie ma wiele ważnych zastosowań, albo (ii) wielu użytkowników korzysta z sortowania bez potrzeby, albo też (iii) w powszechnym użyciu były nieefektywne algorytmy sortowania. Praw da pewnie leży gdzieś między tymi trzem a możliwościami, ale w każdym razie widzimy, że sortowanie z praktycznego punktu widzenia zasługuje na dokładniejsze zbadanie. Nawet gdyby sortowanie nie miało żadnych zastosowań, to i tak byłoby wiele powodów do tego, by je zgłębić! Wielce pomysłowe algorytmy, które zostały odkryte, pokazują, że sortowanie samo w sobie jest niezwykle interesującym tem atem do studiowania. W tej dziedzinie istnieje zarówno wiele fascynujących, nierozwiązanych problemów, jak i sporo już rozwiązanych. Z szerszej perspektywy zobaczymy również, że algorytmy sortowania stano wią wartościowe studium sposobów ogólnego podejścia do rozwiązywania próbie-
4
SORTOWANIE
5
mów programistycznych. W tym rozdziale przedstawimy wiele istotnych zasad posługiwania się strukturam i danych. Prześledzimy rozwój kilku technik sorto wania w celu ukazania idei, które za nimi stały. Na podstawie tego studium nauczymy się wiele o strategiach, które są pomocne w tworzeniu dobrych algo rytmów dla innych zadań komputerowych. Sortowanie jest doskonałą ilustracją ogólnych zagadnień związanych z ana lizą algorytmów - sposobów określania wydajności algorytmów w celu dokona nia rozsądnego wyboru między konkurencyjnymi algorytmami. Czytelnicy o za interesowaniach m atem atycznych znajdą w tym rozdziale kilka interesujących sposobów oceny szybkości działania algorytmów oraz rozwiązywania złożonych zależności rekurencyjnych. M ateriał został jednak tak opracowany, że Czytelnicy nie zainteresowani m atem atyką mogą spokojnie pominąć te rozważania. Zanim przejdziemy dalej, powinniśmy jaśniej zdefiniować nasze zadanie i wprowadzić potrzebną terminologię. Danych jest N elementów i ii , i? 2, . . . , R n i które m ają być posortowane. Elementy będziemy nazywać rekordami, a cały zestaw N rekordów będziemy nazywać plikiem. Każdy rekord R j ma klucz K j , który steruje procesem sortowania. Zazwyczaj poza kluczem występują też dodatkowe dane. Taka dodatkowa „informacja” nie ma wpływu na sortowanie, z wyjątkiem tego, że musi być przemieszczana jako część każdego rekordu. Relacja porządku „< ” jest określona na kluczach, tak że są spełnione nastę pujące warunki dla każdych wartości kluczy a, 6, c: i) Dokładnie jedna z możliwości a < 6, a = ó, b < a jest prawdziwa. (Jest to prawo trychotom ii). ii) Jeśli a < b i b < c, to a < c. (Jest to znane prawo przechodniości). W łasności (i) i (ii) charakteryzują matem atyczne pojęcie porządku liniowego, nazywanego także porządkiem całkowitym. Każda relacja „< ” spełniająca te dwa warunki może być użyta w większości m etod sortowania omawianych w tym rozdziale, chociaż niektóre z nich stososują się tylko do kluczy numerycznych lub tekstowych ze zwykłym porządkiem. Celem sortowania jest wyznaczenie perm utacji p ( l ) p ( 2 ) .. .p(N ) indeksów { 1 , 2 , . . . , N } , która określa niemalejący porządek kluczy: Kp(i) < Kp( 2) <
* < Kp(N)-
(i)
O sortowaniu mówimy, że jest stabilne, jeśli zachowuje wyjściowy porządek kluczy o tych samych wartościach. Innymi słowy, sortowanie stabilne ma dodatkową własność, że p(i) < p (j),
gdy
K pi i)
=
K pU)
i
i < j.
(2)
W pewnych przypadkach będziemy chcieli fizycznie przemieścić rekordy w pamięci, tak żeby ich klucze były uporządkowane. Jednak w innych przypad kach wystarczy tylko zbudować pomocniczą tablicę, w której zostaje w pewien
SORTOWANIE
5
5
sposób zapisana perm utacja wyznaczająca porządek kluczy, ale same rekordy nie zmieniają swojego położenia. W kilku m etodach sortowania opisywanych w tym rozdziale zakłada się istnienie jednej lub obu wartości „oo” i oo” , które definiuje się odpowiednio jako wartość większą lub mniejszą od wszystkich kluczy: -o o < K j < oo,
dla 1 < j < N .
(3 )
Takie ekstremalne wartości są czasami wykorzystywane jako sztuczne klucze lub jako wartownicy. W (3 ) wykluczamy zachodzenie równości; jeśli równość jest dopuszczalna, to nasze algorytmy można tak zmodyfikować, żeby nadal pracowały, ale zazwyczaj kosztem pewnej elegancji i efektywności. Sortowanie można ogólnie podzielić na sortowanie wewnętrzne, w którym rekordy są całkowicie przechowywane w szybkiej pamięci wewnętrznej, i na sor towanie zewnętrzne, gdy mamy więcej rekordów niż jednorazowo można zmieścić w dogodny sposób w pamięci wewnętrznej. Sortowanie wewnętrzne umożliwia większą elastyczność w organizowaniu danych i dostępie do nich, podczas gdy sortowanie zewnętrzne uczy nas, jak radzić sobie z dość ostrym i ograniczeniami dotyczącymi dostępu do danych. Czas potrzebny do posortowania N rekordów za pomocą dobrego algorytmu sortowania jest z grubsza proporcjonalny do N \o g N; wykonywanych jest około log N „przebiegów” przez dane. To jest najmniejszy możliwy czas, co pokażemy w punkcie 5 .3 . 1 , jeśli rekordy są dane w losowym porządku i jeśli sortowanie jest wykonywane przez porównywanie kluczy param i. Tak więc, jeśli podwoimy liczbę rekordów, to czas sortowania zwiększy się niewiele więcej niż dwukrotnie. (W rzeczywistości, jeśli klucze są różne, to przy N dążącym do nieskończoności lepszym wskaźnikiem czasu potrzebnego na sortowanie jest TY^logiY)2, ponieważ rozmiar kluczy musi rosnąć co najmniej tak szybko jak log jednak w prak tycznych zastosowaniach N nigdy naprawdę nie dąży do nieskończoności). Jeśli o kluczach wiadomo, że są rozmieszczone losowo zgodnie z pewnym cią głym rozkładem liczbowym, to przekonamy się, że można je posortować średnio w O (N ) krokach. ĆW ICZENIA - zestaw pierwszy 1. [M20] Korzystając z praw trychotomii i przechodniości, udowodnij, że permutacja p ( l ) p ( 2 ) .. .p{N) jest jednoznacznie wyznaczona, jeśli o sortowaniu zakłada się, że jest stabilne. 2. [21] Załóżmy, że w pewnym pliku każdy rekord Rj zawiera dwa klucze, „klucz główny” K j i „klucz wtórny” k j , i na każdym zbiorze kluczy jest określony porządek liniowy <. Możemy teraz w zwykły sposób zdefiniować porządek leksykograficzny na parach kluczy (K, k): (Ki, ki) < ( K j , k j ) ,
jeśli
Ki < K j
lub jeśli
Ki — K j
i
ki < kj.
Alicja posortowała dany plik najpierw po kluczach głównych, otrzymując n grup rekordów o takich samych kluczach w każdej grupie,
Kp(i) = • • *= K p(i1) < K p(i1_|_i) — *• • = iCP(i2) < **■< K Pan_1+1) = **• = ATp(jn),
6
SORTOWANIE
5
gdzie i n = N. Następnie posortowała każdą z n grup R p ^ . _!+i), ■■•, ^p(ij) P° kluczach wtórnych. Bolesław wziął ten sam plik wejściowy i posortował go najpierw po kluczach wtórnych; następnie otrzymany plik posortował po kluczach głównych. Cezary wziął także ten sam plik, wykonał jedno sortowanie, wykorzystując porzą dek leksykograficzny na kluczach głównych i wtórnych ( Kj , k 3). Czy każde z nich otrzymało ten sam wynik? 3. [M25] Niech < będzie relacją na K i , . . . , K n , dla której zachodzi prawo trychotomii, ale nie prawo przechodniości. Udowodnij, że nawet bez prawa przechodniości jest możliwe posortowanie rekordów w sposób stabilny tak, żeby były spełnione warunki (1) i (2); w rzeczywistości istnieją co najmniej trzy rozmieszczenia, które spełniają te warunki! ► 4. [21] W słownikach w rzeczywistości nie jest używany ścisły porządek leksyko graficzny, ponieważ duże i małe litery muszą występować na zmianę. Tak więc jest potrzebny porządek przedstawiony poniżej: a < A < aa < AA < AAA < Aachen < aah < • • • < zzz < ZZZ. Wyjaśnij, w jaki sposób zaimplementować porządek słownikowy. ► 5. [M28 ] Zaproponuj sposób kodowania binarnego wszystkich nieujemnych liczb cał kowitych tak, że jeśli kodem n jest słowo p(n), to zachodzi m < n wtedy i tylko wtedy, gdy p(m) jest leksykograficznie mniejsze od p{n). Ponadto, p(m) nie powinno być prefiksem p(n) dla jakiegokolwiek m ^ n. Jeśli to możliwe, długość p(n) powinna wynosić lg n + O (loglogn) dla wszystkich dużych n. (Taki kod jest przydatny, jeśli chcemy sortować teksty, które zawierają słowa zmieszane z liczbami, lub jeśli chcemy odwzorować dowolnie duży alfabet na słowa binarne). 6. [15] Pan B. C. Tępogłowy (programista maszyny MIX) chciał się dowiedzieć, czy liczba zapamiętana w komórce A jest większa, mniejsza, czy równa liczbie zapamiętanej w komórce B. Zatem napisał „LDA A; SUB B” i sprawdzał, czy wartość rejestru A była dodatnia, ujemna, czy równa zero. Jaki poważny błąd zrobił i co powinien zrobić w zamian? 7. [17] Napisz podprogram w języku maszyny MIX porównujący klucze składające się z wielu liczb i spełniający następującą specyfikację: Wywołanie:
JMP COMPARE
Warunki wejściowe: r ll = n; CONTENTS (A + k) — dh i CONTENTS (B + k) = 6*, dla 1 ^ k ^ n; przyjmij, że n ^ 1. Warunki wyjściowe: CI = GREATER, jeśli (an, • . . , ai) > (6n, . . . , £>i); CI = EQUAL, jeśli (an, . . . , ai ) = (6n, . . . ,&i); CI = LESS, jeśli (an, . . . , oi ) < (6n, • • • M ) \ rX i r ll mogą być naruszone. Tutaj relacja (an, . . . , ai) < (b7L). . . , b\) oznacza porządek leksykograficzny z lewa na prawo; to znaczy istnieje indeks j taki, że dk = bk dla n ^ k > j , ale a3 < bj. ► 8. [30] Komórki A i B zawierają dwie liczby a i b. Pokaż, że możnanapisać program w języku maszyny MIX bez używania żadnego operatora skoku, który obliczai zapamię tuje min (a, 6) w komórce C. (Ostrzeżenie: Ponieważ nie wolno testować, czy wystąpił
5
SORTOWANIE
7
lub nie nadmiar arytmetyczny, zatem mądrze jest zagwarantować, żeby nadmiar był niemożliwy niezależnie od wartości a i 6). 9. [M27] Sortujemy niemalejąco n liczb wybranych z przedziału (0 , 1 ) losowo (z roz kładem jednostajnym) i niezależnie. Jakie jest prawdopodobieństwo, że r-ta z tych liczb, w kolejności od najmniejszej, jest ^ x l
ĆW ICZENIA - zestaw drugi W każdym z następnych ćwiczeń sformułowano problem, przed jakim mógł stanąć programista komputerowy w dawnych latach, kiedy to komputery nie miały dostatecz nie dużej pamięci o dostępie bezpośrednim. Zaproponuj „dobry” sposób rozwiązania takiego problemu, przy założeniu 7 że do dyspozycji jest tylko pamięć wewnętrzna skła dająca się jedynie z kilku tysięcy słów oraz około pół tuzina jednostek taśmowych (wystarczająco do sortowania). Algorytmy, które zachowują się dobrze przy takich ograniczeniach, okazują się być także efektywne na współczesnych maszynach. 10. [15] Na taśmie znajduje się jeden milion słów danych. W jaki sposób można sprawdzić, ile różnych słów znajduje się na taśmie? 11. [18] Pracujesz w urzędzie skarbowym. Otrzymałeś miliony formularzy „infor macyjnych”, w których instytucje powiadamiają o dokonanych wypłatach dla osób prywatnych, oraz miliony indywidualnych zeznań podatkowych o dochodach. W jaki sposób wychwycić osoby, które nie podały pełnej informacji o swoich dochodach? 12. [M25] ( Transponowanie macierzy) Dana jest taśma magnetyczna zawierająca million słów, w których zapisano elementy macierzy 1000 x 1000 w porządku wierszowym: ai,i a i ,2 01 ,100002,1 .. . 02,1000 ■■■ aiooo,iooo- W jaki sposób można utworzyć taśmę, na której elementy macierzy są przechowywane w porządku kolumnowym ai,i a 2,i . . . 01000,1 oi ,2 .. . aiooo,2 *• • 01000,1000? (Postaraj się wykonać mniej niż dwanaście przebie gów przez dane). 13. [M26] W jaki sposób „potasować” losowo duży plik składający się z N słów? 14. [20] Pracujemy na dwóch systemach komputerowych, w których kolejność znaków alfanumerycznych jest różna. W jaki sposób można sortować pliki alfanumeryczne na jednym komputerze zgodnie z porządkiem stosowanym na drugim z nich? 15. [18] Dana jest wyjątkowo długa lista osób urodzonych w Stanach Zjednoczonych razem z nazwami stanów, w których się urodzili. W jaki sposób można policzyć liczbę osób urodzonych w każdym stanie? (Zakładamy, że nikt nie pojawia się na liście więcej niż raz). 16. [20] Żeby ułatwić dokonywanie zmian w dużych programach w języku FORTRAN, postanowiono napisać program do tworzenia odsyłaczy.; taki program dostaje na wejściu program napisany w języku FORTRAN i drukuje ten program wraz z indeksem, który pokazuje użycie w nim każdego identyfikatora. W jaki sposób taki program powinien zostać wykonany? ►17. [55] (Sortowanie kart bibliotecznych) Zanim powstały komputerowe bazy danych, w każdej bibliotece znajdował się katalog z kartami, w którym użytkownicy wyszukiwali interesujące ich książki. Jednakże zadanie utrzymywania kart katalogowych w porządku wygodnym dla człowieka stawało się coraz bardziej skomplikowane wraz z rozrostem zasobów bibliotecznych. Poniższa lista ułożona w porządku „alfabetycznym” pozwala zapoznać się z procedurami postępowania zalecanymi w Zasadach wypełniania kart katalogowych amerykańskiego stowarzyszenia bibliotek (Chicago: 1942):
8
SORTOWANIE
Tekst na karcie R. Accademia nazionale dei Lincei, Rome 1812; ein historischer Roman Bibliothèque d ’histoire révolutionnaire Bibliothèque des curiosités Brown, Mrs. J. Crosby Brown, John Brown, John, mathematician Brown, John, of Boston Brown, John, 1715-1766 BROWN, JOHN, 1715-1766 Brown, John, d. 1811 Brown, Dr. John, 1810-1882 Brown-Wiiliams, Reginald Makepeace Brown America Brown & Dallison’s Nevada directory Brownjohn, Alan Den’, Vladimir Eduardovich, 1867The den Den lieben süssen Mädeln Dix, Morgan, 1827-1908 1812 ouverture Le XIXe siècle français The 1847 issue of U. S. stamps 1812 overture I am a mathematician IBM journal of research and development ha-I ha-ehad la; a love story International Business Machines Corporation al-Khuwarizml, Muhammad ibn Müsä, ft. 8 1 3 -8 4 6 Labour. A magazine for all workers Labor research association Labour, see Labor McCall’s cookbook McCarthy, John, 1927Machine-independent computer programming MacMahon, Maj. Percy Alexander, 1854-1929 Mrs. Dalloway Mistress of mistresses Royal society of London St. Petersburger Zeitung Saint-Saëns, Camille, 1835-1921 Ste-Marie, Gaston P Seminumerical algorithms Uncle Tom’s cabin
5
Uwagi Ignore foreign royalty (except British) Achtzehnhundert zwolf Treat apostrophe as space in French Ignore accents on letters Ignore designation of rank Names with dates follow those without . . . and the latter are subarranged by descriptive words Arrange identical names by birthdate Works „about” follow works „by” Sometimes birthdate must be estimated Ignore designation of rank Treat hyphen as space Book titles follow compound names & in English becomes „and” Ignore apostrophe in names Ignore an initial article . *. provided it’s in nominative case Names precede words Dix-huit cent douze Dix-neuvieme Eighteen forty-seven Eighteen twelve (a book by Norbert Wiener) Initials are like one-letter words Ignore initial article Ignore punctuation in titles
Ignore initial ,,al-” in Arabic names Respell it „Labor” Cross-reference card Ignore apostrophe in English Me = Mac Treat hyphen as space Ignore designation of rank „Mrs”. = „Mistress” Don’t ignore British royalty „St” . = „Saint”, even in German Treat hyphen as space Saint e (a book by Donald Ervin Knuth) (a book by Harriet Beecher Stowe)
SORTOWANIE
5
9
Uwagi
Tekst na karcie U. S. bureau of the census Vandermonde, Alexandre Théophile, 1735-1796 Van Valkenburg, Mac Elwyn, 1921Von Neumann, John, 1903-1957 The whole art of legerdemain Who’s afraid of Virginia Woolf? Wijngaarden, Adriaan van, 1916-
„U. S”. = „United States”
Ignore space after prefix in surnames Ignore initial article Ignore apostrophe in English Surname begins with upper case letter
(Do większości tych zasad stosują się pewne wyjątki. Jest także wiele zasad, które nie zostały tu zilustrowane). Jeśli naszym zadaniem jest sortowanie za pomocą komputera dużych ilości kart bibliotecznych, a następnie pielęgnowanie bardzo dużego pliku takich kart, ale nie mamy wpływu na zmianę polityki wypełniania kart, to jak należy zorganizować dane, żeby ułatwić ich sortowanie i scalanie? 18. [M25] (E. T. Parker) Leonard Euler postawił hipotezę [Nbva Acta Acad. Sci. Petropolitanae 13 (1795), 4 5 -6 3 , §3; napisane w 1778], że równanie
nie ma rozwiązań w dodatnich liczbach całkowitych u, v , w , x, y, z. W tym samym czasie postawił także hipotezę, że równanie
n —i —Xnn X\n -|-, *■■+. Xn nie ma całkowitych, dodatnich rozwiązań dla każdego n ^ 3, ale ta uogólniona hipoteza okazała się nieprawdziwa. Za pomocą komputera odkryto, że 275 + 845 + 1105 4- 1335 = 1445; zobacz L. J. Lander, T. R. Parkin, J. L. Selfridge, M a t h . Comp. 21 (1967), 446-459. Nieskończenie wiele rozwiązań dla n = 4 podał Noam Elkies [Math. Comp. 51 (1988), 825-835]. Czy można by zastosować sortowanie do znalezienia kontrprzykładu dla hipotezy Eulera, gdy n — 6? ►19. [24] Dany jest plik zawierający około miliona 30-bitowych słów binarnych x \ , . . . , xjv. Jaki jest dobry sposób na znalezienie w pliku wszystkich dopełniających się par {xi,Xj}, które tam występują? (Dwa słowa nazywamy dopełniającymi się, gdy na tych samych pozycjach w jednym z nich pojawia się 0, a w drugim 1; tak więc dopełniają się wtedy i tylko wtedy, gdy ich sumą jest ( 11. . . 1 ) 2 , jeśli potraktujemy je jako liczby binarne). ►20. [25] Dany jest plik zawierający 1000 30-bitowych słów x \ , . . . , xiooo; w jaki sposób można sporządzić listę wszystkich par ( x i , x j ) takich, że Xi = Xj z wyjątkiem co najwyżej dwóch bitów? 21. [22] W jaki sposób odnaleźć pięcioliterowe anagramy, jakimi w języku angielskim są na przykład CARET, CARTE, CATER, CRATE, REACT, RECTA, TRACĘ; CRUEL, LUCRE, ULCER; D0WRY, R0WDY, W0RDY? [Jest interesujące, czy w języku angielskim istnieje jakikolwiek inny zbiór dziesięciu lub więcej piecioliterowych anagramów poza znanym zbiorem APERS, ASPER, PARES, PARSE, PEARS, PRASE, PRESA, RAPES, REAPS, SPAER, SPARE, SPEAR, do którego można dołączyć francuskie słowo APRÈS].
10
SORTOWANIE
5
22. [M28] Mamy daną dość dużą liczbę grafów zorientowanych. Jaki jest najwygod niejszy sposób zgrupowania grafów izomorficznych? (Dwa grafy zorientowane są izomor ficzne, jeśli istnieje wzajemnie jednoznaczna odpowiedniość między ich wierzchołkami i wzajemnie jednoznaczna odpowiedniość między krawędziami, które zachowują relację incydencji wierzchołków i krawędzi). 23. [30] W pewnej grupie 4096 osób, każda ma około 100 znajomych. Przygotowano plik zawierający wszystkie pary osób, które są znajomymi. (Relacja znajomości jest symetryczna: jeśli x jest znajomym y, to y jest znajomym x. Dlatego w pliku znajduje się około 200000 par). Zaproponuj algorytm, który dla danego k sporządzałby listę wszystkich /c-osobowych klik w tej grupie osób. (Klika obrazuje znajomość wszystkich ze wszystkimi: W klice każdy jest znajomym każdego). Przyjmijmy, że nie ma klik 0 rozmiarze 25, tak więc liczba klik nie może być wielka. ►24. [30] Trzy miliony osób utworzyło żywy łańcuch rozciągający się od Nowego Jorku do Kalifornii. Każdy dostał kartkę papieru, na której zapisał swoje własne nazwisko 1 nazwisko osoby sąsiadującej bezpośrednio z nim w łańcuchu od zachodu. Osoba wysunięta najbardziej na zachód nie wiedziała, co zrobić, i wyrzuciła swoją kartkę. Pozostałych 2 999 999 kartek złożono w olbrzymim koszu i dostarczono do Narodowe go Archiwum w Waszyngtonie. Tutaj zawartość kosza wymieszano, a następnie dane z kartek zapisano na taśmach magnetycznych. Naukowcy zajmujący się przetwarzaniem informacji zauważyli, że na taśmach znajduje się wystarczająco informacji, żeby odtworzyć kolejność osób w łańcuchu. Zaproszony informatyk odkrył, że można to zrobić za pomocą mniej niż 1000 przebiegów przez dane zapisane na taśmach, wykorzystując tylko dostęp sekwencyjny do plików taśmowych i niewielką ilość pamięci o dostępie bezpośrednim. Jak to jest możliwe? [Innymi słowy, dane są w porządku losowym pary (xi,Xt+ 1) dla 1 ^ i < JV, gdzie Xi są różne. W jaki sposób można otrzymać ciąg X\X 2 . . . xjv za pomocą operacji sekwencyjnych właściwych dla taśm magnetycznych? Jest to problem sortowania, kiedy nie jest łatwo odpowiedzieć, który z dwóch kluczy poprzedza pozostały. Takie pytanie pojawiło się już jako część ćwiczenia 2.2.3-25]. 25. [M21 ] (Logarytmy dyskretne) O liczbie p wiemy, że jest (raczej dużą) liczbą pierw szą i że a jest pierwiastkiem pierwotnym modulo p. Dlatego, dla każdego b z przedziału 1 ^ b < p istnieje dokładnie jedno n takie, że an mod p = 6, 1 ^ n < p, (Takie n nazywamy indeksem b modulo p względem a). Wyjaśnij, w jaki sposób można znaleźć rz, mając dane 6, nie potrzebując do tego fi(n) kroków. [Wskazówka: Weźmy m = \y/p] i spróbujmy rozwiązać amni = ba~n2 (modulo p) dla 0 ^ 711,712 < m].
INW ERSJE
5.1.1
11
*5.1. KO M BINATO RYCZNE W ŁASNOŚCI PERMUTACJI
Perm utacją skończonego zbioru nazywamy każde ustawienie jego elementów w szereg. Perm utacje odgrywają szczególną rolę w badaniu algorytmów sorto wania, ponieważ reprezentują nieposortowane dane wejściowe. W celu zbadania wydajności różnych m etod sortowania będziemy chcieli umieć wyznaczać liczbę permutacji, dla których wskazany krok procedury sortującej jest wykonywany zadaną liczbę razy. Z perm utacjam i spotykaliśmy się często już w poprzednich rozdziałach. Na przykład w punkcie 1.2.5 rozważaliśmy dwie podstawowe m etody generowa nia wszystkich n! perm utacji n obiektów; w punkcie 1.3.3 dokonaliśmy analizy pewnych algorytmów wykorzystujących strukturę cyklową i własności multiplikatywne permutacji; w punkcie 3.3.2 badaliśmy sekwensy. W tym rozdziale przedstawimy inne własności perm utacji, a także rozważymy przypadek ogólniej szy, w którym dopuszcza się perm utacje takich samych elementów. Przy okazji dowiemy się sporo na tem at m atem atyki kom binatorycznej. Własności perm utacji są wystarczająco interesujące, żeby się zajmować tyl ko nimi. Dlatego jest wygodnie omawiać je systematycznie w jednym miejscu, zamiast rozrzucać m ateriał po całym rozdziale. Czytelnikom, którzy nie lubią matem atyki, a także tym, którzy chcą natychm iast przejść do m etod sortowa nia, radzimy rozpocząć lekturę od razu od podrozdziału 5.2. Tak naprawdę ten rozdział nie ma wielu bezpośrednich związków z sortowaniem. *5.1.1. Inwersje
Niech ai Ü2 .. . an będzie perm utacją zbioru { 1 , 2 , . . . , n}. Parę (a*, aj) nazywamy inwersją tej perm utacji, jeśli i < j oraz di > aj. Na przykład perm utacja 3 1 4 2 ma trzy inwersje: (3,1), (3,2) i (4,2). Każda inwersja jest parą nieposortowanych elementów. Tylko perm utacja bez inwersji jest posortowaną perm utacją 12 . . . n. Ten związek z sortowaniem jest głównym powodem naszego zainteresowania inwersjami, chociaż już wcześniej użyliśmy ich do analizy algorytm u dynamicznej alokacji pamięci (zobacz ćwiczenie 2.2.2-9). Pojęcie inwersji zostało wprowadzone przez G. Cram era w 1750 roku [Intr. à l ’Analyse des Lignes Courbes Algébriques (Geneva: 1750), 657-659; zobacz Thomas Muir, Theory o f Determinants 1 (1906), 11-14], w związku z jego słynnymi wzorami na rozwiązanie układu równań liniowych. Cram er zdefiniował wyznacznik macierzy n x n w następujący sposób: ^11
det
(
%12
*• * Œln = £ ( - l ) inv(ai“2"-a" )x la i* 2a2 . . . x nan,
gdzie sumowanie przebiega po wszystkich perm utacjach ai £¿2 .. • o,n zbioru { 1 , 2 , . . . , n}, a in v (aia 2 .. . an) jest liczbą inwersji perm utacji (ai
2 . . . bn perm utacji a\ «2 . . . an otrzym uje się, przyjmując za bj liczbę tych elementów na lewo od j , które są większe od j . Innymi słowy, bj jest liczbą inwersji, których drugą składową jest j . Na przykład
12
SORTOWANIE
5.1.1
perm utacja 591826473
(i)
2 3 6 4 0 2 2 1 0,
(2 )
m a wektor inwersji
ponieważ 5 i 9 znajdują się na lewo od 1; 5, 9, 8 znajdują się na lewo od 2 itd. Ta perm utacja m a w sumie 20 inwersji. Z definicji wynika, że liczby bj spełniają ograniczenia 0<&i
0 < 62 < n —2 ,
...,
0 < 6n_i < 1 ,
bn = 0.
(3 )
Prawdopodobnie najważniejszą obserwacją dotyczącą inwersji jest ta pocho dząca od M arshalla Halla. Mówi ona, że wektor inwersji jednoznacznie wyznacza odpowiadającą mu permutację. [Zobacz Proc. Symp. Applied Math. 6 (Ame rican M ath. Society, 1956), 203]. Dla wektora inwersji b\ 62 .. . bn spełniającego (3) można odtworzyć jedyną odpowiadającą mu permutację, określając kolejno względne położenia elementów n ,n —1 , . . . , 1 (w tym porządku). Na przykład możemy znaleźć perm utację odpowiadającą wektorowi ( 2) jak następuje: Zapi sujemy liczbę 9; następnie umieszczamy 8 po 9, ponieważ b$ = 1. Podobnie umieszczamy 7 po 8 i 9, ponieważ 67 = 2 . Wówczas 6 musi występować po dwóch z dotychczas zapisanych liczb, ponieważ b$ — 2. Jak do tej pory uzyskaliśmy częściowy wynik 9 8 6 7. Kontynuujemy, umieszczając 5 na lewym końcu, ponieważ 65 = 0; umieszczamy 4 po czterech liczbach; na koniec 3 wstawiamy po sześciu liczbach (tzn. na skrajnie prawym końcu) i otrzymujemy 5 9 8 6 4 7 3. W stawiając 2 i 1 w analogiczny sposób, dostajem y ( 1 ). Przedstawiona odpowiedniość jest ważna, ponieważ pozwala często przetłu maczyć problem sformułowany w języku perm utacji na problem sformułowany w języku wektorów inwersji, który to może okazać się łatwiejszy do rozwiązania. Dla przykładu rozważmy najprostsze z możliwych pytań: Ile jest różnych per m utacji zbioru { 1 , 2 , . . . , n}? Odpowiedzią jest liczba różnych wektorów inwersji, która jest łatwa do policzenia: mamy n wyborów dla 61, niezależnie n —1 wyborów dla 62, . . . , 1 wybór dla 6n , co daje razem n ( n —1 ) . . . 1 = n! możliwości. Inwersje można łatwo liczyć, ponieważ składowe b są w pełni od siebie niezależne, podczas gdy składowe a muszą się param i różnić. W punkcie 1.2.10 analizowaliśmy liczbę prawostronnych maksimów w per mutacji. Innymi słowy, liczyliśmy, jak wiele elementów jest większych od swoich następników. (Na przykład prawostronnymi maksimami w ( 1 ) są 3, 7, 8 i 9). Jest to liczba tych j , dla których bj przyjmuje największą wartość n — j. Ponieważ bi równa się n — 1 z prawdopodobieństwem l / n , a (niezależnie) 62 równa się n —2 z prawdopodobieństwem l / ( n — 1 ) itd., zatem, posiłkując się inwersjami,
INW ERSJE
5.1.1
13
1234
R y s. 1. Ścięty ośmiościan ilustrujący zmianę w inwersjach po zamianie w permutacji sąsiednich elementów.
otrzymujemy, że średnia liczba prawostronnych maksimów w losowej perm utacji wynosi 1 1 1 rr —I + ••• + - — H n. n n —1 1 W podobny sposób łatwo można wyprowadzić odpowiednią funkcję tworzącą. Łatwo można też zauważyć, że jeśli zamienimy w perm utacji dwa sąsiednie elementy, to ogólna liczba inwersji wzrośnie lub zmaleje o jeden. Na rysunku 1 pokazano 24 perm utacje zbioru { 1 , 2 , 3,4}. Odcinkami połączono te perm utacje, które różnią się tylko kolejnością dwóch sąsiednich elementów. Przejście w dół po takim odcinku odpowiada zamianie dokładnie dwóch elementów. Tak więc liczba inwersji perm utacji n jest równa długości ścieżki z rysunku 1 , prowadzącej w dół od 1234 do n. W szystkie takie ścieżki muszą mieć taką sam ą długość. Nawiasem mówiąc na diagram z rys. 1 można patrzeć jak na trówymiarową bryłę, „ścięty ośmiościan” , która m a 8 ścian sześciokątnych i 6 ścian kw adrato wych. Jest to jeden z klasycznych wielościanów półforemnych przypisywanych Archimedesowi (zobacz ćwiczenie 10). Nie należy mylić inwersji perm utacji z permutacj&rtó odwrotnymi Przypo mnijmy, że perm utację możemy zapisać w dwóch wierszach n a n )/
(4)
Perm utacją odw rotną do tej perm utacji jest perm utacja a[ af2 af3 .. .a'n otrzym y wana przez zamianę wierszy, a następnie uporządkowanie kolumn tak, żeby górny
14
SORTOWANIE
5.1.1
wiersz był uporządkowany rosnąco: f ai \1
a2 a 3 2 3
. . . an \ ... n )
Na przykład perm utacją odw rotną do 5 9 1 8 2 6 4 7 3 jest 3 5 9 7 1 6 8 4 2 , ponie waż /5 9 1 8 2 6 4 7 3 \_ /1 2 3 4 5 6 7 8 9 \ 1^123456789/ —1^359716842/ Innym sposobem zdefiniowania perm utacji odwrotnej jest powiedzenie, że a' = k wtedy i tylko wtedy, gdy ak — j, Perm utacja odw rotna została po raz pierwszy zdefiniowana przez H. A. Roth e ’a [w Sammlung combinatorisch-analytischer Abhandlungen, wydanym przez K. F. Hindenburga, 2 (Leipzig: 1800), 263-305], który zauważył interesujący związek między perm utacjam i odwrotnymi a inwersjami: Permutacja i permuta cja do niej odwrotna mają dokładnie tyle samo inwersji. Dowód tego faktu poda ny przez R othe’a nie był najprostszym z możliwych, ale niemniej był pouczający i ładny. Budujemy szachownicę n x n, umieszczając kropkę w j-te j kolumnie oraz z-tym wierszu, ilekroć a* = j . Następnie we wszystkich kwadratach, dla których w kolumnie poniżej i w wierszu na prawo znajdują się kropki, umieszczamy znak x . Na przykład dla perm utacji 5 9 1 8 2 6 4 7 3 otrzymujemy diagram •
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
•
X
X
•
X
•
•
•
•
X
•
•
Liczba znaków x jest liczbą inwersji - łatwo można zauważyć, że bj jest liczbą znaków x w kolumnie j . Jeśli teraz przetransponujemy nasz diagram, zamienia jąc wiersze z kolumnami, otrzym am y diagram dla perm utacji odwrotnej. Zatem liczba znaków x (liczba inwersji) jest taka sam a w obu przypadkach. Rothe użył powyższego faktu do wykazania, że wyznaczniki macierzy i macierzy do niej transponowanej są takie same. Analiza kilku algorytmów sortowania wymaga wiedzy na tem at liczby per m utacji n-elementowych o dokładnie k inwersjach. Oznaczmy tę liczbę przez In (k). Tabela 1 zawiera kilka pierwszych wartości tej funkcji. Posiłkując się wektorem inwersji b\ b2 . . . 6n) natychm iast otrzymujemy, że Jn (0) — 1 , I n ( 1 ) — n — 1 oraz własność symetryczności
M G ) ~k) = l n { k ) -
(6)
5.1.1
INW ERSJE
15
Tabela 1 PERMUTACJE O k INWERSJACH
n /„(O) In(1) /„(2) /„(3) / n(4) /n(5) In (6) I n(7) In(8) / n(9) J«(10) /n(ll ) 1
1
0
0
0
0
0
0
0
0
0
0
0
2
1
1
0
0
0
0
0
0
0
0
0
0
3
1
2
2
1
0
0
0
0
0
0
0
0
4
1
3
5
6
5
3
1
0
0
0
0
0
5
1
4
9
15
20
22
20
15
9
4
1
0
6
1
5
14
29
49
71
90
101
101
90
71
49
Dodatkowo, ponieważ każdą ze składowych b można wybrać niezależnie od in nych, nie jest trudno zauważyć, że funkcja tworząca Gn (z) — Jn (0) + I n ( l ) z -f I n (2)z2 +
(7)
spełnia Gn (z) = (l + z-\ h z n 1)G n- i ( z ) . Zatem m a ona stosunkowo prostą postać podaną przez O. Rodrigueza [J. de Math. 4 (1839), 236-240]: (1 + * + ••• + z 71- 1) . . . (1 + *)(1) = (1 - z " ) . . . (1 - 22)(1 -
Z)/{1
- z)n.
(8)
Korzystając z tej funkcji tworzącej można łatwo uzupełnić tabelę 1, jak i spraw dzić, że liczby poniżej łamanej spełniają równanie I n(k) = I n (k - 1 ) + /n -i(fc),
fc < n.
dla
(9)
(Ta równość me zachodzi powyżej linii łam anej). Stosując bardziej skomplikowa ną argumentację (zobacz ćwiczenie 14), można wykazać, że w istocie zachodzą związki: ^n{2) — ( 2 )
n
1,
> 2;
'•« « -(■ r n ? )-
n > 3;
-c i
n > 4; n > 5;
a w ogólności, wzór na I n (k) zawiera około 1.6\/fc członów: 'n+ fc —2 \ ¿n(f c) =
fc
+ r_ivY ^ ; l V
/ n +f c —3 \ / n+fc —6 \ / n+fc —8' V k - 2 y + \ fc-5 J + V * - 7
k-uj
k -U j-j
.
+
gdzie Uj = (3 j2 — j ) / 2 jest tak zwaną „liczbą pięciokątną” .
n > fc,
( 10)
16
SORTOWANIE
5.1.1
Jeśli podzielimy G n (z) przez n!, dostaniemy funkcję tworzącą gn (z) dla roz kładu prawdopodobieństwa liczby inwersji w losowej n-elementowej permutacji. Jest nią iloczyn gn (z) = h i( z ) h 2{ z ) . . . h n (z),
(1 1 )
gdzie hk(z) = (1 + z + • ■• + z k~l ) / k jest funkcją tworzącą dla rozkładu jednostajnego losowej, nieujemnej liczby całkowitej mniejszej od fc. Wynika stąd, że mean(ć?n ) = m ean(ńi) + m ean(/i2) + *• • + m ean(ńn ) = var(#n) =
0
+
n —1 +•■•+ —
1 2
n (n — 1 ) = - 4 ^ ;
, . (I2)
var(fti) + var(ń2) H--------h var(ńn)
=
0
+
1 4
H
n2 — 1 h --------12
n(2n + 5)(n — 1) , , = —--------—--------------( i i ) 72 V 6}
Zatem średnia liczba inwersji jest dość duża i wynosi około \ n 2\ odchylenie standardowe jest także dość duże i wynosi około | n 3/ 2. Ważnego spostrzeżenia na tem at rozkładu inwersji dokonał P. A. MacMahon [.A m er. J. Math. 35 (1913), 281-322]. Zdefiniujmy indeks perm utacji ai a 2 . . . an jako sumę wszystkich indeksów j , dla których aj > aj+ 1 , 1 < j < n. Na przykład indeksem perm utacji 5 9 1 8 2 6 4 7 3 jest 2 + 4 + 6 + 8 = 20. Przez przypadek indeks tej perm utacji jest równy liczbie jej inwersji. Jeśli wypiszemy wszystkie 24 perm utacje zbioru {1, 2, 3,4}, a mianowicie Perm utacja
Indeks
Inwersje
Perm utacja
Indeks
Inwersje
1234 1 2 4|3 1 3|2 4 1 3 4|2 1 4|2 3 1 4|3|2
0 3 2 3 2 5
0 1 1 2 2 3
3 11 2 4 3 11 4|2 3 12 11 4 3¡2 4|1 3 4| 1 2 3 4 |2 11
1 4 3 4 2 5
2 3 3 4 4 5
2|1 3 4 2 11 4|3 2 3|1 4 2 3 4|1 2 4|1 3 2 4|3|1
1 4 2 3 2 5
1 2 2 3 3 4
4|1 2 3 4|1 3|2 4|211 3 4|2 3 11 4 |3 |1 2 4|3|2|1
1 4 3 4 3
3 4 4 5 5
6
6
zobaczymy, że permutacji o indeksie k jest tyle samo, co permutacji mających k inwersji. Na pierwszy rzut oka wydaje się to prawie oczywiste, ale po bliższym przyj rzeniu się, fakt ten staje się bardzo tajemniczy. MacMahon podał następujący, pomysłowy, ale niebezpośredni dowód tego faktu. Niech ind(ai a 2 .. .a n) będzie
INWERSJE
5.1.1
17
indeksem perm utacji ai a? . . . an i niech tf„ (z ) = ] T y nd(ai “2...an)
( 14 )
będzie odpowiadającą mu funkcją tworzącą; sumowanie w ( 14 ) odbywa się po wszystkich perm utacjach zbioru { 1 , 2 , . . . , n } . Pokażemy, że H n {z) ~ Gn (z). W tym celu zdefiniujemy wzajemnie jednoznaczne odwzorowanie między n-tkam i ( 92, • • • j Qn) nieujemnych liczb całkowitych z jednej strony a uporządkowanymi parami n-tek ((O i, 02, . . . , a n ), (pi,P2,---,P n)) z drugiej strony, gdzie ai a 2 . - - an jest perm utacją indeksów { 1 , 2 , . . . , n}, nato miast pi > p 2 > • • * > pn ^ 0. Nasze odwzorowanie będzie spełniało następujący warunek Qi +Q 2 + *** + qn = i n d ( a i a 2 *. • an) + (pi + P2 H
bp«).
( 15 )
Funkcją tworzącą ^ "+^ , gdzie sumowanie odbywa się po wszystkich n-tkach nieujemnych liczb całkowitych (gi,g2) *■• ,qn), jest Qn (z) = 1/(1 —z ) n ; natom iast funkcją tworzącą ^ z Pi+Pz+—+Pn^ gdzie sumowanie odbywa się po wszystkich n-tkach liczb całkowitych (pi , p2, .. . ?Pn) takich, że pi > p 2 ^ ^ Pn > 0, jest Pn (z) = 1/(1 (1 -0 , ( 16 ) (zobacz ćwiczenie 15). Z warunku ( 15 ) i z wzajemnej jednoznaczności naszego odwzorowania wynika, że Qn (z) = i i n (^)Pn (z), a stąd # n (z ) = Q n {z)/P n (z).
( 17 )
Ale z (8) dostajemy, że Qn {z)/ Pn {z) jest równe Gn (z). Poszukiwane odwzorowanie definiujemy za pomocą prostej procedury sor tującej. Każdą n-tkę (gi,g2, .. . ,qn ) można przekształcić stabilnie w nierosnącą n-tkę qa i > qa 2 > ■ - > qan, gdzie a 1 a2 . . . a n jest perm utacją taką, że qaj = qaj+1 implikuje aó < aj+x. Weźmy (pi , p2, . -. , pn ) = {qai, Qa2, *■., 4a J , a następnie, dla 1 < j < n, odejmijmy 1 od wszystkich p i, . . . , pj dla każdego j takiego, że aj > Uj+ i . Nadal mamy pi > p 2 > • • • > pn , ponieważ pj było ostro większe od Pj+U gdy aj > Oj+1 - otrzy m an a para ( ( a i , a 2, .. . , a n), (pi ,P 2, • *• ,Pn)) spełnia ( 15 ), ponieważ łącznie od składowych p odjęliśmy ind(ai a 2 . . . an ). Na przykład, jeśli n = 9 i ( ą i , . . . , q$) = ( 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ,5), mamy 0 4 . ..ag = 6 8 5 9 3 1 7 2 4 i ( p i , . . . , p 9) = ( 5 , 2 , 2 , 2 , 2 , 2 , l , l , l ) - / Na odwrót, można łatwo dostać (gi, g2, . . . , gn), gdy dane są ax a 2 .. . a n i (pi,P 2j • ■■jPn)- (Zobacz ćwiczenie 17). Tak więc określiliśmy żądane odwzo rowanie i w ten sposób udowodniliśmy twierdzenie MacM ahona o indeksie. Około 65 lat po publikacji MacMahona, D. Foata i M. P. Schiitzenberger odkryli zadziwiające uogólnienie jego twierdzenia: Liczba permutacji n-elementowych o k inwersjach i indeksie l jest taka sam a jak liczba permutacji o l inwersjach i indeksie k. W rzeczywistości Foata i Schiitzenberger znaleźli proste wzajemnie jednoznaczne odwzorowanie między perm utacjam i pierwszego i drugiego rodzaju (zobacz ćwiczenie 25).
18
SORTOWANIE
5.1.1
Ć W IC ZEN IA 1. [10] Podaj wektor inwersji permutacji 2 7 1 8 4 5 9 3 6 . Dla jakiej permutacji wek torem inwersji jest 5 0 1 2 1 2 0 0 ? 2 . [M20] W klasycznym problemie Józefa Flawiusza (ćwiczenie 1.3.2-22), n męż czyzn ponumerowanych 1, 2 , . . . , n staje w kręgu, właśnie w takiej kolejności. Następnie z kręgu zostaje usunięty m-ty mężczyzna, po czym krąg się zamyka. Potem cyklicznie zostaje usuwany co m-ty mężczyzna, aż do chwili, w której nikt już nie zostanie. Kolej ność usuwania mężczyzn z kręgu jest zadana przez permutację liczb z { 1 , 2 , , . . , n}. Na przykład, gdy n — 8 i m = 4, taką permutacją jest 5 4 6 1 3 8 7 2 (mężczyzna o numerze 1 jest usuwany jako piąty itd.); wektorem inwersji tej permutacji jest 3 6 3 1 0 0 1 0 . Podaj prostą zależność rekurencyjną dla elementów b\ b2 • • • bn wektora inwersji permutacji z problemu Józefa Flawiusza dla n mężczyzn, gdy co m-ty mężczyzna jest usuwany.
3. [18] Jeśli permutacja ai «2 . . . an odpowiada wektorowi inwersji b\ 62 • •. bn , to jaka permutacja a\ 0,2 . . . an odpowiada wektorowi inwersji (n - 1 - b\) (n — 2 — b2) . -. (0 — bn ) ? 4. [20] Zaprojektuj łatwy do komputerowej implementacji algorytm, który dla da nego wektora inwersji bi 62 ■■■bn spełniającego (3 ) znajduje odpowiadającą mu permu tację ai a 2 . . . a n. [Wskazówka: Rozważ zastosowanie techniki listowej]. 5. [35] Czas wykonania algorytmu opisanego w ćwiczeniu 4 jest proporcjonalny do n + 61 H------- 1- 6n, czyli średnio do © (n2). Czy istnieje algorytm, którego czas działania w pesymistycznym przypadku jest istotnie lepszy niż (rzędu) n 2? 6 . [26] Zaprojektuj algorytm, który w czasie proporcjonalnym do n log n oblicza wek tor inwersji bi ¿>2 . . . bn odpowiadający danej permutacji a\ a2 . . . an zbioru { 1 , 2 , . . . , n}.
7. [20] Oprócz zdefiniowanego w tekście wektora inwersji b\ 62 ■• -bn , można zdefi niować kilka innych rodzajów wektorów inwersji odpowiadających danej permutacji ai 02 . . . an zbioru { 1 , 2 , . . . , n}. W tym zadaniu rozważamy trzy inne typy wektorów inwersji, które występują w zastosowaniach. Niech Cj będzie liczbą inwersji, których pierwszą składową jest j, to jest liczba elementów na prawo od j, które są mniejsze od j. [Dla ( 1 ) wektorem inwersji jest 0 0 0 1 4 2 1 5 7 ; oczywiście 0 ^ cj < j ] . Niech Bj = baj i Cj = ca j . Pokaż, że 0 ^ Bj < j i 0 ^ Cj ^ n — j dla 1 ^ j ^ n; ponadto pokaż, że permu tację ai «2 . . . an można wyznaczyć jednoznacznie, jeśli dany jest wektor Ci c2 . . . cn lub B l B 2 . . . B n lub C iC 2 . . . C„. 8 . [M2Ą] W dalszym ciągu korzystamy z oznaczeń z ćwiczenia 7. Niech a± a2 .. *an
będzie permutacją odwrotną do ai a2 . . . an i niech odpowiadającymi jej wektorami inwersji będą b[ bf2 . . . ¿4, ci c2 • ■■ B[ B 2f . . . B*n i C[ C 2 . . . C^. Znajdź tak dużo, jak tylko potrafisz, ciekawych zależności między liczbami a3, bj, Cj, B j , C j , a':i, bj, , B j , C j . 9. [M21 ] Udowodnij, że permutacja ai a 2 . . . an jest inwolucją (tzn. że jest odwrotna do samej siebie) wtedy i tylko wtedy, gdy bj = Cj dla 1 ^ j ^ n (oznaczenia takie jak w ćwiczeniu 7). 10. [HM20] Przyjmijmy, że na rysunku 1 przedstawiono trójwymiarowy wielościan. Ile wynosi średnica ściętego ośmiościanu (odległość między wierzchołkami 1234 i 4321), jeśli wszystkie jego krawędzie mają jednostkową długość?
INW ERSJE
5.1.1 1 1 . [M25] Jeśli 7r = di
19
. . . an jest permutacją zbioru { 1 , 2 , . . . , n}, to niech E ( 7r) = {(oi,Oj) | i < j, ca > aj}
będzie zbiorem jej inwersji i niech E ( 7r) = {(ai,aj) \ i > j, a,i > aj} będzie zbiorem jej „nieinwersji”. a) Udowodnij, że E ( tt) i E(n ) są przechodnie* (Zbiór par uporządkowanych S jest przechodni, gdy z tego, iż (a, b) i (6 , c) są w 5, wynika, że (a, c) należy 5). b) Na odwrót, niech E będzie dowolnym przechodnim podzbiorem T — { ( x ,y ) | 1 y < x ^ n}, którego dopełnienie E — T \ E też jest przechodnie. Wówczas istnieje permutacja n taka, że E ( tt) = E. 1 2 . [M28] W dalszym ciągu trzymamy się oznaczeń z poprzedniego ćwiczenia. Udo wodnij, że jeśli 7ri i 7T2 są permutacjami, a E jest najmniejszym zbiorem przechodnim zawierającym E ( tti) U £ ( ^ 2), to dopełnienie E jest przechodnie. [Stąd, jeśli powiemy, że 7Ti leży „powyżej” 7T2 , gdy tylko E ( 7Ti) C E ( tt2), to zdefiniujemy kratę permutacji;
istnieje dokładnie jedna „najniższa” permutacja „powyżej” dwóch danych permutacji. Na rysunku 1 pokazano taką kratę dla n — 4]. 13. [M23] Jest ogólnie znaną zasadą, że w rozwinięciu wyznacznika połowa skład ników jest brana ze znakiem plus, a połowa ze znakiem minus. Innymi słowy, jest dokładnie tyle samo permutacji o parzystej liczbie inwersji, co permutacji o nieparzystej liczbie inwersji, gdy tylko n ^ 2. Pokaż, że w ogólnym przypadku liczba permutacji 0 liczbie inwersji przystającej do t modulo m wynosi n \ / m , niezależnie od wyboru liczby całkowitej t, gdy tylko m. 14. [M24] (F. Franklin) Podziałem liczby n na k różnych składników nazywamy przedstawienie tej liczby w postaci n = pi + P2 + *** + pk, gdzie pi > p 2 > • • • > Pk > 0. Na przykład, jest 7 podziałów liczby 7 na różne składniki: 6 + 1, 5 + 2, 4 + 3, 4 + 2 + 1 . Niech fk{n) będzie liczbą podziałów n na k różnych składników; udowodnij, że ^ fc( ^ l ) fe/fc(^) = 0 , jeśli tylko n nie jest postaci (3j 2 ± j ) / 2 dla pewnej nieujemnej liczby całkowitej j; w takim przypadku wartością sumy jest ( —1)+ Na przykład, gdy n = 7, wartością sumy jest — 1 + 3 — 1 = 1 i 7 = (3 • 22 + 2)/2. [ Wskazówka: Przedstaw podział w postaci diagramu, który składa się z tylu wierszy, ile jest składników w podziale (czyli k ), przy czym i-ty wiersz zawiera pi kropek dla 1 ^ i ^ k. Znajdź najmniejsze takie j , że pj+i < pj — 1, a następnie obrysuj skrajnie prawe kropki w pierwszych j wierszach. Jeśli j < Pk, to te j kropek można usunąć, obrócić o 45° i umieścić w (fc + l)-szym wierszu. Jednakże, jeśli j ^ pk, k -ty wiersz kropek można usunąć, obrócić o 45° i umieścić na prawo od obrysowanych kropek. (Zobacz rysunek 2 ). Ten proces umożliwia w większości przypadków połączenie w pary
R y s. 2 . Odpowiedniość Franklina między podziałami na różne składniki.
20
SORTOWANIE
5.1.1
podziałów o nieparzystej liczbie wierszy z podziałami o parzystej liczbie wierszy. Tak więc w sumie musimy rozważyć tylko niesparowane podziały]. Uwaga: Jako wniosek otrzymujemy wzór Eulera (1 - z){ 1 - z2)( 1 - z 3) . . . = 1 - z - z 2 + z h + z 1 - z 12 - z 15 + • • •
(—i y z(3j2+i)/'2.
= —o o < j< o o
Funkcją tworzącą dla zwykłych podziałów (w których składniki nie muszą się różnić) jest Y l p ( n ) z n = 1 /(1 —*0(1 —^2)(1 “ z 3) *• *i w ten sposób otrzymujemy nieoczywistą zależność rekurencyjną na liczbę podziałów, p(n) = p(n - 1) + p(n - 2) - p( n — 5) - p(n - 7) + p(n - 12 ) + p(rt - 15) - • • • . 15. [M23] Udowodnij, że ( 16 ) jest funkcją tworzącą dla podziałów na co najwyżej n składników; to jest udowodnij, że współczynnik przy z m w 1 /(1 —z)( 1 —z 2) ... (1 —z n ) jest liczbą sposobów przedstawienia m w postaci m = pi + p 2 H hPn, gdzie pi ^ p 2 '' • ^ P n ^ 0. [Wskazówka: Rozmieść kropki tak jak w zadaniu 14 i pokaż, że istnieje wzajemnie jednoznaczne odwzorowanie między n-tkami (p i,p 2, • • • ,Pn) takimi, że pi ^ P2 ^ ^ P n ^ 0 i ciągami (P i, P2, P 3 , . . . ) takimi, że n ^ Pi ^ P 2 ^ P 3 ^ ^ 0, o własności pi + p 2 + *** + Pn = Pl + P 2 + P 3 + • ■■. Innymi słowy, podziałom na n składników odpowiadają podziały na składniki o wartościach nie przekraczających n]. 16. [M25] (L. Euler) Udowodnij następujące tożsamości, interpretując obie strony równości w języku podziałów: TT — l— = ____________ 1-----------------n ( i _ qkz) (1 _ 2)(1 _ qz){;i _ q 2z ) . . . _ 1
~ U
z
z2
+ 1 -9 +
( l - 9 ) ( l - 9 2)
+
= n^O £ * ni/ l^k^n n
(1 +
k^O z
z 2q
= H ---------- 1------------ ---------- u + l - 9 + ( l - 9) ( l - . g3) +
= £ > " , f (n- 1,/2/
n^O
J ] (1 - q k).
/ l
17. [20] Podaj 24 czwórki {q\, q2, #3 , <74), dla których (pi, p 2 ,P3 ,P4 ) = (0, 0, 0, 0) wodpowiedniości MacMahona zdefiniowanej pod koniec tego punktu. 18. [M30\ (T. Hibbard, C A C M 6 (1963), 210) Weźmy n > 0 i załóżmy, że dany jest losowy ciąg 2 n n-bitowych liczb całkowitych X o , . . . , X 2n~i, w których każdy bit jest niezależnie równy jeden z prawdopodobieństwem p. Rozważmy ciąg Xo © 0, X \ © 1 , . . . , X 2n - i © ( 2 n — 1 ), gdzie 0 oznacza operację „różnicy symetrycznej” na reprezentacjach binarnych. Tak więc, jeśli p = 0, takim ciągiem jest 0, 1, . . . , 2n —1, natomiast jeśli p — 1 , takim ciągiem jest 2n —1 , . . . , 1 , 0 ; gdy p = - , każdy element ciągu jest losową liczbą całkowitą z przedziału od 0 do 2 n — 1 . W ogólności, biorąc różne p, otrzymujemy użyteczny sposób generowania ciągów liczb losowych o nierównomiernie rozłożonych liczbach inwersji, chociaż rozkład elementów w samym ciągu, branym jako całość, jest jednostajny w znaczeniu, że każda n-bitowa liczba całkowita pojawia się z takim samym prawdopodobieństwem. Wyraź średnią liczbę inwersji w takim ciągu jako funkcję prawdopodobieństwa p.
INW ERSJE
5.1.1
21
19. [M28] (C, Meyer) Gdy m jest względnie pierwsze z n wiemy, że ciąg (m mod n)(2m mod n ) . . . ((n — 1)m mod n) jest permutacją zbioru { 1 , 2 , . . . , n — 1}. Pokaż, że liczbę inwersji w takiej permutacji można wyrazić za pomocą sum Dedekinda (zobacz punkt 3.3.3). 20. [MĄ3] Następująca znana tożsamość, pochodząca od Jacobiego [Fundamenta Nova Theoriae Functionum Ellipticarum (1829), §64], jest podstawą wielu ważnych zależ ności, w których występują funkcje eliptyczne:
R (i - i i V _1)(i -
V ) ( i - ukvk)
= (1 —u )(l —v)( l —u v )(l —u2v)( 1 —uv2)(l —u2v2) . . . = 1 —(u + v) + (u3v + uv3) —(u6v3 + u V ) + • • • =
E
(-1
y u ( ^ v ( i+^ .
—o o < j < + oo
Na przykład, jeśli weźmiemy u = z, v = z 2, to otrzymamy wzór Eulera z ćwiczenia 14. Jeśli weźmiemy 2 = yfu/v , q = to dostaniemy n ( l - 9 2^ 1^ ) ( l - 9 2fe' 1^ 1) ( l - 9 2':) =
k^l
E
( - l ) n^ V 2.
—CXJ
Czy istnieje kombinatoryczny dowód tożsamości Jacobiego analogiczny do dowo du Franklina dla specjalnego przykładu z ćwiczenia 14? (Tak więc chcemy rozważać „podziały zespolone”
m + ni = (pi + q\i) + (p2 + q2t) H
1- (Pk + qki)
gdzie pj + qji są różnymi niezerowymi liczbami zespolonymi, natomiast pj i qj są nieujemnymi liczbami całkowitymi takimi, że |pj — qj \ ^ 1. Tożsamość Jacobiego mówi, że liczba takich reprezentacji o parzystych k jest taka sama jak liczba reprezentacji z nie parzystym fc, z wyjątkiem przypadku, gdy m i n są kolejnymi liczbami trójkątnymi). Jakie inne istotne własności mają podziały zespolone? ►2 1 . [M25] (G. D. Knott) Pokaż, że permutację 0 1 . . . an można otrzymać za pomocą stosu (w znaczeniu z ćwiczenia 2 .2 .1-5 lub 2.3. 1- 6 ) wtedy i tylko wtedy, gdy Cj ^ Cj+i + 1 , dla 1 ^ j < n (oznaczenia z ćwiczenia 7). 2 2 . [M26] Dla danej permutacji a\ <22 . . . an zbioru { 1 , 2 , . . . , n} niech hj będzie liczbą indeksów i < j takich, że di £ { a j-fl, % + 2 , . . . , d j +1}. (Jeśli dj + 1 < dj, to elementy tego zbioru „zacyklają” się od n do 1 . Gdy j = n, wówczas za nasz zbiór bierzemy {anH-l,an + 2 , . . . , u}). Na przykład dla permutacji 5 9 1 8 2 6 4 7 3 otrzymujemy ciąg hi .. .hg = 0 0 1 2 1 4 2 4 6 . a) Udowodnij, że a\ «2 . . . an można odtworzyć z ciągu hi /12 . . . h n . b) Udowodnij, że hi + /12 + • *■+ hn jest indeksem permutacji ai . . . an.
►23. [M27] (Rosyjska ruletka) Grupa n skazańców, którzy wolą teorię prawdopodo bieństwa od teorii liczb, mogłaby wybrać sposób popełniania samobójstw będący mo dyfikacją problemu Józefa Flawiusza (ćwiczenia 2). Skazańcy siadają w kręgu. Pierwszy skazaniec trzyma pistolet i celuje w swoją głowę; z prawdopodobieństwem p ginie, a jego zwłoki zostają usunięte. Następnie drugi mężczyzna bierze broń i powtarza się to samo, co za pierwszym razem. Gra toczy się cyklicznie ze stałym prawdopodobieństwem p > 0, aż wszyscy zginą.
22
SORTOWANIE
5.1.1
Niech aj = &, jeśli mężczyzna k ginie jako j - ty. Udowodnij, że kolejność ai a 2 . .. an, w której giną skazańcy, pojawia się z prawdopodobieństwem, które jest funkcją tylko n, p oraz indeksu permutacji dualnej (n + 1 — an) . . . (n + 1 — a2) (n + 1 —ai). Która z kolejności jest najmniej prawdopodobna? 24. [M26] Dla danych liczb całkowitych ¿(1 ) ¿(2). . . t(ń) takich, że t(j) ^ j, uogólnio nym indeksem permutacji ai d 2 . . . an nazywamy sumę wszystkich indeksów j o wła sności takiej, że aj > t(dj+ 1), z dodaną liczbą wszystkich inwersji takich, że i < j i t(aj) ^ di > dj. Zatem, gdy t(j) = j dla każdego j , indeks uogólniony jest tym samym co indeks zwykły. Jednak gdy t(j) ^ n dla każdego j, indeks uogólniony jest liczbą wszystkich inwersji. Udowodnij, że liczba permutacji, których indeks uogólniony wynosi k , jest równa liczbie permutacji zawierających k inwersji. [Wskazówka: Pokaż, że jeśli weźmiemy dowolną permutację ai . . . an- i zbioru { l , . . . , n — 1 } i będziemy wstawiać n na każdą z możliwych pozycji, indeks uogólniony będzie wzrastał o liczby ze zbioru { 0 , 1 , . . . , n — 1 } w pewnym, niekoniecznie właśnie takim, porządku]. ►25. [M30] (Foata i Schutzenberger) Dla permutacji a = a\ . . . an oznaczmy przez ind(a) jej indeks, a przez inv(a) liczbę jej inwersji. a) Zdefiniuj wzajemnie jednoznaczną odpowiedniość, która każdej permutacji a zbio ru { l , . . . , n } przyporządkowuje permutację f ( a ) o następujących własnościach: (i) in d (/(a )) = inv(a); (ii) dla 1 ^ j < n, liczba j pojawia się na lewo od j + 1 w f ( a ) wtedy i tylko wtedy, gdy pojawia się na lewo od j + 1 w ot. Jak wygląda w Twojej konstrukcji permutacja /( a ) , gdy a = 1 9 8 2 6 3 7 4 5 ? Dla jakiej permutacji a jest f ( a ) = 1 9 8 2 6 3 7 4 5? [Wskazówka: Dla n > 1 piszemy a = xiOi\X20 i2 . . . ZkCtkUn, gdzie . . . , Xk są wszystkimi elementami < on, jeśli di < an ; w przeciwnym przypadku Xi, . . . , Xk są wszystkimi elementami > an ; pozostałe elementy występują w (być może pustych) ciągach au, . . . , a^. Porównaj liczbę inwersji permutacji h(a) = 0 :1X102 X2 ■• ■otk%k z inv(o); w tej konstrukcji liczba an nie występuje w h(a)]. b) Wykorzystaj / do zdefiniowania jeszcze jednej wzajemnie jednoznacznej odpowiedniości g o następujących własnościach: (i) ind(g(a)) = inv(o); (ii) inv(^(o)) — ind(o). [Wskazówka: Rozważ permutacje odwrotne]. 26. [M25] Ile wynosi współczynnik korelacji statystycznej między liczbą inwersji a in deksem w losowej permutacji? (Zobacz równanie 3 .3 .2 - ( 2 ą)). 27. [M37] Jako uzupełnienie ( 15 ) udowodnij, że istnieje prosta zależność między inv(oi d 2 >.. an ) oraz n-tką ( 91 , <72, • • • ,
5.1.2
PERMUTACJE MULTIZBIORÓW
23
*5.1.2. Permutacje multizbiorów
Jak dotąd rozważaliśmy perm utacje zbioru różnych elementów; jest to specjalny przypadek perm utacji multizbioru. (W multizbiorze dopuszcza się wielokrotne wystąpienia tych samych elementów. Pewne podstawowe własności multizbiorów były już omawiane w ćwiczeniu 4.6.3-19). Dla przykładu rozważmy multizbiór M = {a, a, a, ó, ó, c, d, d, d, d},
(i)
który zawiera 3 litery a, 2 litery 6, 1 literę c oraz 4 litery d. Powtórzenia tych samych elementów możemy zaznaczyć też w inny sposób, a mianowicie M = {3 • a, 2 • ó, c, 4 • d}.
(2)
Permutacją* zbioru M nazywamy każde ustawienie jego elementów w rzędzie; na przykład c a b d d a b d a d . Z innego punktu widzenia taki ciąg złożony z 3 liter a, 2 liter 6, 1 litery c i 4 liter d będziemy nazywali słowem. Ile jest różnych perm utacji zbioru M ? Jeśli będziemy rozróżniali elementy M , indeksując je a \ , a 2, ¿ 3, &i, 62, c i , d\ , ¿ 2 , d%, ¿ 4, to dostaniemy 10! = 3 628 800 permutacji, ale wiele z nich, po usunięciu indeksów, okaże się takich samych. W istocie każda perm utacja M pojaw ia się 3! 2 ! 1 ! 4! = 288 razy, ponieważ możemy wystartować od jakiejkolwiek perm utacji M i nadać indeksy literom a na 3! sposobów, literom b (niezależnie) na 2! sposobów, literze c na 1 sposób, a literze d na 4! sposobów. Dlatego prawdą jest, że liczba perm utacji M wynosi 10! s i T i R r 12600W ogólności, używając tego samego argum entu, można pokazać, że liczba per mutacji multizbioru jest współczynnikiem wielomianowym n
^ =
,n 1 ,n 2, ■■■)
n!
n i ! n 2! . . . ’
( \
^
gdzie ni jest liczbą elementów pierwszego rodzaju, n 2 jest liczbą elementów drugiego rodzaju itd., a n — n i +712 H jest łączną liczbą wszystkich elementów. Liczba perm utacji zbioru jest znana od ponad 1500 lat. Hebrajska Księga stworzenia (około 400 roku n.e.), która jest najstarszym literackim wytworem żydowskiego filozoficznego mistycyzmu, wymienia poprawne wartości siedmiu pierwszych silni, po słowach „Idź i oblicz to, co usta nie mogą wypowiedzieć, a ucho nie może usłyszeć” . [Sefer Yetzirah, koniec rozdziału 4. Zobacz także Solomon Gandz, Studies in Hebrew Astronom y and Mathematics (New York: Ktav, 1970), 494-496; Aryeh Kapłan, Sefer Yetzirah (York Beach, Maine: Sa muel Weiser, 1993).] Jest to pierwsze (znane) w historii policzenie perm utacji. Drugi taki fakt znajdujemy w klasycznym dziele hinduskim Anuyogadvara-sutra * Czasami nazywaną „permatucją” .
24
5.1.2
SORTOWANIE
(około 500 roku); jest to zasada 97, gdzie znajduje się wzór na liczbę perm utacji sześciu elementów, które nie są ani rosnące, ani malejące: 6x5x4x3x2xl-2. [Zobacz G. Chakravarti, Buîî. Calcutta Math. Soc. 24 (1932), 7 9-88. Ariuyogadvâra-sutra jest jedną z ksiąg kanonu dżajminizmu, sekty religijnej popular nej w Indiach]. W ydaje się, że odpowiedni wzór na liczbę perm utacji multizbioru pojawił się pierwszy raz w książce Liîàvati napisanej przez Bhâscara Achârya (oko ło 1150 roku), rozdziały 270-271. Bhâscara podał ten wzór bez uzasadnienia i zilustrował go tylko na dwóch prostych przykładach {2,2,1,1} i {4, 8,5, 5,5}. W konsekwencji, w angielskim tłum aczeniu jego dzieła ten wzór nie jest podany poprawnie. Istnieją także przypuszczenia, że sam Bhâscara nie wiedział, o czym pisał. Doszedł on do interesującego wzoru (4 + 8 + 5 + 5 + 5) x 120x11111 5x6 na sumę 20 liczb 48555 + 45855 + • • •. Poprawny wzór na obliczanie perm utacji, gdy tylko jeden element może się powtarzać, został podany niezależnie przez niemieckiego uczonego, jezuitę A thanasiusa Kirchera, w jego wielotomowym traktacie o muzyce [Musurgia Universalis 2 (Rome: 1650), 5 - 7]. Kircher interesował się liczbą melodii, które można ułożyć z danego zbioru nut. Do tego celu wymyślił tzw. „muzarytmetykę” . Na stronach 1 8 -2 1 swojego tra k ta tu podał poprawną liczbę perm utacji multizbiorów {m • C, n * D}, dla szeregu wartości m i n, chociaż nie wyjaśnił metody liczenia poza jednym przypadkiem, gdy n = 1 . Jean P restet podał ogólny wzór (3 ) w swojej książce Eléments de Mathéma tiques (Paris: 1675), 351-352, która to książka zawierała tekst jednego z pierw szych wykładów m atem atyki kombinatorycznej w świecie zachodnim. Prestet podał poprawny wzór dla dowolnego multizbioru, ale zilustrował go tylko na prostym przykładzie zbioru {a, a, 6, 6, c, c}. W szczególności zauważył, że dziele nie przez sumę silni, co byłoby naturalnym uogólnieniem wzoru Kirchera, nie jest poprawne. Kilka lat później, w książce Johna Wallisa Discourse of Combinations (Oxford: 1685), rozdział 2 (wydanym razem z jego Treatise of Algebra) znalazło się jaśniejsze i bardziej szczegółowe omówienie tego wzoru. W 1965 roku Dominique Foata wpadł na pomysł „iloczynu z wtrąceniami” (■intercalate product), który pozwala rozszerzyć wiele znanych wyników dla zwy kłych perm utacji na perm utacje multizbiorów. [Zobacz Publ. Inst. Statistique , Univ. Paris, 14 (1965), 81-241; a także Lecture Notes in Math. 85 (Sprin ger, 1969)]. Założywszy, że elementy multizbioru zostały liniowo uporządkowane w pewien (dowolny) sposób, możemy rozważać dwuwierszowe reprezentacje per m utacji, takie jak
(
a a a b b c d d d d c a b d d a b d a d
(4 )
5.1.2
PERMUTACJE MULTIZBIORÓW
25
gdzie górny wiersz zawiera elementy zbioru M posortowane w porządku niemalejącym, natom iast dolny wiersz zawiera sam ą perm utację. Iloczynem z wtrącenia mi a j ¡3 dwóch perm utacji multizbiorów a i ¡3 nazywamy perm utację otrzym y waną w następujący sposób: (a) a i (3 reprezentujemy dwuwierszowo, (b) zesta wiamy razem obie reprezentacje, a następnie (c) sortujemy kolumny w porządku niemalejącym względem górnego wiersza. O sortowaniu zakłada się, że jest sta bilne w znaczeniu, że zachowuje porządek między elementami w dolnym wierszu, jeśli odpowiadające im elementy w górnym wierszu są takie same. Na przykład c a d a b j b d d a d = c a b d d a b d a d , ponieważ f a a \c a
bc d \ f a b d d d \ _ i a a a b da b J J \ b d d a d J yc a b d
bc d d d d \ d a bd a d) '
,,
Można zauważyć, że iloczyn z wtrąceniam i jest łączny: { a j f 3 ) j 7 = a T(/3T7);
(6)
stosują się do niego także dwa prawa skracania: 7r y q = 7r j /?
implikuje
a = /?,
a j 7r = ¡3 y 7r
implikuje
a = ¡3.
(7)
Operacja iloczynu ma także element neutralny, jedynkę, a j € = e j a = a,
( 8)
gdzie e jest perm utacją pustą, czyli „rozmieszczeniem” elementów zbioru puste go. Chociaż prawo przemienności nie zachodzi w ogólnym przypadku (zobacz ćwiczenie 2), mamy a x fi = ¡3 t a ,
jeślia i ¡3 nie zawierają takich samych elementów.
( 9)
W analogiczny sposób można uogólnić pojęcie cykli wperm utacjach na przypadek, gdy elementy się powtarzają; niech (zi
x2
...
( 10)
x n)
oznacza perm utację otrzymywaną w wyniku stabilnego posortowania względem górnego wiersza kolumn dwuwierszowej reprezentacji perm utacji fX\ X2 c.X2 X3
... ...
xn \ Xi )
(11)
Na przykład mamy /JLJJ ( d b d d a c a a b d\ ( d b d d a c a a b d ) =^ b d d a c a a h d d ^
^
f a a a b b c d d d d\ c a h d d a b d a d y
a zatem (4 ) jest w rzeczywistości cyklem. Moglibyśmy opisać ten cykl słowami, pisząc na przykład „d przechodzi na 6, b przechodzi na d, d przechodzi na d, d przechodzi na ..., na koniec wracamy do d” . Zauważmy, że cykle uogólnione nie m ają wszystkich własności zwykłych cykli; (x± x2 . ■. x n) nie zawsze jest tym samym co (x2 . . . x n xi).
26
SORTOWANIE
5.1.2
W punkcie 1.3.3 zauważyliśmy, że każdą (zwykłą) perm utację można jed noznacznie przedstawić jako złożenie (z dokładnością do kolejności składania) rozłącznych cykli. Łatwo można zauważyć, że złożenie rozłącznych cykłi jest dokładnie tym samym co ich iłoczyn z wtrąceniami. Sugeruje to, że być może moglibyśmy uogólnić poprzedni wynik i otrzymać jednoznaczną reprezentację (w pewnym sensie) dowolnej perm utacji multizbioru jako iloczyn z wtrąceniami cykli. W rzeczywistości istnieją co najm niej dwa naturalne sposoby, żeby to zrobić, z których każdy m a ważne zastosowania. W yrażenie (5) wskazuje jeden sposób przedstawienia c a b d d a b d a d jako iloczynu z wtrąceniam i krótszych perm utacji. Rozważmy ogólny problem przedstawienia danej perm utacji 7r w postaci iloczynu n — a j fi. Pomocnym w tym będzie rozważenie konkretnej perm utacji, na przykład f a a b b b b b c c c d d d d d 7r = I \d b c b c a c d a d d b b b d
( 12 )
Jeśli perm utację 7r możemy zapisać w postaci a j fi, gdzie a zawiera co najm niej jedną literę a, to skrajnie lewe a w górnym wierszu dwuwierszowej reprezentacji a musi leżeć nad d. Zatem a musi także zawierać co najmniej jedno wystąpienie litery d. Jeśli teraz przyjrzymy się skrajnie lewemu d w górnym wierszu reprezentacji a , widzimy podobnie, że musi ono leżeć nad d, a zatem a musi zawierać co najm niej dwa d. Patrząc na drugie d widzimy, że a zawiera co najm niej jedno b. W ten sposób dostajem y a
b
d
d
d
....................
d
b
( 13 )
przy jedynym założeniu, że a jest lewym czynnikiem w iloczynie 7r zawierającym literę a . Postępując dalej w ten sam sposób, odkryjemy, że b z górnego wiersza w (13) musi leżeć nad literą c itd. Na końcu tego procesu dojdziemy ponownie do litery a i możemy utożsamić to a z pierwszym a, jeśli tylko chcemy. Ta argum entacja dowodzi w istocie, że każdy lewy czynnik a w iloczynie (12), który zawiera literę a, ma postać (d d b c d b b c a) j a f dla pewnej perm utacji a '. (Jest wygodnie zapisać a jako ostatnie w cyklu zamiast jako pierwsze; jest to dopuszczalne, ponieważ mamy tylko jedno a). Podobnie, jeśli założylibyśmy, że a zawiera literę 6, moglibyśmy wydedukować, że a — (c d d b) j a n dla pewnej perm utacji a". W ogólności, argum entując jak powyżej, widzimy, że jeśli mamy dowolny rozkład na czynniki a j fi = 7r, gdzie a zawiera literę y. to dokładnie jeden cykl postaci O i . . . x n y), n > 0, x i , . . . , x n ^y, (14) jest lewym czynnikiem a . Taki cykl łatwo można znaleźć, gdy dane są 7r i y; jest to najkrótszy lewy czynnik w rozkładzie 7r, który zawiera literę y. Jednym z wniosków z tej obserwacji jest następujące twierdzenie:
T w ie rd z e n ie A . Niech „ < ” będzie relacją liniowego porządku na elementach multizbioru M. Każdą permutację tt zbioru M można jednoznacznie przedstawić
5.1.2
PERMUTACJE MULTIZBIORÓW
27
jako iloczyn z wtrąceniami
7T = (xn * Xl niy1) j (x2l . . -X2n2y2)T' **T (^il • •
t > 0,
(15)
spełniający następujące dwa warunki: Vi < V2 < ■■* < Vt
oraz
y* <
dla 1 < j < n 2, 1 < i < i.
(16)
(Innymi słowy, ostatni element w każdym cyklu jest mniejszy od każdego innego elementu, a ciąg ostatnich elementów jest niemalejący). Dowód. Jeśli 7r = e, to taki rozkład dostajemy, przyjmując t = 0. W przeciwnym przypadku niech y\ będzie najm niejszym elementem w perm utacji. Najkrótszy lewy czynnik (x n .. .X\nxyi) w rozkładzie 7r zawierający y\ znajdujem y w spo sób opisany w przykładzie powyżej. Teraz 7r = (asn . . . X\ni y\) j p dla pewnej perm utacji p. Indukcyjnie względem długości mamy, że p = O2I • • • X2n2 2/2) T ’ ' ' T O tl • • • Xtnt Vt ) ,
t > 1,
i spełnione są warunki (16). To dowodzi istnienia poszukiwanego rozkładu. Pozostaje udowodnić, że rozkład (15) spełniający (16) jest jednoznaczny. Oczywiście t — 0 wtedy i tylko wtedy, gdy 7r jest perm utacją pustą e. Gdy t > 0, z (16) mamy, że y\ jest najmniejszym elementem w perm utacji i że (xn . . . x\ni y\) jest najkrótszym lewym czynnikiem zawierającym y\. Dlatego (xn . . . x\ni yi) jest jednoznacznie wyznaczona. Z prawa skracania (7) i założe nia indukcyjnego wynika, że rozkład jest (15) jednoznaczny. | Na przykład rozkładem „kanonicznym” (12), spełniającym podane warunki, jest (d d b c d b b c a) j (b a) j (c d b) j (d),
(17)
jeśli a < b < c < d. Jest ważne, żeby zauważyć, że bez szkody dla jednoznaczności możemy opuścić w tej reprezentacji nawiasy i znaki j! Każdy cykl kończy się zaraz po pojawieniu się najmniejszego brakującego elementu. Tak więc w tej konstrukcji perm utacja i:1 — d d b c d b b c a b a c d b d
odpowiada wyjściowej perm utacji 7r = d b c b c a c d a d d b b b d . Kiedy w dwuwierszowej reprezentacji 7r występuje kolumna postaci gdzie x < y, wtedy w stowarzyszonej z nią perm utacji 7r' pojawia się odpow iadająca jej para sąsiednich elementów . . . y x .. . . Przykładowo nasza perm utacja 7r zawiera trzy kolumny postaci 5, a nf zawiera trzy wystąpienia pary db. W ogólności powyższa konstrukcja umożliwia sformułowanie następującego, godnego uwagi twierdzenia.
28
SORTOWANIE
5.1.2
T w ie rd z e n ie B . Niech M będzie multizbiorem. Wówczas istnieje wzajemnie jednoznaczna odpowiedniość między permutacjami zbioru M taka, że jeśli ir odpowiada 7r' to spełnione są następujące warunki: a) Skrajnie lewy element w C jest równy skrajnie lewemu elementowi w n. b) Dla każdej pary permutowanych elementów (x, y) przy x < y, liczba wy stąpień kolumny y x w dwuwierszowej reprezentacji n jest taka sama jak liczba wystąpień x bezpośrednio przed y w n'. | Gdy M jest zwykłym zbiorem, wówczas mamy w istocie do czynienia z „nie zwykłym odwzorowaniem” (z nieistotnymi zmianami) omawianym na koniec punktu 1.3.3. Ogólniejszy wynik z twierdzenia B jest wyjątkowo przydatny w zli czaniu pewnych rodzajów perm utacji, ponieważ często łatwiej rozwiązać problem na podstawie dwuwierszowej reprezentacji perm utacji niż równoważny problem oparty na warunkach odnoszących się do par sąsiednich elementów. P. A. M acM ahon rozważał problemy tego typu w swojej znakomitej książce Combinatory Analysis 1 (Cambridge Univ. Press, 1915), 168-186. Podał on konstruktywny dowód twierdzenia B w specjalnym przypadku, gdy M zawiera tylko dwa różne rodzaje elementów, powiedzmy a i 6 . Jego konstrukcja dla tego przypadku jest w istocie taka sam a jak podana tu ta j, chociaż wyrażona zupełnie inaczej. Dla przypadku trzech różnych elementów a, 6, c, dowód MacMahona był skomplikowany i niekonstruktywny. Dowód twierdzenia B w przypadku ogólnym podał po raz pierwszy Foata [Comptes Rendus Acad. Sci . Paris 258 (1964), 1672-1675]. Jako nie trywialny przykład zastosowania twierdzenia B spróbujmy znaleźć liczbę słów złożonych z liter a, b, c i zawierających dokładnie A B C k l m
w ystąpień w ystąpień wystąpień w ystąpień w ystąpień w ystąpień
litery a; litery 5; litery c; par sąsiednich liter ca; par sąsiednich liter cb ; par sąsiednich liter ba.
( 18 )
Z twierdzenia B wynika, że ta liczba jest równa liczbie dwuwierszowych repre zentacji postaci A
B
C
a
b .. .
b
u
u
u
A —k —m a
* ■-
ma
V--------------------------------------------- v ------------------------------------
B- l b '---------------------------V— Cc
(!9 )
5.1.2
PERMUTACJE MULTIZBIORÓW
29
Litery a można umieścić w drugim wierszu na (,4 -t-m )
(™ ) ( t )
SP0S0“ W;
następnie litery b można umieścić na pozostałych miejscach na f B + k\ ( C — k\ U
- J
l
i
)
sp
”■
Pozostałe jeszcze pozycje muszą zawierać litery c. Zatem poszukiwaną liczbą jest
( , - i - J ( * ) ( ? ) G +- i ) ( V ) -
<»>
Wróćmy teraz do pytania o znajdowanie wszystkich rozkładów danej perm u tacji. Czy istnieje coś takiego jak perm utacja „pierwsza” , która jest iloczynem tylko jej samej i e? Rozważania poprzedzające twierdzenie A prowadzą szybko do wniosku, że permutacja jest pierwsza wtedy i tylko wtedy, gdy jest cyklem bez powtarzających się elementów. Jeśli perm utacja jest takim cyklem, to z naszych rozważań wynika, że jedynymi lewymi czynnikami w rozkładzie mogą być e lub sam cykl. Natom iast gdy perm utacja zawiera powtarzający się element y, to m a nietrywialny, cykliczny lewy czynnik, w którym y pojawia się tylko raz. Permutację, która nie jest pierwszą, można rozkładać na coraz mniejsze czynniki, aż otrzym am y jej reprezentację jako iloczyn perm utacji pierwszych. Więcej, można pokazać, że taki rozkład jest jednoznaczny, jeśli pominąć porządek wymnażania przemiennych perm utacji pierwszych: T w ie rd z e n ie C . Każdą permutację multizbioru można przedstawić jako iloczyn
t > 0,
(2l)
gdzie każde o 3 jest cyklem bez powtarzających się elementów. Taka reprezentacja jest jednoznaczna w znaczeniu, że dwie reprezentacje tej samej permutacji można przekształcić jedna w drugą, zamieniając parami sąsiednie rozłączne cykłe.
Termin „rozłączne cykle” oznacza cykle nie zawierające wspólnych elemen tów. Z tego twierdzenia wynika, że perm utacja ( a a b b c c d\ \b a a c db cJ
ma dokładnie pięć rozkładów na perm utacje pierwsze, a mianowicie ( a b) r (a) j ( c d ) j ( b c) = (a b) j ( c d) T(a) T (b c)
= (a b) T (c d) t (6 c) T (a) = M )
t
(a b) i (b c) T (a)
= (cd)j(ab)j(a)j(bc).
(22)
Musimy pokazać, że zachodzi podana własność jednoznaczności. W y starczy pokazać przez indukcję względem długości perm utacji, że jeśli p i a są Dowód.
30
SORTOWANIE
5.1.2
różnymi cyklami bez powtarzających się elementów i jeśli p Ta = <7T/3, to p i a są rozłączne i (3 = pi<9,
a =
dla pewnej perm utacji 0. Jeśli y jest jakimkolwiek elementem w cyklu p ) to każdy lewy czynnik w ajf3 zawierający element y musi mieć p jako lewy czynnik. Zatem, jeśli p i a m ają wspólny element, to a jest złożeniem p i pewnej permutacji; zatem a = p (ponie waż obie są pierwsze), co przeczy naszemu założeniu. Dlatego cykl zawierający y, nie m ający wspólnych elementów z
Twierdzenie C mówi, że te perm utacje możemy policzyć w inny sposób; ponieważ kolumny postaci £, £, £ są zabronione, jedynymi możliwymi perm utacjami pierwszymi w rozkładzie takich perm utacji są (a 5),
(a c),
(6 c),
(a 6 c),
(a c 6).
(24)
Każda para tych cykli m a co najmniej jeden wspólny element, tak więc rozkład na perm utacje pierwsze jest w pełni jednoznaczny. Jeśli cykl (o b c) pojawia się w tym rozkładzie k razy, z naszych poprzednich założeń wynika, że (a b) występuje m — k razy, (b c) występuje C — A + m — k razy, (a c) występuje C —B + m —k razy i ( ac b) występuje A + B —C —2 m + k razy. Stąd N ( A , B , C, m) jest sum ą względem k liczby perm utacji złożonych z tych cykli (współczynnik wielomianowy): N(A,B,C,m)
= ^
{ C -\~7Tl —ky. ( m - k ) \ ( C - A + m - k ) \ ( C - B + m - k ) \ k \ ( A + B - C - 2m + k)\
PERMUTACJE MULTIZBIGRÓW
5,1.2
31
Biorąc pod uwagę (23), otrzymujemy następującą tożsamość:
ęk ( T ) (
)(
<*>
z M — A + B — C — m, N = C — B + m, R = B , S — C i j = C — B + m — k. Podobnie możemy policzyć liczbę perm utacji zbioru {^4 • a, B •6, C *c, D *d} takich, że liczby kolumn różnych typów są następujące: Typ
kolumny:
a d
Częstość:
r
b
a
a
A —r
b
q
ć
b
c b
c d
d a
d c
B —q
B —A + r
D —r
A —q
D -A -\-q
(Tutaj A + C = B + D ) . Możliwymi cyklami w rozkładzie na perm utacje pierwsze są wówczas Cykle:
(a b)
(b c)
(c d)
( d a)
Częstość: A —r —s B —q —s D —r —s A —q —s
(a b c d)
(d c b a)
s
q —A + r + s
dla pewnego s (zobacz ćwiczenie 12). W tym przypadku iloczyn cykli (a b) i (c d) jest przemienny, jak i przemienny jest iloczyn cykli (b c) i ( da). Tak więc musimy policzyć liczbę rozkładów na perm utacje pierwsze. Okazuje się (zobacz ćwiczenie 10), że istnieje zawsze dokładnie jeden rozkład, w którym (a b) nie występuje bezpośrednio za (c d) oraz (b c) nie występuje bezpośrednio za (d a). Stąd, wykorzystując wynik ćwiczenia 13, mamy
X (D — r —s)! (A — q — s)! s\ (q — A + r + s)!
Dzieląc obie strony przez i upraszczając lewą stronę, otrzymujemy skom plikowanie wyglądającą, pięcioparametrową tożsamość
Sumowanie względem s można wykonać, wykorzystując (27), tak że otrzym aną sumę względem t już łatwo można policzyć. Po tym wszystkim okazuje się, że nie
32
SORTOWANIE
5.1.2
otrzymujemy żadnej tożsamości, której nie potrafiliśmy już wcześniej wyprowa dzić. Jednak przynajmniej nauczyliśmy się, jak liczyć pewne rodzaje permutacji na dwa różne sposoby. Poznane techniki zliczania są dobrym treningiem przed problemami, które na nas czekają. Ć W IC ZEN IA 1 . [MO5) Prawda czy fałsz: Niech Mi i M 2 będą multizbiorami. Jeśli a jest permutacją Mi i fi jest permutacją M 2 , to a j fi jest permutacją zbioru Mi U M 2 .
2. [10] Iloczyn z wtrąceniami c a d a b i b d d a d został policzony w ( 5 ); oblicz iloczyn z wtrąceniami b d d a d j c a d a b , gdy zamienimy kolejność czynników w iloczynie. 3. [Ml3] Czy prawdziwe jest twierdzenie odwrotne do ( 9 )? Innymi słowy, jeśli iloczyn z wtrąceniami o: i fi jest przemienny, to obie permutacje nie mają wspólnych elementów? 4. [Mil] Rozkład kanoniczny ( 12 ) w znaczeniu z twierdzenia A został podany w ( 17 ), przy założeniu a < b < c < d. Znajdź odpowiedni rozkład kanoniczny, gdy d < c < b < a. 5. [M 2 3 ] W warunku (b) twierdzenia B wymaga się £ < y , c o stanie się, gdy osłabimy ten warunek na x ^ y l 6 . [M l5] Ile jest słów zawierających dokładnie m liter a, n liter b i nie zawierających żadnych innych liter, a w których bezpośrednio przed dokładnie k literami a występuje litera 6?
7. [M21] Ile słów złożonych z liter a, b, c i spełniających warunki ( 18 ) zaczyna się od litery a, ile od litery b, a ile od c? ► 8 . [20] Znajdź wszystkie rozkłady ( 12 ) na dwa czynniki a j fi. 9. [33] Napisz program, który znajduje rozkłady danej permutacji multizbioru w po staciach, o których mowa w twierdzeniach A i C. ►10. [M30] Prawda czy fałsz: Chociaż rozkład na permutacje pierwsze nie jest jed noznaczny, to, korzystając z twierdzenia C, możemy uzyskać jednoznaczność w na stępujący sposób. „Istnieje liniowe uporządkowanie -< zbioru permutacji pierwszych takie, że każda permutacja multizbioru ma dokładnie jeden rozkład
12 . [M16] Pokaż, że (29 ) wynika z założeń przyjętych w ( 28 ). 13. [M21] Udowodnij, że liczba permutacji multizbioru
{A ■a, B *6 , C ■c, D ■d, E *e, F • / } ,
5.1.2
PERMUTACJE MULTIZBIORÓW
33
nie zawierających sąsiadujących ze sobą par liter ca i db, wynosi
^
/
D \ fA + B + E + F \ / A + B + C + E + F ~ t \ f C + D + E + F t ) V B )\ C, J9 , Ej F
14. [M30] Jeden ze sposobów zdefiniowania permutacji odwrotnej do permutacji uogólnionej 7r (sugerowany przez inne definicje z tego punktu) polega na zamianie wierszy w reprezentacji dwuwierszowej 7r, a następnie stabilnym posortowaniu kolumn niemalejąco względem górnego wiersza. Na przykład, jeśli a < b < c < d> to zgodnie z tą definicją permutacją odwrotną do c a b d d a b d a d jest a c d a d a b b d d . Zbadaj własności operacji odwracania; na przykład czy ma ona jakikolwiek prosty związek z iloczynem z wtrąceniami? Czy można policzyć liczbę takich permutacji, że 7r ~ 7T~? ►15. [M25] Udowodnij, że permutacja a\ .. .a n multizbioru {iii • X\ , Tl2 *X2 i • • ■i U-rn ’
5
gdzie x\ < X2 < ’ '' < Xm i n\ +U -2 + ■• •+ nm = m, jest cyklem wtedy itylkowtedy, gdy graf zorientowany o wierzchołkach {x \, £ 2 , . . . ,Xm} i krawędziachprowadzących od xj do ani +~-+rij zawiera dokładnie jeden cykl zorientowany. W ostatnim przypadku liczba sposobów reprezentacji takiej permutacji w postaci cyklicznej jest równa długości cyklu w grafie. Na przykład grafem odpowiadającym permutacji a a a b b c c c d d\ d c b a c a a b d c
a*
d •----
a dwoma cyklami reprezentującymi tę permutację są ( b a d d c a c a b c ) i ( c a d d c a c b a b ) . 16. [M35] W poprzednim punkcie znaleźliśmy funkcję tworzącą dla inwersji w zwy kłych permutacjach, wzór 5.1.1-(8). Pokaż, że w ogólnym przypadku, jeśli rozważamy permutacje multizbioru, funkcją tworzącą dla inwersji zbioru {n i • x i, U2 • X2 , *.. } jest „z-wielomianowy współczynnik”
/ (
\ U
)
Vn i , n 2, . . . / 2
!
m
= — r — ^------- ,
gdzie
ni ! z n2!». . .
mlz = R
^
(1 + z H
h
[Porównaj to z ( 3 ) i z definicją z-mianowych współczynników we wzorze 1.2.6-(4o)]. 17. [M2Ą] Korzystając z funkcji tworzącej z ćwiczenia 16, znajdź wartość oczekiwaną i odchylenie standardowe dla liczby inwersji w losowej permutacji danego multizbioru. 18. [M30] (P. A. MacMahon) W poprzednim punkcie zdefiniowaliśmy indeks permu tacji ai «2 . . . an i udowodniliśmy, że liczba permutacji danego zbioru o indeksie k jest taka sama jak liczba permutacji, które mają k inwersji. Czy to samo zachodzi dla permutacji danego multizbioru? 19. [HM28] Zdefiniujmy funkcję Móbiusa dla permutacji 7r jako 0 , gdy 7r zawiera powtarzające się elementy i ( —l ) fc, jeśli 7r jest złożeniem k permutacji pierwszych. (Porównaj powyższe z definicją zwykłej funkcji Móbiusa, ćwiczenie 4.5.2-10). a) Udowodnij, że jeśli n ^ e, to
£
MA) = 0,
gdzie sumowanie odbywa się po wszystkich permutacjach A, które są lewymi czyn nikami 7r (tzn. po wszystkich A takich, że 7r = X j p dla pewnego p).
34
5.1.2
SORTOWANIE
b) Dla danych x\ < < •** < xm i n = 1 ^ k ^ n, udowodnij, że |i(f) = (-l)*E(!iij...t,),
Xj 2 . ..Xjn, gdzie 1
gdzie
j k ^ m dla (i k - i j ).
=sign
►20. [HM33] (D. Foata) Niech ( ) będzie dowolną macierzą liczb rzeczywistych. Sto sując oznaczenia z ćwiczenia 19(b), definiujemy — ai 1j 1 .. .o*njn , gdzie x% ^ x ^2 X 3l
XJ2
jest dwuwierszową reprezentacją permutacji n. Ta funkcja jest użyteczna w znajdowaniu funkcji tworzących dla permutacji multizbiorów, ponieważ gdzie sumowanie odbywa się po wszystkich permutacjach ir multizbioru { Tli *
Xl,
* * * »Tlm '
Xm
}j
jest funkcją tworzącą dla liczby permutacji spełniających pewne ograniczenia. Na przy kład, jeśli weźmiemy aij — z dla i — j oraz = 1 dla i 7^ j> to X} Jest funkcją tworzącą dla liczby „punktów stałych” (kolumn, w których zawartości górnego i dolnego wiersza są takie same). Żeby zbadać X] v(n) dla wszystkich multizbiorów jednocześnie, rozważamy funkcję
° = X l 7ri'( 7r)’ gdzie sumowanie odbywa się względem wszystkich 7r w zbiorze { x i , . . . , x m}* wszystkich permutacji multizbiorów zawierających elementy x \ , . . . , x m i patrzymy na współczyn nik przy x ? 1 . . . x ”m w G. We wzorze dla G permutacja 7r jest traktowana jako iloczyn wartości x. Na przy kład dla m = 2 mamy G = l+xii/(xi)+X2^(x2)+xiXi^(xiXi)+xiX2Z'(xiX2)+X2Xii'(x2£i)+:r2£2i'(x2X2)H---2 =
1
+
X
i a
n
+
X
2 a 2 2
+
X
2
i O
n
2 +
x
i X
2
0
h
0
2
2
+
x i X
2 0 2 i a i 2
+
^
2
2^22
+
* * * •
Stąd współczynnik przy x ™1. . . x^m w G wynosi X ^ M j gdzie sumowanie jest po wszystkich permutacjach 7r zbioru {n i • x i , . . . , n m *x m}. Nie jest trudno zauważyć, że ten współczynnik jest także współczynnikiem przy x ^1 • ■■#mm w wyrażeniu (a n x i H
ha \ m
X m )ni
( 021 x 1 H
1- a 2mXm) n2 . . . (amix i H
h ammx m)nm.
Celem tego ćwiczenia jest dowód tego, co P. A. MacMahon nazywa „twierdzeniem mistrza” w swojej książce Combinatory Analysis 1 (1915), rozdział 3, tzn. dowód równości ( 1 — O11X 1
G = 1 /D ,
gdzie
012X2
—021 X1
1 —022X2
OmiXi
Om,2X2
••■
Oi m Xm
\
—02 mXm
D = det
\
• *■ 1
OmmXm /
Na przykład, jeśli dij — 1 dla wszystkich i oraz j, z tej równości mamy, że <7 = 1/(1 — (xi + X2 + *■■+ x m)), a współczynnik przy X™1. . . x^m okazuje się być równym (m + ■• ■+ nm) ! / ni ! . . . nm!, czyli tak, jak być powinno. Żeby udowodnić twierdzenie mistrza pokaż, że
PERMUTACJE MULTIZBIORÓW
5.1.2
35
a) v ( n j p) = v (tv) v (p ); b) D = S 7r// (7r) l/(7r)> Przy oznaczeniach z ćwiczenia 19, gdzie sumowanie odbywa się po wszystkich permutacjach n z { x i , . . . , x m}*; c) dlatego D G — 1 . 2 1 . [M21] Dane są liczby m , z powtórzeniami {n i ■ 1 ,
n —m H
nm i O 0. Ile permutacji a i a 2 . . . a n zbioru • m } spełnia warunek a^+i ^ aj — d dla 1 ź 3 <
h nm?
1 . . . x ^ p ) oznacza zbiór wszystkich możliwych permutacji zbioru {ni • x i , . . . , nm • x m } i niech PoC^o0^ ! 1 **• X%P) będzie podzbiorem P ( xq ° x ™1 . . . x^lTn), w którym pierwszymi no elementami są elementy ^ x0. a) Dla danej liczby t, 1 ^ t < m, znajdź wzajemnie jednoznaczną odpowiedniość mię dzy P ( l ni . . . mnm) a zbiorem wszystkich uporządkowanych par permutacji, które należą odpowiednio do P 0 (Ofcl ni .. . t nt) i Po(0 (t -|- l )71^ 1 .. . m nm) dla pewnego k ^ 0 . [ Wskazówka: Dla każdego 7r = a i . . . an € P ( l ni . . . m nm) niech Z(7r) będzie permutacją otrzymaną przez zamianę i + 1 , . . . , m na 0 i usunięcie wszystkich 0 z ostatnich rit+i + ■*■4- nm pozycji; podobnie, niech r( 7r) będzie permutacją otrzymaną przez zamianę 1 , . . . , t na 0 i usunięcie wszystkich 0 z pierwszych ni + ■• *+ n t pozycji]. b) Udowodnij, że liczba permutacji zbioru P 0 (0n° l ni . . . ranm), których dwuwierszowe reprezentacje zawierają pj kolumn ° i q3 kolumn j , wynosi 2 2 . [M?0 ] Niech
IP ( x ? ...
yT1~ P1 - • • ) 11P { x f . . . X*? y?1~gi . ■. y Z r |P 0 (On0 ln i . . . m«m) |
)[
c) Niech tui, . . . , rum, z i , . . . , zm będą liczbami zespolonymi na okręgu jednostkowym. Zdefiniujmy wagę w(ir) permutacji 7r € P ( l ni .. . mnm) jako iloczyn wag kolumn w jej dwuwierszowej reprezentacji, gdzie wagą 3k jest Wj/wk, jeśli indeksy j i k są oba ^ t lub oba > t, a Zj/zk w przeciwnym przypadku. Udowodnij, że suma w(7r), względem wszystkich ir G P ( l ni . . . m n™), wynosi
E rC
k\2(n ^t ~ k)\ (n>t - fc)! y ^ / n A ć n m\ / w A 131 n i ! . . . n m! ^ I pi / * * \Pm ) Vzi ) "
YP m \ zm )
,2
gdzie n^t oznacza m H h n*, n>t oznacza rit+i H h nm i suma wewnętrzna jest liczona względem wszystkich (pi,... ,pm), takich że p^t —p>t = A:. 23. [M£5] Na łańcuch DNA można patrzeć jak na słowo nad czteroliterowym alfa betem. Załóżmy, że replikujemy łańcuch DNA i rozbiliśmy go całkowicie na jedno literowe składowe, a następnie połączyliśmy te składowe losowo. Udowodnij, że jest bardziej prawdopodobne, że liczba pozycji, na których łańcuchy wyjściowy i wynikowy się różnią, jest parzysta niż nieparzysta. [Wskazówka: Wykorzystaj poprzednie ćwi czenie] . 24. [21\ Rozważmy dowolną relację R y która może zachodzić między dwiema nieupo rządkowanymi parami liter; jeśli {w, x}R{y, z}, to mówimy, że {w,x} chroni {y, z}, w przeciwnym razie mówimy, że {iu,x} rusza {y, z}. Operacja transpozycji ™xz w zgodzie z R polega na zastąpieniu ™%przez x w z lub 2 y w zależności od tego, czy para {w , x} chroni, czy rusza parę {y, z }, przy założeniu w ^ x i y 7^ z\ jeśli w — x lub y = z, to w wyniku transpozycji zawsze dostajemy * ™.
36
SORTOWANIE
5 .1.2
Operacja sortowania dwuwierszowej tablicy ;;; £” ) w zgodzie z R polega na powtarzaniu znajdowania największego Xj , takiego że x 3 > x 3+i, i transponowaniu kolumn j i j + 1 aż do otrzymania na koniec x\ ^ ^ x n . (Nie wymagamy, żeby yi ■■■ Kn było permutacją x i . . . x n). a) Dla danej tablicy
;;; ®” ), udowodnij, że dla każdego x G { x i , . . . , x n} istnieje
dokładnie taki jeden y G { j / i , . . . ,2/n}, że sort(JJ ; ; ; ^ ) = s o r t ( ^ pewnych x 2, y2, b) Niech (" i ;;;
yń;;; xz[ ) oznacza wynik sortowania ( ^ ;;; ^
dla ;;;
) zgod
nego z R. Na przykład, jeśli R zawsze zachodzi, ® jest zwyczajnie konkatenacją (sklejaniem); jeśli R nigdy nie zachodzi, ® jest iloczynem z wtrąceniami j. Uogólnij twierdzenie A, dowodząc, że każda permutacja 7r multizbioru M ma jednoznaczną reprezentację w postaci 7T = { x \ i . . . X i m y i ) ® ( ( x 2l • • • X 2n 2 2/ 2) ® * * * ® ( « t l ■■• X t n t V t ) )
spełniającą ( 16 ), jeśli przedefiniujemy pojęcie cyklu, przyjmując ( 11 ) dla (x 2 . . . x n x \) zamiast dla (x\ x 2 ... x n). Przypuśćmy dla przykładu, że {w , x } R { y }z} oznacza, że w, x, y i z są różne; wówczas okazuje się, że rozkładem dla ( 12 ), analogicznym do ( 17 ), jest ( d d b c a ) ® ((c b b a ) ® ((c d b ) ® ((db) ® ( d) ) ) ) . (Operacja ® nie zawsze jest łączna; nawiasy w uogólnionym rozkładzie powinny być zagnieżdżane z prawa na lewo).
*5.1.3. Sekwensy
W rozdziale 3 analizowaliśmy długości rosnących sekwensów w permutacjach, które tam nazywaliśmy seriami. Te długości są pewną m iarą losowości ciągu. Jeśli umieścimy pionowe kreski na obu końcach perm utacji ai a2 .. . an , a także między aj i cij+i, zawsze gdy aj > aj+ 1 , wówczas sekwensami są fragmenty między param i kresek. Na przykład perm utacja | 3 .5 7 | 1 6 8 9 | 4 | 2 | m a cztery sekwensy. W punkcie 3.3.2G wyznaczyliśmy średnią liczbę sekwensów o długości k w losowej perm utacji zbioru { 1 , 2 , . . . , n}, jak również kowariancję liczb sekwensów o długościach j i k. Sekwensy odgrywają istotną rolę w ba daniu algorytmów sortowania, ponieważ reprezentują uporządkowane fragmenty danych. Dlatego sekwensy będą jeszcze raz przedmiotem naszych rozważań. Przez
będziemy oznaczali liczbę perm utacji zbioru { 1 ,2 ,... ,n} o dokładnie k „spad kach” aj > GŁj+i, a co za tym idzie o dokładnie k + 1 rosnących sekwensach. Liczby (£) pojaw iają się w wielu różnych kontekstach i są powszechnie nazywane liczbami eulerowskimi. Euler rozważał je w swojej znanej książce In st itu tio ne s Calculi Differentialis (St. Petersburg: 1755), 485- 487, po tym jak wprowadził
SEKWENSY
5.1.3
37
je kilka lat wcześniej w pracy [Com m ent. Acad, Sci. Imp. Petrop. 8 (1736), 147-158, §13]. Te liczby nie powinny być mylone z liczbami Eulera E n , o których jest mowa w ćwiczeniu 5.1.4-23. Nawiasy kątowe w (£) przypom inają o użyciu znaku „> ” w definicji spadku. Oczywiście (™) jest także liczbą perm utacji, które m ają k „wzrostów” aj < aj+ 1 . Z danej perm utacji zbioru { 1, . . . , n — 1} można utworzyć n nowych permutacji, wstawiając element n na każdą z możliwych pozycji. Jeśli wyjściowa perm utacja ma k spadków, to dokładnie k + 1 nowych perm utacji będzie miało k wzrostów. Pozostałe n —1 —k perm utacje będą m iały k + 1 spadków, ponieważ liczba spadków rośnie zawsze ilekroć elementu n nie umieszczamy na końcu ist niejącego sekwensu. Dla przykładu następujące sześć perm utacji można uzyskać z perm utacji 3 1 2 4 5: 631245, 312645,
361245, 312465,
316245, 312456.
Wszystkie te perm utacje, z wyjątkiem drugiej i ostatniej, m ają po dwa spadki. Druga i szósta perm utacja m ają po jednym spadku. Stąd otrzymujemy następu jącą zależność rekurencyjną =
+
—
j ^
dla całkowitych n > 0 i k.
( 2)
Przyjmujemy także, że (3) co oznacza, że pusta perm utacja nie zawiera spadków. Jest interesujące porównanie ( 2) z zależnością rekurencyjną dla liczb Stirlinga 1 .2 .6- ( 46). Tabela 1 zawiera liczby eulerowskie dla małych n. W tabeli 1 można zaobserwować kilka zależności. Z definicji mamy (4) (5) dla n > 1 .
( 6)
Równości (6 ) otrzymujemy z (5 ), korzystając z własności symetryczności dla n > 1
(7)
która wynika z faktu, że każda niepusta perm utacja a\ a 2 . . . an o k spadkach ma n — 1 —k wzrostów. Inną ważną własnością liczb eulerowskich jest zależność
38
SORTOWANIE
5.1.3
Tabela 1 LICZBY EULEROWSKIE
n
n 0 0 1
0 0 0 1 11 66
4 11
26 57 120
247 502
302 1191 4293 14608
0 0 0 0 1
26 302 2416 15619 88234
0 0 0 0 0 0 1 120
0 0 0 0 0 1
57 1191 15619 4293 156190 88234
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
247 14608 502
0 0 0 0 0 0 0 0 0 1
która została odkryta przez chińskiego m atem atyka Li Shan-Lan i opublikowa na w 1867 roku. [Zobacz J.-C. Martzloff, A History o f Chinese Mathematics (Berlin: Springer, 1997), 346-348. Yoshisuke M atsunaga z Japonii, który zmarł w 1744 roku, już wcześniej rozpoznał przypadki dla n < 5.] Tożsamość Li Shan-Lana wynika z następujących własności sortowania. Rozważmy m n ciągów a i d2 . . . an takich, że 1 < < m. Każdy z tych ciągów można posortować niemalejąco i stabilnie, otrzym ując ciąg (9) gdzie i i i 2 . . . i n j est jednoznacznie określoną perm utacją zbioru { l , 2 , . . . , n } taką, że jeśli aió = dij+1, to ij < i j + I n n y m i słowy, z tego, że ij > ij+i, wynika aió < aij+1. Dla perm utacji i x i 2 .. . i n o k sekwensach pokażemy, że liczba odpowiadających jej ciągów di 0,2 . . . an wynosi Dowód (8) otrzymamy, jeśli zamienimy k przez n — k i zastosujemy ( 7 ), ponieważ (£) perm utacji ma n — k sekwensów. Dla przykładu policzymy dla n — 9 \ i x i2 .. . i n = 3 5 7 1 6 8 9 4 2 liczbę takich ciągów a\ a2 . . . an , że 1
U3 ^
jest to liczba ciągów 1
¿15 ^
¿ą. 62
U7 <
o>i ^
dg
^
d% ^
d§
<
clą
<
cl2
^
m ;
(10)
- • ■&9 takich, że
^ b\ < b2 < 63 < 64 < 65 < ¿>6 < 67 < &8 < b$ ^ wi -f-
5,
ponieważ możemy wziąć 61 = 0 3 , ¿>2 = «5 + 1 , 63 = « 7 + 2 , 64 = a i + 2, ¿>5 = & 6 + 3 itd. Liczba wyborów wartości b jest po prostu liczbą sposobów wyboru 9 elementów spośród m + 5, czyli Podobny dowód można przeprowadzić dla dowolnych n i fc, jak i dowolnej perm utacji i\ i2 . . . in o k sekwensach. Ponieważ obie strony równości (8) są wielomianami zmiennej m, to możemy zastąpić m przez dowolną liczbę rzeczywistą x i otrzymać w ten sposób intere
SEKWENSY
5.1.3
39
sującą reprezentację potęgi x przez kolejne współczynniki dwumianowe:
^ X M
: > ( T ) + - + c 1> r r 1>
- » •
Na przykład ■■-g m t m t )To jest właśnie kluczowa własność liczb eulerowskich, która czyni je użytecznymi w matematyce dyskretnej. Przyjmując w ( 1 1 ) x = 1 , otrzymujemy raz jeszcze, że ( n^ 1) = 1, ponieważ współczynniki dwumianowe zerują się wszędzie z wyjątkiem ostatniego składni ka. Podstawiając x = 2 , otrzymujemy ( „ - 2 ) = ( i ) = 2" - " - 1'
n> 1'
(12)
Przyjmując x = 3, 4, . . . , widzimy, że zależność ( n ) daje pełną definicję liczb (£) i prowadzi do wzoru podanego przez Eulera:
<") = (*+! r - * " ( " t 1)+ (‘ - 1)"(nr ) - - +(-1)‘1"(nt 1) k = D 3=o
- 1)J ( n +
) ( fc + 1 _ i)">
n > 0, k > 0 .
( 13 )
3
Przejdźmy teraz do zbadania funkcji tworzącej dla sekwensów. Jeśli weźmie my
k to współczynnik przy z k jest prawdopodobieństwem, że losowa perm utacja {1,2, zawiera dokładnie k sekwensów. Ponieważ k sekwensów jest tak samo prawdopodobne jak n + 1 — k, to średnia liczba sekwensów musi wynosić |( n + 1), a zatem <7^(1) = | ( n + 1). W ćwiczeniu 2(b) pokazujemy, że istnieją proste wzory na wszystkie pochodne funkcji gn {%) w punkcie z — l:
W szczególności wariancja 2, co oznacza, że mamy do czynienia z rozkładem skupionym wokół średniej. (Podobną wielkość wyznaczyliśmy w równaniu 3.3.2-(i8), gdzie oznaczyliśmy ją przez covar(i?/1, R [)). Ponieważ gn (z) jest wielomianem, możemy użyć zależności ( 15 ) do rozwinięcia gn (z) w szereg Taylora:
40
SORTOWANIE
5.1.3
(!7) co dostajem y z warunku symetryczności ( 7 ). Z zależności rekurencyjnej dla liczb Stir linga
otrzym ujem y trochę prostsze reprezentacje
gdy n > 1. Funkcja tworząca dwóch zmiennych
jest zatem równa ^ ^
/c,n^0
( ( z - l ) x ) n ( n } k\
(z — l ) h V
l Ar J n!
/ ę(z ~ 1)x —l \ fc \ z —1 ) V
7
(1-z)
e(z~i)x — z ’
W ten sposób otrzym ujem y jeszcze jedną zależność rozważaną przez Eulera. O dalszych własnościach liczb eulerowskich można przeczytać w przeglądo wym artykule L. C arlitza [Math. Magazine 33 (1959), 247-260]. Zobacz także J. Riordan, Introduction to Combinatorial Analysis (New York: Wiley, 1958), 3 8 -3 9 , 214-219, 234-237; D. Foata i M. R Schiitzenberger, Lecture Notes in Math. 138 (Berlin: Springer, 1970). Zbadajm y teraz długości sekwensów. Jaka jest średnia długość sekwensu? * W punkcie 3.3.2 badaliśmy oczekiwaną liczbę sekwensów o danej długości. Śred nia długość sekwensu wynosi w przybliżeniu 2, co wynika z faktu, że losowa perm utacja o długości n zawiera około \ { n -f- 1) sekwensów. W zastosowaniach dotyczących algorytmów sortowania jest potrzebny trochę inny punkt widzenia. Dla k = 1, 2, . . . zbadamy długość k-tego sekwensu w perm utacji, patrząc od strony lewej do prawej. Dla przykładu, jak długi jest pierwszy (skrajnie lewy) sekwens w losowej perm utacji d\ .. . anl Jego długość jest zawsze > 1, ale jest ona > 2 dokładnie dla połowy przypadków (wtedy, gdy a\ < <12). J eS° długość jest > 3 dokładnie dla jednej szóstej przypadków (gdy a\ < 0,2 < « 3). Ogólnie jego długość jest > m z prawdopodobieństwem qm = l / m ! dla 1 < m < n. Prawdopodobieństwo, że jego długość wynosi dokładnie m, jest Pm = qm - qm + 1 = l/m ! - l/(m + 1)! p n = l/n !.
dla 1 < m < n; (21 )
5.1.3
SEKWENSY
41
Dlatego średnia długość pierwszego sekwensu wynosi PI + 2 p 2 +
b n p n = (
1
1
+ --- + qn - Y| + 2 ! + ' ' ‘ + n ! '
^
Przy n —>oo otrzymujemy w granicy e — 1 — 1.71828..., a zatem dla skończo nych n poszukiwaną wartością jest e — 1 —5n , gdzie Sn jest bardzo małe; -
1 (i 1 1 (n + 1)! \ + n + 2 + (n + 2)(n + 3) +
\
e —1 ^ (n + 1)! ’
Z tego powodu w praktyce jest wygodnie badać sekwensy w losowym, nieskoń czonym ciągu różnych liczb 01)02)^3,-----
„Losowy” oznacza tu ciąg, w którym każde z n\ możliwych względnych uporząd kowań pierwszych n elementów w tym ciągu jest jednakowo prawdopodobne. Średnia długość pierwszego sekwensu w losowym, nieskończonym ciągu wynosi dokładnie e — 1 . Rozwijając nieco naszą analizę pierwszego sekwensu, możemy wyznaczyć średnią długość fc-tego sekwensu w losowym ciągu. Niech q^m będzie prawdo podobieństwem zdarzenia, że łączna długość pierwszych k sekwensów jest > m. Wówczas qkm jest równe l/m ! razy liczba perm utacji zbioru { 1 , 2 , . . . , m}, które m ają < k sekwensów,
®” = ((o ) + "' + ( t mi ) ) / m!'
(23)
Prawdopodobieństwo, że pierwsze k sekwensów ma łączną długość m, wynosi Qkm —< 7fc(m+i)* Dlatego, jeśli przez L o z n a c z y m y średnią długość k-tego sekwen su, to Li H
+ Lfc = średnia łączna długość pierwszych k sekwensów — (Qki “ Qk2) + 2(
Odejmując Li + • • • 4- L k - i i korzystając z wartości qkm 2 (23 ), otrzymujemy <•*>
Ponieważ = 0 z wyjątkiem k = 1, widzimy, że L& jest współczynnikiem przy z k~ l w funkcji tworzącej g(z, 1) - 1 (zobacz równość( 19 )). Tak więc mamy L{z) =
L *zk = * f- i
- z•
(25)
42
SORTOWANIE
5.1.3
Ze wzoru Eulera ( 13 ) otrzymujemy reprezentację Lk jako wielomian od e:
(26) Ten wzór na Lk został po raz pierwszy otrzym any przez B. J. Gassner [zobacz C A C M 10 (1967), 89-93]. W szczególności mamy h L2 L3
=e- 1 = e 2 - 2e = e 3 - 3e 2
w 1.71828... ; « 1.95249... ; + | e w 1.99579... .
Oczekiwana długość drugiego sekwensu jest większa niż długość pierwszego se kwensu, natom iast oczekiwana długość trzeciego sekwensu jest większa niż długość drugiego. To może dziwić na pierwszy rzut oka, ale po namyśle widzimy, że pierwszy element drugiego sekwensu m a tendencję do bycia m ałym (powoduje przerwanie pierwszego sekwensu), a zatem jest większa szansa, że drugi sekwens będzie dłuższy. Pierwszy element trzeciego sekwensu m a tendencję do bycia jeszcze mniejszym niż ten z drugiego sekwensu. Liczby Lk odgrywają ważną rolę w teorii sortowania przez wybór i podmianę (punkt 5.4.1), tak więc jest interesującym, żeby zbadać szczegółowo ich wartości. W tabeli 2 pokazano pierwszych 18 wartości liczb Lk z dokładnością do piętnastego miejsca po kropce. Nasze rozważania z poprzedniego akapitu mogłyby prowadzić do przypuszczenia, że L k +1 > W rzeczywistości te wartości są raz większe, raz mniejsze. Zauważmy, że wartości Lk szybko zbiegają do gra nicznej wartości 2 . Jest godne uwagi, że te wielomiany od niewymiernej liczby e, o całkowitych współczynnikach i współczynnikach przy najwyższej potędze + 1 (monie polynomial), zbiegają tak szybko do wymiernej liczby 2! Wielomiany (26) są także ciekawe z punktu widzenia analizy numerycznej, ponieważ dostar czają wspaniałego przykładu u traty znaczących cyfr, gdy odejmowane są dwie prawie takie same liczby; używając 19-cyfrowej arytm etyki zmiennopozycyjnej Gassner wywnioskował niepoprawnie, że L 12 > 2 , natom iast John W. Wrench, Jr., zauważył, że 42-cyfrowa arytm etyka zmiennopozycyjna umożliwia policzenie poprawnie tylko 29 najbardziej znaczących cyfr liczby ¿28Asymptotyczne zachowanie się liczb Lk można zbadać, używając prostych m etod z teorii liczb zespolonych. Mianownik w (25 ) jest równy zeru tylko wtedy,
SEKWENSY
5.1.3
43
Tabela 2 ŚREDNIA DŁUGOŚĆ fc-TEGO SEKWENSU
1
2
3 4 5 6 7
1.71828 1.95249 1.99579 2.00003 2.00005 2.00000 1.99999 1.99999 1.99999
Lk
k
Lk 18284 24420 13690 88504 75785 50727 96401 98889 99948
2.00000 2.00000 1.99999 1.99999 1.99999 2.00000
05997+ 93672+ 99909+ 9702299719+ 00019+ 2.00000 00000 00006+ 2.00000 00000 00000 + 2.00000 00000 00000 -
10 11 12
59045+ 12560842857680689716+ 5571044022+ 04744+ 43434-
13 14 15 16 17 18
00012 00001 99999 99999 99999 00000
gdy ez 1 = z, czyli gdy ex 1sin y ^= y,
oraz
ex 1 cos y — x
(27)
jeśli przyjmiemy z = x + iy. Na rysunku 3, gdzie przedstawiono wykresy obu równań, widzimy, że przecinają się one w punktach z — zo, ¿4 , ż j, Z2 , Ź2, . . . , gdzie zo = h Zi = (3.08884 30156 13044-) + (7.46148 92856 54255-) i,
( 28)
a część urojona 3 (2++ 1 ), dla dużych k jest w przybliżeniu równa 3 ( 2+) + 27r. Ponieważ lim ( — 1 —— ^ (z —Z&) = —1 \ e z~ L — z )
dla k > 0,
z -+ zk
i granica ta jest równa —2 dla k — 0, zatem funkcja J U 2 ) = i( i) + _ ? _ + ^
Z -Z o
+ ^
Z —Zi
+ -
z —Z1
^
+ ^
Z - 22
+ ...+
2 —22
2 2 — 2.
2
2 -2
nie ma żadnych osobliwości na płaszczyźnie zespolonej dla |z| < |zm+ i|. Stąd Jim (z) można rozwinąć w szereg potęgowy ^2k PkZk ^ który jest bezwzględnie zbieżny, gdy \z\ < |zm+ i|; wynika stąd, że p k M k —> 0, kiedy k —>00, przy czym M = |2m+i| —e. W spółczynniki w L(z) są współczynnikami w
2 | *Ai 1-2
1 — 2/21
| z/n
|
!
1 —2/21
Z¡Z. + 2-------— + R m { z ), 1 - Z/Zm 1 - z /z 7
a zatem Ln = 2 + 2r ^ n cosn9\ + 2n p c o s n 02 H
1" 2r “ n co sn 0m +
(29)
jeśli weźmiemy 2+ = r kei@k
(30)
44
SORTOWANIE
5.1.3
ex 1 sin y = y ex_1 cos y = x R y s . 3. Pierwiastki ez 1
To ukazuje asym ptotyczne zachowanie się liczb L n . Mamy 8.07556 64528 89526-,
6>i = 1.17830 39784 74668+;
r2 = 14.35456 68997 62106-,
6*2 = 1.31268 53883 87636+;
r3 = 20.62073 15381 80628-,
03 = 1.37427 90757 91688-;
r4 = 26.88795 29424 54546-,
04 = 1.41049 72786 51865-;
n =
(3i)
tak więc główny wkład do L n — 2 wnoszą r x i 6X, a szereg (29) zbiega bardzo szybko. Dalsza analiza [W. W. Hooker, C A C M 12 (1969), 411-413] pokazuje, że Rm{z) —►—cz dla pewnej stałej c, gdy m —>0 0 ; stąd szereg 2 ^ fc>0 r^"n c o s n ^ rzeczywiście zbiega do gdy n > 1 (zobacz również ćwiczenie 28). Można przeprowadzić bardziej uważną analizę prawdopodobieństw, żeby wyznaczyć pełny rozkład prawdopodobieństwa dla długości fc-tego sekwensu i łącznej długości pierwszych k sekwensów (zobacz ćwiczenia 9, 10 , 1 1 ). Okazuje się, że wartość sumy Zq + • • • 4- Lfc wynosi asymptotycznie 2k — | + 0 (8-fc). Zakończymy ten punkt zbadaniem własności sekwensów, gdy dopuścimy występowanie w perm utacjach tych samych elementów. Znany dziewiętnasto wieczny amerykański astronom Simon Newcomb często układał pasjansa, który
SEKWENSY
5.1.3
45
ma związek z powyższym zadaniem. W tym pasjansie należy układać karty na kupkę (jedna na drugą) tak długo, jak długo ich wartości są w porządku niemalejącym; kiedy kolejna karta ma wartość mniejszą od ostatnio położonej na kupce, należy rozpocząć budowę nowej kupki. Simon Newcomb interesował się prawdopodobieństwem tego, że po wyłożeniu wszystkich kart z talii zostanie utworzona zadana liczba kupek. Problem Simona Newcomba polega zatem na znalezieniu rozkładu praw dopodobieństwa dla sekwensów w losowej perm utacji m ultizbioru zbioru. Pełna odpowiedź jest dosyć skomplikowana (zobacz ćwiczenie 12 ), chociaż wiemy już, jak rozwiązać ten problem w specjalnym przypadku, gdy karty m ają różne war tości. T utaj zadowolimy się wyprowadzeniem średniej liczby kupek powstających podczas układania pasjansa. Na początek przyjmijmy, że mamy m różnych typów kart i karta każdego typu pojawia się p razy. Na przykład w zwykłej talii kart do brydża m = 13 i p = 4, jeśli nie liczyć kolorów kart. Dla tego przypadku godną uwagi sym etrię odkrył P. A. MacMahon [Combinatory Analysis 1 (Cambridge, 1915), 212-213]: Liczba perm utacji zawierających k + 1 sekwensów jest taka sam a jak liczba perm utacji 0 m p —p — k + 1 sekwensach. Gdy p — 1, ten związek opisuje równość (7 ), ale dla p > 1 jest ona całkowicie zaskakująca. Możemy wykazać tę symetrię, znajdując wzajemnie jednoznaczną odpowiedniość między perm utacjam i, które każdej perm utacji o k + 1 sekwensach przyporządkowuje inną perm utację o m p — p — k + 1 sekwensach. Nalegamy, żeby przed przystąpieniem do dalszej lektury spróbować samemu znaleźć taką odpowiedniość. Trudno jest wskazać prostą odpowiedniość; dowód M acM ahona był przepro wadzony za pomocą funkcji tworzących, a nie konstrukcji kombinatorycznej. Jed nak odpowiedniość Foata (twierdzenie 5.1.2B) umożliwia uproszczenie zadania. Twierdzenie 5.1.2B mówi, że istnieje różnowartościowa odpowiedniość między perm utacjam i zbiorów z powtórzeniami o k + 1 sekwensach a perm utacjam i, których dwuwierszowa reprezentacja zawiera dokładnie k kolumn % z x < y. Załóżmy, że danym zbiorem z powtórzeniami jest {p • 1, p • 2 , . . . , p • m}, 1 rozważmy perm utację, której dwuwierszową reprezentacją jest
...
1
2
...
X\p
X21
■• ■
2
...
m
X2p
• ■•
Xm i
(32)
Możemy tę perm utację związać z perm utacją 1 x ’lp
l x'mX
.. .
2
...
m
...
x'mp
...
x'21
(33 )
gdzie x ł = m + 1 — x. Jeśli (32 ) zawiera k kolumn postaci przy x < y, to (33) zawiera (m — 1 )p — k takich kolumn; ponieważ musimy rozważać tylko przypadek y > 1 , a x < y jest równoważne x f > m + 2 — y. Ale teraz (32 ) odpowiada perm utacji o k + 1 sekwensach, a (33 ) perm utacji o m p — p — k + 1 sekwensach; przekształcenie z (32 ) w (33 ) jest odwracalne - przekształca (33 )
46
SORTOWANIE
5.1.3
z powrotem w (32). W ten sposób wykazaliśmy warunek symetryczności MacMahona. W ćwiczeniu 14 znajdziemy przykład tej konstrukcji. Z własności symetryczności mamy, że średnia liczba sekwensów w losowej perm utacji musi wynosić |((/c + 1) + (mp — p — fc + 1)) — 1 + \p{m — 1 ). Na przykład średnia liczba kupek kart w pasjansie Simona Newcomba dla zwykłej talii kart wynosi 25 (tak więc ten pasjans nie jest zbyt ekscytujący). W rzeczywistości, posiłkując się bardzo prostą argum entacją, możemy wy znaczyć średnią liczbę sekwensów w ogólnym przypadku. Niech {n\ • x i, ri2 • X 2 , **• ) n m *%m} będzie dowolnym multizbiorem, gdzie x-y są różne. Niech n ~ n i + U2 + *■* + n m i wyobraźmy sobie, że zapisaliśmy wszystkie permutacje a\ Ü2 . . . an powyższego multizbioru. Policzymy, jak często a* jest większe od a,i+i dla każdej ustalonej wartości «, 1 < i < n. Liczba przypadków > 0^+1 jest równa połowie liczby przypadków di ^ fli+i; nie jest trudno zauważyć, że = a^+i = Xj dokładnie N n j ( n j — l ) / n ( n — 1 ) razy, gdzie N jest liczbą wszystkich perm utacji. Stąd a\ = a^+i dokładnie n(n^-l) razy i
“ X)) = n ^ _ i) (n i + ' ' ' +
+ '' ’+
- »)
dokładnie
razy. Sumując względem i i dodając 7V, ponieważ sekwens kończy się w an w każ dej perm utacji, otrzymujemy łączną liczbę wszystkich sekwensów we wszystkich N perm utacjach: i V( ? - à (n' + " ‘ + n ™) + 1 ) ' (34) Po podzieleniu przez N otrzymujemy poszukiwaną średnią liczbę sekwensów. Ponieważ sekwensy odgrywają ważną rolę w badaniu „statystyk porządko wych” , istnieje całkiem spora literatura na ich tem at. Rozważa się w niej także inne typy sekwensów, które tu ta j nie były omawiane. Po dodatkowe informacje m ożna sięgnąć do książki Combinatorial Chance , F. N. David i D. E. Barton (London: Griffin, 1962), rozdział 10; jak również do przeglądowego artykułu D. E. B artona i C. L. Mallowsa, Annais of Math. Statistics 36 (1965), 236-260. Ć W IC ZEN IA 1. [M26 ] Wyprowadź wzór Eulera ( 13 ). ► 2 . [M22\ (a) Rozwiń ideę opisaną w tekście i udowodnij (8 ). Rozważ ciągi ai które zawierają dokładnie q różnych elementów w celu udowodnienia, że
(b) Wykorzystaj tę tożsamość do dowodu, że n \ f k + 1\
f
n+1
. . . an,
5.1.3
SEKWENSY
47
3. [HM25] Oblicz sumę 4. [M21} Jaka jest wartość S fc(—l ) fc{£}
(”^*0 ?
5. [M20] Znajdź wartość (£) modp, gdy p jest liczbą pierwszą. ► 6 . [M21] Pan Pustogłowy zauważył (zależności (4 ) i ( 13 )), że 'n-\- 1 ’
k^O j^O “ i r ' l
k^O
Sumując najpierw po k odkrył, że X)fe^0( —l ) fe j ( 2 - j) = 0 dla każdego j ^ 0; stąd n! = 0 dla każdego n ^ 0. Czy pan Pustogłowy się pomylił? 7. [HMĄO] Czy rozkład prawdopodobieństwa zadany w ( 14 ) jest rozkładem asymp totycznie normalnym? (Zobacz ćwiczenie 1.2.10-13). 8 . [M24] (P. A. MacMahon) Pokaż, że prawdopodobieństwo, iż w wystarczająco długiej permutacji długość pierwszego sekwensu wynosi ¿1, drugi sekwens ma długość ¿2, . •, a k-ty ma długość ^ lk, wynosi 1/(¿1 -h ¿2 + h Y
•**
1
1/ ( h hYl / / 2!
l / ( / 2 + / 3)!
...
o
1
I/I3!
...
l / ( i 3 + - " + /fc)!
0
0
...
1
1/ l k \
^l/ /i!
det
l / ( ^i + ¿2 + ¿3 + * ■■+ I k Y \
l / ( / 2 + /s H
h /A:)i
J
9. [M30\ Niech hk{z) — Y2PkmZm, gdzie pkm jest prawdopodobieństwem, że m jest łączną długością pierwszych k sekwensów w losowym (nieskończonym) ciągu. Znajdź „proste” wzory na ńi(z), ń 2 (z) oraz funkcję tworzącą dwóch zmiennych h ( z , x ) = Efc hk( z ) x k.
1 0 . [HM30] Jak asymptotycznie zachowuje się wartość oczekiwana i wariancja dla
rozkładu hk{z) z poprzedniego ćwiczenia dla dużych wartości fc? 1 1 . [M40] Niech Hk(z) = Y l ^ k m Z m, gdzie Pkm jest prawdopodobieństwem, że m jest długością fc-tego sekwensu w losowym (nieskończonym) ciągu. Przedstaw H \(z ), i / 2 (z) i funkcję tworzącą dwóch zmiennych H(z , x) — Y^k H k ( z ) x k za pomocą znanych funkcji. 1 2 . [M33] (P. A. MacMahon) Uogólnij zależność ( 13 ) na permutacje multizbiorów, dowodząc, że liczba permutacji {m * 1 , n 2 • 2 , . . . , nm • m } o dokładnie k sekwensach wynosi
\ Ek r_1 v iV n ^~1 j )
J=u
gdzie n = m + n 2 4
( ni ~ 1 + k ~ 3 \ ( U2 ~ 1 + k ~ V
ni
/ V
n2
/
( Urn “ 1 +
- j\
rim
/
" V
h n m.
13. [05] Załóżmy, że układamy pasjansa Simona Newcomba dla zwykłej talii kart do brydża, ale ignorujemy wartości kart, natomiast bierzemy pod uwagę ich kolory: trefle < kara < kiery < piki. Jaka jest oczekiwana liczba kupek w tym przypadku? 14. [Ml8] Permutacja 3 1 1 1 2 3 1 4 2 3 3 4 2 2 4 4 zawiera 5 sekwensów. Zastosuj kon strukcję opisaną w dowodzie warunku symetryczności MacMahona do znalezienia od powiadającej jej permutacji o 9 sekwensach.
48
SORTOWANIE
5.1.3
►15. [M21] (Sekwensy naprzemienne) W klasycznej dziewiętnastowiecznej literaturze poświęconej analizie kombinatorycznej nie porusza się tematu sekwensów w permutacjach w sposób, o jakim była tutaj mowa. Kilku badaczy rozważało sekwensy, które na przemian rosną i maleją. Tak więc o permutacji 5 3 2 4 7 6 1 8 uważało się, że ma 4 sekwense: 5 3 2, 2 4 7, 7 6 1 i 18. (Pierwszy sekwens może być zarówno rosnący, jak i malejący, w zależności od tego, czy a\ < a2, czy ai > a2; tak więc a i a 2 . . . a n, an . . . a2 ai i (n + 1 —ai ) ( n + 1 —a2) . . . (n + 1 —an ) mają wszystkie taką samą liczbę naprzemiennych sekwensów). Dla permutacji n-elementowej maksymalna liczba takich sekwensów wynosi n — 1 . Znajdź średnią liczbę naprzemiennych sekwensów w losowej permutacji zbioru {1, 2 , . . . , n}. [Wskazówka: Rozważ dowód zależności ( 34 )]. 16. [M30] W dalszym ciągu rozważamy poprzednie ćwiczenie. Niech | ™| będzie liczbą permutacji zbioru { l , 2 , . . . , n } , które mają dokładnie k naprzemiennych sekwensów. Znajdź zależność rekurencyjną, za pomocą której można by policzyć tabelę liczb | ” |. Znajdź także odpowiadającą jej zależność rekurencyjną dla funkcji tworzącej Gn (z) = Y2k IjJ Iz k/n\. Użyj ostatniej zależności do znalezienia prostego wzoru na wariancję liczby naprzemiennych sekwensów w losowej permutacji zbioru { 1 , 2 , . . . , n}. 17. [M25] Ile spośród 2 n ciągów a± a 2 .. . an, w których aj jest równe 0 lub 1, ma dokładnie k sekwensów (tzn. k — 1 wystąpień aj > aj+ 1)? 18. [M28] Rozważmy n! ciągów 61 b2 .. . 6n, takich że każde bj jest liczbą całkowitą w przedziale 0 ^ bj ^ n —j. Ile spośród tych ciągów zawiera (a) dokładnie k spadków (to jest k wystąpień bj > b3+i)? (b) dokładnie k różnych elementów?
R y s. 4. Szachownica z nieatakującymi się wieżami. ►19. [M26] (J. Riordan) (a) Na ile sposobów można rozmieścić n nieatakujących się wież - żadne dwie nie mogą znaleźć się w tym samym wierszu ani w tej samej kolumnie - na szachownicy n x n, tak żeby dokładnie k z nich leżało poniżej głównej przekąt nej? (b) Na ile sposobów można rozmieścić k nieatakujących się wież poniżej głównej przekątnej szachownicy o wymiarach n X n? Rysunek 4 przedstawia na przykład jeden z 15619 sposobów rozmieszczenia ośmiu nieatakujących się wież na zwykłej szachownicy, z dokładnie trzema wieżami umiesz czonymi w niezacieniowanym obszarze szachownicy poniżej głównej przekątnej. Na tym samym rysunku pokazano także jeden z 1050 sposobów rozmieszczenia nieatakujących się wież na trójkątnej planszy.
TABLEAUX I INWOLUCJE
5.1.4
49
►2 0 . [M21] O permutacji mówimy, że wymaga k odczytów, jeśli należy przejrzeć ją k razy od lewej do prawej, żeby odczytać jej elementy w porządku niemalejącym. Na przykład permutacja 4 9 1 8 2 5 3 6 7 wymaga czterech odczytów. Za pierwszym razem otrzymujemy 1, 2, 3; za drugim dostajemy 4, 5, 6 , 7; potem 8 ; na koniec 9. Znajdź związek między sekwensami a odczytami. 21. [M22] Jeśli permutacja a\ ci2 . . . an zbioru { 1 , 2 , . . . , n} zawiera k sekwensów i wy maga j odczytów (w znaczeniu z ćwiczenia 20 ), to co można powiedzieć o permutacji an ... 02 ai? 2 2 . [M26] (L. Carlitz, D. P. Roselle, R. A. Scoville) Pokaż, że nie istnieje permutacja zbioru { 1 , 2 , . . . , n} o n + 1 —r sekwensach i wymagająca s odczytów, jeśli rs < n; taka permutacja istnieje, gdy n ^ n + 1 —r ^ s ^ l oraz rs X n.
23. [HMĄ2] (Walter Weissblum) „Długie sekwensy” w permutacji a\ a
X X ™ 1 + 5™1) = e ~ 2' m —1
*5.1.4. Tableaux i inwolucje
Na zakończenie naszego przeglądu kombinatorycznych własności perm utacji omówimy pewne istotne zależności, które łączą perm utacje z tabelam i liczb całkowitych nazywanymi tableaux. Tableau Younga postaci ( n i , n 2, . . . , n m), gdzie n i > ri2 > **• > n m > 0, nazywamy rozmieszczenie n i + 712 + *• • + n m różnych liczb całkowitych w tabeli składającej się z m wierszy rozpoczynających się w tej samej kolumnie i w której i-ty wiersz zawiera n^ elementów, elementy w każdym wierszu są uporządkowane rosnąco z lewa na prawo, a elementy
50
5.1.4
SORTOWANIE
w każdej kolumnie są uporządkowane rosnąco z góry na dół. Na przykład 9 10 15 13 ( i)
12 14
11 jest tableau Younga postaci (6 , 4, 4, 1 ). Takie rozmieszczanie liczb całkowitych zostało zaproponowane przez Alfreda Younga, jako pomoc w badaniu macie rzowych reprezentacji perm utacji [zobacz Proc. London M ath. Soc. (2) 28 (1928), 255-292; Bruce E. Sagan, The Symmetric Group (Pacific Grove, Calif.: W adsworth & Brooks/Cole, 1991)]. Upraszczając, będziemy mówili po prostu „tableau” zam iast „tableau Younga” . Inwolucją nazywamy perm utację, która sama dla siebie jest perm utacją odwrotną. Na przykład jest dziesięć inwolucji zbioru {1, 2, 3, 4},
(2 )
Termin „inwolucją” pochodzi z geometrii klasycznej; inwolucje w znaczeniu roz ważanym tu ta j były pierwszy raz badane przez H. A. R othe’a wraz z pojęciem inwersji (zobacz punkt 5.1.1). Może wydawać się dziwne, że będziemy jednocześnie omawiać tableaux i in wolucje, ale jest pewien zadziwiający związek między tymi, na pozór odległymi, pojęciami: Liczba inwolucji zbioru { 1 , 2 , . . . , n} jest taka sama ja k liczba ta bleaux, które można utworzyć z elementów { l , 2 , . . . , n } . Na przykład z liczb {1, 2, 3, 4} można utworzyć dziesięć tableaux
to
1
3 4
1 2
CO
12
1 2 3
1 4 2
1 3 2
3
4
1 2 4
3 (3)
co
4
4
które odpow iadają dziesięciu inwolucjom (2 ). Ten związek między inwolucjami a tableaux nie jest wcale oczywisty i praw dopodobnie nie m a zbyt prostego dowodu dla tego faktu. Dowód, który przed stawimy, korzysta z interesującego algorytm u budowy tableau. Sam algorytm m a także kilka innych zadziwiających własności. Stosuje się w nim specjalną procedurę wstawiania nowych elementów do tableau.
TABLEAUX I INWOLUCJE
5.1.4
51
Załóżmy przykładowo, że chcemy wstawić 8 do tableau 1
3 5 9 12 16
2
6 10 15
4 13 14
(4)
11
17 W metodzie, którą zastosujemy, rozpoczynamy od umieszczenia 8 w wierszu 1, w miejscu poprzednio zajmowanym przez 9, ponieważ 9 jest najm niejszym elementem w tym wierszu większym od 8 . Element 9 zostaje przesunięty do wiersza 2 , w którym zastępuje 10. Następnie 10 „wypycha” 13 z wiersza 3 do wiersza 4. Ponieważ wiersz 4 nie zawiera elementów większych niż 13, cały proces kończy się na wstawieniu 13 na prawym końcu wiersza 4. Tak więc tableau (4 ) zostało przekształcone na 1
3 5 8 12 16
2
6
9 15 4 10 14
(5)
11 13
17 Dokładny opis tego procesu wraz z dowodem, że zachowuje on zawsze wła sności tableau, znajduje się poniżej. A lg o ry tm I ( Wstawianie do tableau). Niech P = (Pij) będzie tableau dodatnich liczb całkowitych i niech x będzie dodatnią liczbą całkowitą nie występującą w P. Omawiany algorytm przekształca P na inne tableau, które zawiera x razem z poprzednimi elementami. Nowe tableau jest tej samej postaci co stare z wyjątkiem dodanej nowej pozycji w wierszu s i kolumnie t, gdzie wartości s i t są wyznaczane w algorytmie. (Uwagi w nawiasach okrągłych w opisie algorytmu służą do wykazania jego poprawności - łatwo jest sprawdzić przez indukcję, że są one słuszne i że tablica P pozostaje tableau podczas całego procesu. Dla wygody będziemy zakładali, że tableau zostało otoczone zerami z góry i z lewa oraz wartościami 00 z dołu i z prawa, tak że Pij jest określone dla wszystkich i , j > 0. Jeśli zdefiniujemy relację a
wtedy i tylko wtedy, gdy
'¿(¿+1) Pi*
i
Pij £ p (i+i)j
i =0
lub
j = 0;
dla wszystkich i, j > 0.
(7)
Stwierdzenie nx 0 P ” oznacza, że x = 00 lub x ^ P ^ dla wszystkich i , j > 0).
52
SORTOWANIE
5.1.4
1 1 . [ W p r o w a d z a n ie x \
W ykonaj
P\3 =
w a r to ś ć ta k ą , że
1 2 . [ Z n a jd o w a n ie X j+ i] x i <
(W
ty m
< x t <
x i+ i =
14 . [C zy x i + i = Xi <
=
P tj <
oo?]
x i+ i <
<—
x
p u n k c ie P ( i ~ i ) j
P i ( j - 1)> z m n i e js z J o l i
1 3 . [ Z a s t ę p o w a n ie p r z e z
1, x \
o r a z p r z y p is z j
n a jm n i e js z ą
oo.
w y k o n a j x t + i < - P t] i n
Pij
i
xĄ
<
Xi
p o w tó r z te n krok. W
<
P ij
i x,
£
P).
J e ś li
p r z e c iw n y m p r z y p a d k u
<- j . (T eraz
P(i+ i)j
<
oraz
r, =
( T e r a z P i ( j _ 1} < P ( j+ i) j, n
= j
x t <
P x]
j).
=
x i+ i =
W ykonaj
x t <
oraz x i + \
P ij <
P).
x i+1
<
C y + i) ,
P(i~ i)j
P l} < - x x . P i ( j + 1 ), P {x- \ ) j
<
J e ś li x i + i ^ oo, z w ię k s z i
o 1 i wróć do kroku 12 . 15.
[Wyznaczanie s, t] W ykonaj s (W tym punkcie warunki Pst ^ oo są spełnione).
i, t
oraz
j i zakończ wykonywanie algorytmu.
P(s+i)t = ^ ( ¿ + 1) = oo
(8)
|
Algorytm I definiuje „ciąg przemieszczeń” X = Xi <
X2
< ■*• < x s < £ S+ 1 = OO,
( 9)
jak i pomocniczy ciąg indeksów kolumn n > r 2 > **•
> rs = t;
( 10)
element P{Ti zmienił się z Xi+1 na X{ dla 1< i < 5. Na przykład dla elementu 8 wstawianego do (4 ) ciągiem przemieszczeń jest 8, 9, 10, 13, 00, a pomocniczym ciągiem indeksów jest 4, 3, 2 , 2 . Powyższy algorytm można zapisać w taki sposób, żeby wykorzystać dużo mniej pamięci pomocniczej; tylko bieżące wartości j , xi oraz Xi+\ muszą być zapam iętane. Ciągi (9) i ( 10) zostały wprowadzone tylko po to, żeby udowodnić kilka interesujących własności tego algorytmu. Kluczową własnością algorytmu I, z której będziemy korzystali, jest to, że można algorytm odwrócić: M ając dane wartości s i t wyznaczane w kroku 15, możemy na powrót odtworzyć P , wyznaczając i usuwając element x, który został uprzednio wstawiony. Dla przykładu rozważmy ( 5 ) i załóżmy, że powiedziano nam, że element 13 znajduje się na pozycji, która poprzednio była niezapełniona. Zatem 13 musiało zostać wypchnięte z wiersza 3 przez 10, ponieważ 10 jest największym elementem mniejszym od 13 w tym wierszu; podobnie 10 musiało zostać wypchnięte z wiersza 2 przez 9, a 9 musiało zostać wypchnięte z wiersza 1 przez 8. Tak więc możemy przejść z ( 5 ) z powrotem do (4 ). Poniższy algorytm opisuje ten proces szczegółowo. A lg o r y tm D ( Usuwanie z tableau). Dane jest tableau P i dodatnie liczby całkowite s, t spełniające (8). Przedstawiany algorytm przekształca P na nowe tableau o tej samej postaci, ale z 00 w kolumnie t i wierszu s. Z P jest usuwany element x, który jest wyznaczany w algorytmie. (Podobnie jak w algorytmie I, w nawiasach okrągłych są podane asercje, które służą do wykazania, że P pozostaje tableau).
TABLEAUX I INWOLUCJE
5.1.4
D l . [Wprowadzanie s, t] W ykonaj j
£, i
5 , x s+x
53
<— oo.
D 2 . [Znajdowanie xĄ (W tym punkcie P\j < Xi+\ < P(i+i)j i %i+i & P)Pi(j+ 1) < £¿+ 1 , zwiększ j o l i powtórz ten krok. W przeciwnym przypadku wykonaj Xi Pij i r* +—j. D 3. [Zastępowanie przez x i+ i] (Teraz Ą ( j-i) < Pij = Xi < x i+\ < Pt{j+1), P (i-I)j < Pij = Xi < x i+i < P(i+i)j oraz n = j) . W ykonaj Pió *- x i+1. D 4. [Czy i = 1 ?] (Teraz Pi{j_ < x t < x l+\ - Pl;j < Pąj+ i), P (i-i)j < x,t < x i+i = Pij < P ^ i y j oraz Ti = j) . Jeśli i > 1, zmniejsz i o 1 i wróć do kroku D2. D 5. [Wyznaczanie x] W ykonaj x czone. (Teraz 0 < x < oo). |
x \\ wykonywanie algorytmu zostaje zakoń
Asercje w nawiasach okrągłych pojawiające się w algorytmach I oraz D nie tylko są pomocne w dowodach, że oba algorytmy zachowują strukturę tableau, ale pozwalają także uzasadnić, że algorytm y I i D są w pełni odwrotne do siebie. Jeśli najpierw uruchomimy algorytm I dla danych, tableau P i dodatniej liczby całkowitej x P , to x zostanie wstawione do tableau i wyznaczone zostaną liczby całkowite s, t spełniające (8). Algorytm D zastosowany do otrzym anych wyników wyznaczy x i odtworzy P. Odwrotnie, jeśli najpierw wykonamy algorytm D dla danych, P i pewnych liczb całkowitych s, t spełniających (8), dokona się m ody fikacja P i zostanie usunięta pewna liczba całkowita x. Algorytm I zastosowany do otrzymanych wyników wyznacza s, t i odtwarza P. Dzieje się tak dlatego, ponieważ asercje w krokach 13 i D4 są identyczne jak asercje w krokach 14 i D3. Asercje te jednoznacznie określają wartość j . Zatem pomocnicze ciągi (9), ( 10 ) są takie same w każdym przypadku. Teraz jesteśmy już gotowi, żeby udowodnić podstawową własność tableaux: T w ie rd z e n ie A . Istnieje wzajemnie jednoznaczna odpowiedniośc m iędzy zbio rem wszystkich perm utacji zbioru { 1 , 2 , . . . , n} a zbiorem uporządkowanych par tableaux (P, Q) zbudowanych z { 1 , 2 , . . . , n}, gdzie P i Q są tej samej postaci. (Przykład ilustrujący to twierdzenie występuje w jego dowodzie). Dowód. Jest wygodnie udowodnić trochę ogólniejszy rezultat. Dla danej dwu wierszowej tablicy ( qi \P i
P2
• • . Q n\ .. . P n ) '
Ql < <12 < *** < P i , P2 j • • • j Pn są różne,
1
v }
zbudujemy dwa odpowiadające jej tableaux P i Q, w których elementami P są { p i,. . . , Pn}) elementami Q są ( g i , .. . ,ą n }> a postać P jest taka sam a jak postać Q. Niech P i Q będą początkowo puste. Następnie, dla i = 1, 2, . . . , n (w takiej kolejności), wykonujemy następującą operację: W staw pi do P , korzystając z al gorytmu I; następnie wykonaj Q st ćp, gdzie s i t wyznaczają nowo zapełnioną pozycję w P .
Jeśli
54
5.1.4
SORTOWANIE
N a przykład dla perm utacji ( 7 2 9 5 3 ) otrzymujemy P W staw 7:
m
W staw 2 :
_2j _7_ 2 9
W staw 9:
1
to
5
1
5
7
9
CO
W staw 3:
6
2
3
1
5
5
9
3
6
00
7
i1 3 i V7 2 5 5
5
9
6
7
(13)
00
1 II
3 O
to
;) są
CO
p =
( 12 )
CO
7 W staw 5:
5
Z powyższej konstrukcji jasno wynika, że P i Q są zawsze tej samej po staci. Ponadto, ponieważ zawsze dodajemy elementy na brzegu Q w porządku rosnącym, zatem Q jest tableau. Na odwrót, m ając dane dwa tableaux P i Q tej samej postaci, możemy w następujący sposób znaleźć odpowiadającą im dwuwierszową tablicę ( 1 1 ). Niech elementami Q będą qi < q
Dla i = n, . . . , 2 , 1 (w tej kolejności), niech pi będzie takim elementem x, który jest usuwany, gdy zastosujemy algorytm D do P dla s i t takich, że Q st — Dla przykładu, rozpoczynając od ( 13 ) i stosując algorytm D do kolejnych ta bleaux z ( 12 ) (w odwrotnej kolejności), aż P będzie puste, dostaniemy ( 7 2 9 5 3 )* Ponieważ algorytmy I oraz D są wzajemnie odwrotne, opisane właśnie kon strukcje są także wzajemnie odwrotne. W ten sposób wykazaliśmy istnienie poszukiwanej odpowiedniości. | Odpowiedniość zdefiniowana w dowodzie twierdzenia A m a wiele zaskaku jących własności i naszym celem będzie wykazanie niektórych z nich. Przed przystąpieniem do czytania dalszej części zalecamy przerobienie przykładu z ćwi czenia 1 w celu bliższego zaznajomienia się z opisaną wyżej konstrukcją. Element przesuwany z wiersza 1 do wiersza 2 nie wpływa więcej na postać wiersza 1; ponadto wiersze 2, 3, . . . są budowane z elementów wypychanych z wiersza 1 dokładnie w taki sposób, w jaki są budowane wiersze 1 , 2 , ...
5.1.4
TABLEAUX I INWOLUCJE
55
z wyjściowej perm utacji. Te fakty pozwalają inaczej spojrzeć na konstrukcję z twierdzenia A - można skoncentrować się tylko na pierwszych wierszach P i Q. Na przykład perm utacja ( 7 2 9 5 3 ) powoduje następujące akcje na wierszu 1 (patrz ( 12 )): 1 : W staw 7, Q n <— 1 . 3: W staw 2, wypchnij 7. 5: W staw 9, Q 12 <— 5. ( 14 ) 6 : W staw 5, wypchnij 9. 8 : W staw 3, wypchnij 5. Tak więc pierwszym wierszem P jest 2 3, a pierwszym wierszem Q jest 1 5. Ponadto pozostałe wiersze P i Q tworzą tableaux odpowiadające dwuwierszowej tablicy „wypchniętych” elementów ( 15 ) W celu zbadania zachowania się powyższego procesu na wierszu 1 możemy rozważyć elementy, które trafiają do danej kolumny w tym wierszu. Powiemy, że (qi,Pi) jest klasy t względem dwuwierszowej tablicy «1 < » < - < « . ,
P uP2,---yP n są rożne,
( , v }
jeśli pi = P \t po tym, jak algorytm I został kolejno zastosowany do wstawie nia p i,P 2, • • • i Pi do początkowo pustego tableau P . (Pam iętajmy, że algorytm I zawsze wstawia dany element do wiersza 1 ). Można zauważyć, że (qi,Pi) jest klasy 1 wtedy i tylko wtedy, gdy pi m a i —1 inwersji, tzn. wtedy i tylko wtedy, gdy pi = m in { p i,p 2) ■• • ,Pi} jest „lewo stronnym minimum” . Jeśli z ( 16 ) usuniemy kolumny klasy 1 , otrzym am y inną dwuwierszową tablicę / „/ _v \ (!7) taką, że (g,p) jest klasy t względem ( 17 ) wtedy i tylko wtedy, gdy jest klasy t + 1 względem ( 16 ). Operacja przechodzenia z ( 16 ) do ( 17 ) odpowiada usuwa niu skrajnie lewej pozycji z wiersza 1 . W ten sposób możemy systematycznie wyznaczać klasy. Na przykład w ( 7 2 9 5 3 ) lewostronnymi minimami są 7 i 2, zatem w klasie 1 są {(1,7), (3 , 2)}; w otrzym anej tablicy ( 9 5 3 ) wszystkie ele menty są minimami, tak więc klasę 2 tworzą {(5,9), (6,5), (8,3)}. W tablicy „wypchniętych” elementów ( 15 ) klasę 1 tworzą {(3,7), (8,5)}, a klasę 2 tworzy {(6,9)}. Dla ustalonej wartości t elementy klasy t można poetykietować {ętil ) P i l ) ) * * * » f e f c ) P i k )
w taki sposób, że Qii < 0i2 < Pii > P i2 > *** > P iki
(l8 )
56
5.1.4
SORTOWANIE
ponieważ elementy trafiające na pozycję P u podczas wstawiania tworzą malejący ciąg p u , . . . , Pik. Po zakończeniu tego procesu mamy P u = P i k,
Qit = qu;
( 19 )
a dwuwierszowa tablica „wypchniętych” elementów, która określa wiersze 2, 3, . . . tableaux P i Q, zawiera kolumny ( qi2 \Ph
\
*3 • • •
(20)
Pi2 • • Pik- l J
plus inne kolumny tworzone w podobny sposób z innych klas. Te obserwacje dają prostą m etodę ręcznego obliczania P i Q (zobacz ćwicze nie 3 ), a także dostarczają środków do udowodnienia nieoczekiwanego wyniku: T w ie rd z e n ie B . Jeśli w konstrukcji z twierdzenia A permutacji (1
\a 1
a2
2 -
...
odpowiadają tableaux ( P, Q). to perm utacji do niej odwrotnej odpowiadają ( Q , p ). Ten fakt jest rzeczywiście zaskakujący, ponieważ P i Q są budowane za pomocą zupełnie różnych m etod z twierdzenia A, a także dlatego, że permutacja odw rotna jest otrzym ywana w wyniku dziwnego żonglowania kolumnami dwuwierszowej tablicy. Dowód. Załóżmy, że mamy daną dwuwierszową tablicę ( 16 ); zamieniając wiersze i sortując kolumny w taki sposób, żeby nowy górny wiersz był uporządkowany rosnąco, otrzymujemy tablicę „odwrotną”
Pl < P2 < **• < Vn\ , , , Sii rOZne'
( , (21)
Pokażemy, że taka operacja odpowiada zamianie P i Q w konstrukcji z twierdze nia A. W ćwiczeniu 2inaczej formułujemy nasze spostrzeżenia dotyczące wyzna czania klas, tak że klasa ( qi ,p i) nie zależy od faktu, iż q \ , q%, . . . , qn są w porządku rosnącym. Ponieważ otrzym ane warunki są symetryczne względem elementów q i elementów p, operacja ( 21 ) nie burzy struktury klas; jeśli ( q, p) jest w klasie t względem ( 16 ), to ( p ,q ) jest w klasie t względem (21 ). Jeśli zatem przedstawimy elementy drugiej klasy t analogicznie do ( 18) jako Pik < Qik >
*■* * * *
< P i2 < P > qi 2 >
(22)
i n >
to mamy Pu =
,
Q u = Pik
( 23 )
5.1.4
TABLEAUX I INWOLUCJE
57
podobnie jak w ( 19), a kolumny (P i^
...
p.
Pi A
\
••• q*3
(
}
wędrują do tablicy „wypchniętych” elementów jak w ( 20). Zatem pierwsze wier sze P i Q są zamienione. Ponadto dwuwierszowa tablica „wypchniętych” ele mentów dla (21 ) jest odwrotnością dwuwierszowej tablicy „wypchniętych” ele mentów dla ( 16 ). Dowód kończymy przez indukcję względem liczby wierszy w tableaux. | W n io se k . Liczba tableaux, które można utworzyć z { 1 , 2 , . . . , n}, je st liczbą inwolucji na { 1 , 2 , . . . , n}. Dowód. Jeśli 7T jest inwolucją odpowiadającą (P ,Q ), to n = 7r_ odpowiada (<3,P); stąd P = Q. Odwrotnie, jeśli 7r jest dowolną perm utacją odpow iadającą (P, P ), to tt~ także odpowiada (P, P ); stąd 7r = ir~. Zatem istnieje wzajemnie jednoznaczna odpowiedniość między inwolucjami ir a tableaux P . | Jest jasne, że element w górnym lewym rogu tableau jest zawsze najmniejszy. To sugeruje następujący sposób sortowania zbioru liczb. Najpierw umieszczamy liczby w tableau za pomocą algorytmu I; w wyniku tego najm niejszy element znajdzie się w górnym lewym rogu. Następnie usuwamy najm niejszy element, przemieszczając pozostałe elementy w taki sposób, żeby otrzym ać nowe tableau; potem usuwamy nowy najmniejszy element; itd. Zastanówmy się, co dzieje się po usunięciu narożnego elementu z tableau. 1
3 5 7 11 15 2 6 8 14 4 9 13 10 12
16 Jeśli 1 zostaje usunięte, to 2 musi wejść na jego miejsce. Następnie możemy przesunąć 4 na miejsce, gdzie było 2, ale na miejsce 4 nie możemy przesunąć 10; zamiast 10 można przesunąć 9, a potem 12 w miejsce 9. W ogólności dochodzimy do następującej procedury. A lg o ry tm S (Usuwanie elementu narożnego). Algorytm usuwa element z gór nego lewego rogu danego tableau P i przesuwa inne elementy w taki sposób, żeby zachować własności tableau. Przyjmujem y takie same zasady notacyjne jak w algorytmach I oraz D. 51. [Inicjowanie] W ykonaj r
1, s
1.
52. [Czy koniec?] Jeśli Prs — 00, to koniec. 53. [Porównywanie] Jeśli P(r+ i)s < P r (s+i)> to przejdź do kroku S5. (Badamy elementy tuż poniżej i tuż na prawo od opróżnionej pozycji; przesuwamy w wolne miejsce mniejszy z nich).
58
5.1.4
SORTOWANIE
54 . [Przesuwanie w lewo]
W ykonaj PrsP r (s+i)> s ^ - 5 +
1
i wróć doS3.
55 . [Przesuwanie w górę]
W ykonaj PrsP(r +i)s; r ^ - r +
l
i wróć doS 2 .|
Łatwo można pokazać, że P pozostaje tableau po usunięciu narożnego ele m entu za pom ocą algorytm u S (zobacz ćwiczenie 10). Tak więc powtarzając algorytm S aż do opróżnienia P , otrzym am y elementy z tableau w porządku rosnącym. Niestety ten algorytm okazuje się nie tak efektywny jak inne metody sortowania, o których będzie mowa; jego minimalny czas działania jest propor cjonalny do n 15, jednakże podobne algorytmy, które używają drzew zamiast stru k tu r typu tableau, działają w czasie rzędu n lo g n . Pomimo faktu, że algorytm S nie jest bardzo szybkim algorytmem sortowa nia, to m a on pewne bardzo interesujące własności. T w ierd zen ie C (M. P. Schiitzenberger). Jeśli P jest tableau utworzonym m etodą z twierdzenia A z perm utacji ai . . . an i jeśli o>i — m in { ai, ge-2: • • • >
}•>
to algorytm S zm ienia P w tableau odpowiadające Dowód. Zobacz ćwiczenie 13.
.. a 2_ i a ^ i .. . a n .
|
Po zastosowaniu algorytm u S do danego tableau, umieśćmy usunięty element w nowo zwolnionym miejscu P rs , ale zapiszmy go kursywą w celu zaznaczenia, że nie jest to rzeczywisty element tableau. Na przykład po zastosowaniu tej procedury do tableau (25 ) otrzymalibyśmy 2
3
5 7 11 15
4 6 8 14 9 12 13 10 1
16 a kolejne dwa wykonania algorytm u S dają 4
5 7 11 15 2
6
8 13 14
9 12 3 10 1
16 Kontynuując, aż wszystkie elementy zostaną usunięte, dostaniemy układ 16 U 13 12 10 2 15 9 6 4 11 5 3 8 7
1
TABLEAUX I INWOLUCJE
5.1.4
59
o postaci takiej samej jak wyjściowe tableau ( 25 ). Otrzym any układ możemy na zwać tableau dualnym, ponieważ jest podobny do tableau z wyjątkiem „porządku dualnego” w wierszach i kolumnach (zam iana ról znaków < i > ). Oznaczmy przez P s tableau dualne otrzym ane w ten sposób z tableau P . Tableau P można wyznaczyć w jednoznaczny sposób z P s ; w rzeczywistości możemy dostać wyjściowe tableau P z P 5 , stosując ten sam algorytm; ponieważ P s jest tableau dualnym, to wystarczy odwrócić porządek i role elementów zapi sanych kursywą i normalnie. Na przykład dwa kroki tego algorytm u zastosowane do (26) dają H 13 12 10 2 15 u 9 6 4 8 5 3 7 1 16 i na koniec (25 ) zostaje ponownie odtworzone! Ten godny uwagi fakt jest jednym z wniosków z naszego następnego twierdzenia. T w ierd zen ie D (C. Schensted, M. P. Schiitzenberger). Niech
(qi \Pl
92 P2
••• qn j •••
( }
PnJ
będzie dwuwierszową tablicą odpowiadającą tableaux (P, Q). a) P rzy zastosowaniu porządku dualnego (odwrotnego) na elementach qf ale nie na elementach p ? dwuwierszowa tablica
(qn
...
\Pn
•••
92 P2
91) Pl J
m
odpowiada (P T ,(Q S)T). Jak zazwyczaj, „T” oznacza operację transpozycji wierszy i kolumn; P T jest tableau, podczas gdy (Q S )T jest tableau dualnym, ponieważ porządek elementów q został odwrócony. b) Przy zastosowaniu porządku dualnego na elementach p, ale nie na elemen tach q, dwuwierszowa tablica (27 ) odpowiada ((P S )T , Q T) . c) P rzy zastosowaniu porządku dualnego zarówno na elementach p, ja k i ele mentach q, dwuwierszowa tablica (28) odpowiada (P s\ Q s )Dowód.Nie jest znany żaden prosty dowód tego twierdzenia. Fakt, że przypadek (a) odpowiada (P T , X ) dla pewnego tableau dualnego X , jest udowodniony w ćwiczeniu 5; zatem z twierdzenia B mamy, że (b) odpowiada (T, QT ) dla pewnego tableau dualnego 7 , a 7 musi mieć postać taką sam ą jak P T. Niech pi = m in { p i,.. . ,p n }; ponieważ pi jest „największym” elementem w porządku dualnym, to znajduje się na brzegu Y i nie wypycha żadnego ele
60
SORTOWANIE
5.1.4
m entu w konstrukcji z twierdzenia A. Zatem, jeśli kolejno wstawimy p i , .. . ,P i-i, Pi+1 , . . . , pn , stosując porządek dualny, dostaniemy Y — {p^}, to jest Y z usu niętym pi. Z twierdzenia C wynika, że jeśli kolejno wstawimy p i , .. . ,pi_i,pi+i, . . . , p n , stosując zwykły porządek, to dostaniemy tableau d(P ) otrzymywane przez zastosowanie algorytm u S do P . Przez indukcję względem n, F — {pi} = (id (P )s ) T. Ale ponieważ - {P i} = (d (P )S) T ,
(29)
to z definicji operacji 5 i z tego, że F m a taką samą postać jak (P S)T, wynika f = ( p s )t . To dowodzi części (b), natom iast część (a) wynika z zastosowania twierdze nia B. Stosując kolejno części (a) i (b), pokazujemy następnie, że przypadek (c) odpowiada (((P T)5 )T, ((Q S )T )T )', czyli {Ps , Q S ), ponieważ (P S )T = (P T)S, co wynika z symetrii wierszy i kolumn w operacji S. \ Z powyższego twierdzenia wynikają dwa zaskakujące fakty dotyczące algo rytm u wstawiania w tableau: Jeśli po wstawieniu kolejno n różnych elementów p i , . . . , p n do pustego tableau otrzymujemy tableau P , to wstawianie w od wrotnym porządku pn , • ■• ,Pi daje transportowane tableau P T. Jeśli natom iast elementy p wstawiamy nie tylko w porządku p n , . . . , p i , ale w procesie wstawiania zamienimy także rolami < i >, jak i 0 z oo, to otrzymamy tableau dualne P s . Zalecamy Czytelnikowi przećwiczenie tych konstrukcji na kilku prostych przykładach. Niezwykła n atu ra tych zbiegów okoliczności może prowadzić do podejrzeń, że kryją się za tym jakieś czary! Nie jest znane żadne proste wytłu maczenie tego zjawiska; wydaje się, że nie m a nawet prostego dowodu na to, że przypadek (c) odpowiada tableaux o takich samych postaciach, jak P i Q , chociaż charakteryzacja klas z zadania 2 dostarcza ważnej wskazówki. Odpowiedniość z twierdzenia A została podana przez G. de B. Robinsona [American J. M ath. 60 (1938), 745-760, §5] w trochę innej, niejasnej postaci, ja ko część rozwiązania trudnego problemu z teorii grup. Robinson podał twierdze nie B bez dowodu. Wiele lat później C. Schensted ponownie i niezależnie odkrył tę odpowiedniość i opisał ją w term inach „wypychania” , tak jak my zrobiliśmy to w algorytmie I; Schensted udowodnił także część „ P ” w twierdzeniu D(a) [zobacz Canadian J. M ath. 13 (1961), 179-191]. M. R Schiitzenberger [Math. Scand. 1 2 (1963), 117-128] udowodnił twierdzenie C i część „Q” twierdzenia D(a), z której to wynikają części (b) i (c). Jest możliwe uogólnienie omawia nej odpowiedniości na perm utacje multizbiorów; przypadek, gdy p i , . . . , p n nie muszą być różne, był rozważany przez Schensteda, a „ostateczne” uogólnienie do przypadku, w którym zarówno ciąg p, jak i ciąg q mogą zawierać powtarza jące się elementy, zostało zbadane przez K nutha [Pacific J. M ath. 34 (1970), 709-727]. Spróbujmy teraz odpowiedzieć na pokrewne pytanie: Ile tableaux zbudowa nych z { 1 , 2 , . . . , n} ma daną postać (ni, ri2, . . . , n m), gdzie n\ Jcn 2 + - *A~nm = n? Jeśli oznaczymy tę liczbę przez / ( n i , 712, . . . , n m) i jeśli pozwolimy, żeby pa-
5.1.4
TABLEAUX I INWOLUCJE
61
ram etry rij były dowolnymi liczbami całkowitymi, to funkcja / musi spełniać następujące zależności: f ( n i , n 2, .. • , n m) = 0,
m > n 2 > ■■■> n m > 0 ;
chyba że
f ( n i , n 2, .. . , n m , 0) = f ( n 1, n 2, . . . , n m);
(30) (3 1 )
f { n i , n 2, ... , n m) = f { n 1- l , n 2, ■■■, n m ) + / ( n i , n 2- l , . . . , n m ) h f ( r i i , n 2, . . . , n m - l ) ,
H
ni > n 2 > • • • > n m > 1 .
jeśli
(32 )
Rekurencja (32) jest uzasadniona faktem, że po usunięciu największego elementu z tableau nadal dostajem y tableau. Na przykład liczba tableaux po staci (6,4,4,1) wynosi / ( 5 , 4,4 ,1 ) + / ( 6 , 3,4,1) + / ( 6 , 4,3,1) + / ( 6 , 4,4,0) = / ( 5 , 4,4,1) + / ( 6 , 4,3,1) + / ( 6 ,4,4), ponieważ każde tableau postaci (6 ,4,4,1) dla { 1 , 2 , . . . , 15} można otrzymać, wstawiając 15 we właściwe miejsce pewnego tableau postaci (5,4,4,1), (6,4,3,1) lub (6,4,4). Mamy następujący schemat 15 15
+
(33)
15
Funkcja / ( n i , n 2, . . . , n m), która spełnia tę zależność, m a dość prostą postać A ( n i + m — 1 , 712 + Tri — 2, ..., n m) n\ f { j l \ , 712, * * • j 7lm )
1M/
,
i
oM
I
(ni + m — 1 )! (712 + m —2)! . . . n m!
’
(3 4 )
pod warunkiem, że spełnione są stosunkowo łagodne warunki n i + m —l > n 2 + m —2 > * * * > n m; tu ta j A oznacza wyznacznik /X
& ( x i , x 2, .. . , x m) = det
m —1
xi xx \
1
—l Jbm O
1v ■*
\
(3 5 )
ar: ar m
1
I
Wzór (34) został podany przez G. Frobeniusa [Sitzungsberichte preuß. A kad . der Wissenschaften (1900), 516-534, §3] w związku z problemem równoważności w teorii grup, a jego wyprowadzenie wymagało głębokich rozważań teoriogrupowych. Dowód kombinatoryczny został podany niezależnie przez M acM ahona [Philosophicai Trans. A 209 (1909), 153-175]. Poprawność tego wzoru można dowieść indukcyjnie, ponieważ zależności (30) i (3 1 ) zachodzą w oczywisty spo sób, a (32 ) otrzymujemy przyjmując, y — ~ l w tożsamości z ćwiczenia 17.
62
SORTOWANIE
5.1.4
Twierdzenie A w połączeniu ze wzorem (34) daje godną uwagi tożsamość na liczbę tableaux. Sumując względem wszystkich postaci, otrzymujemy ni ki~\-k 2 ~\
ni?2
bk n —n
E k ^ k^ ^ ^/Cfj, 4
ki ~hk*2H---= n l2
^0
A(fci + n — 1 , k2 + n —2 , . . . , fcn)2 ( k i + n - l )!2 (k2 + n - 2)!2 .. . kn \2
MQu Q2 , - - - , ę ny !2 gi !2 ę 2!2
E
Ql>92>-">9n^0
* • # n *
9 i + 9 2 H-------\-Qn = (n+l)n/2
a zatem
E
Qi +92 H---- \-qn —{ n -\-l)n /2 g i , 92, . - . , g n >0
A( 9l , 92, - --, 9n)S 12 = 1 . Qn 9 i !2 92!2
(36)
Nierówności q\ > g2 > *** > Qn zostały usunięte z ostatniej sumy, ponieważ składnik sumy jest funkcją sym etryczną dla elementów q i zeruje się, gdy = qj, Podobną tożsamość znajdziemy w ćwiczeniu 24. W zór na liczbę tableaux można także podać w dużo bardziej interesujący sposób, korzystając z pojęcia „haka” . Hakiem odpowiadającym danej komórce w tableau nazywamy tę komórkę wraz ze wszystkimi komórkami leżącymi poniżej i na prawo od niej. Na przykład zacieniowany obszar na rysunku 5 jest hakiem odpowiadającym komórce (2,3) z wiersza 2 i kolumny 3. Ten hak składa się z 6 komórek. W każdej komórce na rysunku 5 podano rozmiar odpowiadającego jej haka. 12 11 8 10 9
7 5 4
j||j |
•
9 8 5
4
2
5 2 3 2 • 2 1 •
1
•
6
1
1
•
R y s. 5. Haki i ich rozmiary.
Jeśli tableau jest postaci (ni, n 2, . . . , n m), to największy hak m a rozmiar n i +771—1. B adając dalej, widzimy, że rozmiarami haków w wierszu 1 są n\ + m — 1 , n i + m - 2 , . . . , 1 z wyjątkiem ( n i + m - l ) - ( n m), ( n i + m - l ) - ( n m_i + l), . . . , ( n i + m —l) —(n 2 + m —2). Na przykład na rysunku 5 rozmiarami haków w wierszu 1 są 12, 11, 10, . . . , 1, z wyjątkiem 10, 9, 6 , 3, 2; wyjątki odpo w iadają pięciu nieistniejącym hakom prowadzącym od nieistniejących komórek (6,3), (5,3), (4,5), (3,7), (2,7) w górę do komórki (1,7). Podobnie wiersz j
5.1.4
TABLEAUX I INWOLUCJE
63
zawiera wszystkie rozmiary n ^ + m —j , 1 , z wyjątkiem {rij Ą-m —j ) —(nm), . . . , (rij + m —j ) —(rij+i + m —j —1). W ynika stąd, że iloczyn wszystkich rozmia rów jest równy ( n i + m - 1 )! (n2+ m —2)!.. . n m! A ( n i + m - l , n 2 + m - 2 , . . . , n m) ' To jest dokładnie to, co pojawia się we wzorze (34). W ten sposób otrzymujemy następujący, głośny wynik pochodzący od J. S. Fram e’a, G. de B. Robinsona i R. M. Thralla [Canadian J. M a th . 6 (1954), 316-318]: T w ie rd z e n ie H . Liczba tableaux o zadanej postaci dla liczb { 1 , 2 , . . . , n} wynosi n! podzielone przez iloczyn rozmiarów haków. | Taka prosta reguła zasługuje na prosty dowód. Jeden z takich dowodów mógłby wyglądać następująco: Każdy element w tableau jest najm niejszy w swo im haku. Jeśli tableau danej postaci wypełnimy losowo, to prawdopodobieństwo, że komórka (i,j) będzie zawierała najmniejszy element w odpowiadającym jej haku, jest równe odwrotności rozmiaru tego haka. W ymnożywszy te prawdo podobieństwa względem wszystkich i, j , dostaniemy twierdzenie H. Niestety to rozumowanie jest niepoprawne, ponieważ rozważane prawdopodobieństwa nie są niezależne! Do 1992 roku nie był znany żaden bezpośredni, poprawny do wód Twierdzenia H, wykorzystujący kombinatoryczne własności haków (zobacz ćwiczenie 39), chociaż pojawiło się kilka pouczających dowodów pośrednich (ćwi czenia 35, 36 i 38). Twierdzenie H m a interesujący związek ze zliczaniem drzew, o którym by ła mowa w rozdziale 2. Zauważyliśmy wtedy, że drzewa binarne o n węzłach odpowiadają permutacjom, które można otrzym ać za pomocą stosu, i że takie perm utacje odpowiadają ciągom 04 a 2 . . . a 2n zbudowanym z n liter S i n liter X, w których liczba liter S nigdy nie jest mniejsza od liczby liter X, przy przeglądaniu ciągu z lewa na prawo. (Zobacz ćwiczenia 2.2.1-3 i 2.3.1-6). Takie ciągi odpowiadają w naturalny sposób tableaux postaci (n, n); w wierszu 1 umieszczamy te indeksy z, dla których a* = S, a w wierszu 2 te indeksy, dla których di = X. Na przykład ciągowi SSSXXSSXXSXX odpowiada tableau 1
2
4
5 8 9 11 12
3 6 7 10
W takim tableau warunek dla kolumn jest spełniony w tedy i tylko wtedy, gdy liczba liter X nigdy nie przekracza liczby liter S, patrząc od strony lewej do prawej. Z twierdzenia H mamy, że liczba tableaux postaci (n, n) wynosi ( 2n)! . (n + 1 )! n\ ’ a to jest liczba drzew binarnych, co zgadza się 2.3 .4 .4- ( i 4 ). Ponadto to sa mo rozumowanie umożliwia rozwiązywanie ogólniejszego „problemu głosowania”
64
SORTOWANIE
5.1.4
00
rozważanego w odpowiedzi do ćwiczenia 2.2.1-4, jeśli użyjemy tableaux postaci ( n, m) dla n > m . Tak więc z twierdzenia H można otrzymać rozwiązania złożonych problemów zliczania, traktując je jako proste, szczególne przypadki. Każde tableau A postaci (n,n), o elementach { 1 , 2 , . . . , 2n}, odpowiada dwóm tableaux (P, Q) tej samej postaci, w sposób zaproponowany przez MacM ahona [Combinatory Analysis 1 (1915), 130-131]: P składa się z elementów { l , . . . , n } w kolejności, w jakiej pojaw iają się one w A, Q tworzymy, biorąc pozostałe elementy i obracając całą konfigurację o 180°, a następnie zastępując n + 1, n + 2, . . . , 2n odpowiednio przez n, n — 1, ..., 1. Na przykład (37 ) rozpada się na 1 7 10 6 9 11 12
obrót i przemianowanie drugiej konfiguracji daje 1
6
1
Q =
2
3 6
4 5
(38)
Odwrotnie, każda para tableaux tej samej postaci i o co najwyżej dwóch wier szach odpowiada w ten sposób pewnemu tableau postaci (n,n). Zatem z ćwi czenia 7 otrzymujemy, ze liczba perm utacji d\ <12 . . . an zbioru {1, 2, . . . ,n}, nie zawierających podciągów malejących di > aj > tik dla i < j < łc, jest rów na liczbie n-węzlowych drzew binarnych. Interesująca, wzajemnie jednoznaczna odpowiedniość między takim i perm utacjam i a drzewami binarnymi, bardziej bezpośrednia niż m etoda okrężna wykorzystująca algorytm I zastosowana tu ta j, została odkryta przez D. Rotem a [Inf. Proc. Letters 4 (1975), 58-61]. Podobnie istnieje stosunkowo prosta odpowiedniość między drzewami binarnymi a perm utacjam i nie zawierającymi trójek aj > > ca dla i < j < k (zobacz ćwiczenie 2.2.1-5). Liczba sposobów zapełnienia tableau postaci (6,4,4,1) jest oczywiście taka sama jak liczba sposobów oznaczania etykietam i z {1 , 2 , . . . , 1 5 } wierzchołków grafu skierowanego
(3 9 )
w taki sposób, że etykieta wierzchołka u jest mniejsza niż etykieta wierzchołka kiedy u —►v. Innymi słowy, jest to liczba porządków topologicznych dla częściowego porządku (39) w znaczeniu z punktu 2.2.3. W ogólności możemy zadać to samo pytanie dla każdego grafu skierowanego bez zorientowanych cykli. Dobrze byłoby, gdyby istniał prosty wzór uogólniający twierdzenie H na przypadek dowolnego grafu skierowanego. Niestety nie wszyst kie grafy m ają takie przyjemne własności jak grafy odpowiadające tableaux. Pewne inne klasy grafów skierowanych, dla których problem etykietowania ma proste rozwiązanie, są omawiane w ćwiczeniach na końcu tego punktu. Inne
5.1.4
TABLEAUX I INWOLUCJE
65
ćwiczenia pokazują, że dla pewnych grafów skierowanych nie m a żadnej prostej reguły odpowiadającej twierdzeniu H. Na przykład liczba sposobów dokonywania etykietowania nie zawsze jest podzielna przez n!. Na zakończenie policzymy, ile jest różnych tableaux, które można utwo rzyć z n różnych elementów. Tę liczbę będziemy oznaczać przez t n . Z wniosku z twierdzenia B wynika, że t n jest liczbą inwolucji zbioru { 1 , 2 , . . . , n}. Permutacja jest swoją odwrotnością wtedy i tylko wtedy, gdy w rozkładzie na cykle występują tylko cykle jednoelementowe (punkty stałe) i cykle dwuelementowe (transpozycje). Ponieważ w t n- \ inwolucjach spośród t n element (n) tworzy cykl jednoelementowy i ponieważ w t n - 2 spośród nich mamy cykl (j n) dla ustalonego j < n, zachodzi zatem równość t n = in —1 4“ (^
f)^n—2*
(4o)
W 1800 roku Rot he wykorzystał ją do obliczenia t n dla m ałych wartości n. Tymi wartościami dla n > 0 są 1, 1 , 2, 4, 10, 26, 76, 232, 764, 2620, 9496, . . . . Policzmy to samo w inny sposób. Załóżmy, że jest k cykli dwuelementowych i (n —2k) cykli jednoeiementowych. Punkty stałe możemy wybrać na (2™) sposo bów. Pozostałe elementy możemy rozdzielić na k transpozycji uporządkowanych na (2A;)!/(2 !)fc sposobów. Po podzieleniu przez fc! dostajem y liczbę sposobów otrzym ania k transpozycji nieuporządkowanych. Tak więc 1V 2J
tn = ^
tn (k),
t n {k) = (n _ 2ky 2kk r
(41)
Niestety ta suma nie ma prostej, zamkniętej postaci (chyba, że za taką postać przyjmiemy wielomian H erm ite’a). Żeby lepiej zrozumieć t n , zastosujemy dwa niebezpośrednie podejścia: a) Znajdziemy funkcję tworzącą Y j t nz n/n \ = ez+^ /2\ n
(42)
zobacz ćwiczenie 25. b) Zbadamy asymptotyczne zachowanie się t n . To jest pouczający problem, ponieważ zostaną wykorzystane pewne ogólne techniki, które okażą się dla nas użyteczne przy innych okazjach. Tak więc kończymy ten podrozdział analizą asymptotycznego zachowania się t n . Pierwszym krokiem w analizie asymptotycznego zachowania się (4 1 ) jest wyznaczenie największego wkładu do tej sumy. Ponieważ t n (k + 1 ) t n [k)
(n — 2k)(n — 2k — 1 ) 2 {k + 1 )
(43)
to można zauważyć, że kolejne składniki sumy stopniowo rosną, poczynając od k = 0, aż do t n (k - f i ) « t n (k), kiedy to k jest w przybliżeniu równe | (n —y / n ). Gdy k przekracza ^n, wówczas składniki m aleją do zera. Największy wkład do
66
SORTOWANIE
5.1.4
rozważanej sumy pochodzi z okolic k = ^ (n — \/ń ) . Zazwyczaj jest wygodnie, żeby wyrazić wartość największego wkładu w zerze i dlatego zapiszemy k = \(n - y/ń) -f x ,
(44)
a następnie zbadamy wielkość tn(k) jako funkcję x. Jednym z użytecznych sposobów pozbycia się silni z tn(k) jest zastosowanie wzoru Stirłinga (równanie 1.2.11.2-(i8)). W tym celu wygodnie jest (jak zoba czymy za chwilę) ograniczyć x do przedziału - n £+1/4 < x < ne+1/4,
(45)
gdzie e = 0.001, tak żeby można było włączyć składnik błędu. Po trochę żmud nych obliczeniach, które autor wykonał ręcznie w latach sześćdziesiątych, a które teraz łatwo przeprowadzić za pomocą algebry komputerowej, dostajemy wzór t n (k) — exp (~n In n — | n + y/n — \ In n —2x 2/y /n — |
^ ln 7r
— | x 3/ n + 2x / y / n + | / y/n — ~x4/n y /n + 0 (n5e-3//4) ) .
(46)
Ograniczenia na x w (45) uzasadnia się faktem, że możemy wziąć x = ± n e+1/ 4, żeby dostać górne ograniczenie na wszystkie pominięte składniki, a mianowicie e~2n2e e x p ( |n l n n - \n + y/n - \ In n — \ — \ l n 7r + 0{n^e~ ^ A)).
(47)
Jeśli pomnożymy to przez n, to dostaniemy górne ograniczenie na sumę wszyst kich pominiętych składników. To górne ograniczenie jest mniejszego rzędu niż składniki, które obliczymy dla x w przedziale (45), ponieważ czynnik exp(—2n 2e) jest dużo mniejszy niż jakikolwiek wielomian od n. W oczywisty sposób możemy z rozważanej sumy usunąć czynnik exp Q n In n — \n 4- y/n — | l n n — | - ^ l n 7r + ~/y/n).
(48)
Pozostaje zatem zsumować e x p ( - 2x 2/ y / n - ~x3/n + 2x/y/n — ~x4/ny/n + 0 (n5e-3/ 4)) ( - 2 x 2\
(
4
x3
_6XP( t ^ T )
8x6\
+
/
v
x
n£2\
U ;
U-5A)(1+0(nS‘~3/1))(49)
względem x = a , a + 1 , . . . , /3—2, (3—1, gdzie —a i (3 są w przybliżeniu równe n e+1/4 ^ niekoniecznie są liczbami całkowitymi). Ze wzoru sumacyjnego Eulera (równanie 1 .2 . 1 1 .2-(io )) mamy
^2 /(*) =J f(x)dx- l/(x) 1
f ,^x) p
. + Rm+l-
(5 °)
TABLEAUX I INWOLUCJE
5.1.4
67
Tutaj |jRm| < (4/(27r)m) Jeśli dla ustalonej, nieujemnej liczby całkowitej t weźmiemy f ( x ) — x l ex p (—2x 2/ y /n ) , to ze wzoru Eulera otrzym u jemy szereg asymptotyczny dla ^ 2 f ( x ) przy n —> oo, ponieważ / (m)(a) = n ^ ^ g ^ i n - ^ x ) ,
g(y) = ¡/‘ c “ 2**,
(51)
a g(y) jest dobrze zachowującą się funkcją niezależną od n. Pochodna g^m\ y ) jest wielomianem od y pomnożonym przez e~2y . Stąd R m = 0 (n ^ i+1“ m^ 4) x I “ 0 ( n ( t+1~m)/4). Ponadto, jeśli zastąpim y a i f3 przez —oo i +00 po prawej stronie (50), zrobimy błąd o wartości co najwyżej 0 (exp(—2n e)) na każdym składniku. Tak więc /
aśźx<{3
oo f ( x ) dx + 0 ( n ~ m)
/(* ) =
dla każdego m > 0.
(52 )
-00
Przy naszym szczególnym wyborze f ( x ) tylko całka jest w rzeczywistości znaczą ca! Tę całkę nie jest trudno obliczyć (zobacz ćwiczenie 26), tak więc możemy mno żyć i sumować we wzorze (49), otrzym ując y / n / 2 (n 1/4 — + 0{ n Stąd t n = A n n/2e-n /2 + V ii-l/4 ^ + £ n _ l /2 + 0 ( „ - 3 / 4 ^ V2
^
W rzeczywistości w składnikach O powinniśmy uwzględnić dodatkowo 9 e w wy kładniku, ale z naszych przekształceń jasno wynika, że 9e zniknie, jeśli wpro wadzimy większą precyzję w obliczeniach pośrednich. W zasadzie zastosowaną metodę można tak rozszerzyć, żeby dostać 0 ( n -fc), dla dowolnego k, zam iast 0 ( n -3 / 4). Przedstawiony szereg asym ptotyczny dla t n został po raz pierwszy uzyskany (w inny sposób) przez Mosera i W ym ana, Canadian J. M ath. 7 (1955), 159-168. M etoda użyta przez nas do uzyskania (53 ) jest wysoce użyteczna w ana lizie asymptotycznej. W prowadził ją P. S. Laplace [Memoires Acad. Sci. Paris (1782), 1 - 88]. Jest ona omawiana w C M ath, §9.4 pod nazwą „wymienne ogony” . Dalsze przykłady zastosowań i rozszerzeń tej m etody znajdziemy w zakończeniu punktu 5.2.2. ĆWICZENIA 1. [16] Jakie tableaux (P, (?) odpowiadają dwuwierszowej tablicy
(1 2 3 4 5 6 7 8 9\ \6 4 9 5 7 1 2 8 3 / ’ w konstrukcji z twierdzenia A? Jaka dwuwierszowa tablica odpowiada tableaux
00
1 4 7
4 5 9
00
P = 2 5 9
1 3 7
68
5.1.4
SORTOWANIE
2 . [M21] Udowodnij, że {q,p) należy do klasy t względem ( 16 ) wtedy i tylko wtedy,
gdy t jest największą liczbą indeksów U, ■■■, it takich, że Pil < Pi2
<
* ‘ •
<
PU = P l
Qil
3. [M2 Ą] Pokaż, że zależność zdefiniowaną w twierdzeniu A można udowodnić, kon struując następującą tabelę: Wiersz Wiersz Wiersz Wiersz Wiersz
0
1
3
1 2
7
2
5 9
00
7
00
3 4
00
6
8
5 9 ■30
3 5 7 00
Tutaj wiersze 0 i 1 tworzą zadaną tablicę dwuwierszową. Dla k ^ 1 wiersz k + 1 uzyskujemy z wiersza k w następujący sposób: a) p oo. b) Niech kolumna j będzie skrajnie lewą kolumną, w której w wierszu k znajduje się liczba < p, natomiast wiersz k + 1 jest pusty. Jeśli żadna taka kolumna nie istnieje i jeśli p = oo, to wiersz & + 1 jest gotowy; jeśli żadna taka kolumna nie istnieje i p < oo, wróć do (a). c) Wstaw p do kolumny j w wierszu k + 1, a następnie za p weź wartość z kolumny j i wiersza k i wróć do (b). Po zbudowaniu tabeli w sposób opisany powyżej mamy, że wiersz k w P składa się z tych liczb z wiersza k w tabeli, które nie występują w wierszu (k + 1); wiersz k w Q składa się z tych liczb w wierszu 0, które występują w kolumnie zawierającej oo w wierszu k + 1. 4. [M30\ Niech a\ . . . a j - i aj . . . an będzie permutacją różnychelementów i załóż my, że 1 < j ^ n. Powiemy, że permutacjaa \ . . . a j - 2 aj a j - 1 a^+i.. . an,powstająca w wyniku zamiany a j - 1 z a^, jest „dopuszczalna”, jeśli albo i) j ^ 3 i a j - 2 leży między a j - 1 i albo ii) j < n i Oj+i leży między a j - 1 i aj. Dla przykładu, na permutacji 1 5 4 6 8 3 7 można wykonać dokładnie trzy dopuszczalne zamiany; możemy zamienić 1 i 5, ponieważ 1 < 4 < 5; możemy zamienić 8 i 3, ponieważ 3 < 6 < 8 (lub ponieważ 3 < 7 < 8); nie możemy jednak zamienić 5 i 4 ani 3 i 7. a) Udowodnij, że dopuszczalna zamiana nie zmienia tableau P powstałego w wy niku wstawienia do początkowo pustego tableau kolejnych elementów permutacji a±, U2 j *■■jan. b) Na odwrót, udowodnij, że dowolne dwie permutacje o takim samym tableau P można przekształcić jedną na drugą za pomocą ciągu dopuszczalnych za mian. [Wskazówka: Niech P będzie postaci (n i, 712, . . . , nm)> Pokaż, że każdą permutację, która odpowiada P, można przekształcić do „permutacji kanonicznej” Pml ■• ■P rnnrn ■• • P 21 • ■*p 2 n 2 -P11 *Pini pomocą ciągu zamian dopuszczalnych]. 5. [M22] Niech P będzie tableau odpowiadającym permutacji ai a 2 . . . an . Wykorzy staj ćwiczenie 4 do dowodu, że P T jest tableau odpowiadającym an . . . ¿¿2 a\. 6. [M26] (M. P. Schiitzenberger) Niech 7r będzie inwolucją o k punktach stałych. Udowodnij, że tableau z dowodu wniosku do twierdzenia B, odpowiadające 7r, ma dokładnie k kolumn o nieparzystej długości.
TABLEAUX I INWOLUCJE
5.1.4
69
7. [M20] (C. Schensted) Niech P będzie tableau odpowiadającym permutacji ai a 2 .. , an . Udowodnij, że liczba kolumn w P jest równa długości c najdłuższego rosnącego podciągu < ai 2 < ••■ < Oic, gdzie ii < ¿2 < *• * < ic\ liczba wierszy w P jest równa długości r najdłuższego malejącego podciągu > aj 2 > • • • > aJr, gdzie j i < j 2 < ■• • < jr8. [M i5] (P. Erdós, G. Szekeres) Udowodnij, że każda permutacja o więcej niż n 2 elementach zawiera podciąg monotoniczny o długości większej niż n, ale istnieją permutacje o n 2 elementach bez podciągów monotonicznych o długościach większych niż n. [Wskazówka: Zobacz poprzednie ćwiczenie]. 9. [M24] Rozważamy dalej ćwiczenie 8 . Znajdź „prosty” wzór na dokładną liczbę permutacji liczb { 1 , 2 , . . . , n2}, które nie zawierają podciągów monotonicznych o dłu gościach większych niż n. 10 . [M20\ Udowodnij, że jeśli P jest tableau, to po zakończeniu działania algorytmu S nadal pozostaje tableau. 11. [20] Czy można odtworzyć początkową postać P , jeśli po zakończeniu działania algorytmu S znane są tylko wartości r i s? 12. [M2Ą] Ile razy wykonywany jest krok S3, jeśli algorytm S zastosujemy do usu nięcia po kolei wszystkich elementów tableau P postaci (n i,ri 2 ; . . . ,n m)? Ile wyno si minimum z tej wartości brane po wszystkich postaciach spełniających warunek ni + n 2 4- • ■- + = n? 13. [M28] Udowodnij twierdzenie C. 14. [MĄ3] Znajdź bardziej bezpośredni dowód części (c) twierdzenia D. 15. [M20] Ile permutacji multizbioru {/ * a, m • 6, n ■c} ma taką własność, że przy odczytywaniu permutacji z lewa na prawo liczba liter c nigdy nie przekracza liczby liter 6, a liczba liter b nigdy nie przekroczy liczby liter a? (Dla przykładu taką permutacją jest a a b c a b b c a c a ) . 16. [MO8 ] Na ile sposobów można posortować topologicznie częściowy porządek re prezentowany przez graf (39 )? 17. [HM25] Niech g ( x i , x 2, .. - ,x n; y) = x i A ( x i + y , x 2, . . . , x n ) + x 2 A ( x 1}x 2+y, ■.. ,x„) H-------(- x n A (z i,X 2 , *• • ,Xn+y)Udowodnij, że g ( x i , x 2, . . . , X n \ y ) = (xi + x 2 H
b x n + (£) v) A( xi , x2) ... , xn).
[Wskazówka: Wielomian g jest wielomianem homogenicznym (łączny stopień każdego z jego składników jest taki sam) i antysymetrycznym ze względu na x (zamiana Xi i Xj powoduje zmianę znaku g)]. 18. [HM30] Uogólnij ćwiczenie 17 i policz sumę x™ A ( x i + y , x 2, . . . , x n) + x ? A (xi ,x 2+ y , . . . ,x n) H------- b x ^ A ( x i,x 2, . . . ,x n+ y) dla m > 0 .
70
SORTOWANIE
5.1.4
19. [MĄ0\ Podaj wzór na liczbę sposobów zapełnienia tablicy, która jest postaci ta bleau bez dwóch klatek po lewej stronie w wierszu 1; na przykład n i - 2 klatki ri2 klatek ri3 klatek
jest takiej postaci. (Wiersze i kolumny powinny być uporządkowane rosnąco tak jak w zwykłym tableau). Innymi słowy, ile tableaux postaci (n i, n 2 ,. . . , nm) i elementach { 1 , 2 , . . . , rii+ ■■• + n m} ma oba elementy 1 i 2 w pierwszym wierszu? ►20. [M24] Udowodnij, że liczba sposobów poetykietowania węzłów danego drzewa liczbami { 1 ,2 , , n} tak, żeby etykieta każdego węzła była mniejsza od etykiet jego potomków, wynosi n! podzielone przez iloczyn rozmiarów poddrzew (liczba węzłów w każdym podddrzewie). Na przykład liczba sposobów poetykietowania węzłów drzewa
wynosi l l ! / l l - 4 1 - 5 1 - 2 - 3 1 1 * l * l = 10*9*8-7-6. (Porównaj to z twierdzeniem H). 21. [HM31] (R. M. Thrall) Niech m > 712 > • • • > nm określają postać „przesuniętego tableau” , w którym wiersz i + 1 rozpoczyna o jedną pozycję dalej niż wiersz i; na przykład przesunięte tableau postaci (7 ,5 ,4 ,1 ) ma kształt 12 11 8 III 5 4 1 li 6 5 3 2 5 i l l 2 ¡11 V 1 Udowodnij, że liczba sposobów ułożenia liczb 1, 2 , . . . , n = ni+7i2H f-nm w przesu nięte tableaux postaci (n i, n 2 , . . . , n rn) tak, żeby wiersze i kolumny były uporządkowane rosnąco, wynosi n! podzielone przez iloczyn „długości uogólnionych haków”; uogólniony hak o długości 11, odpowiadający klatce z pierwszego wiersza i drugiej kolumny, został na powyższym diagramie zacieniowany. (Haki w „schodkowej” części tablicy, z lewej strony, mają kształt litery U (zamiast L) obróconej o 90°). Zatem diagram o takim kształcie można zapełnić na 171/12 1 1 - 8 - 7 - 5 - 4 - 1 9 - 6 - 5 3 - 2 - 5 - 4 - 2 - 1 1 sposobów, tak żeby wiersze i kolumny były uporządkowane rosnąco. 22. [M39] Na ile sposobów można zapełnić tablicę postaci (m , ri2 , . . . , nm) elementa mi ze zbioru { 1 , 2 , . . . , iV}, gdy dopuścimy powtórzenia i zażądamy, żeby wiersze były uporządkowane niemalejąco, a kolumny ściśle rosnąco? D1p nrzykładu, m-wierszową
5.1.4
TABLEAUX I INWOLUCJE
71
tablicę o prostej postaci ( 1 , 1 , . . . , ! ) można zapełnić na (^) sposobów; 1-wierszową tablicę postaci (m) można zapełnić na (m+^ -1 ) sposobów; małą kwadratową tablicę postaci ( 2 , 2 ) na | (N^ ) (^) sposobów. ►23. [HM30] (D. André) Podaj liczbę A n rozmieszczeń liczb { 1 , 2 , . . . , n} w n-klatkowej tablicy
w taki sposób, żeby zarówno wiersze, jak i kolumny były uporządkowane rosnąco. Znajdź funkcję tworzącą g(z) = A nz n/n\. 24. [M28] Udowodnij, że
[ Wskazówki: Udowodnij, że A (fci+n —1 , . . . , k n) — A( m —k n + n —1 , . . . , m —ki)\ rozłóż tableau n x (m — n + 1 ) w sposób analogiczny dó ( 38 ); przekształcaj podaną sumę tak jak w wyprowadzeniu ( 36 )]. 25. \M20] Dlaczego (42 ) jest funkcją tworzącą dla inwolucji? 26. [HM2 1 ] Oblicz całkę f ^ ° x l exp ( —2 x 2/ y / n ) d x , gdy t jest nieujemną liczbą całko witą. 27. [M2Ą] Niech Q będzie tableau Younga dla { 1 , 2 , . . . , n}; niech element i znajduje się w wierszu r* i kolumnie Powiemy, że i jest „powyżej” j, jeśli n < r j . a) Udowodnij, że dla 1 ^ i < n, i jest powyżej ż+1 wtedy i tylko wtedy, gdy Ci ^ Ci+i. b) Wiedząc, że Q jest takie, że (P, Q) odpowiada permutacji
udowodnij, że i jest powyżej i + 1 wtedy i tylko wtedy, gdy at > at \ \ . (Dlatego znając tylko Q , można wyznaczyć liczbę sekwensów w tej permutacji. Ten wynik pochodzi od M. P. Schiitzenbergera). c) Udowodnij, że dla 1 ^ i < n, i jest powyżej i + 1 w Q wtedy i tylko wtedy, gdy i + 1 jest powyżej i w Q s . 28. [M43] Udowodnij, że średnia długość najdłuższego rosnącego podciągu w losowej permutacji liczb { 1 , 2 , . . . , n} jest asymptotycznie równa 2y/n. (To jest średnia długość pierwszego wiersza w tableau z twierdzenia A). 29. [HM25] Udowodnij, że losowa n-elementowa permutacja zawiera podciąg rosnący o długości ^ Z, z prawdopodobieństwem ^ (”) //!. To prawdopodobieństwo wynosi 0 ( 1 / y/n ), gdy l = ey/n + 0 (1 ), a 0 (e x p (—cy^n)), gdy l = 3^/n, c = 6 ln 3 —6 .
72
SORTOWANIE
5.1.4
30. [MĄ1 ] (M. P. Schiitzenberger) Pokaż, że operacja przejścia z P do P s jest szcze gólnym przypadkiem operacji, która ma zastosowanie do dowolnego skończonego, czę ściowo uporządkowanego zbioru, a nie tylko tableau. Poetykietujmy elementy częściowo uporządkowanego zbioru liczbami { 1 , 2 , . . ., n} w taki sposób, żeby częściowy porządek był zgodny z tym etykietowaniem. Wyznaczmy poetykietowanie dualne, analogiczne do (26 ), usuwając kolejno etykiety 1 , 2 , . . . , przemieszczając jednocześnie pozostałe etykiety w sposób analogiczny do opisanego w algorytmie S i umieszczając 1 , 2, ... w wolnych miejscach. Pokaż, że ta operacja, zastosowana do dualnego etykietowania, ale w porządku odwrotnym, da nam w wyniku wyjściowy porządek. Zbadaj inne własności tej operacji. 31. [HM30] Niech x n będzie liczbą rozmieszczeń n parami nie atakujących się wież na szachownicy n x n, gdzie dwa rozmieszczenia uważamy za identyczne, gdy są sy metryczne względem obu przekątnych. Tak więc xą = 6 . (Dla inwolucji żąda się, żeby były symetryczne względem tylko jednej przekątnej. W ćwiczeniu 5.1.3-19 rozważamy podobny problem). Podaj, jak asymptotycznie zachowuje się x n. 32. [HM21} Udowodnij, że t n jest wartością oczekiwaną X n , gdzie X jest odchyleniem normalnym o wartości oczekiwanej równej 1 i wariancji także równej 1 . 33. [M25 } (O. H. Mitchell, 1881) Prawda, czy fałsz: A (a i,a 2 , . . . , am) / A ( l , 2 , .. . ,rn) jest liczbą całkowitą, jeśli 0 1 , a 2 , . . . , am są całkowite. 34. [25] (T. Nakayama, 1940) Udowodnij, że jeśli w tableau występuje hak o długości ab, to jest tam także hak o długości a. ►35. [30] (A. P. Hillman i R. M. Grassl, 1976) Rozmieszczenie nieujemnych liczb cał kowitych w tablicy o danej postaci (która jest postacią pewnego tableau) nazywamy płaskim podziałem rn, jeśli J^Pij = m 1 Pil ^
-^
P ini,
Pij ^
^ Pnji
dla 1 ^ i 5g n i, 1 ^ j ^ n u
gdy w wierszu i znajduje się n , komórek, a w kolumnie j znajduje się ii, komórek. Takie rozmieszczenie nazwiemy odwrotnym podziałem płaskim, jeśli mamy Pil ^
-^ Pim,
Pij ^
" ^ Pn'j
dla 1 ^ i ^ n i, 1 ^ j ^ n 1.
Rozważmy następujący algorytm, w którym operuje się na odwrotnych podziałach płaskich dla danej postaci i który tworzy jeszcze jedną tablicę liczb qij o tej samej postaci: G l . [Inicjowanie] Wykonaj qij wykonaj j <— 1 .
0, dla 1 ^ j ^
oraz 1 ^ i ^ n i. Następnie
G 2 . [Znajdowanie niezerowej komórki] Jeśli p nfj > 0, wykonaj i n^, k <— j i przejdź do kroku G3. W przeciwnym razie, jeśli j < m , zwiększ j o l i powtórz ten krok. W przeciwnym razie zakończ wykonywanie algorytmu (tablica p jest wyzerowana). G 3. [Zmniejszanie p] Zmniejsz pik o 1. G 4. [Ruch w górę lub w prawo] Jeśli i > l i > pik, zmniejsz i o 1 i wróć do G3. W przeciwnym razie, jeśli k < ni, zwiększ k o 1 i wróć do G3. G 5. [Zwiększanie q] Zwiększ qij o 1 i wróć do G2.
|
5.1.4
TABLEAUX I INWOLUCJE
73
Udowodnij, że ta konstrukcja definiuje wzajemnie jednoznaczne odwzorowanie między odwrotnymi płaskimi podziałami m a rozwiązaniami równania m = ^ ^ hij ąij , gdzie liczby hij są długościami haków dla tej postaci. Ułóż w tym celu algorytm, który oblicza wartości p z wartości q. 36. [HM27] (R. P. Stanley, 1971) (a) Udowodnij, że liczba odwrotnych płaskich po działów m dla danej postaci wynosi [zm] l / n ( l — z hij)> gdzie hij są długościami haków, (b) Wywiedź z (a) twierdzenie H. [ Wskazówka: Jaka jest asymptotyczna liczba podziałów, gdy m —> oo?].
37. [M20\ (P. A. MacMahon, 1912) Jaka jest funkcja tworząca dla wszystkich płaskich podziałów? (Współczynnik przy powinien być ogólną liczbą płaskich podziałów m, gdy postać tableau jest nieograniczona). ►38. [M30\ (Greene, Nijenhuis i Wilf, 1979) Dla danej postaci tableau T możemy skonstruować zorientowany graf bez cykli, którego węzłami są komórki w T, natomiast krawędzie prowadzą od każdej komórki w T do wszystkich pozostałych komórek w jej haku. Stopień wyjściowy komórki (i, j ) wynosi wówczas dij = hij — 1, gdzie hij jest rozmiarem haka. Przypuśćmy, że generujemy losową ścieżkę w tym grafie, wybierając losowo komórkę startową (i, j), a następnie wybierając losowo krawędzie, aż dojdziemy do komórki narożnej, z której nie ma już wyjścia. Losowe wybory są jednostajne. a) Niech (a, b) będzie komórką narożną w T . Niech I = {¿o,. . . , ik} i J = {Jo, • • *, ji} będą zbiorami wierszy i kolumn, dla których i0 < • • ■< ik = a i jo < ■■* < ji = b. Nasz graf zawiera ( ^ ^ ścieżek, których zbiorami wierszy i kolumn są odpowiednio 7 oraz J. Niech P(7, J ) będzie prawdopodobieństwem, że losowa ścieżka jest jedną z nich. Udowodnij, że P(7, J) — l / ( n d i 0b . . . dik_ xb daj 0 . . . gdzie n ~ |T|. b) Niech f ( T) = n\j {{ hij. Udowodnij, że losowa ścieżka kończy się w narożniku (a, b) z prawdopodobieństwem f ( T \ {(a, b)})/f(T). c) Pokaż, że (b) dowodzi twierdzenia H i podaj także sposób generowania losowego tableau o postaci T, przy założeniu, że wszystkie f ( T) tableaux są jednakowo prawdopodobne. 39. [M38] (I. M. Pak i A. W. Stojanowski, 1992) Niech P będzie tablicą posta ci ( n i , . . . , n m), która została zapełniona dowolnie (wszystkimi) liczbami ze zbioru { 1 , . . . , n}, gdzie n — n\ + • • • 4- n m. Następujący algorytm, który jest analogiczny do algorytmu „przesiewania w górę” z punktu 5.2.3, można zastosować do przekształcenia P w tableau. Definiuje on także tablicę Q tej samej postaci, którą można wykorzystać w kombinatorycznym dowodzie twierdzenia 77.
P I . [Pętla po (iyj)] Wykonaj kroki P2 i P3 dla wszystkich komórek (ż, j ) w tablicy, w odwrotnym porządku leksykograficznym (to jest z dołu do góry i w każdym wierszu z prawa na lewo); następnie zakończ wykonywanie algorytmu.
P 2 . [Poprawianie P w (¿,J)] Wykonaj K
P i j , a następnie algorytm S; (patrz
niżej).
P3. [Poprawianie Q] Wykonaj Qik <— Qi(k+i) + 1 dla j ^ k < s, a następnie Qis * i
^■ I
Algorytm S; jest taki sam jak algorytm S Schützenbergera z wyjątkiem tego, że kroki SI i S2 są nieznacznie ogólniejsze: S l \ [Inicjowanie] Wykonaj r
i, s
j.
74
SORTOWANIE
5.1.4
S 2 \ [Koniec?] Jeśli K < P(r+i)a 1 K
Pr(s+i)> wykonaj Prs
K i skończ.
2
5 1 6 4 2 3
7 8 5 1 3 4
7
5 1 3 4
7
4 1 3 5
7
2
2 6
2 6
2 6
0 „1 0 1 0
-1 0 -1 0 1 0
0 „1 0 0 1 0
6
0
Q=
-1 0
1 0
00
00
4
co
1 6
7
1 0
4
1 5
00
5
7
co
co
2
7 8 5 1 6 4 3 2
00
5 P = 1 6 4 7
00
00
(Algorytm S jest w istocie szczególnym przypadkiem, gdy i = l, j = 1, K = oo). Dla przykładu prześledźmy działanie algorytmu P dla jednej szczególnej tablicy postaci (3 ,3 ,2 ). Pokazywane zawartości tablic P i Q są z początku kroku P2. Zawartość Pij jest zapisana pismem pogrubionym:
Na koniec dostajemy 1 -2 -1 Q = 0 -1 0 1 0
1 3 4 00
P = 2 5 6 7
a) Jeśli P jest po prostu tablicą 1 x n, algorytm P przekształci ją do posortowanej postaci n . Wyjaśnij, jaka będzie w tym przypadku zawartość tablicy Q. b) Odpowiedz na to samo pytanie, jeśli P jest postaci n x 1 zamiast 1 x n. c) Udowodnij, że w ogólności będziemy mieli
^ 'fiiji
bij ^ Q i j
gdzie bij jest liczbą komórek poniżej (ż, j), a n j jest liczbą komórek na prawo od niej. Zatem liczba możliwych wartości dla Qij wynosi dokładnie h i j , co jest równe rozmiarowi haka odpowiadającego komórce (ż, j). d) Twierdzenie H udowodnimy w konstruktywny sposób, jeśli pokażemy, że algorytm P definiuje wzajemnie jednoznaczne odwzorowanie między wszystkimi n! począt kowymi wypełnieniami tablicy o danej postaci a parami tablic (P, Q), gdzie P jest pewnym tableau, a Q spełnia warunek z części (c). Dlatego chcemy znaleźć algorytm odwrotny do algorytmu P. Dla jakich wyjściowych permutacji algorytm P daje tablicę (2 X 2) Q = (° )? e) Jaką permutację algorytm P przekształca na tablice
P =
1 3 5 7 U 15 2 6 8 14 4 9 13
-2 —3 -1 -1 1 0
Q
=
3 -2 -1 0 0 -1 0
10 12
-1 0
16
0
f) Zaproponuj algorytm odwrotny do algorytmu P, który działa dla dowolnej par ta blic (P, Q) takich, że P jest tableau, a Q spełnia warunek z części (c). [ Wskazówka: Zbuduj zorientowane drzewo, którego wierzchołkami są komórki (z, j), a krawędzia mi (i , j ) -» ( m - 1), jeśli Pi(j-i) > P(i-i)j\
(i, j )
-► (* - 1, j ) ,
jeśli
£¿ 0 - 1) < P(i-\)j-
5.1.4
TABLEAUX I INWOLUCJE
75
Na przykład z części (e) mamy drzewo A
A
ii
IM< •<
A A A
Ścieżki tego drzewa są kluczowe w konstrukcji algorytmu odwrotnego do algoryt mu P]. 40. [HMĄ3] Załóżmy, że zbudowaliśmy losowe tableau Younga, umieszczając kolejno liczby 1, 2, . . . , n w taki sposób, że każda z możliwych pozycji dla nowej liczby jest jednakowo prawdopodobna. Na przykład tableau (i) otrzymuje się za pomocą tego algorytmu z prawdopodobieństwem | ^ | Udowodnij, że z dużym prawdopodobieństwem dla wynikowej postaci (n i, 712, . . . , nm) zachodzi m « y/6n i y / k + / n k +1 ~ y/rn dla 0 ^ k ^ m. 41. [25] (Nieporządek w bibliotece) Przypadkowi użytkownicy biblioteki często odkła dają książki na półki w złych miejscach. Jeden ze sposobów mierzenia nieporządku w bibliotece polega na zbadaniu, ile razy należałoby zabierać książki z jednego miejsca i wstawiać w inne, zanim wszystkie książki nie znajdą się na swoim miejscu. Tak więc niech 7r = ai a*i.. .a n będzie permutacją liczb { 1 ,2 ,... ,n }. Operacja „usuń-wstaw” zamienia permutację 7r na 0\ . . . Qt% —i 0%-|-i . . . Oj Qi{ Uj-j-i . . . Oxi
lub
O^ . . . Oj Oi Oj-j-i . . . Oi—i 0%~|-i . . . Oji,
dla pewnych i, j. Niech dis(7r) będzie minimalną liczbą operacji usuń-wstaw, które uporządkują 7r. Czy dis(7r) można wyrazić w terminach prostszych charakterystyk 7r? ►42. [30] (Nieporządek w genomie) Geny w DNA Lobelii feruens tworzą ciąg 9 7 '9 i 9294 ,9 5 9 3 9 6 ^ gdzie g? oznacza odwrotność g^\ te same geny występują w tytoniu, ale w porządku pi 3. 44. [M37] Pokaż, że średnia liczba odwróceń wymagana do posortowania losowego rozmieszczenia n genów jest większa od n —H n, jeśli wszystkie 2n n\ roszczenia genomu są jednakowo prawdopodobne.
76
SORTOWANIE
5.2
5.2. SORTOW ANIE W E W N Ę TR ZN E
Nasze rozważania na tem at „wzorowego sortowania” rozpoczniemy od przepro wadzenia małego eksperym entu. W jaki sposób można rozwiązać następujące zadanie programistyczne? „W komórkach pamięci R+l, R+2, R+3, R+4 i R+5 znajduje się pięć liczb. Napisz program , który przestawi te liczby w taki sposób (jeśli jest to konieczne), żeby występowały w porządku rosnącym” . (Jeśli znane są nam już pewne m etody sortowania, to postarajm y się o nich natychm iast zapomnieć; wyobraźmy sobie, że próbujemy rozwiązać to zadanie po raz pierwszy, bez żadnej wstępnej wiedzy na tem at tego, jak postępować). Przed dalszą lekturą postarajmy się koniecznie rozwiązać postawione zadanie.
Czas, który został spędzony nad rozwiązaniem naszego zadania, przyniesie owoce, gdy będziemy kontynuowali czytanie tego podrozdziału. Prawdopodobnie znalezione rozwiązanie jest jednym z następujących typów: A. Sortowanie przez wstawianie. Sortowane elementy rozważamy kolejno i każdy nowy element jest wstawiany na właściwą pozycję względem dotychczas uporządkowanych elementów. (W ten sposób układają karty brydżyści, biorąc i dokładając po jednej karcie). B. Sortowanie przez zamienianie. Jeśli znajdziemy dwa nieuporządkowane elementy, to zamieniamy je miejscami. Ten proces kontynuujemy aż żadne za miany nie będą więcej potrzebne. C. Sortowanie przez wybieranie. Najpierw znajdujemy element najmniejszy (można też znajdować element największy), a następnie oddzielamy go w jakiś sposób od reszty; następnie wybieramy kolejny element najmniejszy (lub kolejny największy) itd. D. Sortowanie przez zliczanie. Każdy element porównujemy ze wszystkimi innymi; końcowa pozycja każdego elementu jest wyznaczana przez liczbę elemen tów, które są od niego mniejsze. E. Sortowanie ukierunkowane. Jest dobre do posortowania pięciu elemen tów, ale nie daje się uqgólnić do sortowania większej liczby elementów. F. Zachowanie lenia. W tym rozwiązaniu zostały zignorowane zalecenia autora i nie został zaproponowany żaden algorytm dla postawionego zadania. Szkoda, doszliśmy za daleko i straciliśmy swoją szansę. G. Nowa, wspaniała technika sortowania. Zdecydowanie przewyższa ona wszystkie dotychczasowe znane metody. (Poinformuj o tym fakcie bezzwłocznie autora książki). Jeśli wspomniane zadanie byłoby postawione na przykład dla 1000 elemen tów, a nie zaledwie 5, pewnie odkrylibyśmy sprytniejsze m etody sortowania, o których będzie jeszcze mowa w dalszej części tej książki. W każdym razie, kiedy atakujem y nowy problem, często mądrze jest znaleźć bardzo proste rozwiązania, a potem starać się je poprawić. Przypadki A, B i C, o których mowa powyżej,
5.2
SORTOWANIE W EW NĘTRZNE
77
prowadzą, do bardzo ważnych klas technik sortowania, które są rozwinięciem wspomnianych, prostych pomysłów. Odkryto wiele różnych algorytmów sortowania i 25 z nich omówimy w tej książce. Ta zastraszająca liczba m etod to w rzeczywistości tylko część algoryt mów, które dotąd odkryto; wiele technik, które się już zestarzały, pominiemy albo tylko wspomnimy. Dlaczego istnieje tak wiele m etod sortowania? W praktyce programowania jest to specjalny przypadek pytania: dlaczego jest tak wiele metod dla problemu „x” ? Odpowiedzią jest, że każda z tych m etod ma swoje zalety i wady, i jest lepsza od innych dla pewnych konfiguracji danych lub sprzętu. Niestety nie jest znany „najlepszy” sposób sortowania; istnieje wiele najlepszych metod, w zależności od tego, co sortujemy, ha jakiej maszynie i w jakim celu. Ru dyard Kipling napisał: „Jest tysiąc i jeden sposobów ustanaw iania plemiennych praw i każdy z nich bez wyjątku jest prawidłowy” . Dobrze jest poznać cechy charakterystyczne każdej m etody sortowania, tak żeby w konkretnych zastosowaniach można było dokonywać właściwych wy borów. Szczęśliwie, zadanie poznania wszystkich tych algorytmów nie jest tak ogromne, jak się wydaje, ponieważ m ają one wiele interesujących związków. Na początku tego podrozdziału zdefiniowaliśmy podstawową terminologię i notację używaną przez nas w badaniu problemu sortowania. Chcemy uporząd kować rekordy Ä I , Ä 2, ■• ; )
(l)
w porządku niemalejącym względem ich kluczy K \ , cie perm utację p ( l ) p ( 2 ) .. . p(N) taką, że ■Rp(l) ^ R-p{ 2) ^
^ R-p( N) -
...,
znajdując w isto
( 2)
W tym podrozdziale ograniczamy się do sortowania wewnętrznego, kiedy to liczba sortowanych rekordów jest na tyle m ała, że cały proces sortowania można przeprowadzić w (szybkiej) pamięci operacyjnej. W pewnych przypadkach naszym celem będzie fizyczne przestawienie rekor dów, tak żeby ich klucze były uporządkowane, w innych zaś może wystarczyć to, żeby w dodatkowej tablicy zapisać perm utację wyznaczającą porządek rekordów. Jeśli rekordy i /lu b klucze zajm ują wiele słów pamięci kom putera, to często jest lepiej utworzyć nową tablicę dowiązań do rekordów (ich adresów) i manipulować dowiązaniami, a nie przemieszczać samych rekordów. Taki sposób postępowania nazywamy sortowaniem adresowym (zobacz rysunek 6 ). Jeśli klucze są krótkie, ale informacja dodatkowa w rekordach jest długa, to dla zwiększenia szybkości sortowania można klucze umieścić razem z dowiązaniami. Taki sposób postępo wania nazywa się sortowaniem kluczy. W innych schematach sortowania wyko rzystuje się dodatkowe dowiązania w rekordach. Tymi dowiązaniami manipuluje się w taki sposób, żeby na koniec dostać uporządkowaną listę rekordów - każde dowiązanie prowadzi do następnego rekordu na liście. Taki sposób postępowania nazywa się sortowaniem listowym (zobacz rysunek 7). Po wykonaniu sortowania m etodą adresową lub listową rekordy można prze stawić tak, żeby dostać pożądane uporządkowanie. W ćwiczeniach 10 i 12 przed-
78
SORTOWANIE
5.2
Rekordy
fil
R2
Rs
89 R D
37 S T
41
Klucz
0 E
| Informacja dodatkowa
Tablica pomocnicza
v 1
/ • ” V. Ni
Przed sortowaniem Po sortowaniu
R y s . 6 . Sortowanie adresowe.
fii
f i2
89 R D
37 41 S 0 T E •— — > V*
T
fis Klucz j Informacja dodatkowa Pole na dowiązanie (po sortowaniu) Głowa listy
R y s . 7. Sortowanie listowe.
stawiamy interesujące sposoby wykonania takiego przestawienia, które wyma gają dodatkowej pamięci tylko na zapamiętanie jednego rekordu. Alternatywne rozwiązanie polega po prostu na umieszczeniu rekordów w nowym miejscu wy starczającym na ich zapamiętanie. Ta druga m etoda jest zazwyczaj dwa razy szybsza od poprzedniej, ale wymaga prawie dwa razy więcej pamięci. W wielu zastosowaniach rekordów w ogóle nie trzeba przemieszczać, ponieważ dowiązania są często wystarczające w dalszych obliczeniach. Dla każdej m etody sortowania, którą badam y dokładnie, podajemy: a) słowny opis algorytmu, b) schemat blokowy, c) program w języku maszyny MIX oraz d) przykład sortowania tą m etodą 16 liczb. Dla wygody przyjmiemy, że w programach dla maszyny MIX klucze są nume ryczne i mieszczą się w jednym słowie maszyny. Czasami będziemy traktować jako klucz część słowa maszyny. Relacja porządku < będzie zwykłą relacją aryt metyczną. Będziemy też zakładali, że każdy rekord składa się tylko z klucza i nie zawiera żadnej dodatkowej informacji. Te założenia czynią nasze progra my krótszymi i łatwiejszymi do zrozumienia, a nasze rozwiązanie można łatwo zaadoptować do ogólnego przypadku, wykorzystując m etody sortowania adreso wego lub listowego. Analizę czasu działania każdego algorytmu przeprowadzimy na podstawie program u w języku maszyny MIX.
5.2
SORTOWANIE W EW NĘTRZNE
79
Sortow anie przez zliczan ie. W celu przedstawienia sposobu, w który będzie my badać algorytmy sortowania wewnętrznego, rozważmy pomysł „zliczania” , o którym była mowa na początku tego podrozdziału. Ta prosta m etoda sortowa nia jest oparta na spostrzeżeniu, że j -ty klucz w ciągu posortowanym jest większy od dokładnie j —1 innych kluczy. Patrząc na to w inny sposób, jeśli wiemy, że pewien klucz jest większy od dokładnie 27 innych kluczy i każde dwa klucze są różne, to w ciągu posortowanym odpowiadający tem u kluczowi rekord powinien znaleźć się na pozycji 28. Tak więc idea sortowania polega na porównaniu każdej pary kluczy i policzeniu dla każdego klucza, ile kluczy jest od niego mniejszych. W oczywisty sposób można to zrobić jak następuje: ((porównaj K j z K i) dla 1 < j < N ) dla 1 < i < N; łatwo można jednak zauważyć, że więcej niż połowa z tych porównań jest redundantnych, ponieważ nie ma potrzeby porównywać klucza z samym sobą i nie jest z K a. W ystarczy wykonać co konieczne porównywanie K a z K^, a następnie następuje: ((porównaj K j z K i) dla 1 < j < i) dla 1 < i < N . W ten sposób dostajem y następujący algorytm. A lg o ry tm C (Zliczanie przez porównywanie). Ten algorytm sortuje Ą , . . . , względem kluczy Ab, . . . , K n , wykorzystując pomocniczą tablicę C0UNT[1] , . . . , COUNT [JV] do zliczania liczb, które są mniejsze od danego klucza. Po zakończeniu wykonywania algorytmu, COUNT[j] + 1 jest docelową pozycją rekordu R j . C l. [Zerowanie COUNT] Wyzeruj liczniki COUNT [1] , . . . , COUNT [A ] . C 2 , [Pętla po i] W ykonaj krok C3 dla i ~ N , N —1 , . . . , 2 ; następnie zakończ wykonywanie algorytmu. C3. [Pętla po j] W ykonaj krok C4 dla j = i ~ 1 , i —2 , . . . , 1 . C4. [Porównywanie K %: Kj] Jeśli K x < K j, to zwiększ COUNT [ j] o 1; w prze ciwnym przypadku zwiększ COUNT [i] o 1. | Zauważmy, że w tym algorytmie rekordy nie są przemieszczane. Jest on podobny do sortowania adresowego, ponieważ tablica COUNT wyznacza docelowe rozmieszczenie rekordów. Jest jednak drobna różnica, ponieważ COUNT [j ] mówi, gdzie ustawić rekord R j , zamiast wskazywać, który rekord powinien znaleźć się w miejscu rekordu R j. (Tak więc tablica COUNT wyznacza perm utację odwrotną do perm utacji p( 1 ) . . . p ( N ); zobacz punkt 5.1.1). Tabela 1 ilustruje przebieg zliczania przez porównywanie zastosowanego do sortowania 16 liczb, które zostały wybrane przez autora losowo 19 m arca 1963 roku. Te same liczby będą wykorzystywane do ilustracji prawie wszystkich pozostałych, omawianych w tej książce m etod. W naszych rozważaniach poprzedzających opis tego algorytm u przyjęliśmy beztrosko, że żadne dwa klucze nie są sobie równe. Jest to niebezpieczne zało żenie, ponieważ jeśli równym kluczom odpowiadałyby te same wartości COUNT, docelowe rozmieszczanie rekordów komplikowałoby się. Algorytm C daje zawsze poprawny wynik niezależnie od tego, ile jest takich samych kluczy; zobacz ćwi czenie 2 .
80
SORTOWANIE
5.2
Tabela 1 SORTOWANIE PRZEZ ZLICZANIE (ALGORYTM C)
KLUCZE: 503 087 0 0 COUNT (init.): COUNT (i = N): 0 0 COUNT (i = ACA): 0 0 COUNT (i = N - ■2): 0 0 COUNT (i = N - ■3): 0 0 C0UNT (i = N - ■4): 0 0 COUNT (i = N - ■5): 1 0 C0UNT (i = 2):
6
1
512 0 0 0 0 0 1 2 8
061 0 0 0 0 0 0 0
908 0 1 2 3 4 5 6
170 0 0 0 0 0 0 1
897 0 1 2 3 4 5 6
3 14
0 15
275 0 0 0 0 0 0 1
653 0 0 0 0 1 2 3
4 10
426 0 0 0 0 0 0 1
154 0 0 0 0 0 0 2
509 0 0 0 0 0 7 7
5
2
7
612 0 0 0 0 9 9 9
677 0 0 0 11 11 11 11
765 0 1 13 13 13 13 13
703 0 12 12 12 12 12 12
9 11 13 12
R y s. 8. Algorytm C: Zliczanie przez porównywanie.
P r o g r a m C (Zliczanie przez porównywanie). W przedstawianej implementacji algorytm u C dla maszyny MIX zakłada się, że Rj jest zapamiętany w komórce INPUT + j , a COUNT [j] w komórce COUNT + j dla 1 < j < N; r l l = i ; rI2 = j\ rA = K i = R u rX = COUNT [ i ] . 01 02 03 04
05 06 07 08 09 10 11 12 13 U 15 16 17 18 19 20 21
START ENT1 STZ DEC1 J1P ENT1 JMP 2H LDA LDX 3H CMPA JGE LD3 INC3 ST3 JMP 4H INCX 5H DEC2 J2P STX DEC1 1H ENT2 J2P
N COUNT,1 1 * -2
N 1F INPUT,1 COUNT,1 INPUT,2 4F COUNT,2 1
COUNT,2 5F
1 N N N 1 1 N - 1 N - 1
A A B
A -B A
3B COUNT,1
A N - 1 A - 1 N N
- 1 ,1 2B
N ^ i > 0. C2. Pętla po i.
C4. Porówna i Ki : K , . Skok, jeśli K i ^ K j .
COUNT[j]
B B B
1 1
1
Cl. Zerowanie C0UNT.
C0UNTK] *-0.
+1 -» ■
COUNTtj].
COUNT[ż] <- COUNT [i] + 1. C3. Pętla po j.
N ^ i > j > 0.
1
5.2
SORTOWANIE W EW NĘTRZNE
81
Czas działania tego programu wynosi 13N + 6A + 5B — 4 jednostek, gdzie N jest liczbą rekordów; A jest liczbą wyborów dwóch elementów ze zbioru ^-elementowego, tj. (^ ) = (N 2 —N) / 2; a B jest liczbą par indeksów, dla których j < i i Kj > K i. Zatem B jest liczbą inwersji perm utacji K \ .. jest to wielkość, którą dokładnie zanalizowaliśmy w punkcie 5.1.1, gdzie w 5 . 1 .T -(i 2 ) i 5 . 1 . 1 - ( i 3 ) pokazaliśmy, że dla różnych kluczy uporządkowanych losowo mamy B = (min 0, ave (iV2-iV )/4 , m ax (N 2- N ) / 2 , dev y / N { N - 1)( N + 2.5)/6). Tak więc program C wymaga liczby jednostek czasu, która jest między 3 N 2 + .10AT —4 a 5 .5 A 2 -fi 7.57V —■4, a średni czas jego działania leży w połowie między tymi dwoma wartościami. Dla przykładu dla danych z tabeli 1 mamy N = 16, A = 120 , B = 41, tak więc liczba jednostek czasu zajętych przez program C wynosi 1129. W ćwiczeniu 5 zaproponowano modyfikację program u C, która m a trochę inne charakterystyki czasowe. Składnik iV2, który dominuje w czasie działania, pokazuje, że algorytm C nie jest efektywnym sposobem sortowania dla dużych N; podwojenie ilości danych zwiększa czas działania czterokrotnie. Ponieważ w tej metodzie wymaga się porównywania wszystkich różnych par kluczy ( K i , K j ) , nie widać sposobu uniknięcia zależności od 7V2, chociaż zobaczymy później, że wykorzystując inne techniki można pesymistyczny czas działania sortowania zredukować do czasu rzędu N log N. Głównym powodem naszego zainteresowania algorytmem C jest jego prostota, a nie szybkość. Algorytm C posłużył jako przykład stylu, w którym będziemy opisywać bardziej skomplikowane (i efektywniejsze) metody. Jest jeszcze inny sposób sortowania przez zliczanie, który jest bardzo ważny pod względem efektywności. Ma on przede wszystkim zastosowanie w przypadku, gdy występuje wiele tych samych kluczy i gdy wszystkie klucze w padają do przedziału u < K j < u, gdzie różnica (v — u) jest m ała. Te założenia w ydają się zbyt restrykcyjne, ale w rzeczywistości zobaczymy całkiem sporo zastosowań prezentowanego pomysłu. Na przykład, jeśli zastosowalibyśmy omawianą m etodę do kilku najbardziej znaczących cyfr z kluczy, zamiast porównywać całe klucze, otrzymalibyśmy częściowo posortowany plik wejściowy i dokończenie sortowania byłoby już stosunkowo prostsze. Żeby w pełni zrozumieć zasady, którym i będziemy się kierowali, załóżmy, że wszystkie klucze należą do przedziału od 1 do 100. W jednym przebiegu możemy policzyć ile jedynek, dwójek, . . . , setek znajduje się w ciągu wejściowym. W dru gim przebiegu możemy umieścić rekordy we właściwych miejscach w obszarze wyjściowym. Następujący algorytm zawiera szczegóły opisywanego procesu. A lg o ry tm D (Zliczanie przez rozrzucanie). Przy założeniu, że wszystkie klucze są liczbami całkowitymi z przedziału u < K j ^ v dla 1 ^ j ^ TV, ten algorytm sortuje rekordy R i , . . . , R N ¡ wykorzystując pomocniczą tablicę COUNT [w] , . . . , COUNT M . Po zakończeniu wykonywania algorytmu rekordy są w żądanym po rządku w obszarze wyjściowym 5 i , . . . , 5 ^ . D l . [Zerowanie COUNT] Wyzeruj liczniki COUNT [u ], . . . , COUNT [?;]. D 2 . [Pętla po j ] W ykonaj krok D3 dla 1 < j < N; następnie przejdź do kroku D4.
82
SORTOWANIE
5.2
D 3 . [Zwiększanie wartości COUNTlKj~\] Zwiększ wartość COUNTlKj~\ o 1. D 4 . [Sumowanie] (W tym miejscu COUNTS] jest liczbą kluczy, które są równe i). W ykonaj COUNT [i] <- COUNT li] + COUNT li - 1] dla i = u + 1, u + 2, . . . , u. D 5 . [Pętla po j] (W tym miejscu COUNT [i] jest liczbą kluczy, które są mniejsze lub równe i; w szczególności, COUNT [t;] = N). W ykonaj krok D 6 dla j = N , N — 1, . . . , 1; następnie zakończ wykonywanie algorytmu. D 6 . [Wypisanie Rj] W ykonaj i <— COUNT IKj ] , Si Rj oraz COUNT [X j] <— z—1. I W ćwiczeniu 6 jest omawiany przykład działania tego algorytmu, a w ćwiczeniu 9 żądamy napisania odpowiedniego program u na maszynę MIX, gdy zakres v — u jest mały; przedstawiony algorytm jest bardzo szybki.
R y s. 9. Algorytm D: Zliczanie przez rozrzucanie.
Sortowanie za pomocą zliczania przez porównywanie (jak w algorytmie C) zostało po raz pierwszy wspomniane na piśmie przez E. H. Frienda [JACM 3 (1956), 152], jednakże nie twierdził on, że jest to jego własny pomysł. Sortowanie za pom ocą zliczania przez rozrzucanie (jak w algorytmie D) zostało pierwszy raz podane przez H. Sewarda w 1954 roku, w związku z sortowaniem pozycyjnym, o którym będziemy mówić później (zobacz punkt 5.2.5). Zostało ono także za prezentowane przez W. Feurzeiga pod nazwą „M athsort” , C ACM 3 (1960), 601. Ć W IC ZEN IA 1 . [15] Czy algorytm C pozostanie nadał poprawny, jeśli w kroku C 2 wartość i będzie zmieniać się od 2 do N zamiast od N do 2 ? Co będzie, gdy w kroku C3 wartość j zmienia się od 1 do i — 1 ? 2 . [21] Pokaż, że algorytm C działa poprawnie, gdy dopuścimy klucze o tych samych wartościach. Jeśli K } — K x i j < i, to w końcowym uporządkowaniu Rj pojawi się przed, czy po Ri?
► 3. [21] Czy algorytm C byłby nadal poprawny, jeśli zamienilibyśmy sprawdzanie warunku w kroku C4 z „K i < K j ” na „K i ^ K j n? 4. [16] Napisz program na maszynę MIX, który zakończy sortowanie rozpoczęte pro gramem C. Twój program powinien umieścić klucze w porządku rosnącym w komórkach o adresach 0UTPUT+1, . . . ,0UTPUT+N. Jaki jest czas działania Twojego programu?
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
83
5. [22] Czy następujące zmiany usprawniają program C? Nowy wiersz 08a: INCX 0 ,2 Zmiana wiersza 10: JGE 5F Zmiana wiersza 14: DECX 1 Usunięcie wiersza 15. 6. [18] Zasymuluj ręcznie działanie algorytmu D dla 16 rekordów 5T, 0C, 5U, 00, 9 ., IN, 8S, 2R, 6A, 4A, IG, 5L, 6T, 61, 70, 7N. Podaj pośrednie wyniki działania algoryt mu. Tutaj kluczem jest zawsze cyfra, litery natomiast są informacją przechowywaną w rekordach. 7. [13] Czy algorytm D sortuje stabilnie? 8 . [15] Czy algorytm D pozostanie nadal poprawny, jeśli w kroku D5 wartość j będzie zmieniać się od 1 do AT zamiast od W do 1 ?
9. [23] Zaprogramuj algorytm D na maszynę MIX w sposób analogiczny do programu C i programu z ćwiczenia 4. Jaki jest czas działania Twojego programu wyrażony jako funkcja N i (v — u ) l 10. [25] Ułóż efektywny algorytm, który zamienia odpowiednio N elementów ( R \ , . . . , R n ) przez ( Rp(i ) , . . . , Rp(N))t mając dane i i i , . . . , R n i permutację p ( l ) .. . p( N) zbioru { 1, . . . , N} . Staraj się unikać wykorzystywania nadmiernej ilości dodatkowej pamięci. (Ten problem pojawia się, jeśli po sortowaniu adresowym chcemy przemieścić rekordy, ale dysponujemy wystarczającą ilością pamięci, żeby zapamiętać 2 N rekordów). 11. [M27] Zaprogramuj w języku maszyny MIX algorytm z ćwiczenia 10 i zanalizuj jego złożoność. ►1 2 . [25] Zaproponuj efektywny algorytm ustawiania rekordów R \ , . . . , R N w porząd ku zgodnym z wynikiem sortowania, gdy dana jest posortowana lista tych rekordów (rysunek 7). Twój algorytm powinien być oszczędny pamięciowo. ►13. [27] Algorytm D potrzebuje pamięci dla zapamiętania 2N rekordów R i , . . . , R n i S i , . . . , Sn- Pokaż, że można zrobić to samo, korzystając tylko z N rekordów i i i , . . . , R n , jeśli zmienimy procedurę przemieszczania rekordów w krokach D5 i D 6 . (To ćwi czenie polega na zaproponowaniu algorytmu przemieszczania rekordów i i i , . . . , i i j v w miejscu (czyli bez dodatkowej pamięci), mając dane po kroku D4 wartości COUNT [u] , . . . , COUNT[u] . W istocie jest to uogólnienie problemu z ćwiczenia 10).
5.2.1. Sortowanie przez wstawianie
Jedna z ważnych technik sortowania jest podobna do m etody porządkowania kart przez brydżystów, o czym wspominaliśmy już na początku podrozdziału 5.2. Przed rozważeniem rekordu R j zakładamy, że wszystkie poprzedzające go rekor dy i ? i , . . . , R j ~ i zostały już posortowane; następnie wstawiamy R j na właściwe miejsce wśród poprzednio posortowanych rekordów. Możliwe są różne warianty tej podstawowej metody. P r o s te w s ta w ia n ie . Najprostszy algorytm sortowania przez wstawianie jest jednocześnie najbardziej oczywistym. Załóżmy, że 1 < j < N i że rekordy i i i , . . . , R j - 1 zostały rozmieszczone tak, iż Kx ^ K2 ^
^ Kj-L
84
SORTOWANIE
5.2.1
(Pam iętajm y, że w tym rozdziale K j jest kluczem z rekordu Rj). Nowy klucz K j porównujemy kolejno z K j - 1 , K j - 2) . . . , aż do chwili, w której stwierdzamy, że Rj powinien znaleźć się między rekordami Ri a Rą+\ \ następnie przesuwamy rekordy Ri+i, . . . , R j - i o jedną pozycję w prawo i wstawiamy nowy rekord na pozycję i + 1. W ygodnie jest połączyć operacje porównywania i przesuwania, przeplatając je tak, jak pokazano w poniższym algorytmie; ponieważ Rj „spada na swój właściwy poziom” , ta technika sortowania jest często nazywana techniką przesiewania lub zatapiania.
R ys. 1 0 . Algorytm S: proste wstawianie. A lg o r y tm S (Sortowanie przez proste wstawianie). Rekordy i i i , . . . , Ą/v są przemieszczane w miejscu; po zakończeniu sortowania ich klucze będą w porząd ku K i < • * < K n . 5 1 . [Pętla po j] W ykonaj kroki od S2 do S5 dla j = 2 ,3 , . . . , A ; następnie zakończ wykonywanie algorytmu. 52 . [Ustalanie i, K , R] i j — 1, K K j , R <— Rj. (W następnych kro kach próbujemy wstawić R na właściwą pozycję, porównując K z Ki dla zmniejszających się wartości i). 53 . [Porównywanie K : KĄ Jeśli K > Ki, przejdź do kroku S5. (Mamy poszuki waną pozycję dla rekordu R). 54 . [Przesuwanie Ą , zmniejszanie i] Ą + i <— R i , następnie i i — 1 . Jeśli i > 0, wróć do kroku S3. (Jeśli i = 0, to iT jest najmniejszym kluczem spośród dotychczas rozważanych, a zatem rekord R wędruje na pozycję 1). 55. [R w miejsce Ri+\] R i +1
R. | Tabela 1
PRZYKŁAD PROSTEGO WSTAWIANIA a503:087
A087 a087 061 061 061
503:512 503 512:061 087 503 512:908 087a 503 512 908:170 087 170 503 512 908:897
061 087 154 170 275 426 503 509 512 612 653 677a 765 897 908:703 061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
SORTOWANIE PRZEZ WSTAWIANIE
5.2.1
85
W tabeli 1 zilustrowano sortowanie naszych 16 przykładowych liczb za pom ocą algorytmu S. Omawiany algorytm bardzo łatwo można zaprogramować; w rze czywistości poniższy program na maszynę MIX jest najkrótszym program em sortującym w tej książce. P r o g r a m S (Sortowanie przez proste wstawianie). Sortowane rekordy znajdują się na pozycjach od INPUT+1 do INPUT+N; sortowanie odbywa się w miejscu, w tym samym obszarze pamięci; klucze są pełnymi słowami, r l l = j —N ; rI2 = i\ rA = R = K \ zakładamy, że N > 2. 1 SI. Pętla po ?. 7 2. 01 START ENT1 2-N LDA INPUT+N,1 N - 1 S2. Ustal i, K , R. 02 2H ENT2 N -1 ,1 N - 1 03 i* ~ j - 1 . B + N 1 A S3. Porównaj K : K i . 3H CM PA INPUT,2 04 Do S5, jeśli K ^ Ki, JGE 5F B + N - 1-A 05 06 07 08 09 10 11 12
4H
5H
LDX STX DEC2 J2P STA INC1 J1NP
INPUT,2 INPUT+1,2 1 3B INPUT+1,2 1 2B
B B B B
N ~ 1 N - 1 N - 1
S4. Przesuń Ri, zmniejsz i. Ri~\~i ^ R i . i i — 1. Do S3, jeśli i > 0. S5. R w mie jsce Ri+i. 2źj^N .
|
Czas działania tego program u wynosi 9B + 10iV — 3A — 9 jednostek, gdzie N jest liczbą sortowanych rekordów, A jest liczbą przypadków, w których i maleje do zera w kroku S4, B natom iast jest liczbą przesunięć. Oczywiście A jest liczbą przypadków, w których K j < min (Aj, • • •, K j - 1 ) dla 1 < j < 7V; jest to o jeden mniej niż liczba lewostronnych minimów, tak więc A jest równoważne wielkości, którą dokładnie zanalizowaliśmy w punkcie 1.2.10. Po chwili zastanowienia wi dzimy, że B jest także znaną wielkością: liczba przesunięć dla ustalonego j jest równa liczbie inwersji K j , a zatem B jest liczbą wszystkich inwersji w perm utacji K i K 2 ... Kjy. Stąd i z 1 .2 . 10- ( i 6 ), 5.1.1-(i2) oraz 5.1.1-(i3) dostajemy, że A = (minO, ave Hpj — 1 , max AT — 1 , dev \J H m —
);
B = (minO, ave (N 2 —AT)/4, max (N 2 —AT)/2, dev y j N ( N — l ) ( N + 2.5)/6. Zatem średni czas działania programu S, przy założeniu, że wejściowe klucze są różne i losowo uporządkowane, wynosi (2.25N2+ 7 . 75N—3H n —6)u. W ćwiczeniu 33 wyjaśniamy, w jaki sposób można ten rezultat trochę poprawić. W przykładowych danych z tabeli 1 mamy 16 elementów; 2 lewostronne minima, tj. 087 i 061; 41 inwersji, jak już uprzednio stwierdziliśmy. Stąd N = 16, A = 2 , B = 41, a całkowity czas sortowania wynosi 514u. W sta w ia n ie binarne i w sta w ia n ie d w u stro n n e. W algorytmie sortowania przez proste wstawianie klucz z j-teg o rekordu jest porównywany średnio z około j /2 wcześniej posortowanymi kluczami. Dlatego łączna liczba wykonywanych po równań wynosi w przybliżeniu (1+24------VN)/ 2 « A72/ 4 i jest bardzo duża, nawet dla umiarkowanie dużych N. W punkcie 6 .2.1 zajmiemy się „przeszukiwaniem bi narnym ” , które umożliwia znalezienie miejsca dla j-tego elementu po wykonaniu
86
SORTOWANIE
5.2.1
około lg j właściwie dobranych porównań. Na przykład, gdy wstawiamy rekord 64-ty, możemy najpierw porównać K qą z # 32; jeśli jest mniejszy, to porównujemy go z ale jeśli jest większy, to porównujemy go z itd., tak więc właściwe miejsce dla wstawienia #64 będzie znane po wykonaniu tylko sześciu porównań. Łączna liczba porównań potrzebna do wstawienia wszystkich N elementów wy nosi około N \ g N , co jest istotnie lepiej niż ~ N 2. W punkcie 6.2.1 zobaczymy, że odpowiadający tej metodzie program nie musi być dużo bardziej skomplikowany niż program dla prostego wstawiania. Omawiana m etoda nosi nazwę wstawia nia binarnego. B yła ona wspomniana przez Johna M auchly’ego w 1946 roku, w pierwszym opublikowanym omówieniu sortowania z użyciem komputera. Istotną trudnością we wstawianiu binarnym jest to, że mamy rozwiązaną tylko połowę problemu; po znalezieniu miejsca dla rekordu Rj musimy ciągle jeszcze przesunąć około \ j wcześniej posortowanych rekordów, tak żeby zrobić miejsce dla R j. Zatem łączny czas działania jest w istocie nadal proporcjonalny do N 2. Pewne wczesne komputery, jak na przykład IBM 705, m iały specjalną instrukcję, która umożliwiała bardzo szybkie wykonywanie przesunięć. We współ czesnych maszynach przesunięcia można wykonywać jeszcze szybciej, korzystając ze specjalnych rozwiązań sprzętowych. Niezależnie od tego, jeśli N będzie rosło, to zależność od N 2 weźmie w końcu górę. Dla przykładu, analiza przeprowadzona przez H. Naglera [CACM 3 (1960), 618-620] pokazała, że na maszynie IBM 705 nie należało sortować w ten sposób więcej niż N = 128 rekordów składających się z 80 znaków. Podobną analizę można także zastosować dla innych maszyn. Można się oczywiście zastanawiać, w jaki sposób zredukować ilość niezbęd nych przesunięć. Pierwsze takie rozwiązanie zostało zaproponowane we wcze snych latach pięćdziesiątych i jest zilustrowane w tabeli 2. W tym rozwiązaniu pierwszy element jest umieszczany w środku obszaru wynikowego. Miejsce dla kolejnych elementów jest uzyskiwane przez przesunięcia w prawo lub w lewo w zależności od tego, co jest korzystniejsze. Ten sposób zmniejsza czas działania program u mniej więcej o połowę w stosunku do zwykłego wstawiania binarnego. Ceną jest trochę bardziej skomplikowany program. Jest także możliwe skorzy stanie z tej m etody bez użycia pamięci większej niż potrzebnej na zapamiętanie N rekordów (zobacz ćwiczenie 6). Nie będziemy się dłużej rozwodzić się nad tą m etodą, ponieważ istnieją dużo bardziej interesujące techniki sortowania. Tabela 2 WSTAWIANIE DWUSTRONNE A
503
087 503 A 087 503 512 A 061 087 503 512 A 061 087 A 503 512 908 061 087 170 503 512 A 908 061 087 170 A 503 512 897 061 087 170 275 503 512 897
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
87
M e to d a S h e lla . Jeśli mamy do czynienia z algorytmem sortowania, w którym elementy mogą być przesuwane w danej chwili tylko o jedną pozycję, to średni czas działania takiego algorytmu będzie w najlepszym przypadku proporcjonalny do N 2, ponieważ każdy rekord musi podczas sortowania przewędrować średnio przez około pozycji (zobacz ćwiczenie 7). Dlatego, żeby uzyskać zdecydowa nie lepszy rezultat w stosunku do prostego wstawiania, musimy mieć mechanizm, który umożliwi rekordom wykonywanie długich skoków zam iast krótkich. Taką metodę zaproponował w 1959 roku Donald L. Shell [CACM 2 ,7 (July 1959), 30-32] i od tego czasu jest ona znana pod nazwą sortowa nia Shella. W tabeli 3 pokazano, na czym polega główny pomysł będący podstawą tej metody. Najpierw dzielimy 16 rekordów na 8 grup dwuelementowych, tj. ( # i , # 9 ), ( # 2»# 10); • • • >(Rs, Rie)- Po posortowaniu oddzielnie każdej grupy dostajem y drugi wiersz tabeli 3; to jest „pierwszy przebieg” . Zauważmy, że 154 zamieniło się miejscami z 512; także 908 i 897 przesko czyły w prawo. Teraz dzielimy rekordy na 4 grupy czteroelementowe, tj. ( # 1 , # 5 , # 9 , # 13) , . . . , (# 4 , #85 # 12, # 16), i znowu oddzielnie sortujem y każdą grupę; „drugi przebieg” prowadzi nas do 3 wiersza tabeli. W trzecim przebiegu sortujemy grupy ośmioelementowe. Kończymy czwartym przebiegiem, w którym sortujemy wszystkie 16 rekordów. Każde pośrednie sortowanie odnosi się albo do stosunkowo krótkiego, albo do stosunkowo dobrze uporządkowanego ciągu, dlatego też takie sortowanie można wykonać przez proste wstawianie. W ten sposób rekordy szybko zmierzają w kierunku docelowych pozycji. Sortowanie Shella jest także znane pod nazwą „sortowania o malejących sko kach” (diminishing increment sort), ponieważ każdy przebieg jest zdefiniowany przez skok h mówiący o tym, że są sortowane rekordy odległe co h . Ciąg skoków 8, 4, 2, 1 nie jest żadną świętością; w rzeczywistości można wykorzystać dowolny ciąg ht~i, ht~ 2 , • • • j ho, o ile tylko ostatni skok ho jest równy 1 . Dla przykładu, w tabeli 4 widzimy, że ten sam ciąg można posortować ze skokami 7, 5, 3, 1. Pewne ciągi skoków są zdecydowanie lepsze od innych. O tym , jak wybierać skoki, powiemy później. Tabela 3 SORTOWANIE SHELLA O SKOKACH 8, 4, 2, 1
503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 703 8-sortowanie:
503 087 154 061 612 170 765 275 653 426 512 509 908 677 897 703
^ c w a n ie : 503 087 154 061 612 170 512 275 653 426 765 509 908 677 897 703 2-sortowanie:
154 061 503 087 512 170 612 275 653 426 765 509 897 677 908 703 1-sortowanie:
061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
88
5.2.1
SORTOWANIE
A lg o r y tm D (Sortowanie Shella). Rekordy # 1 , . . . , R n są przemieszczane w miejscu; po zakończeniu sortowania klucze będą w porządku K i < ■• * < K n . Proces sortowania jest sterowany za pomocą ciągu skoków h t~ i, ht~ 2, . . . , ńo, gdzie ho = 1 ; dobry dobór skoków może znacząco zmniejszyć czas sortowania. Algorytm D redukuje się do algorytm u S, gdy t = 1. D l . [Pętla po s] W ykonaj krok D2 dla s — t —1, t —2, . . . , 0; następnie zakończ wykonywanie algorytmu. D 2 . [Pętla po j] W ykonaj h hs, a następnie wykonaj kroki od D3 do D 6 dla h < j < N . (Do posortowania elementów odległych co h użyjemy sortowania przez proste wstawianie, a więc dostaniemy K i < Ki+h dla 1 < i < N — h. Kroki od D3 do D 6 są w zasadzie takie same jak kroki od S 2 do S5 z algorytm u S). D 3 . [Ustalanie ż, K , R] i
j — ń, K
K ,, R
R j.
D 4 . [Porównywanie K : KĄ Jeśli K > K i: to przejdź do kroku D 6 . D 5 . [Przesuwanie Ą , zmniejszanie i] W ykonaj Ri+h Jeśli i > 0, to wróć do kroku D4. D 6 . [# w miejsce R i+h] Ri+h <— #•
a następnie i <— i —h.
I
Odpowiedni program w języku maszyny MIX nie jest dłuższy niż nasz pro gram dla prostego wstawiania. Wiersze 0 8 -1 9 w poniższym programie otrzym a no, przepisując bezpośrednio program S w ogólniejszym kontekście algorytmu D. Tabela 4 SORTOWANIE SHELLA O SKOKACH 7, 5, 3, 1
503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 703 7-sortowanie 275 087 426 061 509 170 677 503 653 512 154 908 612 897 765 703 5-sortowanie 154 087 426 061 509 170 677 503 653 512 275 908 612 897 765 703 3-sortowanie 061 087 170 154 275 426 512 503 653 612 509 765 677 897 908 703 1-sortowanie 061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
P r o g r a m D (Sortowanie Shella). Zakładamy, że skoki są zapamiętane w po mocniczej tablicy, skok h s na pozycji H + s; wszystkie skoki są mniejsze od N . Przeznaczenie rejestrów: r l l = j — N; rI2 = z; rA = R = K; rI3 = s; rI4 = h. Za uważmy, że w celu uzyskania efektywnego wykonania pętli wewnętrznej program sam się modyfikuje.
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
89
01 START ENT3 T - l LD4 H ,3 02 1H 03
04 05 06 07 08 09 10 11
2H 3H 4H
12
13 1Ą 15 16 17 18 19 20 21
5H
6H 7H
1 Dl. Pętla po s. s <— t — 1. D2. Pętla po j. h <— h,s . T ENT1 INPUT, 4 Modyfikacja adresów trzech T ST1 5 F ( 0 :2) instrukcji w pętli głównej. T ST1 6 F ( 0 :2) T ENN1 -N,4 T r ll <- N — h. ST1 3 F ( 0 :2) T ENT1 1-N,4 j <- /i + 1. T NT - S LDA INPUT+N,1 D3. Ustal i , K , R. ENT2 N-H, 1 i <— j —h. [Modyfikacja instrukcji] N T -S CMPA INPUT,2 B + N T - S —A D4. Porównaj K : Kj. JGE 6F B + N T - S A Do D6, jeśli K ^ Ki. LDX INPUT,2 D5. Przesuń R , , zmniejsz i. B STX INPUT+H,2 B Ri+h <— R i ■ [Modyfikacja instrukcji] i *— i —h. DEC2 0 ,4 B Do D4, jeśli i > 0. J2P 4B B STA INPUT+H,2 D6 .R w miejsce Ri+h . N T -S INC1 1 j <— j + 1. [Modyfikacja instrukcji] N T -S J1NP 2B Do D3, jeśli j ^ N. N T -S DEC3 1 T J3NN IB T t > s ^ 0. |
* A n a liz a s o rto w a n ia S h e lla . Żeby dobrać dobry ciąg skoków na użytek algorytmu D, musimy zanalizować czas działania tego algorytmu jako funkcję skoków. To prowadzi do fascynujących m atem atycznych problemów, ciągle jeszcze w pełni nie rozwiązanych. Nikt nie podał do tej pory najlepszego możliwego ciągu skoków dla dużych wartości N . Znanych jest wiele interesu jących faktów na tem at zachowania algorytmu Shella. T utaj opowiemy o nich krótko, a szczegóły przeniesiemy do ćwiczeń. [Czytelnicy, których nie pociągają rozważania matematyczne, powinni przejrzeć pobieżnie kilka następnych kartek i przejść do omówienia wstawiania do listy, zaraz za ( 12 )]. Liczby wykonań poszczególnych instrukcji podanych razem z programem D wskazują, że do wyznaczenia czasu działania algorytmu Shella powinniśmy uwzględnić pięć czynników: rozmiar danych N ; liczbę przebiegów (tj. liczbę skoków) T ~ t \ sumę skoków S — ho + *• *+ ht_ 1 ; liczbę porównań B + N T — S —A oraz liczbę przesunięć B . Podobnie jak w pro gramie S, A jest w istocie liczbą lewostronnych minimów pojawiających się w pośrednich sortowaniach, a B jest liczbą inwersji w podciągach. Czynnikiem decydującym o czasie działania jest # , dlatego jem u poświęcimy większość naszej uwagi. Do celów analizy założymy, że klucze są różne i początkowo są uporząd kowane losowo. Nazwijmy operację z kroku D2 ,,/i-sortowaniem” . Tak więc sortowanie Shella składa się z h t - i-sortowania, następnie ń t_ 2-sortowania, . . . , i na końcu ńo-sortowania. Ciąg, w którym K i < Ki+h dla 1 < i < N — ń, będziemy nazywać ciągiem „ń-uporządkowanym” .
90
SORTOWANIE
5.2.1
Rozważmy na początek najprostsze uogólnienie prostego wstawiania, kiedy to mamy tylko dwa skoki h x = 2 i ho = 1 . W tym przypadku drugi przebieg rozpoczyna się z 2-uporządkowanym ciągiem kluczy K x K 2 . . . K jy. Łatwo można zauważyć, że liczba perm utacji a x a2 . . . an zbioru {1 , 2 , . . . , n}, w których a* < cii+2 dla 1 < z < n —2 , wynosi
ponieważ dostaniemy dokładnie jedną 2-uporządkowaną perm utację dla każ dego wyboru \ n / 2J elementów a2 a 4 . . . na pozycjach o parzystych numerach, umieszczając pozostałe \ n / 2] elementów na pozycjach o numerach nieparzy stych. K ażda 2-uporządkowana perm utacja jest jednakowo prawdopodobna po 2-posortowaniu losowego ciągu. Jaka jest średnia liczba inwersji dla takich per m utacji? Niech A n będzie łączną liczbą inwersji w perm utacjach 2-uporządkowanych zbioru { 1 , 2 , . . . , n } . Oczywiście A x = 0, A 2 = 1, A% = 2 ; a po rozpatrzeniu sześciu przypadków 13 24
12 34
12 43
2134
2143
3142
dostajem y A ą = 1 + 0 + 1 + 1 + 2 + 3 = 8. Jeden ze sposobów wyznaczenia A n w ogólnym przypadku polega na rozważeniu „kratownicy” pokazanej na rysunku 11 dla n = 15. K ażdą 2-uporządkowaną perm utację zbioru { 1 , 2 , . . . , n} m ożna przedstawić jako ścieżkę prowadzącą z punktu (0,0) w górnym lewym rogu, do punktu ( [ n / 2], |_n/2j) w dolnym prawym rogu, jeśli fc-ty krok na tej ścieżce wykonujemy albo w dół, albo w prawo, zależnie od tego, czy k pojawia się w perm utacji na pozycji nieparzystej, czy na pozycji parzystej. Ta konstrukcja definiuje wzajemnie jednoznaczną odpowiedniość między 2-uporządkowanymi perm utacjam i a ścieżkami na kratownicy o długości n prowadzącymi między rogami. Na przykład ścieżka zaznaczona na rysunku 11 pogrubioną kreską od powiada perm utacji 2 1 3 4 6 5 7 10 8 11 9 12 14 13 15.
(i)
Przypiszmy pionowym odcinkom na ścieżce „wagi” w sposób pokazany na rysun ku 1 1 ; odcinek z (i , j ) do ( i + l , j ) otrzymuje wagę \i —j\. Po krótkim namyśle widzimy, że sum a wag na ścieżce jest równa liczbie inwersji w odpowiadającej tej ścieżce perm utacji. Ta sum a jest równa także liczbie zacieniowanych kwadratów leżących między tą ścieżką a ścieżką schodkową oznaczoną na rysunku czarnymi kropkami. (Zobacz ćwiczenie 12). Tak więc na przykład perm utacja (i) ma l + 0 + l + 0 + l + 2 + l + 0 = 6 inwersji. Jeśli a < a! i b < 5', to liczba interesujących nas ścieżek z (a, b) do (a', 5') jest równa liczbie sposobów, na jakie możemy wymieszać o! — a odcinków pionowych z bf ~ b odcinkami poziomymi, tj.
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
91
R ys. 11. Związek między 2-uporządkowaniami a ścieżkami na kratownicy. Liczby pisane kursywą są wagami, które wyznaczają liczbę inwersji w permutacjach 2-uporządkowanych.
zatem liczba perm utacji, dla których odpowiadające im ścieżki zawierają odcinek pionowy z (i^j) do (ż+ 1 , j ), wynosi (i + j \ / n - i - j - 1\ V i A L»/2J-J ) ' Mnożąc przez przypisaną wagę i sumując po wszystkich odcinkach, dostajemy, ze i + j \ ( 2 n — i —j — 1 n -j
l2 n + l
-
z
i * C
i + j \ ( 2n — i — j n -j l
(2)
Wartości bezwzględne występujące w tych sumach czynią je nieco zawiłymi, ale ćwiczenie 14 pokazuje, że A n ma zaskakująco prostą postać |_n/2j 2n_2. Zatem średnia liczba inwersji w losowej 2-uporządkowanej perm utacji wynosi [n/2\ 2n —2
71 [n/2\) ’
ze wzoru Stirlinga otrzymujemy, że jest to asymptotycznie równe 7t/128 n 3/2 0.15n3/ 2 Łatwo można zauważyć, że maksymalna liczba inwersji wynosi ^ [ n / 2j + 1 '
1 2 8n -
92
SORTOWANIE
5.2.1
W arto zbadać rozkład liczby inwersji bardziej uważnie, rozpatrując funkcje tworzące Ai (z) = 1 , h2(z) = 1 + 2:, hs(z) = 1 + 2 z, Hą ^z ) = 1 + 3z
z 2 -¡- z 3,
...,
co zostawiamy jako ćwiczenie 15. W ten sposób stwierdzimy, że odchylenie stan dardowe jest także proporcjonalne do n 3/ 2, z czego wynika, że badany rozkład nie skupia się dobrze wokół średniej. Rozważmy teraz ogólny, dwuprzebiegowy przypadek algorytmu D, kiedy to skokami są / i i i : T w ie rd z e n ie H . Średnia liczba inwersji w h-uporządkowanej permutacji zbioru { 1 , 2 , . . . , n} wynosi
,{n’k) =
( ( 2) ?(‘,+ 11+ (Ś)*« + 1} “ ŚC 2 0 ") '
<4)
gdzie q = [n /h \ i r = n mod h. To twierdzenie pochodzi od Douglasa H. Hunt a [Bachelor’s thesis, Princeton Uni versity (April 1967)]. Zauważmy, że dla h > n otrzymujemy poprawną wartość f{n,h) = t ( n 2 ).
Dowód. Perm utacja h-uporządkowana zawiera r posortowanych podciągów dłu gości ą + 1 i h —r długości q. Każda inwersja pochodzi z pary różnych podciągów, a dana para różnych podciągów w losowej /¿-uporządkowanej perm utacji definiuje losową perm utację 2-uporządkowaną. Poszukiwana średnia liczba inwersji jest zatem sum ą średnich liczb inwersji między każdą parą różnych podciągów, tj.
W n io s e k . Jeśli ciąg skoków / + _ i , . . . , Ai, ho spełnia warunek hs+i mod hs — 0
dla
t - 1 > s > 0,
(5 )
to wówczas średnia liczba przesunięć w algorytmie D wynosi X ] (rsf ( q s + l , h s+i / h s) + (hs - r s)f {qs , h s+1/ h s)), t>s^ 0
(6)
gdzie rs ~ N m od h s, qs = [ N / h s\ , ht = N h t~ i, a f jest zdeńniowana w (4 ). Dowód. Proces /¿¿.-sortowania składa się z sortowania przez proste wstawianie r s podciągów (As+ i//is)-uporządkowanych długości qs + 1 oraz (hs —rs) takich podciągów o długości ęs. Z założenia o podzielnościach wynika, że każdy z tych podciągów jest losową perm utacją (/¿s+i/frs)-uporządkowaną, w znaczeniu, że każda (/¿s+i / / i s)-uporządkowana perm utacja jest jednakowo prawdopodobna.
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
93
Rys. 12. Średnia liczba inwersji /( n , h) w n-elementowym ciągu /¿-uporządkowanym, pokazana dla n — 64. Jest tak dlatego, że zakładamy, iż na wejściu mamy losową perm utację różnych elementów. | W arunek ( 5 ) we wniosku jest zawsze spełniony dla dwuprzebiegowego sor towania Shella, kiedy to skokami są h i 1 . Jeśli q = [N/ h\ i r = N m o d h , to średnią wartością B w programie D będzie r f ( q +
1, N
)
+ (h -
r)f(q, N )
+
f ( N , fc)
= I (« + L) +
+ /(AT, /i).
Jako pierwsze przybliżenie przyjmijmy, że f ( n , h ) równa się (y^/S )™ 3/ 2/^1/ 2; możemy na przykład porównać funkcję / z krzywą gładką z rysunku 12 , gdy n = 64. Zatem czas działania dwuprzebiegowego program u D jest w przybliżeniu proporcjonalny do 2N 2/h + vT/V3 h. W y n ik a
stąd,
że z a
h
n a jle p ie j w z i ą ć l i c z b ę b lis k ą
y i6 iV / 7 r
~
1 .7 2 ¥ N .
P rzy
h d o s t a j e m y a l g o r y t m d z i a ł a j ą c y ś r e d n io w c z a s ie A l 5/ 3. Tak więc, stosując sortowanie Shella z tylko dwoma skokami, można istotnie przyśpieszyć sortowanie w porównaniu z sortowaniem przez proste wstawianie z 0(7V2) do 0(A^1667). Można oczywiście uzyskać jeszcze lepszy wynik, do puszczając więcej skoków. W ćwiczeniu 18 rozważamy optymalny dobór skoków ht- 1 , . . . , ho dla ustalonego t i gdy na kroki h narzuca się warunek podzielności. W tym przypadku czas działania dla dużych N spada do 0(7V1,5+e/ 2), gdzie e — 1 / ( 2* — 1 ). Stosując powyższe reguły nie można pokonać bariery 7V15, ta k im w y b o r z e
94
5.2.1
SORTOWANIE
ponieważ przed ostatnim przebiegiem mamy zawsze f i N M ) - ^ / S ) N 3/ 2h \ /2 inwersji. Nasza intuicja podpowiada jednak, że można uzyskać lepszy rezultat, gdy ht , . . . , h i nie spełniają warunku podzielności ( 5 ). Na przykład, wykonując 8-sortowanie, następnie 4-sortowanie, a potem 2-sortowanie nigdy nie porównamy kluczy z pozycji parzystych i nieparzystych. Dlatego w ostatnim przebiegu nieuchronnie napotkam y średnio 0 ( N 3/ 2) inwersji. Dla kontrastu, wykonując 7-sortowanie, następnie 5-sortowanic, a na koniec 3-sortowanie doprowadzimy do tego, że w ostatnim przebiegu nie napotkam y więcej niż 2 N inwersji! (Zobacz ćwiczenie 26). W rzeczywistości mamy do czynienia z zadziwiającym zjawiskiem: T w ie rd z e n ie K . Jeśli na ciągu k-uporządkowanym wykonamy h-sortowanie, to pozostanie on nadal k-uporządkowany. Tak więc ciąg, który jest najpierw 7-sortowany, a potem 5-sortowany, staje się ciągiem zarówno 7-uporządkowanym, jak i 5-uporządkowanym. Jeśli teraz dokonamy 3-sortowania, to w wyniku dostaniemy ciąg 7-, 5- i 3-uporządkowany. Przykłady tej godnej uwagi własności można znaleźć w tabeli 4 na stronie 88. Dowód. Z ćwiczenia 20 wynika, że twierdzenie K jest wnioskiem z następującego faktu: L e m a t L. Niech m, n, r będą nieujem nym i liczbami całkowitymi i niech , x m+r) oraz (yi , . . . , 2/n+r) będą dowolnymi ciągami liczbowymi takimi, że Pl ^ ^m+lł P2 ^ 2'm+2; ■• *j Pr ^ Xm_|_r . (7) Jeśli elem enty x oraz p posortujem y niezależnie tak, że x \ < • ■• < xm+r oraz Pi < **• < Pn+r, to zależności ( 7 ) będą nadal prawdziwe. Dowód. Wiemy, że wszystkie x , z wyjątkiem m z nich, dominują (tzn. są większe lub równe) nad pewnymi elementami y oraz że różne elementy x dominują nad różnymi elementami y. Niech 1 < j < r. Po posortowaniu element x rn+ j dominuje nad m -f j elementami x , a stąd wynika, że dominuje on nad co najmniej j elementami y. Dlatego dominuje on nad j najmniejszymi elementami y, a zatem po posortowaniu x rn+J > y3. | | Twierdzenie K podpowiada, że jest pożądane, aby sortować ze skokami, które są względnie pierwsze. Niestety nie prowadzi to bezpośrednio do dokładnych oszacowań liczby przesunięć w algorytmie D. Ponadto liczba perm utacji zbioru { 1 , 2 , . . . , n } , które są zarówno /¿-uporządkowane, jak i fc-uporządkowane, nie zawsze jest dzielnikiem n l, a co zatem idzie twierdzenie K nie mówi całej prawdy. W wyniku k- i h- sortowania pewne k- i /¿-uporządkowane ciągi pow stają częściej niż inne. Dlatego, jak dotąd, nikt nie poradził sobie z analizą średniego czasu działania algorytm u D dla dowolnych skoków ht~ 1 , . /¿o z t > 3. Nie jest również oczywiste, w jaki sposób znaleźć najgorszy przypadek, gdy są dane N i (/¿¿_i,. . . , /¿o). Możemy jednakże powiedzieć coś o maksymalnym czasie działania, gdy skoki m ają pewną postać:
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
95
T w ie rd z e n ie P . Dla skoków h s — 2S+1 — 1, przy 0 < 5 < t — [Ig A J, czas działania algorytmu D wynosi O (AT3/ 2). Dowód. W ystarczy podać takie ograniczenie na B s (liczbę przesunięć w przebiegu 5 ), że B t- 1 4- • *• + Bo = 0 ( N 3/ 2). Dla pierwszych t/2 przebiegów przy t > s > t j 2, możemy wziąć oczywiste ograniczenie B s — 0 ( h s( N / h s)2); dla pozostałych przebiegów możemy skorzystać z wyniku ćwiczenia 23, B s — 0 ( A ń s+2^s Tak więc Ą -1 + - ■-+ B 0 = 0 ( N ( 2 + 2 2 + - ■■+2t/ 2+ 2 t/ 2 + - ■-+2)) = 0 ( N 3/ 2). | To twierdzenie pochodzi od A. A. Papiernowa i G. W. Stasiewicza, Problem y Pieriedaczi Informacyi 1,3 (1965), 8 1 -9 8 . Podaje ono górne ograniczenie na pesymistyczny czas działania omawianego algorytmu, a nie tylko na czas średni. To nie jest trywialny wynik, ponieważ maksymalny czas działania dla kroków h spełniających warunek podzielności (5 ) jest rzędu A 2, a ćwiczenie 24 pokazuje, że wykładnika 3/2 nie można zmniejszyć. Vaughan P ra tt w 1969 roku w interesujący sposób poprawił wynik z twier dzenia P: Jeśli skoki tworzą zbiór wszystkich liczb postaci 2p3q, mniejszych od N , to czas działania algorytmu D jest rzędu A (log A ) 2. W tym przypadku można zrobić kilka ważnych uproszczeń w samym algorytmie (zobacz ćwiczenia 30 i 31). Jednakże nawet po tych usprawnieniach m etoda P ra tta jest obciążona istotnym i dodatkowymi kosztami związanymi nadal z wieloma przebiegami przez dane. Dlatego w praktyce ten algorytm nie zachowuje się lepiej niż ten z twierdzenia P, chyba że A jest astronomicznie duże. Najlepszy ciąg kroków dla praktycznych A okazuje się spełniać warunek hs w ps , gdzie od stosunku p ~ h s+ \/h s wymaga się, żeby był niezależny od 5 , może on jednak zależeć od A . Zauważyliśmy, że nie jest m ądrym rozwiązaniem wybieranie skoków w taki sposób, że każdy z nich jest dzielnikiem wszystkich poprzednich. Z tego nie powinniśmy jednak wyciągać wniosku, że najlepsze są skoki względnie pierw sze w stosunku do swoich wszystkich poprzedników. Faktycznie, każdy element ciągu, który jest pfi-posortowany i (j/c-posortowany z h JL /c, m a co najwyżej \{ h — l ) ( k — 1) inwersji, kiedy dokonujemy ^-sortowania. (Zobacz ćwiczenie 21). Ciąg P ra tta {2P39} wygrywa przy A —> 00 właśnie z tego powodu, ale rośnie on zbyt wolno dla praktycznych zastosowań. Janet Incerpi i Robert Sedgewick [J. Comp. Syst. Sci, 31 (1985), 210-224; zobacz także Lecture Notes in Comp. Sci. 1136 (1996), 1 - 1 1 ] podali sposób konstrukcji kroków, który jest najlepszy w obu światach - h s w ps i dodatkowo każdy skok jest największym wspólnym dzielnikiem dwóch poprzednich. Dla do wolnego p > 1 zdefiniowali ciąg podstawowy a i, a 2, ■• •, gdzie a &jest najm niejszą liczbą całkowitą > pk taką, że aj _L a& dla 1 < j < k. Na przykład dla p = 2.5 ciąg podstawowy ma postać a u 02, 03, • • • = 3, 7, 16, 41, 101, 247, 613, 1529, 3821, 9539, . . . Następnie podali ciąg skoków, przyjmując ho = 1 i
96
SORTOWANIE
5.2.1
Tak więc początek ciągu skoków jest następujący: 1 ; a x\ a 2, a i a 2; a ia 3, a 2a3, a xa 2a3; . . .
Na przykład dla p = 2.5 dostajemy 1, 3, 7, 21, 48, 112, 336, 861, 1968, 4592, 13776, 33936, 86961, 198768, ... Punktem kluczowym jest, że można zapisać równanie rekurencyjne (8) w postaci: dla
0 •
o
Argum entując tak jak w poprzednim ustępie, dostajemy, że liczba inwersji przy padających na jeden element podczas hg-sortowania, hi-sortowania, . . . wynosi co najwyżej b(a2, ai); b(a3, a2), b(a3, ai); b(a4, a3), b(a4, a2),b(a4, a 3 ; .. .
( 10 )
gdzie b(h, k) — ^ ( h — 1 )(k — 1 ). Jeśli pł~ l < N < p*, to łączna liczba przesunięć B wynosi co najwyżej N razy sum a pierwszych t elementów tego ciągu. W ten sposób (zobacz ćwiczenie 41) można udowodnić, że pesymistyczny czas działania jest dużo lepszy niż rzędu N lm5. T w ie rd z e n ie I. Jeśli kroki hs są zgodne z (8), to czas działania algorytmu D wynosi 0 ( N e c^ lnN). Tutaj c = v/ 8 łn~p, a stała ukryta pod O zależy od p. | To asym ptotyczne górne ograniczenie nie jest specjalnie ważne, gdy N —>oo. W tym przypadku ciąg P ra tta jest lepszy. Główną zaletą twierdzenia I jest to, że dla dowolnego p > 1 ciąg kroków o praktycznej szybkości wzrostu hs ~ ps gwarantuje czas działania 0(7V1+e) dla dowolnie małego e > 0. Rozważmy bardziej uważnie praktyczne wielkości N i prześledźmy dokładny czas działania program u D, tj. (9B + 10A T + 13T —105 —3A + l)u. W tabeli 5 podano średni czas działania dla różnych ciągów skoków, kiedy N = 8 . Dla takiej małej wartości A operacje pomocnicze stanowią najbardziej znaczącą część kosz tu, a najlepszy wynik dostajem y dla t — 1. Zatem dla N = 8 lepiej zastosować proste wstawianie. (Średni czas działania programu S dla N = 8 wynosi tylko 191.85u). Zadziwiające jest, że dostajem y najlepszy dwuprzebiegowy algorytm, gdy /¿i = 6 . Tłum aczy się to tym, że duża wartość 5 jest w tym przypadku ważniejsza niż m ała wartość B . Podobnie, trzy skoki 3 2 1 minimalizują średnią liczbę przesunięć, ale nie tworzą najlepszego ciągu dla trzech przebiegów. W arto w tym miejscu podać „najgorsze” perm utacje, które maksymalizują liczbę prze sunięć, ponieważ konstrukcja takich perm utacji w ogólnym przypadku nie jest ciągle jeszcze znana: h 2 — 5,
hi = 3,
ho = 1:
85 26 3 741
(19 przesunięć)
h2 = 3,
hi = 2,
ho = 1:
835 72461
(17 przesunięć)
Dla większych N obraz się nieco zmienia. W tabeli 6 podano przybliżo ne liczby przesunięć dla różnych ciągów skoków przy N = 1000. Dla kilku
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
97
Tabela 5 ANALIZA ALGORYTMU D DLA A — 8 Skoki
A ave
Save
1 1 1 1 1 1 1 1 1 1
1.718 2.667 2.917 3.083 2.601 2.135 1.718 3.500 3.301 3.320
14.000 9.657 9.100 10.000 10.000 10.667 12.000 8.324 8.167 7.829
2 3 4 5 6 7 4 2 5 3 3 2
S
1 3 4 5 6 7 8 7 9 6
T
1 2 2 2 2 2 2 3 3 3
czas MIX
204.85// 235.91// 220.15// 217.75// 209.20// 206.607/ 209.85 t/ 274.42// 253.60// 280.50//
pierwszych wierszy w tabeli zachodzi warunek podzielności ( 5 ), tak że można zastosować (6 ) i ćwiczenie 19. W pozostałych przypadkach w celu uzyskania średnich wartości przeprowadzono eksperymenty. Wygenerowano tysiąc losowych ciągów 1000-elementowych, a następnie każdy z nich sortowano z użyciem każ dego ciągu skoków. Odchylenie standardowe liczby lewostronnych minimów A wynosiło zazwyczaj około 15, natom iast odchylenie standardowe liczby przesu nięć B wynosiło zazwyczaj około 300. Pewne wzorce są dla tych danych oczywiste, ale zachowanie się algorytmu D ciągle pozostaje niejasne. Oryginalnie Shell proponował używanie skoków [ N / 2J , [iV /4j, [ N / S \ , . . . , ale to nie jest właściwe, gdy binarna reprezentacja N zawiera długi ciąg zer. Lazarus i Frank [CACM 3 (1960), 20-22] zaproponowali w zasadzie używanie tego samego ciągu, ale z dodaniem 1 kiedy to konieczne, w celu uzyskania wszystkich skoków nieparzystych. H ibbard [CACM 6 (1963), 206-213] radził stosować skoki postaci 2k — 1 . Papiernow i Stasiewicz propono wali postać 2k + 1. Inne naturalne ciągi występujące w tabeli 6 zawierają liczby postaci (2k ~ (—l ) k) / S i (3fc — l ) /2, jak również liczby Fibonacciego oraz ciągi Incerpi-Sedgewicka (8) dla p = 2.5 i p = 2 . Zawarto w niej także ciągi postaci {5P119} i {7P139}, podobne do ciągu P ra tta . Ciągi te gw arantują asym ptotyczny czas działania 0 (iV(log N ) 2), ale m ają mniejszy koszt operacji pomocniczych dla małych N. O statni przykład w tabeli 6 pochodzi od Sedgewicka i bazuje na trochę innych heurystykach [J. Algorithm s 7 (1986), 159-173]: 9 • 2S —9 *2sł 2 + 1, jeśli s jest parzyste; 8 • 2S - 6 • 2^s+1^ 2 + 1 , jeśli s jest nieparzyste.
(11)
Sedgewick udowodnił, że kiedy użyjemy skoków (ho, ^ 1 , ^ 2? ■• -) = (1,5,19,41, 109,209,...), wtedy czas działania algorytm u D będzie wynosił 0 ( N 4/ 3). Najmniejszą liczbę przesunięć, około 6750, obserwuje się dla skoków postaci 2k + 1, jak też dla ciągu Incerpiego-Sedgewicka z p = 2. Jednakże jest istotne, żeby zdawać sobie sprawę, że nie tylko liczbę przesunięć należy brać pod uwagę, nawet jeśli ma ona największy wpływ na czas działania. Program D zabiera 9B + 10NT H jednostek czasu. Widzimy więc, że oszczędzenie jednego prze-
98
SORTOWANIE
5.2.1
Tabela 6 PRZYBLIŻONE ZACHOWANIE SIĘ ALGORYTMU D DLA N = 1000
Skoki
256 500 501 511
377 233 144 233 144
89 89
128 250 251 255 255
729 64 125 125 127 127 127
257 129 257 129 129
65 65 65 65
341 171 341 171
85 85
34 34
21 21 377 365
55 55
336 306 170 90 275 125 929 505 505
256 576 192 243 81 32 16 62 31 63 31 63 31 63 31 63 31 63 31 31 33 17 33 17 33 17 33 17 33 17 43 21 43 21 255 63 257 65 341 85 13 8 13 8 144 55 122 41 364 121 121 112 48 45 18 169 91 121 55 209 109 209 109 209 109
j4ave
140 64 48 27 8 15 15 15 15 15 15 15 9 9 9 9 9 11 11 15 17 21 5 5 21 14 40 40 21 10 49 25 41 41 41
60 20 16 16 9 4 7 7 7 7 7 7 7 5 5 5 5 5 5 5 7 5 5 3 3 8 5 13 13 7 5 13 11 19 19 19
17 6 4 4 4 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 2 4 4 3 2 7 5 5 5 5
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
5ave T
6 249750 1 65 41667 2 158 26361 3 262 21913 4 362 20459 5 419 20088 6 378 18533 7 493 16435 10 516 7655 9 558 7370 9 559 7200 9 436 7445 8 299 8170 7 190 9860 6 114 13615 5 561 6745 10 440 6995 9 304 7700 8 197 9300 7 122 12695 6 511 7365 10 490 7490 9 373 8620 6 375 8990 6 410 9345 6 518 7400 13 432 7610 12 456 8795 7 440 8085 7 437 8900 6 268 9790 5 432 7840 7 465 6755 9 349 8698 6 446 6788 8 512 7725 8 519 7790 7 382 8165 6
biegu jest tak samo dobre, jak oszczędzenie ~ N przesunięć; dla N = 1000 oszczę dzenie jednego przebiegu umożliwia dodanie 1111 przesunięć. Dlatego wydaje się, że nie jest zbyt m ądrym pomysłem, rozpoczynać od skoku h t~\ większego niż powiedzmy |iV , ponieważ duży skok nie zmniejszy liczby przesunięć w kolejnych przebiegach wystarczająco, żeby uzasadnić pierwszy przebieg.
SORTOWANIE PRZEZ WSTAWIANIE
5.2.1
99
Tabela 7 PRZESU NIĘC IA NA PRZEBIEG : E K S P E R Y M E N T Y D LA N = 20000
J%s
Bs
hs
Bs
h$
Bs
4095 2047 1023 511 255 127 63 31 15 7 3 1
19458 15201 16363 18867 23232 28034
4097 2049 1025 513 257 129 65 33 17 9 5 3 1
19459 14852
3905 2161 929 505 209 109 41 19 5 1
20714
33606 40350 66037 43915 24191 16898
15966 18434 22746 27595 34528 45497 48717 38560 20271 9448 13459
13428 18206 16444 21405 19605 26604 23441 38941 50000
Obszerne eksperymenty przeprowadzone przez M. A. Weissa [Comp. J. 34 (1991), 88-91] wskazują silnie, że średnia liczba przesunięć wykonywanych przez algorytm D ze skokami 2k — 1, . . . , 15, 7, 3, 1 wynosi w przybliżeniu 7V5/ 4. Dokładniej, Weiss odkrył, że iJave ~ 1.55AT5/4 —AA8N + 0 ( N 3/ 4) dla 100 < AT < 12000000, gdy stosuje się właśnie takie skoki. Uzyskane empirycznie odchylenie standardowe wyniosło w przybliżeniu 0.0657V5/ 4. Weiss stwierdził też, że ciąg Sedgewicka ( n ) zachowuje się asym ptotycznie lepiej, B ave ~ 0.43AT7/6 + 18.57V+ 0(iV 5/ 6). Zadziwiające jest to, że odchylenie standardowe dla tego ciągu skoków okazało się zupełnie małe, w przybliżeniu N 3^4. f W tabeli 7 zawarto liczby przesunięć w poszczególnych przebiegach otrzy mane w trzech eksperymentach dla losowych danych i skoków postaci 2fc — 1 , 2h + 1 i ( n ) . W każdym przypadku sortowano ten sam ciąg liczb. Łączna liczba przesunięć, J2S B S, wyniosła 346152, 329532, 248788. Zatem w tym przykładzie ciąg ( n ) jest zdecydowanie najlepszy. Chociaż algorytm D stawał się stopniowo bardziej zrozumiały, to jednak trzy dekady badań nie doprowadziły do sformułowania istotnych warunków mówią cych, jaki ciąg skoków zachowuje się najlepiej. Jeśli N jest mniejsze od 1000, to prosta reguła, taka jak Niech ho = 1, ń s+i = 3h s + 1, i zakończ na h t~ i, gdy 3ht > N
( 12 )
wydaje się być tak samo dobra, jak każda inna. Dla większych wartości N można polecić ciąg Sedgewicka ( 1 1 ), znowu kończący się na h t~ 1 , gdy 3h t > N . W ćwiczeniu 43 wyjaśniamy, w jaki sposób uśunąć z kroku D5 sprawdzanie warunku „ż > 0” . Ta zmiana powoduje, że program D jest około 10% szybszy. W s ta w ia n ie d o listy. Zostawmy już sortowanie Shella i rozważmy inne rodzaje usprawnień prostego wstawiania. Jeden z najważniejszych, ogólnych sposobów usprawnienia danego algorytmu polega na uważnym zbadaniu używanej w nim struktury danych. Często zmiana organizacji takiej struktury, w celu uniknięcia
100
SORTOWANIE
5.2.1
wykonywania zbędnych operacji, prowadzi do istotnych oszczędności. Rozwi nięcie tej ogólnej idei znajduje się w podrozdziale 2.4, gdzie badaliśmy dosyć złożone algorytmy. T utaj zastanówmy się, w jaki sposób tę ideę zastosować do ta k prostego algorytmu, jakim jest sortowanie przez proste wstawianie. Jaka stru k tu ra danych jest najwłaściwsza dla algorytmu S? W prostym wstawianiu wykonuje się dwie podstawowe operacje: i) przeglądanie uporządkowanego ciągu w celu znalezienia największego klucza mniejszego lub równego danemu kluczowi; ii) wstawienie nowego rekordu w konkretne miejsce w uporządkowanym ciągu. Taki ciąg jest w rzeczywistości listą liniową i w algorytmie S ta lista jest prze tw arzana przy użyciu alokacji liniowej (punkt 2.2.2). Dlatego, w przybliżeniu połowa rekordów musi zostać przesuniętych podczas każdego wstawiania. Z dru giej strony wiemy, że alokacja dowiązaniowa (punkt 2.2.3) idealnie pasuje do wstawiania, ponieważ wystarczy zmienić tylko kilka dowiązań. Druga operacja, sekwencyjne przeszukiwanie, jest tak samo łatwa przy alokacji dowiązaniowej, jak przy alokacji liniowej. Dowiązania mogą być tylko w jednym kierunku, ponieważ listę zawsze przeglądamy w tym samym kierunku. Możemy zatem stwierdzić, że właściwą stru k tu rą danych dla prostego wstawiania jest jednokierunkowa lista liniowa. W ygodnie jest także zmienić algorytm S w taki sposób, żeby lista była przeglądana w porządku rosnącym. A lg o r y tm L (W stawianie do listy). O rekordach Ą , . . . , zakłada się, że zawierają klucze . . . , K jy oraz pola dowiązania L i , . . . , L/y? w których można trzym ać liczby od 0 do A ; dane jest także dodatkowe pole dowiązanie L q w sztucznym rekordzie R q znajdującym się na początku ciągu rekordów. W tym algorytmie dowiązania są ustalane w taki sposób, żeby połączyć rekordy w po rządku rosnącym. Zatem, jeśli p( 1). . . p ( N) jest perm utacją stabilną o własności Kp{i) ^ < K p(n ) i t° P° zakończeniu działania algorytmu L 0 = p ( 1);
L p{i)= p ( i + 1 )
dla
1 < i < IV;
L p{N) = 0.
( 13 )
L I . [Pętla po j } L q <— N, <— 0. (Dowiązanie L q służy jako „głowa” listy, a 0 oznacza brak dowiązania; tak więc w rzeczywistości lista jest cykliczna). W ykonaj kroki od L2 do L5 dla j = N ~ 1 , N —2 , następnie zakończ wykonywanie algorytmu. L 2 . [Ustalanie p, ą, K] p <— Lq, q 0, K <— Kj . (W kolejnych krokach Rj jest wstawiany we właściwe miejsce na liście. W tym celu K jest porównywany w porządku rosnącym z poprzedzającymi go kluczami. Zmienne p i q wska zują aktualne miejsce na liście, p — L q tak, że q jest o jedną pozycję za p). L3. [Porównywanie K : K p\ Jeśli K < K p, przejdź do kroku L5. (Znaleźliśmy docelową pozycję dla rekordu R, będzie on na liście między R q a R p). L 4. [Przesuwanie p, q] q p, p <— L q. Jeśli p > 0, wróć do kroku L3. (Jeśli p — 0, K jest największym z dotychczas przejrzanych kluczy. Tak więc rekord R musi znaleźć się na końcu listy między R q a i?o). L5. [Wstawianie do listy] L q
j , Lj
p.
|
SORTOWANIE PRZEZ WSTAWIANIE
5.2.1
101
Ten algorytm jest ważny nie tylko dlatego, że jest prostym algorytmem sortowania, ale też dlatego, że często jest fragmentem innych algorytmów prze twarzania list. W tabeli 8 zilustrowano kilka pierwszych kroków tego algorytm u zastosowanego do naszych przykładowych 16 liczb. W ćwiczeniu 32 podajem y wynikowe dowiązania. Tabela 8 PRZYKŁAD WSTAWIANIA DO LISTY
j: Ky. Ly. Ly Ly
P rogram
0
1 2
3
4
5
6
7
8
9 10 11 12 13
- 503 087 512 061 908 170 897 275 653 426 154 16 - - - - - - 16 - - - - - - 14 - - - - - - -
L
509 612 - - - -
14
15 16
677 765 703 - 0 0 15 16 0 15
(Wstawianie do listy). Przyjmujemy, że K j jest pam iętane w L ś w I N P U T + j ( 4 : 5 ) . r l l = j; rI 2 = p; rI3 = q; rA (0:3) = K .
IN PU T- f j ( 0 :3 ) , a
U 15 16 17 18
LIN K
EQU
4 :5
START ENT1
2H
3H 4H
N
ST1
IN PU T (LIN K )
STZ
IN PU T + N (LIN K )
JMP
6F
LD2
IN P U T (L IN K )
1 1 1 1 TV - 1
EN T 3 0
TV- 1
LDA
IN P U T ,1
TV- 1
CMPA I N P U T , 2 ( K E Y )
£? + TV — 1 - A
JLE
5F
£? + TV — 1 - A
ENT3
0 ,2
LD2
IN P U T ,3 (LIN K )
B B B
J2P
3B
5H
ST1
IN P U T ,3 (L IN K )
TV- 1
ST2
IN P U T ,1 (LIN K )
TV- 1
6H
DEC1
1
TV
J1P
2B
TV
LI . P ętla p o j. 7 *— TV.
T
0 :3
Ln
0.
Idź, zm n ie jsz j.
L2. U stal p, q, K . p
Lq
0
12 13
EQU
1
04 05 06 07 08 09 10 11
KEY
o
01 02 03
K - Kj L3. Porów na j K : K v . D o L 5 , j e ś l i K ^ K p. L4. P rzesu ń p, q. q <— p. V <- L q . D o L 3 , j e ś l i p > 0.
L5. W staw do listy. L „ <— 3L j < - p. N > j >
1.
|
Czas działania tego program u wynosi I B + 14TV — 3A — 6 , gdzie TV jest długością ciągu, A + 1 jest liczbą prawostronnych maksimów, a B jest liczbą inwersji w wyjściowej perm utacji. (Zobacz analizę program u S. Zauważmy, że program L nie przestawia rekordów w pamięci. To można zrobić w sposób opi sany w ćwiczeniu 5.2-12, w dodatkowym koszcie około 20TV jednostek czasu). Program S wymaga (9B + 10 TV —3A —9) jednostek czasu, a ponieważ B wynosi około |TV2, zatem można zauważyć, że korzystając z dodatkowej pamięci na dowiązania, oszczędzamy około 22 procent na czasie wykonania. Dodatkowe 22 procent można zaoszczędzić, uważnie programując (zobacz ćwiczenie 33), jednakże czas działania będzie nadal proporcjonalny do TV2.
102
SORTOWANIE
5.2.1
P odsum ujm y to, co dotychczas zrobiliśmy. Rozpoczęliśmy od algorytmu S, prostego i naturalnego sortowania, w którym wykonywanych jest około \ N 2 porównań i około j N 2 przesunięć. Poprawiliśmy ten algorytm z jednej strony, stosując binarne wstawianie, co dało około N ł g N porównań i \ N 2 przesunięć. Zmieniając lekko strukturę danych, doszliśmy do „wstawiania dwustronnego” , redukując liczbę przesunięć do około \ N 2. W sortowaniu Shella liczba porównań i przesunięć została ograniczona do około N 7^ dla N z praktycznego zakresu. Przy iV —* oo można tę liczbę zmniejszyć do N (log N ) 2. Inny sposób uspraw nienia algorytm u S polegał na wykorzystaniu dowiązaniowej struktury danych. Sortowanie z wykorzystaniem wstawiania do listy wymaga około ~ N 2 porównań, 0 przesunięć i 2 N zmian dowiązań. Czy jest możliwe, aby połączyć najlepsze charakterystyki tych m etod, re dukując liczbę porównań do rzędu N ł o g N , tak jak przy wstawianiu binarnym, przy jednoczesnej redukcji liczby przesunięć, tak jak przy wstawianiu na listę? Odpowiedź jest pozytywna, ale wymaga zastosowania struktur drzewiastych. Ta ką możliwość dostrzegł po raz pierwszy w 1957 roku D. J. Wheeler. Jego pomysł polegał na stosowaniu dwustronnego wstawiania aż do chwili, w której staje się konieczne przesunięcie pewnych danych. Wówczas, zam iast przesuwać dane wstawia się wskaźnik do innego obszaru pamięci i stosuje się rekurencyjnie tę sam ą technikę do wszystkich elementów, które powinny znaleźć się w tym nowym obszarze pamięci. Oryginalna m etoda W heelera [zobacz A. S. Douglas, Comp. J. 2 (1959), 5] polegała na skomplikowanym połączeniu tablic i wskaźników, a węzły m iały zmienną długość. Na przykład dla ńaszych 16 liczb zostałoby zbudowane drzewo z rysunku 13. Podobny, ale prostszy schemat wstawiania do drzewa, przy użyciu drzew binarnych, został zaproponowany przez C. M. Bernersa-Lee około 1958 roku [zobacz Com p. J. 3 (1960), 174, 184]. Ponieważ m etoda z wykorzystaniem drzew binarnych i jej udoskonalenia są tak samo ważne w wyszukiwaniu, jak i w sortowaniu, omawiamy je w całej rozciągłości w punkcie 6 .2 .2 .
061 154
Y
0 8 7 / 503 | 512 ^908
170 275 426
509
612 653^897 765 703
R ys. 13. Przykładowy schemat sortowania drzewowego Wheelera. Jeszcze inny sposób usprawnienia prostego wstawiania polega na wstawianiu kilku elementów w tym samym czasie. Na przykład, jeśli sortowany ciąg składa się z 1000 elementów i jeśli 998 z nich jest już posortowanych, to w algorytmie S
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
103
są wykonywane jeszcze dwa przebiegi (najpierw jest wstawiany R 999, potem iliooo). Oczywiście możemy zaoszczędzić na czasie, jeśli najpierw porównamy K 999 z K 100O) ¿eby zobaczyć, który klucz jest większy, a następnie wstawimy oba klucze, przeglądając ciąg tylko raz. Stosując operacje tego typu, wykonujemy około | N porównań i przesunięć (zobacz ćwiczenie 3.4.2-5), zam iast dwóch przebiegów, każdy z około |iV porównaniami i przesunięciami. Innymi słowy, należy grupować operacje, które w ym agają długiego przeszu kiwania. Jeśli doprowadzimy ten pomysł do naturalnego końca, to odkryjemy sortowanie przez scalanie, które jest tak ważne, że omawiamy je w punkcie 5.2.4. Sortow anie prfcez w yliczan ie adresów . Do tej pory wyczerpaliśmy pewnie wszystkie możliwości usprawnienia sortowania przez proste wstawianie, ale spró bujmy raz jeszcze. Przypuśćmy, że chcemy ustawić na półce kilkadziesiąt książek według nazwisk autorów, podczas gdy same książki są dane w losowym porządku. Naturalny sposób postępowania polega na ocenieniu w przybliżeniu końcowej pozycji, na której powinna znaleźć się każda książka, a następnie postawieniu jej w tym miejscu. W ten sposób zmniejszamy liczbę porównań i przesunięć, które będziemy musieli wykonać. Cały proces stanie się bardziej wydajny, jeśli będziemy mieli trochę więcej miejsca na półce, niż jest to absolutnie konieczne. Opisana m etoda została zaproponowana dla sortowania komputerowego po raz pierwszy przez Isaaca i Singletona, JA C M 3 (1956), 169-174, a następnie roz winięta przez T artera i Kronmala, Proc. A C M N a t’1 Conf. 21 (1966), 331-337. Sortowanie przez wyliczanie adresów wymaga zazwyczaj dodatkowej pamięci 0 rozmiarze proporcjonalnym do N albo dodatkowego miejsca, żeby nie wyko nywać zbędnych przesunięć, albo dodatkowych tabel, w których byłyby zapa miętane informacje o nieregularnościach w rozkładzie kluczy. (Zobacz sortowanie przez rozrzucanie, algorytm 5.2D, które jest odm ianą sortowania przez wyliczanie adresów). Prawdopodobnie najlepszy sposób użycia dodatkowej pamięci polega na przeznaczeniu jej na dowiązania, tak jak w sortowaniu przez wstawianie do listy. Tym samym możemy także uniknąć rozdziału obszarów wejściowego 1 wyjściowego. Wszystko można zrobić w tym samym obszarze pamięci. Z naszych rozważań wynika, że można uogólnić wstawianie do listy, utrzy mując kilka list zamiast jednej. Uczynimy poważne założenie, że rozkład kluczy jest jednostajny: Zbiór wszystkich możliwych wartości kluczy jest podzielony na M części, a prawdopodobieństwo tego, że dany klucz należy do danej części wynosi 1/M . Przeznaczamy dodatkową pamięć na zapam iętanie M głów list uporządkowanych. Nie m a potrzeby opisywania w większych szczegółach algorytmu sortowania tą metodą. Rozpoczynamy od pustych list, a następnie dla każdego elementu najpierw decydujemy, w której z M części powinien się znaleźć, i wstawiamy go do właściwej listy tak jak w algorytmie L. W celu zilustrowania tego podejścia załóżmy, że nasze 16 przykładowych kluczy zostało podzielonych między M = 4 przedziałów 0 -2 4 9 , 250-499, 5 0 0 -749, 750-999. Przy kolejnym wstawianiu kluczy K x, K 2, . . . , K ie otrzymujemy następujące konfiguracje:
104
SORTOWANIE
5.2.1
Po Po Po 4 elementach: 8 elementach: 12 elementach: Lista Lista Lista Lista
1: 061,087 2: 3: 503, 512 4:
Stan końcowy:
061,087,170 061,087,154,170 061,087,154,170 275 275,426 275,426 503, 512 503,509, 512,653 503, 509, 512,612,653, 677, 703 897,908 897,908 765,897,908
(Program M przedstawiony poniżej w rzeczywistości wstawia klucze w odwrotnej kolejności K iq, . . . , K 2l K \ , ale końcowy wynik jest taki sam). Ponieważ wiążemy w listy elementy zapam iętane w tablicy, zmienna długość list nie powoduje problemów z alokacją pamięci. W szystkie listy można na koniec połączyć w po jedynczą listę, o ile jest taka potrzeba (zobacz ćwiczenie 35). P r o g r a m M ( Wstawianie do wielu list). Założenia dla tego programu są takie same jak dla program u L, z wyjątkiem tego, że klucze muszą być nieujemne. Tak więc 0 < K j < (BYTESIZE)3. W tym programie zakres kluczy jest dzielony na Mrównych części. Podzakres, do którego należy dany klucz, jest wyznaczony przez pomnożenie tego klucza przez odpowiednią stałą. Głowy łist znajdują się w komórkach od HEAD+1 do HEAD+M. 01 02 03 04 05 06 07 08 09 10 11 12 13 U 15 16 17 18 19 20 21 22 23
KEY EQU LINK EQU START ENT2 STZ DEC2 J2P ENT1 2H LDA MUL STA ENT4 ENT3 LDA JMP CMPA 3H JLE ENT3 4H LD2 J2P ST1 5H ST2 6H DEC1 J1P
1 :3 4 :5 M HEAD,2 1 * -2 N INPUT,1 (KEY) =M (1:3)= * + 1 (1 :2 )
0 HEAD+1-INPUT,4 INPUT,1 4F INPUT,2 (KEY) 5F 0 ,2 INPUT, 3 (LINK) 3B INPUT,3 (LINK) INPUT,1 (LINK) 1 2B
1
M M M 1
N N N N N N N B +N -A B +N -A B B +N B +N N N N N
HEADlp] <- A.
M ^ p ^ 1. j N. rA <— [M ■Kj / BYTESIZE3J. rI4 <—rA. q <—L0C (HEAD [rA ] ) .
K*-Kj. Skocz i ustal p. Skocz i wstaw, jeśli K sC K p
q
P-
p <—L IN K (g). Skocz, jeśli nie koniec listy. LINK(5) «- L0C(iij) . LINK(L0C(iij )) <- p.
W tym programie M może być dowolne, ale byłoby łepiej wybrać za M wygodną do obliczeń wartość. Na przykład moglibyśmy wziąć M = BYTESIZE. Wówczas inicjowanie list można wykonać za pomocą pojedynczej instrukcji MOVE, a ciąg instrukcji w wierszach 0 8 -1 1 można zastąpić pojedynczą instrukcją
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
105
LD3 INPUT,1 ( 1 : 1 ). Najbardziej widoczna różnica między program am i L a M jest w tym, że w programie M bierze się pod uwagę listy puste, kiedy to żadne porównania nie są wykonywane. Jaką mamy oszczędność czasu, używając M list? Całkowity czas działania programu M wynosi I B + 31N — 3A + AM A- 2 jednostek, gdzie M jest licz bą list, a N jest liczbą sortowanych rekordów; A i B to, odpowiednio, łączne liczby prawostronnych maksimów oraz inwersji dla kluczy z poszczególnych list. (W przeciwieństwie do innych analiz z tego podrozdziału, w A liczy się skrajnie prawy element niepustej perm utacji). Zbadaliśmy już A i B dla M — l i do staliśmy, że ich średnie wartości wynoszą H n i | ( ^ ) . Przy naszym założeniu o rozkładzie kluczy prawdopodobieństwo, że dana lista po posortowaniu m a długość dokładnie n, jest prawdopodobieństwem „dwumianowym”
(m ) Dlatego w ogólnym przypadku średnie wartości A i B wynoszą ( 15 ) n
2.
^ave — Ai
( 16)
n Korzystając z tożsamości
która jest specjalnym przypadkiem 1 .2 .6- ( 2o), można łatwo policzyć sumę z ( 16 ): ( 17 ) W ćwiczeniu 37 wyprowadzamy odchylenie standardowe dla B . Suma w ( 15 ) jest bardziej skomplikowana. Z twierdzenia 1.2.7A dostajem y
£n i n ) { M - i r “" " = ( ' '
~ bM) + ‘
stąd
(Ten wzór jest praktycznie bezużyteczny, gdy M « N; w ćwiczeniu 40 przedsta wiono bardziej szczegółową analizę asymptotycznego zachowania się Aave, gdy M = N/a).
106
SORTOWANIE
5.2.1
Korzystając z ( 17 ) i ( 18 ), można podać całkowity czas działania programu M dla ustalonego M i N —►00: min
3ÜV + M + 2,
ave
1.75N 2/ M + 31N - 3M H N + 3M In M + AM - 36 - 1.75N /M + 2 ,
m ax
3.50./V2 + 24.5./V + 4M + 2.
( 19 )
Zauważmy, że gdy M nie jest zbyt duże, zw iększam y średni czas działania o czyn n ik M ; dla M — 10 sortowanie będzie około dziesięć razy szybsze niż dla M — 1, Jednakże pesymistyczny czas działania jest dużo większy od czasu średniego. To świadczy o sile naszego założenia o jednostajnym rozkładzie kluczy. Przypadek pesymistyczny m a miejsce wtedy, kiedy wszystkie klucze należą do tej samej listy. Jeśli weźmiemy M = N, to średni czas działania programu M wyniesie w przybliżeniu 34.367V jednostek; dla M = ^ N jest niewiele większy, w przybliże niu 34.52ÍV; a gdy M = ^ N , wówczas wynosi w przybliżeniu 48.04ÍV. Dodatkowy koszt program u z ćwiczenia 35, który łączy M list razem w jedną pojedynczą listę, zwiększa te czasy, odpowiednio, do 44.99 N , 41.95N i 52.74AÍ. (Zauważmy, że 10 N z jednostek czasu maszyny MIX jest przeznaczonych na mnożenie!). W ten sposób otrzym aliśm y m etodę sortowania w czasie rzędu N, jednak p rzy założeniu, że klucze są dobrze rozrzucone w swoim zakresie. Usprawnienia sortowania z wieloma listami omawiamy w punkcie 5.2.5. Ć W IC ZEN IA 1. [10] Czy algorytm S jest stabilnym algorytmem sortowania? 2. [11] Czy algorytm S nadal sortowałby poprawnie, gdyby zamienić porównanie „K ^ K ” z kroku S3 na porównanie „K > K¿”? 3. [30] Czy program S jest najkrótszym możliwym programem sortującym dla ma szyny MIX, czy też może istnieją krótsze programy? 4. [M20] Wyznacz minimalny i maksymalny czas działania programu S jako funk cje N. 5. [M27] Wyznacz funkcję tworzącą gN(z) = ^2k^opNkZk dla łącznego czasu dzia łania programu S, gdzie pNk jest prawdopodobieństwem tego, że program S wykonuje się w dokładnie k jednostkach czasu dla danej na wejściu losowej permutacji liczb { 1, 2, . . . , N }. Dla danego N policz także odchylenie standardowe czasu działania. 6. [23] Wydaje się, że wstawianie dwustronne, które zostało zilustrowane w tabeli 2, oprócz obszaru wejściowego na N rekordów wymaga obszaru wyjściowego zdolnego pomieścić 2N + 1 rekordów. Pokaż, że wstawianie dwustronne można przeprowadzić w obszarze o wielkości tylko N + 1 rekordów, licząc zarówno wejście, jak i wyjście. 7. [M20] Ile wynosi średnia wartość wyrażenia |ai — 1| + |a 2 —2| + ■** + \an —n\ dla losowej permutacji a\ 0*2 . . . an liczb { 1 , 2 , . . . ,n }? (To jest równe n razy średnia odległość, jaką podczas sortowania pokonuje jeden rekord). 8. [10] Czy algorytm D jest stabilnym algorytmem sortowania?
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
107
9. [20] Jakie wartości przyjmują A i B i jaki jest całkowity czas działania programu D dla danych z tabel 3 i 4? Omów zalety i wady sortowania Shella w stosunku do sortowania przez wstawianie w tym przypadku. ►10 . [22] Jeśli na początku kroku D3 w algorytmie D mamy K j ^ K j - h , to wówczas wykonywanych jest wiele zbędnych akcji. Pokaż, w jaki sposób zmodyfikować algorytm D, tak żeby można było uniknąć takich redundantnych obliczeń i przeprowadź dyskusję na temat zalet takiego rozwiązania. 11. [M10] Jaka ścieżka na kratownicy, podobnej do tej z rysunku 11 , odpowiada permutacji 1 2 5 3 7 4 8 6 9 11 10 12? 12. [M20] Udowodnij, że powierzchnia między ścieżką na kratownicy, odpowiadającej pewnej permutacji 2-uporządkowanej, a ścieżką schodkową (jak to pokazano na rysunku 11 ) jest równa liczbie inwersji w tej permutacji. ►13. [M16] Wyjaśnij, w jaki sposób przypisać wagi poziomym odcinkom na kratownicy (zamiast pionowym), tak żeby suma poziomych wag na ścieżce odpowiadającej pewnej permutacji 2 -uporządkowanej była równa liczbie inwersji w tej permutacji. 14. [M28] (a) Pokaż, że dla sum zdefiniowanych w ( 2 ) zachodzi A 2n+i = 2A2n(b) Ogólna tożsamość z ćwiczenia 1.2.6-26 upraszcza się do
?(
2 k + s \ fc 1 / 1 —y/l —4z z = k ) y /l - 4z V 2z
jeśli weźmiemy r = s, t = —2 . Rozważ sumę
A 2nzn i pokaż, że
A 2 n ~ n ■4n 1. ►15. [HM33] Niech gn (z), gn (z ), hn (z) i hn {z) będą równe £ p o w i t a waga ścieżki? gdzie sumowanie odbywa się po wszystkich ścieżkach na kratownicy o długości 2 n, z (0 ,0 ) do (n ,n), przy pewnych ograniczeniach na wierzchołki występujące na tych ścieżkach. O wagach zakładamy, że są zdefiniowane tak jak na rysunku 11 . Dla hn (z) nie narzucamy żadnych ograniczeń, ale dla gn {z) ścieżki nie mogą zawierać wierzchołków (i, j) z i > j; h n {z) oraz gn {z) są zdefiniowane podobnie, z wyjątkiem tego, że nie mogą zawierać żadnego z wierzchołków (i, i) dla 0 < i < n. Tak więc go(z) = 1 ,
gi (z) = z,
ho(z) = 1,
g2(z) = z 3 + z 2;
hi (z) = z -1-1, hi ( z) — z + 1 ,
gi (z) ~ z,
g2(z) = z3;
/12 (z) = z 3 + z 2 + 3z + 1;
/¿2 (z) — z 3 4- z.
Znajdź zależności rekurencyjne definiujące te funkcje i wykorzystaj te zależności do dowodu, że -.3 1 A« 2
O D + * ( l ) = 7n + f f + 4 n ( ^ ) . (Następnie już łatwo można znaleźć dokładny wzór na wariancję liczby inwersji w loso wej 2-uporządkowanej permutacji liczb { 1 , 2 , . . . , 2 n}. Wariancja wynosi w przybliżeniu
( £ - f e h 3)16. [M2Ą] Znajdź wzór na maksymalną liczbę inwersji w h-uporządkowanej permuta cji liczb { 1, 2, , . . , n}. Jaka jest największa liczba przesunięć w algorytmie D, gdy skoki spełniają warunek podzielności ( 5 )?
108
SORTOWANIE
5.2.1
17. [M21] Pokaż, że gdy N = 2* i h s — 2S dla t > s ^ 0, to istnieje dokładnie jedna permutacja liczb { l , 2 , . . . , n } , która maksymalizuje liczbę przesunięć wykonywanych w algorytmie D. Znajdź prosty sposób opisania tej permutacji. 18. [HM2Ą] Dla dużych N sumę (6 ) można oszacować jako 1 _Nj_ 4 ht-i
0 F / JV3/ah f f 8 y ht-2
N 3/2h \ / 2 \
J
Dla jakich wartości ht ~ i , . . . , ho wyrażenie to przyjmuje rhinimum, gdy N i t są usta lone, a ho = 1 ? ►19. [M25] Ile wynosi średnia wartość A z analizy złożoności czasowej programu D dla skoków spełniających warunek podzielności (5 )? 20. [M22] Pokaż, że twierdzenie K wynika z lematu L. 21. [M25 ] Niech h i k będą względnie pierwszymi dodatnimi liczbami całkowitymi. Powiemy, że liczba całkowita n jest generowalna, jeśli można ją przedstawić w postaci n = x h + y k dla pewnych nieujemnych liczb całkowitych x i y. Pokaż, że liczba n jest generowalna wtedy i tylko wtedy, gdy liczba hk — h —k — n nie jest generowalna. (Ponieważ 0 jest najmniejszą liczbą generowalną, największą liczbą generowalną musi być zatem hk — h — k. Wynika stąd, że w każdym pliku, który jest jednocześnie /i-uporządkowany i k-uporządkowany, Ki ^ K j , jeśli tylko j —i ^ (h — l ) ( k — 1)). 22. [M 3 0 } Udowodnij, że każdą liczbę całkowitą ^ 2 S( 2 S - 1) można reprezentować w postaci a0(2s - 1) + a i(2 s+1 - 1) + a2(2s+2 - 1) + • • ■, gdzie aj są nieujemnymi liczbami całkowitymi, natomiast liczba 2 S( 2 S—1 ) —1 nie ma już takiej reprezentacji. Dodatkowo, dokładnie 2s™1(2s + s —3) dodatnich liczb całkowitych nie ma reprezentacji w tej postaci. Znajdź analogiczne wzory, gdy w podanych reprezentacjach wielkości 2k — 1 za stąpimy przez 2k 4 * 1 . ►23. [M22] Udowodnij, że jeśli h s+2 i h s+1 są względnie pierwsze, to liczba przesunięć wykonywanych w algorytmie D, ze skokami hs , wynosi 0 ( N h s+2hs+i/hs). Wskazówka: Zobacz ćwiczenie 21. 24. [MĄ2] Udowodnij, że wynik twierdzenia P jest najlepszy z możliwych w tym sensie, że nie można zmniejszyć wykładnika 3/2. ►25. [M22] Ile permutacji liczb { 1, 2, . . . , N } jest zarówno 3-, jak i 2-uporządkowanych? Jaka jest maksymalna liczba inwersji w takiej permutacji? Jaka jest łączna liczba inwersji we wszystkich takich permutacjach? 26. [M35] Czy ciąg 3-, 5- i 7-uporządkowany, o N elementach, może mieć więcej niż N inwersji? Oszacuj dla dużych N maksymalną liczbę inwersji. 27. [MĄ1] (Bjorn Poonen) (a) Udowodnij, że istnieje stała c taka, że jeśli m skoków h s w algorytmie D jest mniejszych od N / 2 , to jego pesymistyczny czas działania wynosi q ( j/\t1+c/\A^)i (b) yy konsekwencji, pesymistyczny czas działania algorytmu D wynosi zawsze fŁ(N(log AT/'loglogN ) 2). 28. [15] Który z ciągów skoków z tabeli 6 jest najlepszy ze względu na algorytm D, gdy rozważamy średni, całkowity czas działania?
5.2.1
SORTOWANIE PRZEZ WSTAWIANIE
109
29. [Ą0] Dla N = 1000 i różnych wartości t , wyznacz doświadczalnie wartości h t~ i, . . . , hi, ho, dla których średnia liczba przesunięć, B ave, jest najmniejszą, jaką jesteś w stanie uzyskać. 30. [M23] (V. Pratt) Pokaż, że dla zbioru kroków {2p3g | 2P39 < N } liczba przebiegów w algorytmie Shella wynosi w przybliżeniu | (log 2 iV) (log3 N ) , a liczba przesunięć w jed nym przebiegu jest nie większa od N / 2 . W rzeczywistości, jeśli w dowolnym przebiegu K j - h > K j , to zawsze K j - 3h, K j - 2 h ^ K j < K j - h ^ K j + h,Kj+2h* Wystarczy zatem po prostu zamienić K j - h z K j i zwiększyć j o 2 h. W ten sposób zaoszczędzamy w algorytmie D dwa porównania. Wskazówka: Zobacz ćwiczenie 25. ►31. [25] Zaprogramuj w języku M I X algorytm sortowania Pratta (ćwiczenie 30). Wyraź jego czas działania w zależności od wielkości A, 1?, 5, T, N , analogicznych do tych z programu D. 32. [10] Jaka będzie ostateczna zawartość L q Li . . . L ig, jeśli sortowanie listowe z ta beli 8 doprowadzimy do samego końca? ►33. [25] Znajdź sposób poprawienia programu L tak, żeby dominujący wpływ na jego czas działania miało 5B zamiast 7B, gdzie B jest liczbą inwersji. Rozważ odpowiadające temu usprawnienia programu S. 34. [M10] Uzasadnij wzór ( 14 ). 35. [21] Napisż program w języku M I X , który po zakończeniu programu M łączy wszystkie listy w jedną. Twój program powinien polom L I N K nadać dokładnie te same wartości, jakie nadałby program L. 36. [18] Przyjmijmy, że rozmiarem baj tu maszyny MIX jest 100 i że szesnastoma przy kładowymi kluczami w tabeli 8 są teraz 503000, 087000, 5 1 2 0 0 0 ,..., 703000. Określ, jaki jest czas działania programów L i M dla tych danych, gdy M = 4. 37. [M25] Niech gn (z) będzie funkcją tworzącą prawdopodobieństwa dla inwersji w lo sowej permutacji n-elementowej, wzór 5 .1 .1 -(n ). Niech gNM(z) będzie odpowiadającą funkcją tworzącą dla wielkości B z programu M. Pokaż, że
M n wn N^O
wn \ M
N T“ = l Z ^ 9 n ( z ) ^ j ' \ n>0 */
,
i wykorzystaj ten wzór do wyprowadzenia wariancji B. 38. [HM23] (R. M. Karp) Niech F( x) będzie dystrybuantą pewnego rozkładu praw dopodobieństwa i taką, że F ( 0) = 0 i F ( l) = 1 . Wiedząc, że klucze K i, K 2 , . . . , K n zostały wybrane losowo i niezależnie zgodnie z tym rozkładem oraz że M = c N , gdzie c jest stałą, a N —+ 00 , udowodnij, że średni czas działania programu M wynosi O( N) , jeśli tylko F jest wystarczająco gładka. (Klucz K jest wstawiany na listę j, gdy [ M K J — j — 1 ; to dzieje się z prawdopodobieństwem F ( j / M ) — F ( ( j — 1) / M) . W głównym tekście rozważamy tylko przypadek, gdy F( x) = x, 0 ^ x ^ 1 ). 39. [HM16] Jeśli program działa w przybliżeniu w czasie A / M + B jednostek i wyko rzystuje C + M lokacji w pamięci, to jak należy wybrać M, żeby iloczyn czas x pamięć był najmniejszy? ►40. [HM2Ą] Znajdź asymptotyczną wartość średniej liczby prawostronnych maksimów (przy N —» 00 ), które pojawiają się podczas wstawiania na wiele list, wzór (15), gdy M — N / a dla ustalonego a. Podaj rozwinięcie z błędem bezwzględnym 0 ( N ~ 1), wyra żając swoją odpowiedź za pomocą wykładniczej funkcji całkowej E \{z ) = / 2°° e~ł dt/t.
110
SORTOWANIE
5.2.1
41. [HM26] (a) Udowodnij, że suma pierwszych (*) elementów z ( 10 ) wynosi 0 ( p 2k). (b) Udowodnij teraz twierdzenie I. 42. [HMĄ3] Przeprowadź analizę zachowania się algorytmu Shella w średnim przy padku dla t — 3 kroków h, g i 1, przy założeniu, że h _L g. Oczywiście w pierwszym przebiegu, ń-sortowaniu, wykonuje się łącznie \ N 2/ h -f O(N) przesunięć. a) Udowodnij, że w drugim przebiegu, ^-sortowaniu, jest wykonywanych łącznie 2l~ ( V h —1 / V h ) N 3/ 2/g + O(hN) przesunięć. b) Udowodnij, że w trzecim przebiegu, 1-sortowaniu, jest wykonywanych łącznie /i p(h,g)N H- 0 ( g 3h2) przesunięć, gdzie
►43. [25] W ćwiczeniu 33 do przyśpieszenia algorytmu S wykorzystaliśmy wartownika, unikając sprawdzania warunku „i > 0” w kroku S4. Ta sztuczka nie znajduje zasto sowania w algorytmie D. Pomimo to pokaż, jak łatwo można uniknąć sprawdzania warunku „i > 0” w kroku D5, przyśpieszając w ten sposób wykonywanie wewnętrznej pętli w sortowaniu Shella. 44. [M25] Niech 7r = a x . . . an i 7r' = a[ . . . a!n będą permutacjami liczb { 1, . . . , n}. Powiemy, że 7r ^ 7r', jeśli i-ty co do wielkości element w zbiorze { o j , . . . , a.,} jest nie większy od i-tego co do wielkości elementu w zbiorze { a i , . . . ,a^} dla 1 ^ i ^ j ^ n. (Innymi słowy, 7r ^ 7r', jeśli dla każdego j , po wstawieniu pierwszych j elementów w algorytmie sortowania przez proste wstawianie, każda z j pierwszych składowych częściowo posortowanej permutacji 7r jest niewiększa ododpowiadającej jej składowej w częściowo posortowanej permutacji 7r'). Jeśli permutacja 7r jest powyżej irf w znacze niu z ćwiczenia 5.1.1-12, to czy z tego wynika, że 7r ^ 7r'? b) Czy, jeśli 7r ^ tt', ttr ^ 7t/jR? c) Czy, jeśli 7T ^ 7r', n jest powyżej ir'?
5.2.2. Sortowanie przez zamienianie
Rozważymy teraz drugą rodzinę algorytmów sortowania z listy z początku pod rozdziału 5 .2 : m etody „zamieniania” lub „transponowania” , które polegają na systematycznej zamianie par nieuporządkowanych elementów aż do chwili, w któ rej nie m a już takich par. Na algorytm prostego wstawiania (5.2.1S) można patrzeć jak na przykład m etody „zamieniania” : Każdy nowy rekord Rj jest w istocie zamieniany z jego sąsiadam i z lewej strony, aż zostanie umieszczony na właściwym miejscu. Wynika stąd, że klasyfikacja m etod sortowania na m etody „wstawiania” , „zamieniania” , „wybierania” itd., nie zawsze jest przejrzysta. W tym punkcie omówimy cztery typy m etod sortowania, dla których operacja zamiany jest charakterystyczna: wybór przez zam ienianie („sortowanie bąbelkowe”); scalanie przez zamienianie (równoległe sortowanie Batchera); podział przez zamienianie („sortowanie szyb kie” H oare’a) oraz sortowanie pozycyjne przez zamienianie. S ortow an ie b ąb elk ow e. Pewnie najprostszy sposób sortowania przez zamie nianie polega na porównaniu K \ z K 2 i zamianie R \ i R 2 , jeśli klucze nie są uporządkowane; a następnie postąpieniu tak samo z rekordami R 2 i R 3 , R 3
SORTOWANIE PRZEZ ZAMIENIANIE
5.2.2
r— ł f
703
CN bO .2 0S)) t.H n
co bO •f-H r£> W g
O h
O h
O908 O 0 703 O O765 0 O677 O612
765 677 612 509 154 426
'S
tSI.
Ph
0 0
170
061
o°
512,
O h
O h
b)O *p0-H
0
bO
bO *1— r r-O < D N tw ■
< U tSIi
-s
tSI.
t8 j
00
O h
O h
O h
908
908
908
908
908
908
0 897 0 0 703 0
897
897
897
897
897
897
897
0 765
765
765
765
765
765
765
O765
703
703
703
703
703
703
677
677
677
677
677
677
653
653
653
653
653
653
0° 612
612
612
612
612
612
612
o,512
512
512
512
512
512
509
509
509
509
509
c,503 O
503
503
503
503
426
426
426
426
154
0C,275
275
275
154
,170
170
154
154
0 0 509 0
p
908,0°
bD O *< ^4
908
O 154 0 509 O 426 O 0 0 0 426 O 0 154 275 0 653 0 897 0 275 00 653 J 426 170 O 897 < ° 275 „5 1 2 /
653
b0 V Xi 0) N trH .
908
0
0 0 509 0 0 154 0
<0
10
b0 -1— r
J
0 512 0/
275
170 i
5 0 3
0 O509 0 A 0 O 154 0 a
426
O503 0/ j 275 '
00 154 0
426,
J
0
275
275,y
J
512 0^ 061
8503
170
170
170
170
170,
0 503
061
087
087
087
087
087
087
087
087 oc/ 061
061
061
061
061
061
061
087
503,« / 087
111
R ys. 14. Sortowanie bąbelkowe. i R ą itd. Podczas wykonywania tych operacji rekordy z dużymi kluczami m ają tendencję do przemieszczania się w prawo, a rekord z największym kluczem będzie rzeczywiście wędrował w prawo, aż w końcu znajdzie się na pozycji N . Pow tarzając powyższe postępowanie, umieścimy właściwe rekordy na pozycjach R n - i, R n - 2 itd., tak że wszystkie rekordy zostaną w końcu posortowane. Na rysunku 14 pokazano działanie tej m etody dla szesnastu kluczy 503 087 512 .. . 703. W tym przypadku wygodnie jest zapisać sortowany ciąg liczb pionowo z rekordem R n na górze i z rekordem R \ na dole. Opisana m etoda jest nazywana „sortowaniem bąbelkowym” , ponieważ przemieszczanie się elementów o dużych wartościach przypom ina ruch bąbelków powietrza w wodzie. W algo rytmie prostego wstawiania jest przeciwnie - sortowane elementy spadają na swoje właściwe poziomy. Sortowanie bąbelkowe jest także znane pod innymi, bardziej prozaicznymi nazwami, jak na przykład „wybieranie przez zamienianie” lub „propagacja” . Nietrudno zauważyć, że po każdym przebiegu przez ciąg wejściowy, wszystkie rekordy powyżej rekordu (z nim włącznie), który został zamieniony jako ostatni, znajdują się już na swoich docelowych pozycjach i nie trzeba ich brać pod uwagę w kolejnych przebiegach. Na rysunku 14 te rekordy są oddzielone od pozostałych kreskami, a same kreski wskazują, jak postępuje sortowanie. Zauważmy na przy
112
SORTOWANIE
5.2.2
kład, że po czwartym przebiegu na swoich miejscach znalazło się pięć nowych elementów. W ostatnim przebiegu żadne zamiany nie są już wykonywane. Teraz jesteśm y już gotowi sformułować sam algorytm. A lg o r y tm B (Sortowanie bąbelkowe). Rekordy i ? i , . . . , R n są przemieszczane w miejscu; po zakończeniu sortowania ich klucze znajdą się w porządku K \ < ■*■< K N. B I . [Inicjowanie BOUND] BOUND N . (BOUND jest największym numerem rekordu, dla którego nie wiadomo, czy jest na swojej docelowej pozycji. Nadanie takiej właśnie wartości początkowej oznacza, że nic jeszcze nie wiadomo). B 2 . [Pętla po j ] t <— 0. W ykonaj krok B3 dla j = 1 , 2 , . . . , BOUND-1, a następnie przejdź do kroku B4. (BOUND = 1 oznacza, że należy przejść bezpośrednio do kroku B4). B 3 . [Porównywanie/zamienianie Rj i Rj +i ] Jeśli Kj > K j + 1 , zamień Rj <-+ Rj+i i wykonaj t <— j . B 4 . [Czy była zamiana?] Jeśli t = 0, zakończ wykonywanie algorytmu. W prze ciwnym razie wykonaj BOUND <—t i wróć do kroku B2. |
R y s. 15. Sieć działań dla sortowania bąbelkowego.
P r o g r a m B (Sortowanie bąbelkowe). Podobnie jak w dotychczasowych programach z tego rozdziału przyjmujemy, że sortowane elementy znajdują się na pozycjach od INPUT+1 do INPUT+N. r l l = t; rI2 = j. 01 START ENT1N 02 1H ST 1 BOUND( 1 : 2 ) ENT21 03 ENT10 04 JMP BOUND 05 LDA INPUT,2 06 3H CMPAINPUT+1,2 07 JLE 2F 08 09 LDX INPUT+1,2 STX INPUT,2 10 11 STA INPUT+1,2 ENT10,2 12 INC21 13 2H BOUND ENTX-*,2 U JXN 3B 15 J1P IB 16 4H
1 BI. Inicjowanie BOUND. t <— N. BOUND < - t . A B2. Pętla po 7. j <— 1 . A t 0. |
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
113
A n aliza sortow an ia b ąb elk ow ego. Analiza czasu działania algorytm u B jest niezmiernie pouczająca. Przy takiej analizie należy wziąć pod uwagę trzy wielkości: liczbę przebiegów A , liczbę zamian B oraz liczbę porównań C . Jeśli klucze wejściowe są różne i w porządku losowym, możemy przyjąć, że tworzą one losową perm utację zbioru { 1 , 2 , . . . , n}. K orzystając z tablic in w ersji (punkt 5.1.1), można łatwo opisać efekt wykonania pojedynczego przebiegu w sortowa niu bąbelkowym. T w ierd zen ie I. Niech a \ <22 -.. an b ęd zie p e rm u ta c ję zbioru { 1 , 2 , . . . , n ) i niech 6162 ... bn będzie o dpow iadającą je j ta b licą inw ersji . Jeśli je d e n p rze b ie g so rto w a nia bąbelkow ego (algorytm B) zm ien ia 4 a 2 - - ■a r} w p erm u ta cję a\ a f2 ... (i'n , to o d pow iadającą tej p e rm u ta cji tablicę inw ersji b[ bf2 ... bfn o trzy m u je się z b\ 62 ... bn , zm n iejszając każdą niezerow ą w artość o 1 . D owód . Jeśli przed
występuje element większy od niego, to największy z ele mentów poprzedzających a* jest z nim zamieniany, a zatem bai jest zmniejszane 0 1. Jeśli jednak nie jest poprzedzany żadnym elementem od niego większym, to nie jest on nigdy zamieniany z elementem większym i wartością bai jest nadal 0. | Tak więc zachowanie się sortowania bąbelkowego możemy śledzić, badając ciąg tablic inwersji między przebiegami. Na przykład kolejnymi tablicam i inwersji odpowiadającymi sortowaniu z rysunku 14 są: 3 1 8 3 4 5 0 4 0 3 2 2 3 2 1 0 Przebieg 1 2 0 7 2 3 4 0 3 0 2 1 1 2 1 0 0 Przebieg 2
(1) 1 0 6 1 2 3 0 2 0 1 0 0 1 0 0 0
Przebieg 3 0 0 5 0 1 2 0 1 0 0 0 0 0 0 0 0 1tak dalej. Dla tablicy inwersji 61 62 .. . 6n , odpowiadającej wejściowej perm utacji, mamy A = 1 4 -max (61, 62, . . . , 5n),
(2 )
B ~ b\ 4 ¿>2 + *' ' + &nj C = Ci 4 C2 4 h cm,
(3) (4 )
gdzie Cj jest równe BOUND — 1 na początku j-te g o przebiegu. W odniesieniu do tablicy inwersji Cj = max {bi 4 i \ h > j - 1} - j (5)
(zobacz ćwiczenie 5). Dlatego dla przykładu ( 1 ) mamy A = 9, B = 41, C = 15 4 14 4 13 4 12 + 7 4 5 4 4 4 3 + 2 = 75. Łączny czas działania program u B, dla danych z rysunku 14, wynosi 960 jednostek. Rozkład B (ogólną liczbę inwersji w losowej perm utacji) już dobrze znamy, tak więc do analizy pozostają A i C, Prawdopodobieństwo, że A < k wynosi l/n ! razy liczba tablic inwersji o składowych > fc, tj. k n~hk\, gdzie 1 < k < n. Zatem prawdopodobieństwo,
114
SORTOWANIE
5.2.2
że wykonanych zostanie dokładnie k przebiegów wynosi Ak =
71.
{kn~kk\ — (fc — l ) n-fe+1(fc — 1 )!).
( 6)
Teraz można już obliczyć wartość oczekiwaną ]T)A;Afe. Sumując przez części, otrzymujemy Tb
1
Ję 7 I
A ave = n + 1 -
(7 )
= n + 1 - P (n ), fc=0
gdzie P (n ) jest funkcją o asymptotycznej wartości ^ 7r n / 2 ~ ~ - \ - 0 ( l / ^ / n ) (zobacz ćwiczenie 1 .2 . 1 1 .3- ( 24). W zór ( 7 ) został podany bez dowodu przez E. H. Frienda w czasopiśmie J A C M 3 (1956), 150; jego dowód podał Howard B. Dem uth [Ph.D. Thesis (Stanford University, October 1956), 64-68]. Odchylenie standardowe A badam y w ćwiczeniu 7. Ogólna liczba porównań C trochę trudniej poddaje się analizie i dlatego rozważymy tylko Cave- Dla ustalonego n niech fj( k ) będzie liczbą tablic inwersji b\ . . . bn takich, że dla 1 < i < n mamy albo < j — 1 , albo b{ + i — j < k. Wówczas f j ( k ) = (i + k V- U - l ) n~3~k dla 0 < fc < n - 7 . (8) (Zobacz ćwiczenie 8). Średnią wartością c¿ z (5 ) jest (J2 k ( f j ( k ) —f j ( k —l ) ) )/n \\ sumując przez części, a następnie względem j } dostajemy ^
=
(
"
D
-
s
£
e
0^.r
f e)
0 ^ k ^ n —j
A sym ptotyczną wartość tego wyrażenia jest trudno wyznaczyć i wrócimy do tego pod koniec punktu. Podsumowaniem analizy sortowania bąbelkowego są następujące ogranicze nia na jego czas działania (otrzym ane powyżej i poniżej): A = (min 1 , ave N — \ J ttN / 2 + 0 (1 ), max./V);
( 10)
B = (min 0, ave \ { N 2 — N ) , m ax |(iV 2 —N ));
(1 1 )
C = (min N - 1 , ave ± ( N 2 - N l n N -
{7
+ ln2 -
m ax ± ( N 2 - N ) ) .
1 )N )
+ 0 (V Ñ ), ( 12)
W każdym przypadku najm niejsza wartość pojawia się, gdy dane są już uporząd kowane, maksimum natom iast pojawia się, gdy dane są w porządku odwrotnym. Tak więc czas działania program u na maszynę MIX wynosi SA + 7B + 8 0 4- 1 = (min S N 4 - 1, ave 5.75TV2 + 0 ( N log N ), max 7.5A 2 + 0.57V 4- l) . U le p sz a n ie sortow an ia b ąb elk ow ego. Zanalizowanie sortowania bąbelkowe go kosztowało nas sporo pracy i chociaż zastosowane techniki były pouczające, wyniki rozczarowują. Okazało się, że sortowanie bąbelkowe nie jest dobre. W po równaniu z prostym wstawianiem (algorytm 5.2.1S) program na maszynę MIX jest bardziej skomplikowany i działa dwa razy dłużej!
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
908
703
o
765
: 703 <**> 765
677
O
° 765
°°703
° 677
677
° 612
612
509
509
612
o
509
908
908
908
908
908
o
897
897
897
897
897
o
765
765
765
765
765
I 703
703
703
703
703
0 677
677
677
677
677
612
653 0° oS 612
653
653
612
612
509 °q> 512
512
908
o
o
154
o
426
509 0° 154 % 426 o 509 ° 426 o 653 o 426 °
653 275
°
0 653
o
897 * 275 o
°° 509
509
5 1 2 * / 426
503
503
. 503 O512 ° 275 1 7 0 ^ 5 0 3 « / 275
° 426
426
275
275
: 897/
° 426
275 OL
897
o
908 o°°
170
oo 512
o0 512
° 154
5 0 3 « / 087
170
J
503
°° 170
170
170
170
5 0 3 * / 154
154
154
154
154
O 00 -a
0 503
O > o °o
5 1 2 * / 061 087
o
q0 512
: 275 oo 653
170 o° 06!
0 612
115
087
087
087
087
087
061
061
061
061
061
° 061
o
R y s. 16. Sortowanie mieszane.
Pewne wady sortowania bąbelkowego są łatwe do usunięcia. W przykła dzie z rysunku 14 pierwsze porównanie w przebiegu 4 jest redundantne, po dobnie jak dwa pierwsze porównania w przebiegu 5 i pierwsze trzy w prze biegach 6 i 7. Zauważmy także, że w jednym przebiegu żaden z elementów nie może się przesunąć w lewo dalej niż o jedną pozycję. Tak więc, jeśli zda rzy się, że początkowo najmniejszy element znajduje się daleko na prawo, to jesteśmy zmuszeni wykonać dużą liczbę porównań. To sugeruje, żeby stoso wać „sortowanie mieszane” , w którym przebiegi są wykonywane naprzem ien nie w przeciwnych kierunkach (zobacz rys. 16). Przy takim podejściu maleje lekko średnia liczba wykonywanych porównań. K. E. Iverson [A Programming Language (Wiley, 1962), 218-219] dokonał interesującej obserwacji odnośnie tej metody: Jeśli j jest takim indeksem, że Rj i Rj+\ nie są zamieniane ze sobą w dwóch kolejnych przebiegach, to Rj i Rj+i muszą znajdować się już na swoich docelowych pozycjach i nie m a potrzeby, żeby je porównywać w dalszej fazie działania algorytmu. Na przykład, przebiegając 4 3 2 1 8 6 9 7 5 z lewa na prawo, otrzymujemy 3 2 1 4 6 8 7 5 9 ; żadne zamiany nie nastąpiły między i ?4 a i? 5 . Gdy przebiegniemy teraz przez otrzym aną perm utację z prawa na lewo, zauważymy, że Rą jest nadal mniejsze od (nowego) R^. W nioskujemy stąd natychmiast, że Rą i i ?5 nie muszą występować w przyszłych porówna niach. Żadna z zaproponowanych poprawek nie prowadzi do algorytm u lepszego niż proste wstawianie, a wiemy już, że proste wstawianie nie jest zbyt dobre dla du żych N . Inny pomysł polega na eliminacji większości zamian. Ponieważ większość
116
5.2.2
SORTOWANIE
elementów jest przesuwana podczas zamiany o jedną pozycję w lewo, moglibyśmy uzyskać ten sam efekt, patrząc na sortowaną tablicę w inny sposób i przesuwając początek indeksowania! Jednakże otrzym any algorytm nie jest lepszy od prostego wybierania (algorytm 5.2.3S), o którym będzie mowa w dalszej części. Krótko mówiąc, wydaje się, że sortowanie bąbelkowe nie m a w sobie nic takiego, co byłoby godne polecenia, poza chwytliwą nazwą i faktem, że dostarcza ono kilku ciekawych problemów teoretycznych. R ó w n o le g ły a lg o ry tm B a tch era . Jeśli chcemy, żeby sortowanie przez zamie nianie działało w czasie krótszym niż czas rzędu 7V2, musimy porównywać pary niesąsiednich kluczy ( K ^ K j ) . W przeciwnym razie będziemy zmuszeni wykonać tyle zamian, ile jest inwersji w wyjściowej perm utacji, a średnia liczba inwersji wynosi \ { N 2 —N ). Ciekawy sposób ustalania ciągu porównań pod kątem poten cjalnych zam ian został odkryty w 1964 roku przez K. E. Batchera [zobacz Proc. A F IP S Spring Joint Computer Conference 32 (1968), 307-314]. Zaproponowana m etoda nie jest wcale oczywista i w istocie wymaga dosyć skomplikowanego dowodu poprawności. Gw arantuje ona stosunkowo niewiele porównań. Przedsta wimy dwa dowody, jeden w tym punkcie i drugi w punkcie 5.3.4.
p> 1
,Q>P
M2. Zainicjuj q , r, d ---- > M3. Pętla po i ------------ > M5. Pętla po q ------- > M6. Pętla po p 0< i< N -d i Ap = r
A
i > N —d
q=p
p= 0
V
M4. Porównaj/wymień Ri+\ iRi^d+i
R y s . 17. Algorytm M,
Sortowanie B atchera jest podobne do sortowania Shella, ale porównania są wykonywane inaczej, tak że propagacja zamian nie jest potrzebna. Dla przykładu możemy porównać tabelę 1 (poniżej) z tabelą 5.2.1-3. W metodzie Batchera mamy efekt 8-sortowania, 4-sortowania, 2-sortowania i 1-sortowania, ale porów nania są niezależne. Ponieważ algorytm Batchera polega w istocie na scalaniu posortowanych podciągów, możemy go nazywać „sortowaniem przez scalanie z zam ianam i” . A lg o r y tm M (Scalanie z zamianami). Rekordy R i , . . . , R n są przemieszczane w miejscu; po zakończeniu sortowania ich klucze będą w porządku K \ < *** < K n . Zakładamy, że N > 2. M l. [Inicjowanie p] p 2£~ 1, gdzie t — [Ig iV~| jest najm niejszą liczbą całkowitą taką, że 2£ > N. (Kroki od M 2 do M5 wykonuje się dla p = 2i_1, 2£_2, . . . , 1).
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
M 2. [Inicjowanie
2i x, r <— 0, d
117
p.
M 3.
[Pętla po i] Dla każdego i takiego, ż e O < ż < i V —d i ż A p = r, wykonaj krok M4. Potem przejdź do kroku M5. (Tutaj i A p oznacza „bitową koniunkcję” binarnych reprezentacji i oraz p ; każdy bit w wyniku jest zerem prócz przypadku, gdy zarówno z, jak i p m ają jedynki na odpowiadających tem u bitowi pozycjach. Zatem 13A21 = ( 1101)2 A ( 10101)2 = (00101)2 = 5. W tym miejscu d jest nieparzystą wielokrotnością p, a p jest potęgą 2, tak ie i A p ^ (i + d) A p. W ynika stąd, że krok 4 można wykonać w dowolnej kolejności dla wszystkich stosownych ż, a nawet jednocześnie).
M 4.
[Porównanie/zamiana Ri+i :i?i+d+i] Jeśli K i+\ > K{+d+1 , zamień rekordy Ri+i ^ 1*
M 5.
[Pętla po q] Jeśli q ^ p, wykonaj d
M 6.
[Pętla po p] (W tym miejscu perm utacja K \ K 2 . . . jest p-uporządkowana). p [p /2 j. Jeśli p > 0, przejdź z powrotem do M2. |
q — p, q +— ę/2, r
p i wróć do M3.
Tabela 1 SORTOWANIE PRZEZ SCALANIE Z ZAMIANAMI (METODA BATCHERA)
p q r d 503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 703 8 8 0 8
503 087 154 061 612 170 765 275 653 426 512 509 908 677 897 703 4 80 4 503 087 154 061 612 170 765 275 653 426 512 509 908 677 897 703 4 4 4 4 503 087 154 061 612 170 512 275 653 426 765 509 908 677 897 703 2 8 0 2
154 061 503 087 512 170 612 275 653 426 765 509 897 677 908 703 2 4 2 6 154 061 503 087 512 170 612 275 653 426 765 509 897 677 908 703 2 2 2 2
1801
154 061 503 087 512 170 612 275 653 426 765 509 897 677 908 703 W W W W W W W W 061 154 087 503 170 512 275 612 426 653 509 765 677 897 703 908
14 17 061 154 087 503 170 512 275 612 426 653 509 765 677 897 703 908 12 13 1 1 1 1
061 154 087 275 170 426 503 509 512 653 612 703 677 897 765 908 w w w w w w w 061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
118
SORTOWANIE
5.2.2
Tabela 1 ilustruje ten sposób sortowania dla N = 16. Zauważmy, że w tym algorytmie rzeczywiście najpierw sortujem y niezależnie rekordy R i, R 3, i? s ,... i R 2 , Rą , Rq ? • • • j a następnie wykonujemy kroki od M 2 do M5 dla p = 1 , żeby scalić dwa posortowane ciągi w jeden. Żeby udowodnić, że magiczny ciąg porów nań/zam ian podany w algorytmie M rzeczywiście będzie sortował każde możliwe dane wejściowe R i R 2 .. . R n, musimy tylko pokazać, że gdy p = 1, w krokach od M2 do M5 zostanie scalony każdy 2-uporządkowany ciąg wejściowy R \ R 2 . . . R n - Do tego celu możemy użyć m etody ścieżek na kratownicy z punktu 5.2.1 (zobacz rys. 11 na stronie 91); każda 2-uporządkowana perm utacja zbioru { 1 , 2 , . . . , W} od powiada jednoznacznie ścieżce na kratownicy z (0,0) do ([IV/2], [N /2\). Na rysunku 18(a) przedstawiono przykład dla N = 16 odpowiadający perm utacji 1 3 2 4 1 0 5 1 1 6 1 3 7 1 4 8 1 5 9 1 6 1 2 . Krok M3 z param etram ip = 1 , ą = 2i_1, r = 0, d = 1 polega na wykonaniu porównań (i być może zamian) R i :R 2, R3 :Rą itd. To odpowiada prostej transform acji ścieżki na kratownicy - „załamaniu” jej wzdłuż przekątnej, jeśli potrzeba, tak żeby nie przechodziła ponad przekątną. (Zobacz rys. 18(b) i dowód z ćwiczenia 10). W następnej iteracji param etram i kroku M3 są p = r = 1 d — 2ł ~ 1 — l J2t ~ 2 — 1 , . . . , 1 , w wyniku czego są wykonywane porów nania/zam iany R 2 :R 2+ci, R^iRą+ó itd. Ten krok ma także prostą interpretację geometryczną: ścieżkę załamujemy wzdłuż linii odległej o \{ d + 1) jednostek poniżej przekątnej. (Zobacz rys. 18(c) i (d)). W końcu dostajem y ścieżkę z rysunku 18(e), która odpowiada w pełni posortowanej perm utacji. To kończy „geometryczny dowód” poprawności algorytmu Batchera; moglibyśmy go nazwać sortowaniem przez załamanie!
i
(a)
(b)
(d)
(c)
\ \
\
(e)
\J N\
\
\
s
\ \
\
\ \ \
\
\
N !
\
\
\
\
N S
N
N \ N \\
R ys. 18. Geometryczna interpretacja algorytmu Batchera, N — 16. Im plem entacja algorytm u M na maszynie MIX została opisana w ćwiczeniu 12. Niestety sterowanie kolejnością wykonywania porównań jest dosyć kosztowne, co powoduje, że ten algorytm jest mniej efektywny niż inne rozważane dotych czas. M a on jednak cechę wyrównującą te braki: W szystkie porównania/zam iany z jednej iteracji z kroku M3 można wykonywać jednocześnie na komputerach lub sieciach, które umożliwiają dokonywanie obliczeń równoległych. Jeśli dopusz czamy równoległe operacje, to sortowanie wykonuje się w |[lg7V ] ([lg IV] 4 - l) krokach, co jest jedną z najszybszych, ogólnych m etod sortowania. Na przykład 1024 elementów można posortować algorytmem Batchera tylko w 55 równole głych krokach. Najbliższym konkurentem jest algorytm P ra tta (zobacz ćwicze nie 5.2.1-30), który potrzebuje albo 40, albo 73 kroków zależnie od tego, jak
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
119
liczymy - jeśli pozwolimy na wykonywanie zachodzących na siebie porównań, tak długo jak nie jest konieczne wykonywanie nachodzących na siebie zamian, algorytm P ra tta potrzebuje tylko 40 cykli porów nań/zam ian do posortowania 1024 elementów. Dalsze uwagi na ten tem at znajdziemy w punkcie 5.3.4. S o rto w a n ie sz y b k ie . Ciąg porównań w algorytmie B atchera jest znany z góry. Za każdym razem są porównywane te same pary kluczy, niezależnie od wyników wcześniejszych porównań. Generalnie tak samo jest w sortowaniu bąbelkowym, chociaż w algorytmie B wykorzystuje się w sposób ograniczony zdobytą wiedzę, żeby zmniejszyć liczbę operacji na prawym końcu sortowanego ciągu. Przej dziemy teraz do omówienia zupełnie innej strategii, w której wynik każdego porównania wykorzystuje się do wyznaczenia kluczy biorących udział w następ nym porównaniu. Taka strategia nie nadaje się do obliczeń równoległych, ale na maszynach sekwencyjnych daje dobre rezultaty. Główny pomysł omawianej m etody sortowania polega na wzięciu jednego rekordu, powiedzmy i?i, i przesunięciu go na docelową pozycję, którą powinien zająć w ciągu posortowanym, powiedzmy s. Podczas wyznaczania tej pozycji pozostałe rekordy przemieszcza się w taki sposób, żeby żaden o kluczu większym nie znajdował się na lewo od pozycji s, a żaden o kluczu mniejszym nie znajdował się na prawo od tej pozycji. W ten sposób ciąg wejściowy zostaje podzielony tak, że wejściowe zadanie sortowania redukuje się do dwóch prostszych zadań, tj. posortowania R i . . . R s_x i (niezależnie) posortowania R s+ \ . . . R n - Tak sa mo możemy postąpić z każdym podciągiem i skończyć, gdy cały ciąg zostanie posortowany. Istnieje wiele sposobów wykonania takiego podziału na dwa podciągi. Poniż szy schemat, zaproponowany przez R. Sedgewicka, wydaje się najlepszy z przy czyn, które staną się bardzjej przejrzyste, gdy zanalizujemy nasz algorytm: ko rzystamy z dwóch wskaźników i oraz j . Na początku i — 2 , a j = N . Jeśli po podzieleniu Ą ma znaleźć się w lewym podciągu (możemy się o tym dowiedzieć, porównując K i z K \) , zwiększamy i o 1 i postępujemy tak dalej, aż napotkam y rekord który należy do prawego podciągu. Podobnie zmniejszamy j o 1, aż napotkamy rekord R j należący do lewego podciągu. Jeśli i < j , zamieniamy Ri z R j i postępujemy tak samo z kolejnymi rekordami, „zapalając lont z obu końców” aż i > j . Proces podziału kończymy, zam ieniając R 3 z Ą . Rozważmy dla przykładu, co stanie się z naszym ciągiem 16 liczb: *
3
i
l
C i ą g w e jś c io w y :
[503 0 8 7 5 1 2 0 6 1 908 1 7 0 8 9 7 2 7 5 6 5 3 4 2 6 1 5 4 509 6 1 2 6 7 7 7 6 5 703]
p ie r w s z a z a m ia n a :
503 0 8 7
d r u g a z a m ia n a :
503 0 8 7 1 5 4 0 6 1 908 1 7 0 8 9 7 2 7 5 6 5 3
t r z e c i a z a m ia n a :
503 0 8 7 1 5 4 0 6 1 42 6 1 7 0 8 9 7
512 0 6 1
908 1 7 0 8 9 7 2 7 5 653 42 6
M ija n k a w s k a ź n ik ó w : 503 0 8 7 1 5 4 0 6 1 4 2 6 1 7 0 C i ą g p o p o d z ia le :
275
275
426
154
50 9 6 1 2 6 7 7 7 6 5 70 3
5 1 2 50 9 6 1 2 6 7 7 7 6 5 70 3
6 5 3 908 5 1 2 509 6 1 2 6 7 7 7 6 5 70 3
8 9 7 653 908 5 1 2 50 9 6 1 2 6 7 7 7 6 5 70 3
[275 0 8 7 1 5 4 0 6 1 4 2 6 170 ]5 0 3 [8 9 7 6 5 3 908 5 1 2 509 6 1 2 6 7 7 7 6 5 703]
T T (W celu zaznaczenia pozycji i oraz j klucze K i i K j są pogrubione).
120
5.2.2
SORTOWANIE
W tabeli 2 pokazano działanie opisywanej m etody na przykładowym ciągu, który zostaje posortowany w 11 fazach. Nawiasy kwadratowe wyznaczają pod ciągi, które należy posortować. Nawiasy podwójne wskazują aktualnie sortowany podciąg. W konkretnej implementacji aktualnie sortowany ciąg może być repre zentowany przez brzegowe wartości (i,r), a pozostałe podciągi zapamiętane na stosie par (¿*¡,7**;). Podczas podziału ciągu dłuższy podciąg jest odkładany na stos, a dalej jest przetwarzany podciąg krótszy. Postępujemy tak, aż osiągniemy trywialnie krótkie ciągi. Taka strategia gwarantuje, że na stosie nigdy nie będzie więcej niż lg A elementów (zobacz ćwiczenie 20). Opisany algorytm sortowania można by nazwać sortowaniem przez dzielenie i zamienianie. Pochodzi on od C. A. R. Hoare’a, którego interesujący artykuł [Comp. J. 5 (1962), 10-15] zawiera jeden z najbardziej wyczerpujących opisów algorytm u sortowania, jaki kiedykolwiek został opublikowany. Hoare nazwał swo ją m etodę „sortowaniem szybkim” ( quicksort) i ta nazwa nie jest niewłaściwa, ponieważ na większości komputerów obliczenia są wyjątkowo szybkie. Wszystkie porównania na danym etapie są wykonywane względem tego samego klucza, tak więc może być on pam iętany w rejestrze. Między porównaniami potrzeba zmienić tylko pojedynczy indeks. Ponadto, ilość przesunięć danych jest całkiem rozsądna. W obliczeniach z tabeli 2, na przykład, wykonywanych jest tylko 17 zamian. Tabela 2 SORTOWANIE SZYBKIE 087 087 087 087 [087 087 087 087 087 087 087 087
512 154 154 154] 154] 154 154 154 154 154 154 154
061 061 061] 170 170 170 170 170 170 170 170 170
908 426 275 275 275 275 275 275 275 275 275 275
170 170] 426 426 426 426 426 426 426 426 426 426
897 503 503 503 503 503 503 503 503 503 503 503
275 [897 [897 [897 [897 [897 [765 [677 [509 509 509 509
653 653 653 653 653 653 653 653 653 [653 [512 512
426 908 908 908 908 908 703 703 612 612 612] 612
154 512 512 512 512 512 512 512 512] 512] 653 653
509 509 509 509 509 509 509 509 677 677 677 677
612 612 612 612 612 612 612 612] 703 703 703 703
677 677 677 677 677 677 677] 765 765 765 765 765
765 765 765 765 765 765 897 897 897 897 897 897
-4 oO O
[503 [275 [170 [061 061 061 061 061 061 061 061 061
(/, r)
703] 703] 703] 703] 703] 908 908 908 908 908 908
(1,16) (1,6) (1,4) (1,3) (2,3) (8,16) (8,14) (8,13) (8,11) (9,11) (9,10) —
Stos -
(8,16) (8,16) (8,16) (8,16) -
_
—
— —
Operacje pomocnicze potrzebne do sterowania zmiennymi z, j , jak i stosem, nie są skomplikowane, ale powodują, że sortowanie szybkie nadaje się najbar dziej dla większych wartości A . Dlatego w poniższym algorytmie do sortowania krótszych podciągów zastosowano inną strategię. A lg o r y tm Q (Sortowanie szybkie). Rekordy i ? i , . . . , są przemieszczane w miejscu; po zakończeniu sortowania klucze będą w porządku K \ < *• • < K ^ . Jako pamięć pomocnicza jest potrzebny stos o co najwyżej [\g AJ elementach. W tym algorytmie wykorzystuje się procedurę podziału opisaną wcześniej, z nie wielkimi zmianami w celu uzyskania lepszej efektywności:
SORTOWANIE PRZEZ ZAMIENIANIE
5.2.2
121
a) Zakładamy istnienie pomocniczych kluczy (atrap) Ko — —oo i K n +\ — +00 takich, że K 0 < Ki < K n+ 1 dla 1 < i < N. ( 13 ) (Równość jest dozwolona). b) Podciągi o M lub mniej elementach pozostawiamy nieuporządkowane do samego końca, a następnie wykonujemy proste wstawianie dla całego ciągu w cełu uzyskania końcowego uporządkowania. T utaj M > 1 jest param e trem , który należy dobrać w sposób opisany niżej. (Ten pomysł pochodzi od R. Sedgewicka i umożliwia zaoszczędzanie pewnych operacji, które byłyby niezbędne, jeśli proste wstawianie byłoby stosowane do każdego krótkiego podciągu. W yjątkiem od tej reguły jest przypadek, w którym istotne zna czenie ma lokalność odwołań). c) Zamieniamy rekordy o takich samych kluczach, chociaż nie musimy tego robić. (Ten pomysł, pochodzący od R. C. Singletona, umożliwia szybkie wy konywanie pętli wewnętrznych i pozwala dzielić podciągi prawie po połowie w przypadku takich samych elementów; zobacz ćwiczenie 18). Q l . [Inicjowanie] Jeśli N < M, przejdź do kroku Q9. W przeciwnym razie zainicjuj stos jako pusty i wykonaj l 1, r N. Q2. [Początek nowej fazy] (Naszym celem jest teraz posortowanie podciągu Ri . . . R r; z natury samego algorytmu mamy r l + M \ K i-\ < Ki < K r+1 , dla l < i < r). W ykonaj i <— Z, j <— r - ł - 1 oraz K <— Ki. (Poniżej omawiamy alternatywny sposób wyboru K , który może okazać się lepszy). Q 3. [Porównywanie Ki\K ] (W tym miejscu Kk < K
dla l — 1 < fc < ż,
K < Kk
dla j < k < r + 1;
( 14 )
oraz l < i < j). Zwiększ i o 1; następnie powtórz ten krok, jeśli K i < K . (Ponieważ K j > K , iteracja musi zakończyć się z i < j) . Q 4. [Porównywanie K : K j \ Zmniejsz j o l ; następnie powtórz ten krok, jeśli K < K j. (Ponieważ K > K i - 1 , iteracja musi zakończyć się z j > i — 1 ). Q5. [Test i:j] (W tym miejscu zachodzi ( 14 ) z wyjątkiem k ~ i oraz fc = j; również Ki ^ K > K j oraz r > j > i - “ l > / ) . Jeśli j < i, zamień Ri Rj i przejdź do kroku Q7. Q 6 . [Zamienianie] Zamień Rą
Rj
i wróć do kroku Q3.
Q 7. [Na stos] (W tym miejscu podciąg Ą . . . Rj .. . R r został podzielony tak, że Kk < K j dla l — 1 < k < j oraz K j < Kk dla j < k < r + 1. Jeśli r —j > j — l > M, to umieść ( j +1, r) na stosie, wykonaj r j — 1 i przejdź do Q2. Jeśli j — , to umieść (l , j —1) na stosie, wykonaj l <—J + 1 i przejdź do Q 2 . (Każda para (a, b) na stosie wyznacza podciąg R a . . . R^ do posortowania w przyszłości). W przeciwnym razie, jeśli r —j > M > j —Z, to wykonaj Z <— j + 1 i przejdź do Q 2; natom iast jeśli j — l > M ^ r — j , wykonaj r <— j — 1 i przejdź do Q 2.
122
SORTOWANIE
Q 8 . [Ze stosu] Jeśli stos jest niepusty, to usuń parę wykonaj / <— V, r r f i wróć do kroku Q 2 .
5.2.2
z wierzchołka stosu,
Q 9. [Proste wstawianie] Dla j = 2 , 3, . . . , AT, jeśli K j - \ > K j , to wykonaj następujące operacje: zainicjuj AT K j, i i R j, ż <— j — 1 ; następnie wykonaj i 2i+i <— oraz z <— ż —1 raz lub więcej razy aż do chwili, gdy K %< K ; na koniec wykonaj i?*+i <— ii. (To jest algorytm 5.2.1S, zmodyfikowany zgodnie z propozycjami z ćwiczenia 5.2.1-10 i odpowiedzi 5.2.1-33. Krok Q9 m ożna pominąć, gdy M = 1 . Ostrzeżenie: końcowe proste wstawianie może naprawić błędy z kroków Q1 - Q 8 ; nie należy ufać danej implementacji tylko dlatego, że daje poprawne odpowiedzi!). | Stosowny program na maszynę MIX jest dość długi, ale niezbyt skompli kowany. W rzeczywistości duża część kodu odpowiada za krok Q7 i polega na manipulowaniu zmiennymi w bardzo prosty sposób. P r o g r a m Q (Sortowanie szybkie). Rekordy do posortowania znajdują się na pozycjach od INPUT+1 do INPUT+N; przyjmujemy, że na pozycjach INPUT i INPUT+N+1 znajdują się wartości, najm niejsza i największa, dostępne na maszy nie MIX. Stos jest pam iętany na pozycjach STACK+1, STACK+2, . . . ; w ćwiczeniu 20 podajem y dokładną liczbę pozycji, które trzeba zarezerwować na stos. rI 2 = /, rI3 = r, rI4 = i, rI5 = J, rI 6 = rozm iar stosu, rA = K = R. Zakładamy. N > M. A EQU 2 :3 Pierwsza składowa elementu na stosie. B EQU 4 :5 Druga składowa elementu na stosie. 1 01 START ENT60 Ql. Inicjowanie. Pusty stos. ENT21 1 02 Z*-l. ENT3N r <—AT. 1 03 A ENT51,3 Q2 . Zapoczątkuj nowa faze. i «—r-h 1. 04 2H A K
5.2.2 07 08 6H 09 10 11 12 3H 13 OH
H 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
4H
5H
7H
4H 1H
U 42 43
44 45 3H 46 4 7 8H 48 49 50 51 9H 52 2H 53 54 55 3H
SORTOWANIE PRZEZ ZAMIENIANIE
123
JMP OF A Do Q3 z pominięciem „i <—i + 1 LDX INPUT,4 B Q6. Zamień. ENT1INPUT,4 B MOVEINPUT,5 B STX INPUT,5 B Ri < —>R j . INC41 a -A Q3. Porównaj K i . K . i*—i + l. CMPAINPUT,4 a JG 3B Powtórz, jeśli K > Ki. a DEC51 C -C ' Q4. Porównaj K : K i . j <— j — 1 CMPAINPUT,5 c -a JL 4B C -C ' Powtórz, jeśli K < K j . ENTXO,5 B +A Q5. Test i : ?. B +A DECXO,4 JXP 6 B B +A Do Q6, jeśli j > i. A LDX INPUT,5 STX INPUT,2 A Ri «—R j . STA INPUT,5 A Rj R. A ENT40,3 Q7. Na stos. A rI4 <— r —j —M. DEC4M,5 ENT10,5 A DEC1M,2 A rll A ENTAO,4 A DECAO,1 JANN1F A Skok, jeśli r — — J1NP8F A' Do Q8, jeśli S ' + A" Skok, jeśli j —l > M —j . J4NP3F INC61 (Teraz j —l > r —j > M ) . S' ST2 STACK,6 (A) S' ENTA-1 ,5 S' STA STACK,6 (B) (Z, j —1 ) => stos. S' ENT21,5 S ' + A'" l * - j + 1 . JMP 2B S ' + A'" Do Q2. J4NP8F A -A ' Do Q8, jeśli — J1NP4B S - S ' + A'" Skok, jeśli r — — INC61 (Teraz r —j ^ j —l > M ) . S —S' ST3 STACK,6 (B) S-S' ENTA1,5 S-S' STA STACK,6 (A) S-S ' (j+ 1 , r) => stos. ENT3-1,5 S - S ' + A" r ^ j - 1. JMP 2B S - S ' + A " Do Q2. LD2 STACK,6 (A) Q8. Ze stosu. 5+1 LD3 STACK,6 (B) 5+1 DEC61 (Z, r) stos. 5+1 J6NN2B 5+1 Do Q2, jeśli stos nie był pusty. ENT52-N 1 Q9. Sortuj przez proste wstawianie. 7 «—2 LDA INPUT+N,5 K <—K j , R <—R j . N - 1 CMPAINPUT+N-1,5 N - 1 (W tej pętli, rI5 = j —N ) JGE 6F N - 1 Skok, jeśli K ^ K j ^ i . D ENT4N-1,5 i < - j - 1.
124
SORTOWANIE
56 4H 57 58 59 60 61 5H 62 6 H 63
LDX INPUT,4 STX INPUT+1,4 DEC41 CMPAINPUT,4 JL 4B STA INPUT+1,4 INC51 J5NP2B
5.2.2
E
A n a liza sortow an ia szy b k ieg o . Charakterystyki czasowe w programie Q można łatwo otrzym ać, korzystając z prawa Kirchhoffa (punkt 1.3.3) i z faktu, że wszystko, co zostaje umieszczone na stosie, jest w końcu ze stosu usuwane. Stosując prawo Kirchhoffa w Q 2 , otrzymujemy także, że A - 1 + (£ ' 4- A m) + (S - S' + A ") + S = 25 + 1 + A" + A"',
( 15 )
co daje łączny czas działania 24A + 115 + 4C + 3D + 8£ + 7N + 95 jednostek, gdzie A B C Z)
= = = =
liczba faz podziału; liczba zam ian w kroku Q 6 ; liczba porównań wykonywanych podczas podziału; liczba przypadków, w których K j ^ \ > K j , podczas prostego wstawiania (krok Q9); £ = liczba inwersji zlikwidowanych przez proste wstawianie; 5 = liczba wstawień na stos.
( 16 )
Analiza tych sześciu wielkości umożliwi nam właściwy wybór wartości M , która wyznacza „próg” między prostym wstawianiem a podziałem. Taka analiza jest szczególnie pouczająca, ponieważ omawiany algorytm jest dość złożony. W yja śnianie tej złożoności w szczególności dobrze ilustruje ważne techniki. Czytel nikom bez zacięcia m atem atycznego radzimy jednakże kontynuację lektury po równości (25 ). Tak jak w większości analiz w tym rozdziale, założymy, że sortowane klucze są różne. Ćwiczenie 18 pokazuje, że równe klucze nie wpływają istotnie na efektywność algorytm u Q, a w rzeczywistości mogą być nawet pomocne. Ponie waż w algorytmie korzysta się tylko ze względnego porządku między kluczami, można równie dobrze przyjąć, że są one po prostu liczbami { 1 , 2 , . . . , N } danymi w pewnym porządku. Analizę czasu działania sortowania szybkiego możemy przeprowadzić, bada jąc jego zachowanie się podczas pierwszej fazy podziału, po której po raz pierwszy przechodzi się do kroku Q7. Po wykonaniu podziału oba podciągi R \ oraz Rj+i R n będą losowo uporządkowane, jeśli tylko wyjściowy ciąg byl loso w y . Jest tak dlatego, ponieważ względny porządek elementów w tych podciągach nie m a wpływu na algorytm podziału. Zatem wkład do łącznego czasu działania kolejnych podziałów można wyznaczyć przez indukcję względem N. (To jest
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
125
ważna obserwacja, ponieważ pewne alternatyw ne algorytmy, które naruszają tę własność, okazały się znacząco wolniejsze; zobacz Computing Surveys 6 (1974), 287-289). Niech s będzie wartością pierwszego klucza K i i załóżmy, że dokładnie t z kluczy K U . . . , K S jest większych od s. (Pamiętajmy, że kluczami są liczby { 1 , 2 , , N }), Jeśli s ~ 1, to można łatwo zaobserwować, co dzieje się podczas pierwszej fazy podziału. Krok Q3 jest wykonywany raz, krok Q4 jest wykonywany N razy, a następnie krok Q5 prowadzi nas do Q7. Tak więc wkład pierwszej fazy w tym wypadku wynosi A — 1 , B = 0, C — N A l . Podobne, ale trochę bardziej skomplikowane rozumowanie dla s > 1 (zobacz ćwiczenie 21 ) pokazuje, że wkład pierwszej fazy do ogólnego czasu działania wynosi A = 1 , B = t, C = N + 1
dla 1 < s < N.
(1 7 )
Do tego musimy doliczyć wkłady pozostałych faz, w których są sortowane pod ciągi o odpowiednio s — 1 i N —s elementach. Jeśli założymy, że wyjściowy ciąg jest losowy, możemy napisać wzory, któ re definiują funkcje tworzące rozkładów prawdopodobieństwa dla A, R , . . . , S (zobacz ćwiczenie 22). Dla prostoty zbadamy tu ta j tylko średnie wartości tych wielkości, A n , B n , . . . , S ni jako funkcje N. Rozważmy dla przykładu średnią liczbę porównań C n , które są wykonywane podczas podziału. Gdy N < M, C m = 0. W przeciwnym przypadku, ponieważ każda wartość s jest możliwa z prawdopodobieństwem 1/N, mamy 1 N C]V — — ^ 2 5—1
+ 1 + Cs- l + C m - s )
Ck
dla N > M.
( 18 )
0^k
Podobne wzory zachodzą dla A m, B m , D m , E n , S n (zobacz ćwiczenie 23). Zależność rekurencyjną postaci •En ~ fn
2
2 _^
Xk
dla n > m
( 19 )
0^k
można rozwiązać w prosty sposób. Pierwszy krok polega na wyeliminowaniu znaku sumy. Ponieważ (n + l ) x n+1 = (n + l) /„ + i + 2 ^
x k,
O^k^n nxn = n fn + 2
x k, 0^k
więc po odjęciu stronami otrzymujemy (n + l ) x n+i - n x n = gn + 2 x n ,
gdzie gn = (n + l ) f n+ 1 - n f n .
126
5.2.2
SORTOWANIE
Teraz nasza zależność jest w dużo prostszej postaci (n + l ) x n+i = (n +
2)xn
+ gn
dla n > m.
(20)
Każdą zależność rekurencyjną w ogólnej postaci Qn
(^l)
można zredukować do zależności w postaci sumy, jeśli pomnożymy obie strony przez „czynnik upraszczający” ao a \ . . . a n-i/i>o &i *■• bn . W ten sposób otrzymu jemy 2/n+i = 2/n +
.
C „ ,
gdzie
Uo *- ■^n —1 yn = T x n, bo . . . on_i
flo • • ■ 1 cn = — ------ — gn . bo bi .. . bn
/ \ (22)
W naszym przypadku ( 20) czynnikiem upraszczającym jest po prostu n !/(n + 2)! = l / ( n + l)( n + 2), co prowadzi do prostej zależności £»±i = + (n + n H- 2 ti -|-1 (ti -j- l)( n -j- 2)
dla n > m>
(23)
wynikającej z ( 19 ). Dla przykładu, jeśli weźmiemy f n = l / n , to otrzymamy nieoczekiwany wynik x n/ ( n + l ) — xm/(m + 1 ) dla wszystkich n > m. Jeśli weźmiemy f n = n + 1 , to dostaniemy x n / ( n + 1 ) = 2/( n + 1 ) + 2 / n H
h 2/(m + 2) + x rn/{ m + 1 )
= 2 ( i i n+i - i r m+ i) + x m/ ( m + 1 ) dla wszystkich n > m. Zatem rozwiązanie ( 18 ) otrzymujemy, biorąc m = M + 1 oraz x n = 0 dla n < M ; poszukiwanym rozwiązaniem jest - (N + 1)
- 2JW
« 2 (N + 1 ) ln
+ 1) dla N > M .
(24)
W ćwiczeniu 6.2.2-8 dowodzi się, że gdy M ~ 1 , odchylenie standardowe dla C n wynosi asym ptotycznie \/(21 — 27r2)/3TV; ta wielkość jest stosunkowo m ała w porównaniu z (24). Pozostałe wielkości można wyznaczyć w podobny sposób (zobacz ćwiczenie 23); dla N > M mamy A n = 2 (7V + 1 )/( M + 2 ) — 1 , B n = 1 ( N + 1 )( 2H n+1 - 2 H m + 2 + 1 - 6 /(A f + 2)) + b
A
D n = ( N + l ) ( l - 2 H m + i / ( M + 2)), E N = l ( N + 1)M (M - 1 )/(M + 2);
= (JV + l)/( 2 M + 3 ) - l
dla N > 2 M + 1.
(25 )
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
127
Powyższe rozważania pokazują, że jest możliwe przeprowadzenie dokładnej analizy średniego czasu działania całkiem złożonego program u przy zastosowaniu technik, które wcześniej były stosowane tylko w prostszych przypadkach. Wzory ( 24) i ( 25) można wykorzystać do wyznaczenia najlepszej wartości M dla konkretnego kom putera. W przypadku maszyny MIX program Q zużywa średnio (35/3) (AT + 1)H n +i + ^ ( N + l ) f ( M ) - 34.5 jednostek czasu dla N > 2M + 1 , gdzie +
+
(* »
Naszym celem jest taki wybór M , żeby f ( M ) było najmniejsze. Proste obliczenia z użyciem kom putera pokazują, że wybór M — 9 jest najlepszy. Średni czas działania programu Q dla dużych wartości N wynosi wówczas w przybliżeniu 11.667(1V -f 1) I n N — 1.74N — 18.74 jednostek czasu. Tak więc program Q jest w średnim przypadku całkiem szybki, biorąc pod uwagę to, że wymaga bardzo mało pamięci. Ta szybkość wynika z faktu, że wewnętrzne pętle, w krokach Q3 i Q4, są wyjątkowo krótkie - na każdą składają się tylko trzy instrukcje maszyny MIX (zobacz wiersze 1 2 -1 4 i 1 5 -1 7 ). Liczba zamian w kroku Q 6 wynosi około 1/6 liczby porównań w krokach Q3 i Q4. W ten sposób zaoszczędziliśmy znacząco na czasie, nie porównując i z j w pętlach wewnętrznych. Jaki jest jednak pesymistyczny przypadek dla algorytmu Q? Czy istnieją dane wejściowe, z którym i nie może on sobie poradzić efektywnie? Odpowiedź na to pytanie wprawia nas w zakłopotanie: Jeśli wejściowy ciąg jest już uporząd kowany (K i < K 2 < • *• < iCv), każda operacja „podziału” jest bezużyteczna, ponieważ redukuje rozmiar podciągu tylko o jeden element! Tak więc w takiej sytuacji (która powinna być najłatw iejszą w sortowaniu) sortowanie szybkie wcale nie jest szybkie. W tym przypadku czas sortowania jest proporcjonalny do N 2 zamiast do N l g N . (Zobacz ćwiczenie 25). W przeciwieństwie do innych rozważanych przez nas m etod sortowania, algorytm Q lubi nieuporządkowane dane wejściowe. Hoare w swojej pracy zaproponował dwa sposoby zaradzenia takiej sytuacji, polegające na lepszym wyborze testowego klucza K , który steruje podziałem. Jeden z jego pomysłów polegał na wyborze w końcowym fragmencie kroku Q2 losowej liczby całkowitej q leżącej między l a r; w tym celu można w tym kroku zamienić instrukcję „K K ” na K <- K q,
R ^ R q,
R q ^-R i,
Rt
R.
( 27 )
(Ostatnie przypisanie „Ri i?” jest konieczne; w przeciwnym razie wykonanie kroku Q4 kończyłoby się z j = l — 1 , kiedy K b}dby najm niejszym kluczem w dzielonym podciągu). Ze wzorów (25 ) wynika, że losowy wybór liczby całko witej musi być wykonywany średnio tylko 2 (IV + 1 ) / ( M + 2) — 1 razy, tak więc dodatkowy czas potrzebny do tego celu nie jest zbyt duży. Jednakże losowanie jest dobrym zabezpieczeniem przed pesymistycznym przypadkiem. Nawet na pół
128
SORTOWANIE
5.2.2
losowy wybór ą powinien być bezpieczny. W ćwiczeniu 58 dowodzimy, że przy prawdziwie losowym q prawdopodobieństwo wykonywania więcej niż 2 0 N \ n N porównań będzie na pewno mniejsze niż 10 - 8 . Druga propozycja Hoare’a polegała na rozpatrzeniu małej próbki z ciągu wejściowego i wybraniu z niej mediany. To podejście zaadoptował R. C. Singleton [CACM 12 (1969), 185-187], który zaproponował, żeby K q było medianą z trzech wartości Ku
^L (H -r)/2jj
K r.
(28)
Po zastosowaniu procedury Singletona liczba porównań maleje z 2 N \ n N do około ^ N l n N (zobacz ćwiczenie 29). Można pokazać, że tu B ^ wynosi asymp totycznie C at/5 zamiast C jv/ 6 , tak więc m etoda z użyciem mediany powoduje lekkie zwiększenie czasu potrzebnego na przemieszczanie danych. Łączny czas działania jest jednak mniejszy w przybliżeniu o 8 procent. (Szczegółową analizę znajdziemy w ćwiczeniu 56). W pesymistycznym przypadku mamy nadal czas rzędu N 2, ale tak wolne działanie będzie występowało bardzo rzadko. W. D. Frazer i A. C. McKellar [JACM 17 (1970), 496-507] zaproponowali rozważenie dużo większej próbki składającej się z 2 k —1 rekordów, gdzie k zostaje wybrane tak, że 2 k « N / \ n N . Próbkę można posortować za pomocą zwykłego sortowania szybkiego, a następnie rozstawić jej elementy pomiędzy pozostałymi rekordami za pomocą k przebiegów przez ciąg wejściowy (dzieląc go w ten sposób na 2k podciągów ograniczonych elementami próbki). Na koniec sortuje się otrzym ane podciągi. Średnia liczba porównań wykonywanych w „sortowaniu próbkowym” jest w przybliżeniu taka sam a jak w metodzie Singletona, kiedy N jest z praktycznego zakresu, ale maleje do asymptotycznej wartości N l g N dla N 00. Pełną gwarancję czasu działania 0 ( N log N ) w pesymistycznym przypadku wraz z szybkim średnim czasem działania można dostać, łącząc sortowanie szyb kie z innymi m etodam i. Na przykład D. R. Musser [Software Practice & Exper. 27 (1997), 983-993] zaproponował związanie „głębokości podziału” z każdym elementem stosu. Jeśli stwierdzimy, że jakikolwiek podciąg był dzielony wię cej niż, powiedzmy, 2 lg N razy, możemy przerwać wykonywanie algorytmu Q i przejść do algorytmu 5.2.3H. P ętla wewnętrzna nie zmienia się, tak więc średni, łączny czas działania pozostaje prawie taki sam jak poprzednio. R obert Sedgewick zanalizował pewną liczbę wariantów optymalizacji sor towania szybkiego (A cta Informatica 7 (1977), 327-356 i C A C M 2 1 (1978), 847-857, 22 (1979), 368). Zobacz także J. L. Bentley i M. D. Mcllroy, Softwa re Practice Sz Exper. 23 (1993), 1249-1265, gdzie opisano wersję sortowania szybkiego dla biblioteki programów systemu UNIX®. W ykorzystano w tym celu dalsze 15 lat doświadczeń. Z a m ie n ia n ie p o z y c y jn e . Omówimy teraz metodę, która jest całkowicie od m ienna od m etod sortowania rozważanych do tej pory. W ykorzystuje się w niej binarną reprezentację kluczy, tak więc m a ona zastosowanie tylko na kompu terach binarnych. W tej metodzie, zam iast porównywać klucze między sobą,
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
129
patrzy się na poszczególne bity, żeby stwierdzić, czy ich wartościami są 0 lub 1 . Pod innymi względami ta m etoda m a cechy sortowania przez zamienianie i jest raczej podobna do sortowania szybkiego. Ponieważ wykorzystuje się zapis pozy cyjny przy podstawie 2 , będziemy nazywać ją „sortowaniem pozycyjnym przez zamienianie” . Algorytm sortowania pozycyjnego można opisać w przybliżeniu w następujący sposób: i) Posortuj ciąg wejściowy ze względu na jego najbardziej znaczący bit, tak żeby wszystkie klucze z wiodącym 0 znalazły się przed wszystkimi kluczami z wiodącą 1 . Takie sortowanie wykonujemy, znajdując najbardziej na lewo wysunięty klucz Ki z wiodącą 1 i najbardziej na prawo wysunięty klucz K j z wiodącym 0 . Następnie rekordy Ri i R j są zamieniane, a cały proces kontynuowany aż do chwili, gdy i > j . ii) Niech F q oznacza elementy z wiodącym bitem 0 i niech Fi oznacza pozo stałe elementy. W ykonaj sortowanie pozycyjne dla Fq (rozpoczynając teraz od drugiego bitu z lewej strony, a pom ijając najbardziej znaczący), aż Fo zostanie w pełni posortowany; następnie zrób to samo z F i . W tabeli 3 przedstawiono przykładowe działanie sortowania pozycyjnego na naszych 16 liczbach losowych, które zapisano ósemkowo. Faza 1 przedstawia wejściowy ciąg. Po zamianach względem pierwszego bitu przechodzimy do fazy 2 . W fazie 2 pierwsza grupa zostaje posortowana względem bitu 2. W fazie trzeciej uwzględniony zostaje bit 3. (Czytelnik powinien w pamięci dokonać konwersji z zapisu ósemkowego na 10-bitowy zapis binarny. Na przykład 0232 odpowiada (0 010 0 110 10 ) 2). Po dojściu do fazy 5, po posortowaniu po bicie 4, widzimy, że każda z pozostałych grup składa się tylko z pojedynczego elementu, tak więc ta część danych nie musi być więcej brana pod uwagę. Zapis ,*[0232 0252]” oznacza, że podciąg 0232 0252 oczekuje na posortowanie po bicie 4 od lewej. W tym szczególnym przypadku sortowanie po bicie 4 nic nie daje; musimy przejść do bitu 5, żeby odseparować te dwa elementy. Proces sortowania pokazany w tabeli 3 odbywa się w 32 fazach, co jest nieco większą liczbą niż w przypadku sortowania szybkiego (tabela 2). Podobnie liczba oglądnięć bitów (82) jest raczej duża. Przekonamy się jednak, że liczba oglądnięć bitów dla dużych AT jest w rzeczywistości mniejsza niż liczba porównań wykonywanych w sortowaniu szybkim, przy założeniu o równomiernym rozkła dzie kluczy. Łączna liczba zamian w tabeli 3 wynosi 17, co jest do przyjęcia. Zauważmy, że oglądanie bitów nigdy nie musi tu ta j przejść poza bit 7, chociaż sortowane są liczby 10-bitowe. Podobnie jak w sortowaniu szybkim możemy wykorzystać stos do pam iętania „informacji o granicach” oczekujących podciągów. Zamiast sortować najpierw krótszy z podciągów, jest wygodnie wędrować po prostu z lewa na prawo, ponie waż rozmiar stosu w takim przypadku nigdy nie przekroczy liczby bitów w zapisie sortowanych kluczy. W algorytmie prezentowanym poniżej element stosu (r, b) oznacza, że r jest prawą granicą podciągu oczekującego na posortowanie po bicie b; lewej granicy nie m a potrzeby pam iętać na stosie - jest ona dana niejawnie, co wynika z własności przetwarzania podciągów z lewa na prawo.
Tabela 3 SORTOWANIE POZYCYJNE Faza 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
110767 2\0767 3\0252
4[Od75 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075 0075
0127 1000 0127 0775 0127 0232 0127p[0232 0127 \0232 0127 510232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232 0127 0232
0075 1614 0252 1601 0075 0232 0252 0652 0075}3[0775 0767 0652 0252} 3[0775 0767 0652 0252}3[0775 0767 0652 0252} 3[0775 0767 0652 0252 3[0775 0767 0652 0252 0423 4[07 ć>7 0652 0252 0423 0652 5{0767 0252 0423 0652 610767 0252 0423 0652 t \0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767 0252 0423 0652 0767
0423 1215 0423}2[1215 0423] 2[1215 0423] 2[1215 0423} 2[1215 0423] 2[1215 0423}2[1215 0775}2[1215 0775}2[1215 0775}2[1215 0775}2[1215 0775 2\1215 0775 3\1215 0775 \ 1 1 4 4 0775 1000 0775 1000 0775 1000 0775 1000 0775 1000 0775 1000 0775 1000 0775 1000 0775 1000
0652 0232 0775 1601 1614 1000 1601 1614 1000 1601 1614 1000 1601 1614 1000 1601 1614 1000 1601 1614 1000 1614 1601 1000 1601 1614 1000 1601 1614 1000 1601 1614 1000 1601 1614 1000 1277 1375 1000 1000\\1375 1277 1144 \ 1 3 7 5 1277 1144 %1245 1277 1144 1215 %1277 1144 1215 1245 1144 1215 1245 1144 1215 1245 1144 1215 1245 1215 1245 1144 1215 1245 1144
1144 1144 1144
1144 1144 1144 1144 1144 1144 1144 1144 1144 1144
1245
1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245 1375 1245}3[1614 1245} 3{1614
1215 1215 1245\3\1614 12 15 }5[1375] 3{1614 1245}5[1375] 3[1614 1277 1375 3{1614 1277 1375 ±11614 1277 1375 5\1614 1277 1375 \ 1 6 1 4 1277 1375 7\1614 1277 1375 1601
1277} 1277] 1277] 1277] 1277] 1277] 1277] 1277] 1277] 1277} 1277] 1277 ] 1601] 1601 ] 1601} 1601 ] 1601] 1601 ] 1601} 1601 ] 1601} 1601} 1614
l
r
b
Stos
1 1 1 1 3 3 5 6 7 7 7 9 9 9 11 11 12 15 15 15 15 15 17
16 8 4 2 4 4 8 8 8 8 8 16 14 10 14 13 13 16 16 16 16 16
1 2 3 4 4 5 3 4 5 6 7 2 3 4 4 5 6 3 4 5 6 7
__
—
(8,3) (4,4)(8,3) (8,3) (8,3)
16,2) 16,2) 16,2) 16,2) 16,2) 16,2) 16,2) 16,2) 16,2) 16,2) —
16,3) (14,4) 16,3) 16,3) (14,5) 16,3) (14,5) 16,3)
-
W sortowaniu pozycyjnym każdy bit, który jest potrzebny do wyznaczenia końcowego uporządkowania kluczy, jest oglądany dokładnie raz.
-— —
—
—
—
—
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
131
A lg o ry tm R (Sortowanie pozycyjne). Rekordy i i i , , R n są przemieszczane w miejscu; po zakończeniu sortowania ich klucze będą w porządku K \ < • • • < K n . O każdym kluczu zakłada się, że jest nieujemną, m-bitową liczbą binarną (ai ot2 .. . a m) 2’, i-ty najbardziej znaczący bit a* w kluczu nazywamy „bitem i ”. Potrzebny jest pomocniczy stos dla co najwyżej m — 1 elementów. Ten algorytm odpowiada w zasadzie procedurze podziału pozycyjnego opisanej wcześniej; moż liwe są jego pewne usprawnienia, co opisano w tekście i ćwiczeniach poniżej. R l . [Inicjowanie] Zainicjuj stos jako pusty. W ykonaj Z<— l , r < — AT, 6 <— 1. R 2 . [Początek nowej fazy] (Naszym celem jest posortowanie podciągu R i " • R r po bicie 6 ; z natury algorytmu mamy l < r). Jeśli l = r, to przejdź do kro ku RIO (ponieważ ciąg złożony z jednego elementu jest już posortowany). W przeciwnym razie wykonaj i <— 'l, j <— r. R 3 . [Test Ki względem 1 ] Sprawdź bit b w K{. Jeśli to jest 1, przejdź do kroku R 6. R 4 . [Zwiększanie i] Zwiększ i o 1. Jeśli i < j , wróć do kroku R3; w przeciwnym razie przejdź do kroku R 8 . R 5 . [Test Kj+\ względem 0] Sprawdź bit b w K j+ 1 . Jeśli to jest 0, przejdź do kroku R7. R 6 . [Zmniejszanie j] Zmniejsz j o l . Jeśli i < j , przejdź do kroku R5; w prze ciwnym razie przejdź do kroku R 8. R 7 . [Zamienianie i?*, R j+ 1] Zamień rekordy R{ <-»• R j+ i; następnie przejdź do kroku R4. R 8 . [Specjalne przypadki] (W tym miejscu jesteśmy po fazie podziału; i = j + 1, bitem b w kluczach K i , . .. , K j jest 0, a bitem b w kluczach K i , . . . , K r jest 1). Powiększ b o i . Jeśli b > m, gdzie m jest liczbą bitów w kluczu, przejdź do kroku RIO. (W takim przypadku podciąg R i . . . R r został posortowany. Takie sprawdzenie nie jest potrzebne, gdy w ciągu wejściowym klucze są różne). W przeciwnym razie, jeśli j < l lub j = r, przejdź z powrotem do kroku R2 (wszystkie oglądane bity były równe odpowiednio 1 lub 0). W przeciwnym razie, jeśli j = Z, zwiększ Z o l i przejdź do kroku R 2 (tylko jeden bit miał wartość 0). R 9 . [Umieszczanie na stosie] W staw parę (r, b) na wierzchołek stosu; następnie wykonaj r j i przejdź do kroku R 2 . R IO . [Usuwanie ze stosu] Jeśli stos jest pusty, sortowanie jest zakończone; w prze ciwnym razie wykonaj Z <— r + 1 , usuń wierzchołek stosu ( r ', 6'), wykonaj r r', b <— bf i powróć do kroku R2. | P r o g r a m R (Sortowanie pozycyjne). W poniższym programie na maszynę MIX stosujemy te same konwencje co w programie Q. Mamy r l l = Z — r, rI2 = r, rI3 = i , rI4 = j , rI5 = m — 6, rI 6 = rozmiar stosu, z wyjątkiem pewnych instrukcji poniżej, dla których jest wygodniej zostawić rI3 = i —j lub rI4 = j — i.
132
SORTOWANIE
5.2.2
Z powodu binarnej natury sortowania pozycyjnego w tym programie wykorzy stuje się operacje SRB ( shift right A X binary ), JAE (jump A even) oraz JAO (jump A odd), które zostały zdefiniowane w punkcie 4.5.2. Zakładamy, że N > 2.
34
35 36 37 38 39 40 41 42 43 44 45
1 START ENT60 ENT11-N 1 ENT2N 1 ENT5M-1 1 JMP 1F 1 9H 5 INC61 ST2 STACK,6 (A) 5 ST5 STACK,6 (B) 5 ENN10,4 5 ENT2-1,3 5 1H ENT30,1 A A ENT40, 2 IN C 30,4 3H C' LDA INPUT,3 C' SRB 0 ,5 C' JAE 4F a C” +X 6H DEC41,3 C"+X J4N 8 F 5H INC40,3 C" LDA INPUT+1,, 4 C" SRB 0 ,5 C" JAO 6 B C" 7H LDA INPUT+1,4 B LDX INPUT,3 B STX INPUT+1.A B STA INPUT,3 B 4H DEC3-1,4 a -x c f- x J3NP3B IN C 30,4 A -X J5Z 0F 8H A DEC51 A -G ENT4-1,3 A -G DEC40,2 A -G J4Z IB A -G DEC40,1 A -G -R J4N IB A -G -R J4NZ9B A —G —L —R K INCH J1NZ1B 2H K+S ENT11,2 5+1 OH LD2 STACK,6 (A) 5 + 1 DEC10,2 5+1 LD5 STACK,6 (B) 5 + 1 5+1 DEC61 J6NN2B 5+1
R l . Inicjowanie. Pusty stos. Z «-l. r*—N. 1. Do R2 (pomiń test / = r). R 9 . Na stos.
[r I4 = j—Z]
(r, &)=> stos. rll<—l —j. r+-j. R 2 . Początek nowej fazy. j * —r. R3. Test K i względem 1 .
I-IO C II . 1 s>.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
[rI3 = i - j ]
bit jednostek z rA<—bit b z Ki. Do R4, jeśli jest nim 0. R6. Zmniejsz i. 7«—7—1 . Do R 8 , jeśli j < i . R5. Test Ki+\ wzgledem 0 .
[r I4 = j—¿] [r I4 = j—*j
bit jednostek z rA<—bit b z Kj+ 1Do R 6 , jeśli jest nim 1 . R 7 . Zamień Rr, R i ^ .
RA. Zwiększ i. i i + 1. [rI3 = i —jf] [rI3 = Z—j] Do R3, jeśli i ś : j . rI3
stos=^ (r, b). Do R2, jeśli stos był niepusty.
1
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
133
Na czas działania programu sortowania pozycyjnego m ają wpływ: A B C G K L R S X
= liczba faz, dla których l < r; = liczba zamian; — C' + C ” = liczba oglądnięć bitów; = liczba przypadków b > m w kroku R 8; = liczba przypadków 5 < m, j = / w kroku R 8 ; = liczba przypadków b < ra, j
(29 )
Z prawa Kirchhoffa mamy, że S = A — G — K — L — R; tak więc łączny czas działania wynosi 27A + 8B + 8 C — 23G — 14K — 17L — 19R — X + 13 jednostek. Pętle, w których są oglądane bity, można uczynić nieco szybszymi, jak pokazujemy w ćwiczeniu 34, ale kosztem skomplikowania programu. Można także przyśpieszyć sortowanie pozycyjne, stosując proste wstawianie, kiedy tylko r —l jest wystarczająco małe, podobnie jak zrobiliśmy w algorytmie Q. Nie będziemy jednak rozwodzić się nad tymi usprawnieniami. Żeby zanalizować czas działania sortowania pozycyjnego, dwa typy danych wejściowych narzucają się same. Możemy i) przyjąć, że N = 2m i sortowane klucze są po prostu liczbami całkowitymi 0, 1 , 2 , . . . , 2m — 1 danymi w losowym porządku lub ii) przyjąć, że m = 00 (niegraniczona precyzja) i sortowane klucze są niezależ nymi i jednostajnie rozłożonymi liczbami rzeczywistymi z przedziału [0 .. 1 ). Analiza w przypadku (i) jest stosunkowo łatwa, zatem pozostawiamy ją jako ćwiczenie dla Czytelnika (zobacz ćwiczenie 35). Przypadek (ii) jest względnie trudny, pozostawiamy go także jako ćwiczenie (zobacz ćwiczenie 38). W tabeli poniżej przedstawiamy zgrubne przybliżenia wyników tych analiz: Wielkość
Przypadek (i)
A
N
B
\N lg N
\N lg N
C
N lg N
N lg N
G 0
L
0
R
0
X
aN
0
K
S
Przypadek (ii)
-2N % (a -l)N 2N
-
¿ ( a + l)AT
(30)
Tutaj a — l / l n 2 « 1.4427. Zauważmy, że średnia liczba zamian, oglądnięć bitów i dostępów do stosu jest w zasadzie taka sam a dla obu typów danych, mimo
134
SORTOWANIE
5.2.2
że w przypadku (ii) wykonuje się około 44 procent więcej faz. Nasz program na maszynę MIX zużywa w przybliżeniu średnio 14.4 JVlniV jednostek czasu do posortowania N elementów w przypadku (ii). To można zmniejszyć do około 11.5 N i n N , stosując się do rad z ćwiczenia 34; dla program u Q odpowiadającą wielkością jest 11.7 AT ln AT i można ją zmniejszyć do około 10.6 TVln AT, stosując pomysł Singletona z m edianą z trzech wartości. Tak więc dla danych o rozkładzie jednostajnym sortowanie pozycyjne jest średnio prawie tak samo wydajne jak sortowanie szybkie. Na pewnych ma szynach sortowanie pozycyjne jest w rzeczywistości trochę szybsze niż sorto wanie szybkie. Ćwiczenie 53 pokazuje, jaki jest wpływ niejednostajnego roz kładu na spowolnianie naszego algorytmu. Jest ważne, żeby zauważyć, że ca ła nasza analiza zakłada różne klucze; sortowanie pozycyjne, takie jak zdefi niowane powyżej, nie jest zbyt wydajne w przypadku równych kluczy, ponie waż wykonywanych jest w nim wiele czasochłonnych faz, w których próbuje się rozdzielić takie same klucze, zanim b będzie > m. Jeden z możliwych do przyjęcia sposobów zaradzenia tem u został zaproponowany w odpowiedzi do ćwiczenia 40. Zarówno sortowanie pozycyjne, jak i sortowanie szybkie wykorzystują w isto cie ideę podziału. Rekordy są zamieniane miejscami aż do chwili, w której ciąg wejściowy zostanie podzielony na dwie części: podciąg lewy, w którym wszystkie klucze są < K dla pewnego K , i podciąg prawy, w którym wszystkie klucze są > K . W sortowaniu szybkim za K wybiera się jeden z kluczy wejściowych, podczas gdy w sortowaniu pozycyjnym wybiera się w istocie sztuczny klucz K , korzystając z reprezentacji binarnej. Historycznie, sortowanie pozycyjne zostało odkryte przez P. Hildebrandta, H. Isbitza, H. Risinga i J. Schwartza [JACM 6 (1959), 156-163], mniej więcej rok wcześniej niż sortowanie szybkie. Możliwe są także inne schematy dzielenia. Na przykład John M cCarthy zaproponował wzięcie K ss ^(u + v), jeśli o kluczach wiadomo, że leżą między u a v. Yihsiao Wang zaproponował wzięcie średniej z wartości trzech kluczy, takich jak w (28), jako granicy podziału. Udowodnił on, że w tym przypadku średnia liczba porów nań potrzebnych do posortowania danych losowych o rozkładzie jednostajnym wynosi asym ptotycznie 1.082N lg AT. Jeszcze jedna strategia podziału została zaproponowana przez M. H. van Em dena [CACM 13 (1970), 563-567]. Zamiast wybierać K z góry, „ba dam y” , jak dobre może być K , pam iętając historię K l = max ( K i , .. . , i ć ) oraz K n = m in( K j , ..., K r) w procesie podziału. Możemy zwiększać i aż do napot kania klucza większego od K*, następnie zmniejszać j aż do napotkania klucza mniejszego od K n, a później zamienić i/lu b zaktualizować K f i K f >Badania eksperym entalne tej m etody sortowania pokazały, że jest ona trochę wolniejsza od sortowania szybkiego. Analiza czasu działania tego algorytmu okazała się tak trudna, że dotychczas nie znaleziono stosownego teoretycznego wyjaśnienia jego zachowania. W szczególności jest tak dlatego, że podciągi powstające w wyniku podziału nie są dłużej losowe. Uogólnienie sortowania pozycyjnego na podstawy większe od 2 omawiamy w punkcie 5.2.5.
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
135
* M e to d y a s y m p to ty c z n e . Analiza algorytmów sortowania przez zamienianie prowadzi do pewnych szczególnie pouczających problemów matem atycznych, które umożliwią nam dowiedzenie się czegoś więcej o tym, jak badać asymp totyczne zachowanie się funkcji. Na przykład podczas analizy sortowania bąbel kowego zetknęliśmy się z funkcją w'- = s
£
<3‘ )
(zobacz (9)). Jaka jest jej wartość asymptotyczna? Możemy postąpić tak jak przy badaniu liczby inwolucji 5 . 1 .4- ( 4 i); przed przystąpieniem do dalszego czytania będzie pomocne przypomnienie sobie roz ważań z końca punktu 5.1.4. Przyjrzawszy się bliżej ( 31 ), widzimy, że wkład dla s — n jest większy niż dla s = n — 1 itd .; to sugeruje, żeby zastąpić s przez n — s . W rzeczywistości wkrótce odkryjemy, że najwygodniej jest zastosować podstawienia t = n —s + 1 , m = n + 1 , tak że z (3 1 ) dostajemy
Ł Wm~l = ^ .
E
E
1iT < rn
0^ r< m —i
rt_1-
(32)
Suma wewnętrzna ma dobrze znane rozwinięcie w szereg otrzymywane ze wzoru sumacyjnego Eulera, a mianowicie E
(Kr
r<_1 = T ~ l (iV<_1" 5(0 + f r ( * - 1)(Art' 2 - * « ) + ■ •• k
=
7
E
( ! ) B ^ N t ~J - 5*>)+ ° ( N t ~k)
r ¿=0 V J/
(33)
(zobacz ćwiczenie 1.2.11.2-4); zatem nasz problem redukuje się do badania sum w postaci —7 E { m - t ) \ { m - t ) H k, Ul, l^t
k > - 1.
(34)
Podobnie jak w punkcie 5.1.4 możemy pokazać, że wartość każdego składnika jest pomijalna, 0 ( e x p (-n 5) ) , gdy tylko t jest większe od ta k więc możemy wziąć t — (^(m 1/ 2^ ) i zastąpić silnie, korzystając ze wzoru aproksymacyjnego Stirlinga: (m — t) \ (m - i ) 1 ml -
1 1~ k exp( i i _ ( h + i
+ i b + ¿ i ) + o(^ 2+6e)) •
136
5.2.2
SORTOWANIE
Dlatego możemy skupić się na asymptotycznej wartości rk(m )=
e ~ ^ 2mt k ,
53
k > -1 .
(35 )
l<7 m l ^2+e są pomijalne. Niech g k ( x ) = x ke ~x2 i fk (x ) = g k ( x / y / 2m ) . Gdy k > 0 , wzór sumacyjny Eulera mówi nam, że rm
53
MO =
0^i
V o
fk (x ) dx + 5 3 0 j= l
/
(/fc'~1)(m ) - /fcJ_ 1)(0)) +
rm ^
I
= r'
=
B p ( { x } ) f l P\ x ) d x
J0
{t s ) ° { L
<36)
stąd możemy otrzym ać rozwinięcie asymptotyczne dla 77 (m), gdy k > 0, stosując w istocie te same pomysły co poprzednio. Jednak dla k = —1 ta m etoda załamuje się, ponieważ / _ i ( 0) jest niezdefiniowane; nie można po prostu przesumować od 1 do m, ponieważ końcowe składniki nie dają malejących potęg m, gdy kresem dolnym jest 1. (To jest sedno sprawy i zanim przejdziemy do dalszej lektury, powinniśmy upewnić się, że rozumiemy problem). * 2 Zeby rozwiązać ten dylem at, możemy zdefiniować g~i(x) = (e~x — l ) / x i f —i = g ~ i ( x / V 2 m ) ; wówczas / - i ( 0) = 0, a r _i ( m) można w prosty sposób otrzym ać z ]Co
[m , , ^ „ [ m e~x^ 2m - 1 , f m / 2 e~y - 1 , / f —i (z) dx = 2 / dx — / Jo Jo x J0 y f 1 e~y - 1 Jo
y
dy+
f m/2 e“ ^ Ji
dy -
m
dy
ln —
y
= - 7 - lnro + l n 2 + 0 (e~m/2), na podstawie ćwiczenia 43. Teraz mamy już dosyć faktów i wzorów, żeby dostać ostateczną odpowiedź, W n — \ m ln m + ^(7 + l n 2)m — ~ \ f 2 wm + |§ + 0(rz-1 ^2),
m = n -f 1, (37 )
co pokazano w ćwiczeniu 44. To kończy naszą analizę sortowania bąbelkowego. Do analizy sortowania pozycyjnego potrzebujem y wiedzieć, jaka jest wartość asym ptotyczna skończonej sumy
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
137
przy n —►oo. To pytanie okazuje się trudniejsze niż jakikolwiek inny asym p totyczny problem, z którym spotkaliśmy się dotychczas; podstawowe m etody polegające na rozwijaniu w szereg potęgowy, wzór sumacyjny Eulera itp. okazują się nieadekwatne. Następujący sposób postępowania został zaproponowany przez N. G. de Bruijna. Żeby uwolnić się od efektów znoszenia się dużych czynników (£) ( —l ) fc w ( 38), rozpoczynamy od zapisania naszej sumy jako szeregu nieskończonego u "
=E G ) (-^ E (¿tT =E (2^ - 2“T - 2J+n)2
m
3^1
(39)
Jeśli weźmiemy x = n / 2J , to składniki szeregu można przedstawić w postaci 2, ( l - 2 - T - 2J + » = i ( ( l - ; ) n - l + *
Dla x < n € mamy ^1 — —^
= exp ^ n ln ^1 — —^
= ex p (—x + x 2 0 (n -1 )),
(40)
a to sugeruje, żeby przybliżyć (39 ) przez = E { V e - n' 2i - V + n). &1
(4 1 )
Żeby zweryfikować to przybliżenie, weźmy Un — Tn = X n + Yn , gdzie Xn —
(2J'(1 —2_J')n —V e ~ nl 23s)
^
[składniki dla x > n e]
2J
=
^
[ponieważ 0 < 1 - 2- *7 < e -2 3]
0 (ne~n/ 2J) 1
[ponieważ jest O (logn) składników];
oraz Yn —
^ 2
=
(2J (1 - 2~j )n — 2j e~n/ 23)
[składniki dla x < n e]
3^1
E (e_n/2^ ° ( 1))
[z(4°)]-
2^ n 1- e
Nasze rozważania poniżej pokażą, że ostatnia sum a jest rzędu 0 (1 ); a stąd Un — Tn = 0 (1 ). (Zobacz ćwiczenie 47). Do tej pory nie korzystaliśmy z technik, które różnią się zasadniczo od wcześniej używanych. Jednakże zbadanie Tn wymaga nowego pomysłu opartego
138
5.2.2
SORTOWANIE
i+iAT-M
\+ iN
—|+iiV
\-iN '
- § -iN '
(a)
M + iN
■>
M -iN '
(b)
R y s. 20. Obwody, po których całkujemy w tożsamościach z funkcjami gamma.
na prostych prawach z teorii zmiennej zespolonej: Dla dowolnej dodatniej liczby x mamy e~x =
fl/2-j-ioo
1 2 iń
i
rOO
/ T ( z ) x ~ z dz — — / r(^ + J 1/2 J —00 1/2 ——¿00 200
dt.
(42)
Żeby udowodnić tę tożsamość, rozważmy drogę całkowania pokazaną na rysun ku 20(a), gdzie iV, J V ' i M są duże. W artością całki po tym obwodzie jest suma residuów wewnątrz obwodu, a mianowicie ^2
x ^ k^
0^k
(z + k)F (z) =
^ xk 0^fc
k\
Całka po górnym odcinku obwodu jest równa 0 ( / ^ \T(t + tiV)| przypadku mamy dobrze znane ograniczenie r (t + ¿i\T) = 0 ( \ t +
di) i w tym
gdy N -> 00.
[Z własnościami funkcji gamm a można zapoznać się na przykład w książ ce Erdelyi’ego, Magnusa, O berhettingera i Tricomiego, Higher Transcendental Functions 1 (New York: McGraw-Hill, 1953), C hapter 1], Dlatego całka po gór nym odcinku wynosi 0 ( e ~ n N ^2 J ^ 2 ( ^ / x e Y 1 Jest pomijalnie m ała. Podobnie zachowuje się całka po dolnym odcinku. Żeby obliczyć całkę po odcinku z lewej strony, korzystamy z faktu, iż r ( | + it — m ) = r ( ± + = P (| +
^ + u ) ... ( - 1 + \ + u) — 1 )!);
a zatem całka lewostronna wynosi 0 { x M~ l ^2/ ( M — 1)!) | r ( | + żi) | dt. Dlatego przy M, 7V, N 7 —> 00 istotna jest tylko całka prawostronna, a to dowodzi ( 4 2 ) . W rzeczywistości ( 4 2 ) pozostaje prawdziwe, jeśli zamienimy | przez dowolną liczbę dodatnią. Podobnie rozumując, można wyprowadzić wiele innych użytecznych zależ ności z funkcją gamma. Można zastąpić x ~ z przez inną funkcję z; można też
5.2.2
SORTOWANIE PRZEZ ZAMIENIANIE
139
zastąpić stałą \ przez inne wielkości. Na przykład i —
ę —3/2+ioo r ( z ) x ~ * d z = e " * - 1 + x,
/
(43)
ŻTTt J —3/2 —200
a to jest kluczowa wielkość we wzorze (41 ) na Tn : /*—3/2+2oo
1
T" = n E “
^ / r ( z ) ( n / 2j ) _ 1 _ z dz. 27T7 7-3/2-200
(44)
Sumę można wprowadzić pod znak całki, ponieważ jej zbieżność jest w ystarcza jąco dobra; mamy zatem
5 3 ( n /2T
= n" 5 3 ( 1/ 2”')i = n7 ( 21w - !)>
kiedy
> °>
ponieważ \2W\ = 2*^“ * > 1 . Dlatego n
r z/2+io° T { z ) n - l ~z ,
T" “ 2™ L
/2_, x
. , (45)
2 _1~2 — 1
i wystarczy obliczyć otrzym aną całkę. Tym razem całkujemy wzdłuż ścieżki, która sięga daleko w prawo, jak na ry sunku 20(b). Całka po górnym odcinku wynosi 0 ( n 1//2e~nNj/2 \M + iN\* di), jeśli 2lN 7^ 1, a całka po dolnym jest równie pomijalnie m ała, gdy N i N f są dużo większe niż M. Całka po prawym odcinku wynosi |T ( M + it)\ di). Dla ustalonego M, iV, N f —> oo mamy, że —Tn/ n wynosi 0 ( n -1 -M ) plus suma residuów w obszarze —3/2 < 5ft(z) < M. Czynnik T(z) m a proste bieguny w z = —1 i z = O, podczas gdy n~l ~z nie m a biegunów, a l / ( 2 - 1 ~z —1 ) m a proste bieguny, gdy z — - l - \ - 27riA:/ln2. Największą trudność przedstawia biegun podwójny w punkcie z = —1 . Możemy skorzystać ze znanej zależności r (z + 1) = e x p ( - 7 z + <(2)z 2/ 2 - <(3)z3/3 +
< ( 4 )z 4/4
------ ),
gdzie C(s) = l ~ s + 2 _s + 3-s + • • • = Hoo, żeby dostać następujące rozwinięcie, kiedy w = z + 1 jest małe:
r(z) ‘ ^ 7 )
‘
+ C t - i ) + 0(m),
n~l ~z = 1 —w ln n + O (w2),
l / ( 2 ~ l ~z - 1 ) = —u;-1/ ln 2 — \ + O {w). Residuum w z = ~1 jest współczynnikiem przy w~x w iloczynie tych trzech wzorów, czyli ^ — (Inn + 7 — l ) / l n 2. Dodając inne residua, dostajemy, że
140
SORTOWANIE
5.2.2
dla dowolnie dużego M, gdzie S(n) jest dziwną funkcją, ^
n
5R(r(—1 — 27rifc/ln2) exp(27riA;lgn)).
(4 7 )
fc^i
Zauważmy, że
^
2n
= Tjl + 1 _ i + n n n
Dlatego składnik błędu 0 ( n ~ M ) w (46 ) jest istotny; nie można go zastąpić przez zero. W ćwiczeniu 54 przedstawiamy jednak inny sposób analizy, który umożliwia uniknięcie tego rodzaju składników błędu przez wyprowadzenie dość specyficznie zbieżnego szeregu. Podsumowując, zbadaliśmy zachowanie się trudnej sumy (38): i7„ = n l g n + n
^ + < 5 ( n ) ^ + 0 ( 1 ).
(50)
Zastosowana m etoda z funkcją gamm a jest szczególnym przypadkiem ogólnej techniki transformat Mellina, które są wyjątkowo przydatne w badaniu zależności rekurencyjnych zorientowanych na zapis pozycyjny. Z innymi zastosowaniami tego podejścia można zapoznać się w ćwiczeniach 5 1 -5 3 i podrozdziale 6.3. Doskonałe wprowadzenie do transform at Mellina i ich zastosowania w analizie algorytmów przedstawili P. Flajolet, X. Gourdon i P. Dumas w Theoretical Computer Science 144 (1995), 3 -5 8 . Ć W IC ZEN IA 1 . [M20\ Niech a \ . . . an będzie permutacją zbioru {1, . . . , n} i niech ż, j będą in deksami takimi, że i < j oraz at > aj. Niech a [ . .. an będzie permutacją otrzymaną z a \ . . . an przez zamianę z aj. Czy a[ . . . afn może mieć więcej inwersji niż a\ . . . an? ► 2 . [M25] (a) Jaka jest minimalna liczba zamian potrzebna do posortowania permutacji 3 769 8145 2 ? (b) Ogólnie, dla danej permutacji tt = a \ . . . an zbioru {1, . . . , n}, niech xch(7r) będzie minimalną liczbą zamian potrzebną do posortowania n w porząd ku rosnącym. Wyraź xch( 7r) w zależności od „prostszych” charakterystyk 7i\ (Zobacz ćwiczenie 5.1.4-41, żeby zapoznać się z inną miarą nieporządku w permutacji).
3. [10] Czy algorytm B sortowania bąbelkowego jest stabilny?
SORTOWANIE PRZEZ ZAMIENIANIE
5.2.2
141
4. [M23] Jeśli w kroku B4, t = 1 , moglibyśmy natychmiast przerwać wykonywanie algorytmu B, ponieważ w następującym po nim kroku B2 nie dzieje się nic pożyteczne go. Jakie jest prawdopodobieństwo, ze t = 1 wystąpi w kroku B4 podczas sortowania losowej permutacji? 5. [M25] Niech bi 62 ... bn będzie wektorem inwersji permutacji a± <22 . . . an - Pokaż, że wartością BOUND po r przebiegach sortowania bąbelkowego jest max | bi ^ r } —r dla 0 ^ r ^ max ( 61 , , 6n). 6 . [M22] Niech a \ . . . an będzie permutacją zbioru { 1 , . . . , n} i niech a} . . . a!n będzie permutacją do niej odwrotną. Pokaż, że liczba przebiegów sortowania bąbelkowego na a \ .. . an wynosi 1 + max (ai — 1 , a'2 —2 , . . . , a!n — n).
7. [M28] Oblicz odchylenie standardowe liczby przebiegów w sortowaniu bąbelko wym i wyraź je w zależności od n i funkcji P(n). [Zobacz ( 6 ) i ( 7 )]. 8 . [M2Ą] Wyprowadź wzór ( 8 ).
9. [MĄ8\ Zanalizuj liczbę przebiegów i liczbę porównań w algorytmie koktajlowym. Uwaga: Częściowe rozwiązanie można znaleźć w ćwiczeniu 5.4.8-9. 10. [M26] Niech a\ a €2 > **• > er ^ 0. a) Niech a(N) = c (N + 1) — c(N). Udowodnij, że a(2n) = a(n) + [\g (2n)J oraz a( 2 n -h i) — a(n) + 1 ; stąd a(N) = ^
^
^ —r(e 1 — 1) + (ei + 62 + ■■■+ er).
b) Niech x(n) = a (n )—a( [n /2 j), tak że a(n) = £ ( n ) + x ( |n / 2 j)+a;(L n/ 4 J)-| .N iech y(n) = ;c(l) -f x(2) -\ h x(n) i niech z(2n) = y(2n) — a ( n ) , z(2n + 1) = y(2n + 1 ). Udowodnij, że c ( N + 1) = z ( N ) + 2 z ( [ N / 2 \ ) + 4z([iV/4J) + ***. c) Udowodnij, że y ( N ) = N + ( [AT/2 J + l)(e i — 1) —2 ei + 2. d) Teraz należy połączyć wszystko razem i podać wzór na c(Ar) wzależności od wykładników ej przy ustalonym r.
142
SORTOWANIE
5.2.2
16. [HMĄ2) Znajdź asymptotyczną wartość średniej liczby zamian wykonywanych w algorytmie Batchera zastosowanym do losowej permutacji N różnych elementów, zakładając, że N jest potęgą dwójki. ►17. [20] W którym miejscu w algorytmie Q wykorzystuje się fakt, że K q i K n +i mają wartości podane w ( 13 )? ►18. [20] Wyjaśnij działanie algorytmu Q, gdy wszystkie klucze wejściowe są takie same. Co stałoby się, gdyby w krokach Q3 i Q4 zamienić znaki „<” na „ $ ”? 19. [15] Czy algorytm Q sortowałby nadal poprawnie, gdyby zamiast stosu (ostatni wchodzi, pierwszy wychodzi) użyć kolejki (pierwszy wchodzi, pierwszy wychodzi)? 2 0 . [M20] Jaka jest największa liczba elementów, które mogą się jednocześnie znaleźć
na stosie w algorytmie Q? Odpowiedź podaj jako funkcję M i N . 21. [20] Wyjaśnij dlaczego przy różnych kluczach, w pierwszej fazie podziału, algo rytm Q wykonuje się tyle porównań i zamian, ile podano w ( 17 ), 2 2 . [M25] Niech pkN będzie prawdopodobieństwem, że wartością A z ( 16 ) jest k , gdy algorytm Q zastosowano do losowej permutacji zbioru ( 1 , 2 , . . . , AT} i niech A n ( z ) —
Y l k P kNzk będzie stosowną funkcją tworzącą. Udowodnij, że A n ( z ) = 1 dla N ^ M oraz A n (z ) = z ( J 2 1 M. Znajdź podobne zależności rekurencyjne definiujące inne rozkłady prawdopodobieństwa B n ( z ), C n (z ), D n {z ), E n ( z ), S n ( z )23. [M23] Niech A n , B n , D n , E n , S n będą średnimi wartościami odpowiadającymi wielkościom z ( 16 ), gdy jest sortowana losowa permutacja liczb { 1 , 2 , . . . , N } , Znajdź zależności rekurencyjne dla tych wielkości, analogiczne do ( 18 ), a następnie rozwiąż je, żeby otrzymać ( 25 ). 24. [M21] W algorytmie Q jest wykonywanych nieco więcej porównań niż jest to rzeczywiście potrzebne, ponieważ w kroku Q3 możemy mieć i = j , a w kroku Q4 nawet i > j . Jaka byłaby średnia liczba porównań C n , jeśli unikalibyśmy porównań dla i ^ j? 25. [M20] Załóżmy, że klucze na wejściu znajdują się w porządku 12 . . . N. Jakie są dokładne wartości A, B, C, D, E i S w analizie czasu działania programu Q? (Przyjmijmy, że IV > M). ►26. [M2Ą] Ułóż dane wejściowe, dla których program Q działa jeszcze wolniej niż dla danych z ćwiczenia 25. (Spróbuj znaleźć prawdziwie złośliwe dane). 27. [M28] (R. Sedgewick) Rozważamy najlepszy przypadek dla algorytmu Q: Znajdź permutację zbioru {1 ,2 ,. ..,2 3 } , na której posortowanie potrzeba najmniej czasu, jeśli N = 23 i M = 3. 28. [M26] Znajdź równanie rekurencyjne analogiczne do ( 20 ), które jest spełnione przez średnią liczbę porównań w modyfikacji Singletona algorytmu Q (wybieramy za s medianę z { K i , K\_(N+i)/ 2 }, K n } zamiast s = K \) . Pomiń porównania wykonane, kiedy jest obliczana wartość mediany s, 29. [HMĄO] Kontynuujemy ćwiczenie 28; znajdź asymptotyczną wartość liczby porów nań w modyfikacji Singletona. ►30. [25] (P. Shackleton) Dla kluczy wielosłowowych, w wielu metodach sortowania, proces sortowania, zbliżając się do końca, staje się coraz wolniejszy, ponieważ wyzna czenie leksykograficznego porządku między takimi samymi lub prawie takimi samymi kluczami wymaga przejrzenia wielu słów. (Zobacz ćwiczenie 5-5). Dane pojawiające się w praktyce często zawierają takie właśnie klucze, dlatego to zjawisko ma istotny wpływ na czas sortowania.
5 .2.2
SORTOWANIE PRZEZ ZAMIENIANIE
143
Wyjaśnij, jak można rozszerzyć algorytm Q, żeby uniknąć takich trudności; w pod ciągu, o którym wiadomo, że dla wszystkich kluczy pierwsze k słów ma ustalone wartości, wystarczy obejrzeć tylko słowa (k + l)-sze. ►31. [20] (C. A. R. Hoare) Przypuśćmy, że zamiast sortowania całego ciągu n elemen tów, chcemy wyznaczyć w nim m-ty element co do wielkości, poczynając od najmniej szego. Pokaż, że do tego celu można zaadoptować sortowanie szybkie, unikając wielu zbędnych obliczeń, które są konieczne w sortowaniu. 32. [MĄO] Znajdź prostą, zamkniętą postać dla Cnm - średniej liczby porównań kluczy potrzebnych do wyboru elementu m-tego co do wielkości spośród n, w metodzie „szyb kiego wyszukiwania” opisanej w ćwiczeniu 31. (Dla prostoty, niech M = 1 ; to znaczy nie zakładamy stosowania żadnych specjalnych technik dla krótkich podciągów). Jak asymptotycznie zachowuje się C(2m- i ) m, to jest średnia liczba porównań potrzebna do znalezienia mediany wśród 2m — 1 elementów za pomocą metody Hoare’a? ►33. [15] Ułóż algorytm, który przestawia liczby w tablicy w taki sposób, żeby wszyst kie liczby ujemne poprzedzały wszystkie liczby nieujemne. (Liczby w tablicy nie muszą zostać posortowane, wystarczy oddzielić liczby ujemne od nieujemnych). Liczba zamian wykonywanych przez Twój algorytm powinna być najmniejszą z możliwych. 34. [20] W jaki sposób można przyśpieszyć wykonywanie pętli, w których podgląda się bity w algorytmie sortowania pozycyjnego (kroki od R3 do R 6 )? 35. [M23] Dokonaj analizy wartości parametrów A, B, C, G, K , L } R, S i X w algo rytmie sortowania pozycyjnego zastosowanego do danych postaci (i). 36. [M27] Dla danego ciągu liczbowego (an) = eto, a \ , a2, . . . definiujemy transformatę dwumianową (dn ) = a o ,a i,a 2, . . . jak następuje:
¡.=
e
(;)
h
i v
a) Udowodnij, że (dn ) — (an). b) Znajdź transformaty ciągów ( 1 ); (n); {(^ )) dla ustalonego m; (a71) dla ustalonego a; ((^ )a n) dla ustalonych a i m. c) Załóżmy, że ciąg (xn ) spełnia równanie rekurencyjne x n = On 4- 21~n
x*
dla n ^ 2 ;
xo = x \ = ao = a\ — 0 .
fcjt2 Udowodnij, że rozwiązaniem tego równania jest 2
G>k
k^2
.
f
k ^2
( i \k
dfę 2fc_1
—
1
’
37. [M28] Wyznacz wszystkie ciągi (an) takie, że (an) = {an ) w znaczeniu z ćwicze nia 36. ►38. [M30] Wyznacz A n , B n >C n , G n , K n , R n i X n , średnie wartości parame trów z ( 29 ) dla sortowania pozycyjnego zastosowanego do danych postaci (ii). Swoją odpowiedź wyraź w zależności od N i wielkości
fc^ 2 [Wskazówka: Zobacz ćwiczenie 36].
k^2
144
SORTOWANIE
5.2.2
39. [20] Z ( 30 ) wynika, że w sortowaniu pozycyjnym zastosowanym do losowych danych wejściowych wykonywanych jest około 1.44Ar faz podziału. Udowodnij, że w sor towaniu szybkim faz podziału nigdy nie będzie więcej niż N . Wyjaśnij także, dlaczego podziały są wykonywane tak często w sortowaniu pozycyjnym. 40. [21] Wyjaśnij, w jaki sposób zmodyfikować algorytm R tak, żeby był wystarcza jąco efektywny w sortowaniu danych zawierających wiele takich samych kluczy, ►41. [30] Wymyśl dobry sposób przestawiania rekordów R i . . . R r tak, żeby podzielić je na trzy bloki spełniające warunki (i) Kk < K dla 1 ^ k < i; (ii) Kk = K dla i ^ k ^ j; (iii) K k K dla j < k ^ r. Na schemacie taki podział wygląda następująco:
>
< K i
>K
=K 1
j
r
42. [HM32] Udowodnij, że dla dowolnej liczby rzeczywistej c > 0, algorytm Q, zasto sowany do losowych danych, wykonuje nie więcej niż (c + 1)(N + 1 )H n porównań. (To górne ograniczenie jest szczególnie interesujące, gdy c wynosi na przykład N e). 43. [HM21] Udowodnij, że j ^ y ~ l {e~v — 1) d y + Rozważ lima^ o + y a~ 1]-
y ~ 1e~v dy = —7 . [Wskazówka:
44. [HM2Ą] Wyprowadź ( 37) w sposób zasugerowany w tekście. 45. [HM20] Wyjaśnij, dlaczego równość ( 43) jest prawdziwa dla x > 0. 46. [HM20] Jaka jest wartość wyrażenia (l/27vi) dodatniej liczby całkowitej s i 0 < a < s?
F ( z ) n s~z d z / ( 2 s~z — 1 ) dla
47. [HM21] Udowodnij, że J2j ^ 1(ri/2j ) e ~ ri^2J jest ograniczoną funkcją od n. 48. [HM2Ą] Podaj asymptotyczną wartość wielkości Vn zdefiniowanej w ćwiczeniu 38. Skorzystaj z metody analogicznej do tej opisanej w analizie Un w celu uzyskania składników aż do 0 ( 1 ). 49. [HM2Ą] Rozwiń do 0 ( n : ) wzór asymptotyczny ( 47) dla Un . 50. [HM2Ą] Podaj asymptotyczną wartość funkcji
- £ ( * ) ( k>2
m k~ 1 — 1 ’
gdy m jest dowolną, ustaloną liczbą większą od 1 . (Dla liczby całkowitej m większej od 2 ta wielkość pojawia się w analizie uogólnień sortowania pozycyjnego, jak i wyszukiwania za pomocą drzew opisanych w podrozdziale 6.3). ►51. [HM28] Pokaż, że do obliczenia asymptotycznej wartości szeregu rk(m) z (35 ), zamiast wzoru sumacyjnego Eulera, można wykorzystać techniki z funkcją gamma. (To daje nam jednolitą metodę badania Tk(m) dla wszystkich A;, bez korzystania z chwytów takich jak opisanych w tekście, przy wprowadzaniu g~i(x) — ( e~x2 — l) /x ) . 52. [HM35] (N. G. de Bruijn) Jak asymptotycznie zachowuje się suma
gdzie d(t) jest liczbą dzielników t? (Stąd d{ 1) = 1, d{2 ) = d( 3) = 2 , d(4) = 3, d( 5) = 2 itd. To pytanie pojawia się w związku z analizą algorytmu obchodzenia drzew, ćwiczenie 2.3.1-11). Znajdź wartość 5 n/ ( 2^) z dokładnością do składników 0 ( n ~ 1).
SORTOWANIE PRZEZ WYBIERANIE
5.2.3
145
53. [HMĄ2] Dokonaj analizy średniej liczby oglądnięć bitów i średniej liczby zamian, wykonywanych w algorytmie sortowania pozycyjnego zastosowanego do ciągu liczb binarnych o nieskończonej precyzji z przedziału [0 .. 1 ) i takich, że każdy bit jest niezależnie równy 1 z prawdopodobieństwem p. (W tekście omawiamy tylko przypadek p = 1; zastosowane metody analizy można uogólnić do dowolnego p). W szczególności należy rozważyć przypadek p = 1/ = 0.61803 . . . 54. [HM24] (S. O. Rice) Pokaż, że Un można przedstawić w postaci
TT _ / n
1
n! I dz 1 } 2ni J c z ( z - l ) . . . ( z - n ) 2 * - 1 - l '
gdzie C jest zamkniętą krzywą ciasno otaczającą punkty 2 , 3 , . . . , n. Zamieniając C na dowolnie duży okrąg, którego środek leży w środku układu współrzędnych, wyprowadź szereg zbieżny U™ ” ^ n j
— -------2 + 2 + In 2 ^
^ (R(n + 1 , -l+ifem )),
gdzie b = 27r/ln2 oraz B ( n + 1 , - 1 + ibm) = F(n 4 - 1 )F ( —1 4 - t 6m )/r (n 4 - ibm) = n ' - / I l L 0(k ~ 1 + ibm)►55. [22] Pokaż, w jaki sposób zmodyfikować program Q, tak żeby element dzielący był medianą z trzech kluczy ( 28 ), przyjmując, że M > 1. 56. [M43] Dokonaj analizy średnich wartości parametrów czasu działania algorytmu Q po jego modyfikacji z medianą z trzech kluczy, która została opisana w ćwiczeniu 55. (Zobacz ćwiczenie 29).
5.2.3. Sortowanie przez wybieranie
W innej ważnej rodzinie technik sortowania wykorzystuje się pomysł wielokrot nego wyboru. Najprostszą z m etod polegających na wybieraniu jest, być może, m etoda następująca: i) Znajdź najmniejszy klucz; przesuń odpowiadający mu rekord do obszaru wyjściowego; następnie zamień ten klucz przez wartość 00 (o której zakłada się, że jest większa od każdego z rzeczywistych kluczy). ii) Powtórz krok (i). Tym razem zostanie wybrany drugi z najmniejszych kluczy, ponieważ najmniejszy klucz został zastąpiony przez 00. iii) Powtarzaj dalej krok (i), aż zostanie wybranych N rekordów. W metodzie przez wybieranie wymaga się obecności wszystkich danych wejścio wych przed rozpoczęciem sortowania, natom iast końcowy wynik jest otrzym y wany element po elemencie. To jest w zasadzie przeciwieństwo wstawiania, gdzie dane wejściowe są pobierane pojedynczo, ale nie znamy końcowego wyniku przed zakończeniem sortowania. W kroku (i), do wyboru każdego nowego rekordu potrzeba 1 porównań, a dodatkowo niezbędne jest zarezerwowanie w pamięci oddzielnego obszaru wyj ściowego. Jednak w oczywisty sposób możemy postąpić lepiej. W ybrany rekord można przesunąć na jego właściwą, docelową pozycję, zamieniając go z rekordem, który się aktualnie na niej znajduje. Wówczas nie ma już potrzeby ponownego rozważania tej pozycji w kolejnych wyborach, a co za tym idzie, nie m a potrzeby
146
5.2.3
SORTOWANIE
używania kluczy o wartości nieskończonej. W ten sposób otrzymujemy nasz pierwszy algorytm sortowania przez wybieranie. A lg o r y tm S (Sortowanie przez proste wybieranie). Rekordy są przemieszczane w miejscu; po zakończeniu sortowania ich klucze będą w po rządku K i < < K ^ t. Sortowanie jest zgodne z m etodą opisaną powyżej, z wyjątkiem tego, że jest wygodniej wybierać najpierw element największy, potem drugi największy itd. 51 . [Pętla po j] W ykonaj kroki S 2 i S3 dla j = IV, N — 1 , . . . , 2 . 5 2 . [Znajdowanie m a x ( K i , . . . , Kj)\ W śród kluczy K j t Kj-_i, *- •, K \ znajdź ten największy; niech to będzie gdzie i jest największe możliwe. 5 3 . [Zamiana z Rj] Zamień rekordy Ri <-►R j. (Teraz rekordy R j , . . . , R n znaj dują się na swoich docelowych pozycjach). |
R ys. 2 1 . Sortowanie przez proste wybieranie. W tabeli 1 przedstawiono działanie tego algorytmu na naszych 16 przykładowych kluczach. Kandydaci na maksimum, przy przeglądaniu danych z prawa na lewo w kroku S2 , są pisani pogrubioną czcionką. Tabela 1 SORTOWANIE PRZEZ PROSTE WYBIERANIE
503 503 503 503 503 503
087 512 061 087 512 061 087 512 061 087 512 061 087 512 061 087 512 061
908 703 703 703 612 612
170 897 170 897 170 765 170 677 170 677 170 509
275 275 275 275 275 275
653 653 653 653 653 653
426 154 509 612 677 765 703 426 154 509 612 677 765| 908 426 154 509 612 677| 897 908 426 154 509 6 1 2 | 765 897 908 426 154 5 0 9 | 703 765 897 908 426 154| 677 703 765 897 908
0 6 1 1087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
Odpowiedni program w języku maszyny MIX jest dość prosty: P r o g r a m S (Sortowanie przez proste wybieranie). Tak jak w programach z po przednich punktów, rekordy znajdują się na pozycjach od INPUT+1 do INPUT+N i są sortowane w miejscu względem kluczy jednosłowowych. rA = bieżące mak simum, r l l = j — 1, rI2 = k (pozycja aktualnie oglądanego elementu), rI3 = i . Zakładamy, że IV > 2.
START ENT1 N -l 2H ENT2 0 , 1 ENT3 1 ,1 LDA INPUT,3 8H CMPA INPUT,2 JGE *+3 ENT3 0 ,2 LDA INPUT,3 DEC2 1 J2P 8B LDX INPUT+1,1 STX INPUT,3 STA INPUT+1,1 DECT 1 J1P 2B
1 N -l AT- 1 N -l A A B B A A N -l N -l N -l N -l N -l
147
SI. Pętla po 7. i <— N. S2. Znaidż m a x ( K \ , . . *
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
SORTOWANIE PRZEZ WYBIERANIE
> T
5.2.3
Skok, jeśli Kk. W przeciwnym razie i tA * - K i . k «— k — 1. Powtórz, jeśli k > 0. S3. Zamień z R , . Ri +— R j . R j i— rA. N ^ j ź 2.
|
Czas działania tego program u zależy od liczby elementów N , liczby porównań A oraz liczby zmian prawostronnego maksimum B . N ietrudno zauważyć, że a
= ( N 2) = \ w
-D,
W
niezależnie od wartości kluczy wejściowych; ta k więc tylko B jest zmienną. Pomi mo prostoty tego algorytmu, wielkość B nie poddaje się łatwo dokładnej analizie. W ćwiczeniach od 3 do 6 pokazujemy, że B = (min 0, ave ( N + 1) H n — 27V, max [A^2/ 4 J );
(2 )
w tym przypadku wartość m aksymalna okazuje się szczególnie interesująca. Od chylenie standardowe B jest rzędu N 3y/4; zobacz ćwiczenie 7. Tak więc średni czas działania program u S wynosi 2.5JV2 + 3( N + l)Hjy + 3.5N — 1 1 , czyli trochę gorzej niż w prostym wstawianiu (program 5.2.1 S). Interesujące jest porównanie algorytm u S z sortowaniem bąbelkowym (algo rytm 5.2.2B), ponieważ na sortowanie bąbelkowe można patrzeć jak na sorto wanie przez wybieranie, w którym czasami wybieranych jest więcej niż jeden element. Z tego powodu w sortowaniu bąbelkowym wykonywanych jest zazwyczaj mniej porównań niż w prostym wybieraniu, a to może wydawać się ważniejsze. W rzeczywistości jednak program 5.2.2B jest więcej niż dwukrotnie wolniejszy od programu S! Sortowanie bąbelkowe jest obarczone dużą liczbą zamian, pod czas gdy w prostym wybieraniu wykonywanych jest bardzo m ało przemieszczeń danych. D osk on alen ie p rostego w yb ieran ia. Czy istnieje jakikolwiek sposób po prawienia m etody wybierania używanej w algorytmie S? Dla przykładu weźmy poszukiwanie maksimum w kroku S 2 ; czy istnieje znacząco szybszy sposób znaj dowania maksimum? Odpowiedzią na to pytanie jest niel L em at M . K ażdy algorytm znajdowania maksimum z n elementów za pomocą porównań par elementów musi wykonać co najmniej n — 1 porównań.
148
SORTOWANIE
5.2.3
Dowód. Jeśli wykonamy mniej niż n — 1 porównań, to znajdą się co najmniej dwa takie elementy, o których nigdy nie stwierdziliśmy, że są mniejsze od innych. Nie wiemy zatem , który z tych dwóch elementów jest większy, a wobec tego nie potrafim y wskazać największego. | Tak więc każdy proces wyboru, w którym znajduje się największy element, wymaga wykonania co najm niej n — 1 porównań i moglibyśmy podejrzewać, że wszystkie m etody sortowania polegające na n kolejnych wyborach są skazane na 0 ( n 2) operacji. Szczęśliwie lem at M odnosi się tylko do pierwszego kroku wyboru; następne wybory mogą korzystać z uprzednio zebranej informacji. Dla przykładu, w ćwiczeniach 8 i 9 pokazujemy, że stosunkowo prosta zmiana w algorytmie S zmniejsza liczbę porównań o połowę. Rozważmy 16 liczb z tabeli 1; jeden ze sposobów oszczędzenia czasu wy konania powtarzających się wyborów polega na potraktowaniu tych liczb jako czterech grup po cztery elementy. Możemy wystartować od wyznaczenia maksi mum w każdej z grup, to jest odpowiednio kluczy 512, 908, 653, 765; największy z tych czterech elementów, 908, jest wówczas największym w całym ciągu. Żeby wyznaczyć drugi największy element trzeba tylko spojrzeć na 512, 653, 765 i pozostałe trzy elementy z grupy zawierającej 908; największym z {170, 897, 275} jest 897, a największym z 512, 897, 653, 765 jest 897. Podobnie, żeby wyznaczyć trzeci największy element wyznaczamy naj większy z {170, 275}, a następnie największy z 512, 275, 653, 765. Każdy wybór, poza pierwszym, zajmuje co najwyżej 5 dodatkowych porównań. Ogólnie, jeśli N jest kwadratem liczby całkowitej, to możemy podzielić ciąg wejściowy na y/~N grup po y /N elementów; każdy wybór, poza pierwszym, zaj muje co najwyżej y /N —2 porównań w każdej uprzednio utworzonej grupie plus V N - 1 porównań wśród „liderów grup” . Ta m etoda jest nazywana wybieraniem kwadratowym; jej łączny czas działania wynosi 0 ( N y / N ) , co jest istotnie lepiej niż rząd N 2. Algorytm wybierania kwadratowego został po raz pierwszy opublikowany przez E. H. Frienda [JACM 3 (1956), 152-154], który wskazał, że ten sam pomysł można uogólnić na wybory kubiczne, czwartego i wyższych stopni wy bierania. Na przykład w wybieraniu kubicznym ciąg wejściowy jest dzielony na y /N dużych grup, każda zawierająca y /N małych grup, każda zawierająca y/N rekordów; czas działania jest proporcjonalny do N y / N . Jeśli doprowadzimy nasz pomysł do samego końca, dojdziemy do tego, co Friend nazwał „wybieraniem n-tego stopnia,” a opartym na strukturze drzewa binarnego. Czas działania tej m etody jest proporcjonalny do N log N ; nazwiemy ją wybieraniem drzewowym.
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
149
W y b ieran ie drzew ow e. Zasady sortowania przez wybieranie drzewowe można łatwo zrozumieć przez analogię do turnieju tenisowego. Rozważmy dla przykładu wyniki turnieju tenisowego przedstawione na rysunku 22; w pierwszej rundzie (najniższy poziom) Kim wygrał z Sandy, a Chris pokonał* Lou, w następnej rundzie Chris pokonał Kim itd. Chris Chris Kim Kim
Pat Chris
Sandy
Chris
Lou
Pat Pat
Ray
Robin Dale
Robin
R y s. 22, Turniej tenisowy.
W turnieju z rysunku 22 m istrzem wśród ośmiu graczy jest Chris, a do wyznaczenia zwycięzcy potrzeba było 8 — 1 = 7 m eczy/porównań. P a t nie musi być w rzeczywistości drugim w kolejności najlepszym tenisistą; każda z osób pokonanych przez Chrisa, także Lou pokonany w pierwszej rundzie, może być druga w kolejności. Moglibyśmy wyznaczyć drugiego najlepszego uczestnika tu r nieju, doprowadzając do pojedynku Lou z Kim, a następnie organizując mecz zwycięzcy tego pojedynku z Pat; tylko dwa dodatkowe mecze są potrzebne do wyłonienia drugiego w kolejności najlepszego gracza, co wynika ze struktury zwycięstw w dotychczas rozegranych meczach. Ogólnie, można „zapisać” gracza z korzenia drzewa i powtórzyć turniej tak, jak gdyby ten gracz był chory i niezdolny do dobrej gry. Wówczas rzeczywisty, drugi w kolejności gracz będzie wędrował do korzenia. Ponowne wyznaczenie zwycięzców na wyższych poziomach w drzewie wymaga zmiany tylko jednej ścieżki. Wynika z tego, że do wyznaczenia drugiego w kolejności najlepszego gracza potrzeba mniej niż fig iV~| dodatkowych porównań. W ten sam sposób znajdziemy trzeciego najlepszego gracza itd.; stąd łączny czas działania takiego algorytmu sortowania przez wybieranie wynosi w przybliżeniu 7Vlog JV, jak już twierdziliśmy wyżej. Rysunek 23 ilustruje działanie sortowania przez wybieranie drzewowe na naszych 16 przykładowych liczbach. Zauważmy, że musimy wiedzieć, skąd po chodzi klucz w korzeniu, żeby móc wstawić następną oo” . Dlatego każdy węzeł rozgałęziający powinien właściwie zawierać wskaźnik lub indeks okre ślający pozycję odpowiedniego klucza zamiast jego samego. W ynika stąd, że potrzebujemy miejsca w pamięci na N rekordów wejściowych, N — 1 wskaźników oraz N rekordów wyjściowych lub wskaźników do tych rekordów. (Jeśli wyniki są zapisywane na taśmie lub dysku, to nie m a potrzeby zapamiętywania rekordów wyjściowych w pamięci operacyjnej). Należy w tym miejscu przerwać czytanie i wykonać ćwiczenie 10, ponieważ dobre zrozumienie podstawowych zasad wybierania drzewowego umożliwi wła ściwe docenianie istotnych ulepszeń, które zaraz omówimy.
150
SORTOWANIE
5.2.3 .908. 908
'765
512 503
908 512
/\
908
/\
/\
653 897
653
/\
/\
765 509
/\
677
765
/\
/\
503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 703 (a) Konfiguracja początkowa. .897. 897 ‘
‘765
512 503
897 512
/\
170
/\
653 897
/\
653
/\
765 509
/\
/\
677
765
/\
/\
503 087 512 061 -o o 170 897 275 653 426 154 509 612 677 765 703 (b) Klucz 908 został zastąpiony przez —oo, a drugi największy klucz wędruje w górę do korzenia. .512. 512'
'509
512 503
275 512
170
—oo
509 275
426
509
—oo
—oo
503 087 512 061 -o o 170 -o o 275 -o o 426 154 509 -o o -o o -o o -o o (c) Konfiguracja po wyprowadzeniu na wyjście 908, 897, 765, 703, 677, 653 i 612.
R y s. 23. Przykład sortowania przez wybieranie drzewowe.
908
512 503
/ \
—oo 087
275 061
/ \
170
/ \
653 -o o
/ \
426
/ \
703 509
/ \
677
/ \
-o o
/ \
—oo—oo —oo —oo —oo —oo —oo —oo 154 —oo 612 —oo —oo —oo
R y s. 24. Zasada awansowania w przedsiębiorstwie zastosowana do sortowania. Każdy dociera do poziomu swojej niekompetencji.
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
151
Jeden ze sposobów modyfikacji wybierania drzewowego, w zasadzie wprowa dzony przez K. E. Iversona [A Programming Language (Wiley, 1962), 223-227], unika używania wskaźników przez „wybieganie do przodu” w następujący sposób: Gdy zwycięzca meczu na najniższym poziomie drzewa wędruje do góry, zwycięską wartość na tym poziomie można natychm iast zamienić przez —oo; kiedykolwiek zwycięzca wędruje do góry z węzła rozgałęziającego, można stosowną wartość zamienić przez tę, która w końcu zajmie zwalniane miejsce (mianowicie wartość większego z dwóch kluczy poniżej). Po powtórzeniu tej operacji, tak często jak to możliwe, rysunek 23(a) zmienia się w rysunek 24. Po uzyskaniu drzewa w ten sposób możemy przystąpić do sortowania m etodą „z góry do dołu” zam iast, tak jak na rysunku 23, m etodą „z dołu do góry” : N aj pierw wyprowadzamy na wyjście korzeń, przesuwamy do góry jego największego potomka, potem przesuwamy w górę potom ka największego potom ka i tak dalej. Ten proces jest mniej podobny do turnieju tenisowego, a przypom ina raczej system awansów w przedsiębiorstwie. Powinniśmy zauważyć, że ta właśnie m etoda „z góry do dołu” umożliwia uniknięcia zbędnych porównań między —oo a —oo. (W m etodzie „z dołu do góry” —oo staje się wszechobecna w późniejszych fazach algorytmu, natom iast w metodzie „z góry do dołu” nie m a potrzeby modyfikowania poddrzewa, gdy tylko w jego korzeniu zostanie umieszczona wartość —oo). Na rysunkach 23 i 24 są przedstawione zupełne drzewa binarne o 16 li ściach (zobacz podpunkt 2.3.4.5). Takie drzewa jest wygodnie reprezentować w kolejnych lokacjach w pamięci, tak jak pokazano na rysunku 25. Zauważmy, że rodzicem węzła o numerze k jest węzeł [ k / 2J , a jego dziećmi są węzły 2k i 2 k-\- 1 . To jest jeszcze jedna dodatnia cecha m etody z góry do dołu, ponieważ często jest zdecydowanie prościej przejść z góry do dołu od węzła k do węzłów 2 k i 2 k + 1 niż od węzła k do węzłów k ® 1 i [k/2J. (Tutaj fc ® 1 oznacza k + 1lub k — 1, w zależności od tego, czy k jest parzyste, czy nieparzyste).
Rys. 25. Sekwencyjna alokacja pamięci dla zupełnego drzewa binarnego. W naszych przykładach wybierania drzewowego zakładaliśmy niejawnie, że N jest potęgą 2 . W rzeczywistości można wziąć dowolne N, ponieważ zupełne drzewo binarne daje się zbudować dla każdego N.
152
SORTOWANIE
5.2.3
Teraz jest czas, żeby postawić decydujące pytanie: Czy w metodzie z góry do dołu można w ogóle wyeliminować wartości —oo? Czy nie byłoby wspaniale, gdyby wszystkie ważne informacje z rysunku 24 znajdowały się w węzłach od 1 do 16 zupełnego drzewa binarnego, bez bezużytecznych dziur zawierających —oo? Jeśli się trochę zastanowimy, to zobaczymy, że rzeczywiście taki cel jest osiągalny. Nie tylko można wyeliminować —oo, ale można także uniknąć korzysta nia z dodatkowego obszaru wyjściowego. Ten kierunek rozumowania doprowadzi nas do ważnego algorytm u sortowania nazwanego po angielsku „heapsort” , co na polski będziemy tłum aczyli jako sortowanie przez kopcowanie. Sortowanie przez kopcowanie zostało odkryte przez J. W. J. W illiamsa [CACM 7 (1964), 347-348]. H ea p so rt —sortow an ie przez k op cow anie. Powiemy, że ciąg kluczy K \, K 2, . . . , K n jest kopcem, jeśli K u/ 2j > K j
dla 1 < [ j / 2 \ < j ^ N .
(3)
Zatem, K i > K 2, K \ > K 3, K 2 > Ką itd.; to jest dokładnie warunek, który zachodzi na rysunku 24, z którego w szczególności wynika, że największy klucz znajduje się „na szczycie kopca” , K 1 = m a x ( K i , K 2 , . . . , K N ).
(4 )
Jeśli potrafilibyśmy w jakiś sposób przekształcić ciąg wejściowy w kopiec, wów czas moglibyśmy posortować go za pomocą procedury wybierania z góry do dołu opisanej wcześniej. Efektywną metodę tworzenia kopca zaproponował R. W. Floyd [CACM 7 (1964), 701]. Załóżmy, że potrafiliśmy przekształcić ciąg wejściowy w taki sposób, że K lj/2] > K j dla l < LJ / 2J < j < N , (5 ) gdzie l > 1. (Dla początkowego ciągu danych ten warunek zachodzioczywiście dla l = \_N/2\, ponieważ żaden z indeksów j nie spełnia warunku |_7V/2J < | j / 2] < j < N). Nie jest trudno wymyślić, co zrobić, żeby przekształcić nasz ciąg do postaci, w której warunki ( 5 ) rozszerzają się na przypadek l = [ j / 2 \ ? pracując tylko w poddrzewie o korzeniu w węźle 1. Następnie można zmniejszać l o 1 , aż w końcu będzie spełniony warunek (3). Idee W illiamsa i Floyda doprowadziły do pow stania następującego, eleganckiego algorytmu, który zasługuje na uważne przestudiowanie: A lg o r y tm H (Sortowanie przez kopcowanie). Rekordy i ? i , . . . , R n są przemiesz czane w miejscu; po zakończeniu sortowania ich klucze znajdą się w porządku Ki ^ ^ K n- Najpierw ciąg wejściowy jest przekształcany tak, żeby tworzył kopiec, a następnie w pętli usuwamy wierzchołek kopca i umieszczamy go na właściwej, docelowej pozycji. Zakładamy, że N > 2. H I . [Inicjowanie] l <— [ N / 2j + 1 , r
N.
H 2 . [Zmniejszanie l lub r] Jeśli l > 1, to Z <— l — 1, ii <— R u K K i . (Jeśli l > 1 , to jesteśm y w fazie przekształcania danych wejściowych w kopiec;
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
153
z drugiej strony, jeśli 1 = 1, klucze K i K 2 ... K r tworzą właśnie kopiec). W przeciwnym przypadku R R r, K K r, R r R\ i r r — 1 ; jeśli teraz r = 1, to wykonaj R i ^ R i zakończ wykonywanie algorytmu.
H3. [Przygotowywanie do przesiewania z przesuwaniem
w górę] j
L (W tym
miejscu mamy K[ k / 2j > K k
dla l < [ k / 2 \ < k < r;
(6)
i rekordy R k znajdują się na docelowych pozycjach dla r < k < N. Kroki H 3 -H 8 nazywamy algorytmem przesiewania z przesuwaniem w górę; ich wykonanie jest równoważne wykonaniu Ri ^ R, a następnie przeorganizo waniu Ą , . . . , R r tak, żeby warunek (6 ) zachodził dla l = [ k / 2 \ ) t
H4. [Przejście w dół] ż
j ij 2j . (W następnych krokach mamy i = |_j/2]). Jeśli j < r, przejdź bezpośrednio do kroku H5; jeśli j = r, przejdź do kroku H 6 ; a jeśli j > r, przejdź do H 8.
H5. [Znajdowanie większego z dzieci] Jeśli K j < itj + i , to wykonaj j <— j + 1* H6. [Czy większy niż KI] Jeśli K > Kj , to przejdź do kroku H 8. H7. [Przesuwanie w górę] W ykonaj Ri R j i wróć z powrotem do kroku H4. H8. [Zapamiętywanie R] W ykonaj R z R. (To kończy wykonywanie algorytmu przesiewania w górę zapoczątkowanego w kroku H3). Wróć do kroku H 2 .
|
R y s. 26. Sortowanie przez kopcowanie; liniami kropkowanymi oznaczono algorytm przesiewania z przesuwaniem w górę.
Czasami, ze względu na ruch l i r , sortowanie kopcowe opisuje się jako algorytm typu Górny trójkąt reprezentuje fazę tworzenia kopca, gdy r = N, a l maleje do 1 ; dolny zaś trójkąt reprezentuje fazę wybierania, gdy ! = 1 , a r maleje do 1. Tabela 2 ilustruje działanie sortowania kopcowego na naszych 16 liczbach. (Każdy wiersz w tabeli odpowiada sytuacji na początku kroku H2, natom iast nawiasy kwadratowe wyznaczają pozycje l i r ) .
154
SORTOWANIE
5.2.3
Tabela 2 PRZYKŁAD SORTOWANIA PRZEZ KOPCOWANIE K x K 2 K 3 K ą K 5 K 6 K r K 8 K 9 K 10 K u K 12 K 1S K u K 1S K w l 503 0 8 7 5 1 2
0 6 1 908
1 7 0 8 9 7 2 7 5 [653
42 6
503 0 8 7 5 1 2
0 6 1 908
170
8 9 7 [703 6 5 3
503 0 8 7 5 1 2
0 6 1 908
1 7 0 [897 70 3 6 5 3
503 0 8 7 5 1 2 503 0 8 7 5 1 2
612
r
15 4
509
426
15 4
509
426
154
509
0 6 1 908 [612 8 9 7 70 3 6 5 3
426
154
509
170
677
76 5
275] 6 16
0 6 1 [908 6 1 2
8 9 7 70 3 6 5 3
426
154
509
170
677
765
275] 5 16
503 0 8 7 5 1 2 [703 908 6 1 2
897 275 653
426
154
509
170
677
76 5
061] 4 16
503 0 8 7 [897 70 3 908 6 1 2
765
275 653
426
154
509
170
677
512
061] 3 16
503 [908 8 9 7 70 3 426 6 1 2
765
275 653
087
154
509
170
677
512
061] 2 16
087
15 4
509
170
677
512
061] 1 16
512 ] 908
677
76 5
703] 9 16
612
677
765
275] 8 16
612
677
76 5
275] 7
[908 70 3
8 9 7 6 5 3 426 6 1 2
[897 70 3
765
6 7 7 2 7 5 50 3
087
154
509
170
061
[765 70 3
6 7 7 653 426 6 12
512
2 7 5 503
087
15 4
509
170
061] 8 9 7
[703 6 5 3 6 7 7
503 4 2 6 6 1 2
512
275 061
087
154
509
170] 7 6 5
[6 77 6 5 3 6 1 2
503 4 2 6 509 5 1 2
275 061
087
154
170] 70 3
[653 50 3 6 1 2
2 7 5 4 2 6 509 5 1 2
170 061
087
154] 6 7 7
[612 50 3 5 1 2
2 7 5 426 509
154
170 061
087] 6 5 3
50 3 509 2 7 5 426 0 8 7
154
1 7 0 061] 6 1 2 170] 5 1 2
6 12
[512
[509 50 3
154
653 426 6 12
765 275
2 7 5 426 0 8 7 0 6 1
503
897
76 5
897
70 3
76 5
897
677
70 3
76 5
897
653
677
70 3
76 5
897
653
677
70 3
76 5
897
[503 4 2 6
15 4
275
1 7 0 0 8 7 061] 509 5 1 2
6 12
653
677
70 3
76 5
897
[426 2 7 5
15 4
061
170
087] 503 509 5 1 2
6 12
653
677
70 3
76 5
897
[275
1 5 4 0 6 1 087] 426 503 509 5 1 2
6 12
653
677
70 3
76 5
897
15 4
612
653
677
70 3
76 5
897
17 0
[170 0 8 7
061] 2 7 5 426 503 509 5 1 2
1 15 1 14 908 1 13 908 1 12 908 1 11 908 1 10 908 1 9 908 1 8 908 1 7 908 1 6 908 1 5 908 1 4 908
[15 4 0 8 7 061] 17 0
2 7 5 426 503 509 5 1 2
612
653
677
703
765
897
908
[087 061] 1 5 4
2 7 5 426 503 509 5 1 2
612
6 53
677
703
76 5
897
908
P ro g ra m H
17 0
16
1 1
3
2
( S o r to w a n ie p r z e z k o p co w a n ie). R e k o r d y n a p o z y c j a c h o d IN P U T +1
d o IN P U T + N s ą s o r t o w a n e a l g o r y t m e m H . P o s z c z e g ó l n e r e j e s t r y m a j ą n a s t ę p u j ą c e
= l — 1,
p r z e z n a c z e n ie : r l l rX
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
rI2
= r — 1,
rI3
= i,
= j,
rI4
rI5
= r — j,
rA
= K = R,
= Rj. STAR T E N T1
N /2
ENT2 N - l 1H
DEC1
1
LDA
IN P U T + 1, 1
3H
ENT4 ENT5
1,1 0,2
DEC5
0,1
JMP
4F
LDX
I N P U T ,4
5H
CMPX I N P U T + 1 , 4
6F IN C 4 1 DEC5 1 JG E
9H
LDX
6H
CMPA I N P U T ,4 JG E
I N P U T ,4
8F
1 1 LiV/2j LAT/2J P P P P B +A -D B + A -D B +A -D C C C + D B +A B + A
HI. Inicjowanie. 1 r N.
\N/2\ + !
R ^ R h K ^K i. H3. Przygotuj przesiewanie, i rI5 <—
r — j.
T o H 4.
H5. Wyznacz większe dziecko. S k o k , je ś li
Kj
^
Kj+
W p r z e c iw n y m r a z ie
j
<—
r X <— R j . H6. Czy większy niż K ? T o H 8 , je ś li K ^ K j.
j
+ 1
SORTOWANIE PRZEZ WYBIERANIE
5.2.3
17 7H 18 4H 19 20 21 22 23 8H 24 2H 25 26 27 J85 29
STX ENT3 DEC5 INC4 J5P J5Z STA J1P LDA LDX STX DEC2 J2P STA
INPUT, 3 0 ,4 0 ,4 0 ,4 5B 9B INPUT,3 IB INPUT+1,2 INPUT+1 INPUT+1,2 1 3B INPUT+1
B B + P B + P B +P B +P P -A +D P P N - 1 N - 1 N - 1 iV-l iV - 1 1
155
H7. Przesuń do zóry. R { <- R ó. H4. Przejdź w dół, i <- ?. rI5 rI5 - j . Do H5, jeśli j < r. Do H6, jeśli j = r. H8. Zapamiętaj R. Ri R. H2. Zmniejsz l lub r. Jeśli / - 1, to R <- R r , K <- K r . i2r <- J?i. r <-r-l. Do H3?jeśli r > 1. R l ^ R. |
Chociaż ten program jest tylko dwa razy dłuższy od program u S, to jest dużo bardziej efektywny dla dużych N. Jego czas działania zależy od: P = N + [N/2\ — 2 , liczby faz przesiewania; A, liczby faz przesiewania, w których K na koniec ląduje w węźle wewnętrznym kopca; 5 , łącznej liczby kluczy promowanych podczas przesiewania; (7, liczby przypisań j
j + 1 w kroku H5 oraz
D , liczby zachodzenia równości j = r w kroku H4. Wielkości te analizujemy poniżej; w praktyce ich zachowanie niewiele odbiega od ich średnich wartości, A w 0.349iV,
B & N \ g N - 1.87AT,
C *±N lgN -0M N ,
D ttln N .
^
Na przykład, gdy N = 1000, cztery eksperymenty na losowych danych dały odpowiednio, A = 371, 351, 341, 340; B = 8055, 8072, 8094, 8108; C = 4056, 4087, 4017, 4083; D = 12, 14, 8 , 13. Zatem średni, łączny czas działania wynosi .
7A + 14B + 4C + 20N ~ 2 D + 15[N/2\ ~ 28,
i jest równy w przybliżeniu 167VlgiV + 0.017V jednostek. Patrząc na tabelę 2 trudno jest uwierzyć, że sortowanie przez kopcowanie jest naprawdę efektywne; duże klucze wędrują w lewo, zanim w końcu umieszczone zostaną na prawo! To jest rzeczywiście dziwny sposób sortowania dla małych N; czas sortowania 16 kluczy z tabeli 2 wynosi 1068 jednostek, podczas gdy m etoda prostego wstawiania (program 5.2.1 S) potrzebuje tylko 514 jednostek. Proste wybieranie (program S) zabiera 853 jednostek. Dla dużych N program H jest efektywniejszy. Aż się prosi o jego porów nanie z sortowaniem Shella (program 5.2.ID ) i szybkim sortowaniem (program 5.2.2Q), ponieważ wszystkie trzy programy sortują przez porównywanie kluczy i wymagają niewielkiej dodatkowej pamięci. Dla N = 1000 przybliżone średnie
156
SORTOWANIE
5.2.3
c z a s y d z i a ł a n i a t y c h p r o g r a m ó w n a m a s z y n i e M IX w y n o s z ą :
160000w dla sortowania przez kopcowanie, 13000Chi dla sortowania Shella, 80000u dla sortowania szybkiego. jest typowym komputerem, ale na poszczególnych maszynach odpowiednie wartości mogą się trochę różnić). Gdy N staje się coraz większe, sortowanie przez kopcowanie jest lepsze od sortowania Shella, ale jego asymptotyczny czas działania 1 6 N \ g N » 23.08A^ln7V nigdy nie pobije czasu działania sortowania szybkiego 11.677V In 7V. Modyfikacja sortowania kopcowego omawiana w ćwicze niu 18 przyśpiesza ten proces przez istotną redukcję liczby porównań, ale nawet to ulepszenie jest za słabe na sortowanie szybkie. Jednakże sortowanie szybkie jest efektywne tylko w przypadku średnim, a jego pesymistyczny czas działania jest rzędu N 2. Sortowanie przez kopcowanie m a tę interesującą własność, że jego pesymistyczny przypadek nie jest dużo gorszy od średniego: Zawsze mamy (M IX
A < 1.5N,
B^N[\gN\,
C < TV|_lg iVJ ,
(8)
tak więc program H nie potrzebuje więcej niż 187V[lg N \ -f 387V jednostek czasu, niezależnie od rozkładu danych wejściowych. Sortowanie przez kopcowanie jest pierwszą m etodą sortowania, jaką poznaliśmy, gwarantującą czas działania rzędu iVlogTV. Sortowanie przez scalanie, które omówimy w następnym punkcie 5.2.4, ma także tę własność, ale wymaga więcej pamięci. „ N a jw ię k szy w ch od zi, p ierw szy w y c h o d zi” . W rozdziale 2 zobaczyliśmy, że listy liniowe są często klasyfikowane w zależności od natury operacji wstawiania i usuwania, które powodują ich wydłużanie lub skracanie. Zachowanie stosu jest typu „ostatni wchodzi, pierwszy wychodzi” w znaczeniu, że zawsze jest usuwany najm łodszy element na liście, czyli ten, który został najpóźniej wstawiony. Prosta kolejka jest typu „pierwszy wchodzi, pierwszy wychodzi” w znaczeniu, że zawsze jest usuwany aktualnie najstarszy element na liście. W bardziej złożonych sytu acjach, takich jak symulacja windy z punktu 2.2.5, potrzebna jest nam lista typu „najmniejszy wchodzi, pierwszy wychodzi” , gdzie zawsze jest usuwany element o najm niejszym kluczu. Taka lista może być nazywana kolejką priorytetową, ponieważ klucz związany z elementem odzwierciedla jego względną zdolność bycia szybko usuniętym z listy. Sortowanie przez wybieranie jest szczególnym przypadkiem pewnej kolejki priorytetowej, w której po N operacjach wstawiania występuje N operacji usuwania. Kolejki priorytetowe pojaw iają się w różnorodnych zastosowaniach. Znane są na przykład numeryczne schematy iteracyjne polegające na wybieraniu w pętli elementu o największej (lub najmniejszej) wartości, zgodnie z zadanym kryte rium; param etry wybranego elementu zm ieniają się, a on sam jest ponownie wstawiany na listę z nową wartością, zależną od jego param etrów. Kolejki prio rytetowe są często wykorzystywane w systemach operacyjnych do szeregowania
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
157
zadań. W ćwiczeniach 15, 29 i 36 wspomniano inne typowe zastosowania kolejek priorytetowych, a wiele innych przykładów pojawi się w dalszych rozdziałach. W jaki sposób zaimplementować kolejkę priorytetową? Jedna z oczywistych m etod polega na utrzym ywaniu posortowanej listy, na której elementy są upo rządkowane zgodnie z ich kluczami. W stawienie nowego elementu jest wówczas w zasadzie tym samym zadaniem, z którym zetknęliśmy się przy omawianiu sortowania przez wstawianie, punkt 5.2.1. Innym, nawet bardziej oczywistym, sposobem radzenia sobie z kolejkami priorytetowym i jest pam iętanie nieuporząd kowanej listy elementów kolejki, na której znajdujem y element o największym (lub najmniejszym) kluczu, ilekroć pojaw ia się żądanie usuwania. K łopot, na jaki napotykamy w obu tych oczywistych przypadkach, polega na tym, że w każdym z nich potrzeba i l ( N) kroków albo na wstawianie, albo na usuwanie, gdzie N jest liczbą elementów na liście. Tak więc obie te m etody są bardzo czasochłonne dla dużych N . W swojej oryginalnej pracy o sortowaniu przez kopcowanie W illiams wskazał na kopce jako na idealnie nadające się w zastosowaniach wymagających dużych kolejek priorytetowych, ponieważ można wstawiać i usuwać elementy z kopca w 0 ( \o g N ) krokach; ponadto, wszystkie elementy kopca są ulokowane zwarcie i kolejno w pamięci. Faza wyboru w algorytmie H jest ciągiem kroków usuwania w procesie typu największy wchodzi, pierwszy wychodzi: Żeby usunąć największy element K \, usuwamy go, a następnie przesiewamy K N w nowym kopcu o N —1 elementach. (Jeśli chcemy mieć algorytm typu „najmniejszy wchodzi, pierwszy wychodzi” , tak jak w symulacji windy, wystarczy tylko zmienić definicję kopca, zamieniając na w (3 ); dla wygody będziemy tylko rozważać przypadek „największy wchodzi, pierwszy wychodzi” ). W ogólności, jeśli chcemy usunąć największy element, a potem wstawić nowy element x , możemy wykonać proce durę przesiewania z param etram i / = 1,
r ~ N
i
K = x.
Jeśli chcemy wstawić nowy element x bez usuwania, możemy zastosować m etodę typu z dołu do góry opisaną w ćwiczeniu 16. R ep rezen tacja dow iązaniow a kolejek p rio ry teto w y ch . Efektywny sposób reprezentacji kolejek priorytetowych za pom ocą drzew binarnych został odkry ty w 1971 roku przez Clarka A. C rane’a [Technical R eport STAN-CS-72-259 (Computer Science D epartm ent, Stanford University, 1972)]. W jego metodzie, w każdym rekordzie potrzebne są dodatkowo dwa pola na dowiązania i niewielki licznik, ale ta m etoda m a przewagę nad kopcem’ z następujących powodów: i) Gdy kolejkę priorytetową traktujem y jako stos, to zarówno operacja w sta wiania, jak i usuwania, zajmuje stały czas, niezależnie od rozm iaru kolejki. ii) Rekordy pozostają w miejscu, tylko wskaźniki ulegają zmianie. iii) Dwie rozłączne kolejki priorytetowe, łącznie o N elementach, można łatwo scalić w jedną kolejkę priorytetową, używając tylko 0 (logiV) kroków. Oryginalna m etoda C rane’a, tylko lekko zmodyfikowana, została pokazana na rysunku 27, który przedstawia pewien szczególny rodzaj drzewiastej struktury
158
5.2.3
SORTOWANIE
danych. Każdy węzeł zawiera pole KEY (klucz), pole DIST (odległość) oraz dwa pola na dowiązania LEFT (lewy) i RIGHT (prawy). Pole DIST zawiera zawsze długość najkrótszej ścieżki z danego węzła do pustego dowiązania A; innymi słowy jest to odległość z danego węzła do najbliższego pustego poddrzewa. Jeśli przyjmiemy DIST (A) — 0 oraz KEY(A) = —oo, to pola KEY i DIST w drzewie spełniają następujące warunki: KEY(P) > KEY(LEFT(P)),
KEY(P) > KEY(RIGHT(P));
(9 )
DIST(P) = 1 +m in(DIST(LEFT(P)),DIST(RIGHT(P)));
( 10)
DIST(LEFT(P)) > DIST(RIGHT(P)).
(1 1 )
Zależność (9 ) jest analogiczna do warunku kopca (3 ); gwarantuje ona, że w korze niu drzewa znajduje się największy klucz. Zależność ( 10) to właśnie definicja pól DIST opisana powyżej. Zależność ( 1 1 ) jest interesującą innowacją. W ynika z niej, że najkrótszą ścieżkę do A można zawsze otrzymać, poruszając się tylko w pra wo. Drzewo binarne o takiej własności będziemy nazywać drzewem lewicowym, ponieważ m a ono tendencję do silnego przechylania się w lewo. Jest jasne, że z tych definicji mamy, iż z DIST(P) = n wynika istnienie co najm niej 2n pustych poddrzew poniżej P; w przeciwnym przypadku istniałaby krótsza ścieżka z P do A. Stąd otrzymujemy, że w drzewie lewicowym o N węzłach skrajnie prawa ścieżka, prowadząca od korzenia w dół drzewa, zawiera co najwy żej [lg(AT+l)J węzłów. Nowy węzeł można wstawić do kolejki priorytetowej, prze chodząc po tej ścieżce (zobacz ćwiczenie 33); zatem w pesymistycznym przypad ku potrzeba tylko 0 ( \ o g N ) kroków. Najlepszy przypadek jest wtedy, kiedy drze wo jest listą liniową (wszystkie dowiązania RIGHT m ają wartość A), natom iast przypadek pesymistyczny jest wtedy, gdy drzewo jest doskonale zrównoważone. Żeby usunąć korzeń drzewa, wystarczy po prostu scalić jego dwa poddrzewa. O peracja scalania dwóch rozłącznych drzew lewicowych, wskazywanych odpo wiednio przez P i Q, jest koncepcyjnie prosta: Jeśli KEY(P) > KEY(Q), to bierzemy P jako korzeń i scalamy Q z prawym poddrzewem P; następnie uaktualniamy DIST(P) i jeśli jest taka potrzeba, zamieniamy LEFT(P) z RIGHT (P) Szczegóły tego procesu łatwo można uzupełnić (zobacz ćwiczenie 33). P o ró w n an ie różn ych tech n ik dla kolejek p riorytetow ych . Gdy liczba węzłów N jest m ała, najlepiej do implementacji kolejki priorytetowej użyć jednej z prostych m etod stosowanych dla list liniowych; jednak gdy N jest duże, metody o czasie działania log7V, takie jak kopce czy drzewa lewicowe, są oczywiście szybsze. W punkcie 6.2.3 omawiamy reprezentację list liniowych za pomocą drzew zrównoważonych, otrzym ując w ten sposób trzecią metodę działającą w czasie log AT i nadającą się do implementacji kolejek priorytetowych. Jest zatem oczy wiste, że należy porównać te trzy techniki. Zobaczyliśmy już, że operacje na drzewach lewicowych są trochę szybsze niż operacje na kopcu, chociaż kopce zużywają mniej pamięci, ponieważ nie ma w nich pól na dowiązania. Drzewa zrównoważone potrzebują tyle samo pamięci co drzewa lewicowe, a być może trochę mniej. Za to operacje na drzewach zrów noważonych są wolniejsze i trudniejsze do zaprogramowania. Z drugiej strony,
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
159
W Format węzła KEY LEFT
1DIST RIGHT
R ys. 27. Reprezentacja kolejki priorytetowej za pom ocą drzewa lewicowego. struktura drzewa zrównoważonego jest znacznie bardziej elastyczna (na wiele różnych sposobów). Kiedy posługujemy się kopcem lub drzewem lewicowym, nie możemy łatwo przewidywać, co stanie się z dwoma elementami o tych samych kluczach; nie jesteśmy w stanie zagwarantować, że elementy o tych samych kluczach będą przetwarzane zgodnie z regułą „ostatni wchodzi, pierwszy wy chodzi” lub „pierwszy wchodzi, pierwszy wychodzi” , chyba że do klucza dodamy dodatkowe pole z „numerem wstawiania” tak, żeby równe klucze w zasadzie nie istniały. Jednakże, w drzewach zrównoważonych można łatwo zapewnić przetwa rzanie takich samych kluczy w żądany sposób, a także wykonywać takie operacje jak „wstawienie x bezpośrednio przed (lub po) y ”. Drzewa zrównoważone są symetryczne, tak że w każdej chwili można usunąć największy lub najm niej szy element, podczas gdy kopce lub drzewa lewicowe muszą być zorientowane w jedną lub drugą stronę. (Zobacz jednak ćwiczenie 31, żeby dowiedzieć się, w jaki sposób konstruować kopce symetryczne). Drzewa zrównoważone m ają zastosowanie do wyszukiwania, jak i sortowania; z drzew zrównoważonych można także dość szybko usuwać bloki kolejnych elementów. Jednakże do scalenia dwóch drzew zrównoważonych potrzeba w ogólności Q( N) kroków, podczas gdy drzewa lewicowe można scalić w tylko O (log AT) krokach. Podsumowując, kopce m ają minimalne wymagania pamięciowe; drzewa le wicowe są doskonałe do scalania rozłącznych kolejek priorytetowych; jeżeli ist nieje taka potrzeba, można, przy rozsądnych kosztach, skorzystać z elastyczności drzew zrównoważonych.
160
SORTOWANIE
5.2.3
/ q \ Od czasu pionierskich prac Williamsa i Crane a odkryto wiele nowych sposoJL bów implementacji kolejek priorytetowych. Programiści mogą teraz brać pod rozwagę szeroką gamę możliwości poza listami, kopcami, drzewami lewicowymi czy drzewami zrównoważonymi: • drzewa warstwowe, które umożliwiają wykonywanie symetrycznych operacji na kolejce priorytetowej w tylko O (loglogM ) krokach, kiedy wszystkie klu cze pochodzą z zadanego zakresu 0 < K < M [P. van Emde Boas, R. Kaas, E. Zijlstra, Math. Systems Theory 10 (1977), 99-127]; • kolejki dwumianowe [J. Vuillemin, C A C M 21 (1978), 309-315; M. R. Brown, SICO M P 7 (1978), 298-319]; • pagody [J. Franęon, G. Viennot, J. Vuillemin, FOCS 19 (1978), 1 -7 ]; • kopce sparowane [M. L. Fredman, R. Sedgewick, D. D. Sleator, R. E. Tarjan, Algorithmica 1 (1986), 111-129; J. T. Stasko, J. S. V itter, CACM 30 (1987), 234-249]; • kopce pochyłe [D. D. Sleator, R. E. Tarjan, SICOM P 15 (1986), 52-59]; • kopce Fibonacciego [M. L. Fredman, R. E. Tarjan, J A C M 34 (1987), 596-615] i ogólniejsze AF-kopce [M. L. Fredman, D. E. W illard, J. Computer and System Sci. 48 (1994), 533-551]; • kolejki kalendarzowe [R. Brown, C A C M 31 (1988), 1220-1227; G. A. Da vison, C A C M 32 (1989), 1241-1243]; • kopce rozluźnione [J. R. Driscoll, H. N. Gabow, R. Shrairman, R. E. Tarjan, C A C M 31 (1988), 1343-1354]; • kolejka Fishspear [M. J. Fischer, M. S. Paterson, JA C M 41 (1994), 3-30]; • kolejki gorące [B. V. Cherkassky, A. V. Goldberg, C. Silverstein, SICOMP 28 (1997), 1326-1346] itd. Nie wszystkie z tych metod przeżyją próbę czasu; drzewa lewicowe ju ż się właściwie zdezaktualizowały, z wyjątkiem zastosowań o siłnej tendencji do zachowania się typu „pierwszy wchodzi, pierwszy wychodzi”. Szczegółowe imple mentacje i opisy kolejek dwumianowych i kopców Fibonacciego można znaleźć w książce D. E. Knutha, The Stanford GraphBase (New York: A C M Press, 1994), 475-489. *A n a liza sortow an ia przez kop cow anie. Algorytm H jest dość skompliko wany tak, że prawdopodobnie nie podda się on nigdy pełnej matematycznej analizie; jednak kilka jego własności można odkryć bez większych trudności. Dlatego zakończymy ten punkt zbadaniem pewnych „anatomicznych” szczegółów kopca. Na rysunku 28 jest przedstawiony kształt kopca o 26 elementach; każdy węzeł ma etykietę binarną odpowiadającą jego numerowi w kopcu. Gwiazdkami zaznaczono specjalne węzły leżące na ścieżce od 1 do N. Jednym z najważniejszych atrybutów kopca jest zbiór rozmiarów jego poddrzew. Dla przykładu, rozmiarami poddrzew z rysunku 28 o korzeniach 1 , 2 , . . . , 26 są odpowiednio, 26*, 15,10*, 7, 7, 6 *, 3, 3, 3, 3, 3, 3, 2*, 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 * .
( 12 )
SORTOWANIE PRZEZ WYBIERANIE
5.2.3
161
R y s. 28. Tak wygląda kopiec złożony z 26 = (11010)2 elementów.
Gwiazdki oznaczają specjalne poddrzewa, o korzeniach w specjalnych węzłach; w ćwiczeniu 20 pokazujemy, że jeśli binarną reprezentacją N jest N = ( M n - i •••6160)2,
n=[lgN\,
(1 3 )
to rozmiarami specjalnych poddrzew są zawsze (l&ra-l • • • ^ 1 ^0) 2 , (l&n-2 • • • &l&o)2, • • • , (16l6o)2) (l^o) 2, ( 1 ) 2-
(l4)
Drzewa niespecjalne są zawsze doskonale zrównoważone, tak więc ich rozmiary m ają zawsze postać 2k —1. W ćwiczeniu 21 pokazujemy, że niespecjalne rozmiary składają się dokładnie z N - 1
jedynek,
IV —2
trójek,
N —4
8
siódemek,
N — 2n_1 2”
liczb (2n - 1).
( 15 )
Dla przykładu, na rysunku 28 mamy dwanaście niespecjalnych poddrzew o roz miarze 1, sześć o rozmiarze 3, dwa o rozmiarze 7 i jedno o rozmiarze 15. Niech si będzie rozmiarem poddrzewa o korzeniu l i niech M n będzie multizbiorem {si, S2 , . • *, Sjv} wszystkich takich rozmiarów. Dla każdego danego N zbiór M n można łatwo obliczyć, korzystając z ( 14 ) i ( 15 ). Z ćwiczenia 5.1.4-20 dowiemy się, że liczba wszystkich sposobów rozmieszczenia liczb { 1 , 2 , . . . , w kopcu wynosi N \ / Sl s 2 . . . s n = N \ / n p
i s e m n }.
( 16 )
Na przykład liczba sposobów rozmieszczenia 26 liter {A , B , <7,..., Z } w drzewie z rysunku 28 tak, żeby w pionie był zachowany porządek alfabetyczny, wynosi 26!/(26 • 10 - 6 • 2 • 1 • l 12 - 36 • 72 • 151). Jesteśmy już gotowi do analizy fazy budowy kopca, to znaczy obliczeń, które występują, zanim warunek l = 1 będzie pierwszy raz spełniony w kroku H2.
162
SORTOWANIE
5.2.3
Szczęśliwie badanie budowy kopca można sprowadzić do badania niezależnych operacji przesiewania. W ynika to z następującego twierdzenia: T w ie rd z e n ie H . Jeśli zastosujemy algorytm H do losowej permutacji zbioru { 1 , 2 , . . . , N} , to po fazie budowy z jednakowym prawdopodobieństwem uzyskamy każdy z N \ / \ \ { s \ s £ M ^ } możliwych kopców. Ponadto wszystkie [ N / 2J operacje przesiewania w tej fazie są zgodne z rozkładem jednostajnym w tym sensie, że po osiągnięciu kroku H 8 , każda z si możliwych wartości i jest jednakowo prawdopodobna. Dowód. Możemy zastosować to, co numerycy nazywają „analizą wstecz” ; mając dany wynik K i .. . K n wykonania operacji przesiewania o korzeniu w Z, zobaczy my, że jest dokładnie si wcześniejszych konfiguracji K [ . . . K \v , które po przesia niu d ają ten wynik. K ażda z wcześniejszych konfiguracji ma inną wartość K[\ zatem , wracając do tyłu, istnieje dokładnie si perm utacji wejściowych zbioru { l , 2 , . . . , i V} , które dają po przesianiu w Z konfigurację K \ . . . K ^ . Przypadek Z = 1 jest typowy: Niech K \ . . . K n będzie kopcem i niech K [ . . . K'n będzie ciągiem, z którego w wyniku przesiania otrzymujemy K \ ... K n , gdy Z = 1, K = K[. Jeśli K = K i: to musi zachodzić K[ — K ^/2 j, K [i/ 2\ = K\ i f 4j itd., podczas gdy K j = K j dla wszystkich j nie leżących na ścieżce od 1 do i. Odwrotnie, dla każdego i ta konstrukcja daje ciąg K [ . .. K N f taki, że (a) przesiewanie przekształca K [ . .. K N f w K \ . .. oraz (b) J ^ Kj dla 2 < [j / 2\ < j < N. Dlatego możliwych jest dokładnie N takich ciągów K [ .. . K N f i operacja przesiewania m a „rozkład jednostajny” . (Przykład dla tego dowodu znajdziemy w ćwiczeniu 22). | Jeśli chodzi o wielkości A, B, C, D w analizie programu H, można zauważyć, że jednostajna operacja przesiewania na poddrzewie rozmiaru s wnosi [s/ 2 \ / s do średniej wartości A. W nosi ona
- ( o + 1 + 1 + 2 + ••• + LigsJ) = - ¿ L i g f c J st[ = - ( ( s + l)LlgsJ _ 2 HS-J+ 1 + 2) s do średniej wartości B (zobacz ćwiczenie 1.2.4-42) oraz wnosi albo 2 /s, albo 0 do średniej wartości £>, w zależności od tego, czy s jest parzyste, czy nieparzyste. Odpowiedni wkład do C jest trochę trudniejszy do wyznaczenia, zatem zosta wiamy to Czytelnikowi (zobacz ćwiczenie 26). Sumując względem wszystkich przesiewań, dostajem y średnią wartość A w fazie budowy A 'n
= y ^ { [ s / 2 \ / s \ s £ M n }.
( 17 )
Podobne wzory zachodzą dla £?, C i D. Dlatego jest możliwe dokładne policzenie tych średnich wartości bez wielkiego trudu, a następująca tabela ukazuje typowe wyniki:
SORTOWANIE PRZEZ WYBIERANIE
5.2.3
N
99 100
999 1000
9999 10000 10001 10002
AA'N
19.18 19.93 196.16 196.94 1966.02 1966.82 1966.45 1967.15
C'N
B'n
68.35 69.39 734.66 735.80 7428.18 7429.39 7430.07 7430.97
163
D'n
42.95 42.71 464.53 464.16 4695.54 4695.06 4695.84 4695.95
0.00 1.84 0.00 1.92 0.00 1.97 0.00 1.73
Rozpatrując to asymptotycznie, możemy pominąć rozmiary specjalnych poddrzew w i odkryjemy dla przykładu, że
^ = f ' I + T' 5 + f ' ? + ' “ + ° (logN ) = (1"
N + ° {log N ) ’ (l8)
gdzie a = Y
- d — = 1.60669 515241529176378 33015 2319092458 04805-.
( 19 )
1
(Ta wartość została po raz pierwszy obliczona z dużą dokładnością przez J. W. Wrencha, Jr., za pomocą transform acji szeregów z ćwiczenia 27. Paul Erdós udowodnił, że a jest niewymierne [J. Indian Math. Soc. 12 (1948), 63-66], natom iast Peter Borwein wykazał niewymierność wielu podobnych stałych [Proc. Camb. Phil. Soc. 112 (1992), 141-146]). Przy dużych N możemy skorzystać ze wzorów A'n w0.19671V + ( - 1 ) w0.3; B'n « 0.74403AT - 1.3 ln N;
(20)
CN f « 0.47034iV - 0.8 I nN;
'
D fN w ( 1.8 ± 0.2) [N parzyste]. Minimalne i maksymalne wartości są także łatwe do wyznaczenia. Tylko O( N) kroków potrzeba do zbudowania kopca (zobacz ćwiczenie 23). Ta teoria dobrze objaśnia fazę budowy kopca w algorytmie H. Jednak faza wybierania to już inna opowieść, która oczekuje na napisanie! Niech Cx i oznaczają średnie wartości A , B , C oraz D wfaziewybierania, gdy sortujemy N elementów. Algorytm H wykazuje stosunkowo małe odchylenia od doświadczalnie wyznaczonych średnich wartości A% « 0.152A7; B ^f ^ N \ g N - 2 M N ; C& K±NlgN-lAlN]
^
lg N ± 2 ; ale żadne, stosowne teoretyczne wyjaśnienie zachowania się Djy lub wyjaśnienie hipotetycznych stałych 0.152, 2.61 lub 1.41 nie są dotychczas znane. Najbardziej znaczące składowe B ^ i zostały jednakże ustalone w elegancki sposób przez
164
SORTOWANIE
5.2.3
R. Schaffera i R. Sedgewicka; zobacz ćwiczenie 30. Schaffer udowodnił także, że najmniejszymi i największymi możliwymi wartościami C ^ są asymptotycznie odpowiednio ^TVlgTV i |7VlgiV. ĆW ICZENIA 1. [10] Czy proste wybieranie (algorytm S) jest stabilną metodą sortowania? 2 . [15] Dlaczego w algorytmie S jest wygodniej wybierać największy klucz, drugi największy itd., a nie najpierw znajdować najmniejszy, potem drugi najmniejszy itd.? 3. [M21] (a) Udowodnij, że jeśli na wejściu algorytmu S dana jest losowa permutacja zbioru { 1 , 2 , . . . , A }, to po pierwszej iteracji kroków S2 i S3 dostajemy losową permutację zbioru {1, 2 , . . . , N —1), a po niej N. (Innymi słowy, każda permutacja K i .. . K n - i zbioru { 1 , 2 , . . . , A —1} jest jednakowo prawdopodobna), (b) Z tego po wodu, jeśli B n oznacza średnią wartość B w programie S dla losowej permutacji, to B n = H n — 1 + B n - i- [Wskazówka: Zobacz 1.2.10-(i6)]. ► 4. [M25] W kroku S3 w algorytmie S nie dzieje się nic, gdy i — j\ czy jest dobrym pomysłem sprawdzanie, czy i = j przed wykonaniem kroku S3? Ile razy średnio i — j w kroku S3 dla losowej permutacji? * 5. [20] Jaka jest wartość B z analizy programu S, gdy na wejściu dana jest permu tacja N . .. 321? 6. [M29] (a) Niech a\ będzie permutacją zbioru { 1 , 2 , . . . , N } mającą C cy kli, I inwersji i B zmian w prawostronnych maksimach podczas sortowania programem S. Udowodnij, że 2B ^ I + N — C. [ Wskazówka: Zobacz ćwiczenie 5.2.2-1]. (b) Pokaż, że I 4- IV —C ^ |_A2/2_|; zatem B nie może nigdy przekraczać |_A2/4J, 7. [MĄ1] Znajdź wariancję zmiennej B z programu S jako funkcję A”przy założeniu, że dane są losowe. ► 8 . [24] Pokaż, że jeśli w poszukiwaniu max ( K i , . . . , Kj ) w kroku S2 klucze są prze glądane w porządku z lewa na prawo K i, K j , a nie z prawa na lewo jak w programie S, to często możliwa jest w następnej iteracji redukcja kroku S2. Napisz program w języku maszyny MIX wykorzystujący tę obserwację. 9. [M25] Jaka jest średnia liczba porównań wykonywanych w algorytmie z ćwiczenia 8 dla danych losowych? 10. [12] Jak będzie wyglądało drzewo z rysunku 23 po wyprowadzeniu na wyjście 14 z 16 początkowych elementów? 11. [10] Jak będzie wyglądało drzewo z rysunku 24 po wyprowadzeniu na wyjście elementu 908? 12. [M20] Ile razy będzie porównywana —00 z —00 , gdy metoda z dołu do góry z rysunku 23 zostanie zastosowana do posortowania ciągu 2n elementów? 13. [20] (J. W. J. Williams) W kroku H4 w algorytmie H rozróżnia się trzy przypadki j < r y j = r i j > r. Pokaż, że jeśli K ^ K r+i, to krok H4 można uprościć do dwóch przypadków. W jaki sposób, modyfikując krok H2, można zapewnić, żeby zachodził warunek K ^ K r+1? 14. [10] Wykaż, że kolejki proste są specjalnymi przypadkami kolejek prioryteto wych. (Wyjaśnij, w jaki sposób przypisać klucze do elementów, aby procedura ty pu „największy wchodzi, pierwszy wychodzi” była równoważna procedurze „pierwszy wchodzi, pierwszy wychodzi”). Czy stos jest także specjalnym przypadkiem kolejki priorytetowej?
5.2.3
SORTOWANIE PRZEZ WYBIERANIE
165
►15. [M22] (B. A. Chartres) Zaprojektuj szybki algorytm do tworzenia tabeli liczb pierwszych ^ N 1 wykorzystując kolejkę priorytetową, żeby uniknąć operacji dzielenia. [ Wskazówka: Niech najmniejszym kluczem w kolejce priorytetowej będzie najmniejsza nieparzysta liczba złożona, większa od ostatniej liczby nieparzystej .rozpatrywanej jako kandydatka na liczbę pierwszą. Staraj się minimalizować liczbę elementów w kolejce]. 16. [20] Zaprojektuj efektywny algorytm, który wstawia nowy klucz do danego kopca r/-elementowego, tworząc kopiec o n + 1 elementach. 17. [20] Zamiast metody „zmniejszaj l do 1” z algorytmu H, do budowy kopca można użyć algorytmu z ćwiczenia 16. Czy obie metody dają ten sam kopiec dla tych samych danych wejściowych? ►18. [21] (R. W. Floyd) W fazie wybierania w sortowaniu przez kopcowanie klucz K jest zazwyczaj mały, tak więc prawie we wszystkich porównaniach w kroku H6 mamy K < Kj . Pokaż, w jaki sposób zmodyfikować ten algorytm, żeby K nie był porównywany z K j w pętli głównej, tym samym zmniejszając o połowę średnią liczbę porównań. 19. [21] Zaprojektuj algorytm, który usuwa dany element z kopca o długości iV, tworząc kopiec o długości N — 1. 20. [M20] Udowodnij, że ( 14 ) daje rozmiary poddrzew specjalnych w kopcu. 2 1 . [M24] Udowodnij, że ( 15 ) daje niespecjalne rozmiary poddrzew w kopcu.
►2 2 . [20] Jakie permutacje zbioru { 1 ,2 ,3 ,4 ,5 } są przekształcane w 5 3 4 1 2 w fazie budowy kopca z algorytmu H? 23. [M28] (a) Udowodnij, że wartość B w algorytmie przesiewania nigdy nie jest większa od [Ig (j/OJ • (k) Zgodnie z (8 ), w żadnym szczególnym zastosowaniu algorytmu H wartość B nigdy nie jest większa od N[\g N j. Znajdź maksymalną wartość B jako funkcję AT, biorąc pod uwagę wszystkie możliwe dane wejściowe. (Trzeba udowodnić, że istnieją dane wejściowe, dla których B przyjmuje maksymalną wartość). 24. [M2Ą] Wyprowadź dokładny wzór na odchylenie standardowe zmiennej B'N (łącz na liczba promocji w fazie budowy kopca w algorytmie H). 25. [M20] Ile wynosi średni wkład do C dla jednego przebiegu przesiewania, gdy l = 1 i r = N, jeśli N = 2n+1 - 1 ? 26. [M30] Rozwiąż zadanie z ćwiczenia 25, (a) dla N — 26, (b) dla dowolnego N. 27. [M25] (T. Clausen, 1828) Udowodnij, że
(Biorąc x = 1, otrzymujemy bardzo szybkozbieżny szereg, który można wykorzystać do policzenia ( 19 )). 28. [
166
SORTOWANIE
5.2.3
►30. [HM35] (R. Schaffer i R. Sedgewick) Niech hnrn będzie liczbą kopców o elementach { 1 , 2 , . . . , n}, dla których w fazie wybierania jest wykonywanych m promocji. Udowod nij, że hnm ^ 2m i wykorzystaj tę zależność do pokazania, iż średnia liczba promocji wykonywanych w algorytmie H wynosi N lg N + 0 ( N log log A ). 31. [37] (J. W. J. Williams) Pokaż, że jeśli dwa kopce są umieszczone „obok siebie” we właściwy sposób, to jest możliwe posiadanie struktury danych, z której najmniejszy lub największy element może zostać w każdej chwili usunięty w O (logn) krokach. (Taką strukturę można by nazwać dwustronną kolejką priorytetową). 3 2 . [M28] Udowodnij, że liczba promocji B w sortowaniu kopcowym wynosi zawsze co najmniej | A lg A + 0 ( A ) , jeśli sortowane klucze są różne. Wskazówka: Należy rozważyć ruchy największych [A /2] kluczy. 33. [21] Zaprojektuj algorytm, który scala dwie rozłączne kolejki priorytetowe, repre zentowane jako drzewa lewicowe, w jedną kolejkę. (W szczególności, jeśli jedna z danych kolejek zawiera pojedynczy element, to podany algorytm będzie wstawiał go do drugiej kolejki). 34. [MĄ1] Ile jest drzew lewicowych o A węzłach, jeśli pominiemy wartości KEY? Odpowiedni ciąg zaczyna się od 1, 1, 2, 4, 8, 17, 38, 87, 203, 482, 1160, . . . . Korzystając z technik podobnych do tych z ćwiczenia 2.3.4.4-4, pokaż, że poszukiwana liczba wynosi asymptotycznie abNN ~ 3^2 dla odpowiednio dobranych stałych a i b. 3 5 . [26] Jeśli w drzewie lewicowym dodamy dowiązania (do rodziców) UP (zobacz omówienie drzew z trzema dowiązaniami z punktu 6.2.3), to można z kolejki prioryte towej usunąć dowolny węzeł P w następujący sposób: Zamień P przez kolejkę powstałą ze scalenia kolejek LEFT(P) i RIGHT(P); następnie uaktualniaj pola DIST w przodkach P, zamieniając być może lewe i prawe poddrzewa i kończąc w korzeniu lub w węźle, którego pole DIST nie uległo zmianie. Udowodnij, że ten proces nigdy nie wymaga więcej niż 0 (lo g A ) zmian pól DIST, jeśli w drzewie jest A węzłów, nawet gdy drzewo zawiera bardzo długie ścieżki w kie runku korzenia. 36. [18] (Najdłużej nie używana strona do wymiany) W wielu systemach operacyjnych wykorzystuje się następujący typ algorytmów: Na zbiorze węzłów są wykonywane na stępujące operacje: (i) „korzystanie” z węzła oraz (ii) zamiana najdłużej nie używanego węzła na nowy węzeł. Jaka struktura danych umożliwia łatwe dotarcie do najdłużej nie używanego węzła? 37. [HM32] Niech eAr(fc) będzie oczekiwaną odległością fc-tego największego elementu od korzenia drzewa w losowym kopcu o A elementach i niech e(k) — limjy^oo ejv(A;). Zatem e (l) = 0, e(2) = 1, e(3) = 1.5 i e(4) — 1.875. Znajdź asymptotyczną wartość e(k) z dokładnością do 0 ( k ~ 1). 38. [M21] Podaj prostą zależność rekurencyjną dla multizbioru M n rozmiarów poddrzew w kopcu lub zupełnym drzewie binarnym o A węzłach.
5.2.4. Sortowanie przez scalanie
Scalanie (lub zestawianie) oznacza łączenie dwóch lub więcej uporządkowanych plików (ciągów) w jeden uporządkowany. Na przykład można scalić ciągi 503 703 765 i 087 512 677, żeby otrzym ać 087 503 512 677 703 765. Prosty spo sób osiągnięcia tego polega na porównaniu dwóch najmniejszych elementów,
5.2.4
SORTOWANIE PRZEZ SCALANIE
167
wypisaniu i usunięciu najmniejszego, a następnie powtórzeniu tego procesu. Rozpoczynając od ( 503 703 765 { 087 512 677 otrzymujemy 087
f 503 703 765 \ 512 677
potem 087 503
f 703 765 \ 512 677
087 503 512
f 703 765 \ 677
i tak dalej. Pewnej uwagi wymaga sytuacja, w której jeden z dwóch ciągów zostanie wyczerpany; szczegółowy opis tego procesu zawiera poniższy algorytm. A lg o ry tm M {Scalanie dwuwejściowe) . W tym algorytmie są scalane niepuste, uporządkowane ciągi x \ < x
^
z m+n*
M l , [Inicjowanie] W ykonaj z <— 1 , j <— 1, k <— 1. M 2 . [Wyznaczanie mniejszego] Jeśli Xi < j/j, to przejdź do kroku M3, w prze ciwnym razie przejdź do M5. M 3, [Wyprowadzanie xĄ W ykonaj Zk to powróć do M2. M 4. [Przeniesienie y j , . . . , y n ] W ykonaj (zk , wykonywanie algorytmu.
k + 1 , i <— ¿4-1. Jeśli i < m, z
M 5. [Wyprowadzanie yj] W ykonaj Zk <— Vj, k to powróć do M2.
m+n) k + 1, j
M 6 . [Przeniesienie Xi , . . . , xm] W ykonaj (zk, . • ., ^m+n) wykonywanie algorytmu. |
yn )
i zakończ
j + 1. Jeśli j < n, (^¿j - *•, x m ) i zakończ
Przekonamy się w punkcie 5.3.2, że ta prosta procedura jest w istocie najlepszym sposobem scalania na konwencjonalnych komputerach, gdy m « n. (Jednakże, gdy m jest dużo mniejsze niż n, wówczas możliwe jest podanie efektywniejszych algorytmów sortowania, chociaż w ogólności są dość skomplikowane). Algorytm M można by bez straty efektywności uczynić trochę prostszym, umieszczając elementy (wartowników) x m+i = Vn+\ = oo na końcu ciągów wejściowych i kończąc tuż przed próbą wyprowadzenia na wyjście oo. Żeby zapoznać się z analizą algorytmu M, zobacz ćwiczenie 2. Ilość pracy wykonywanej przez algorytm M jest z natury proporcjonalna do m + n, tak więc jest jasne, że scalanie jest prostszym problemem od sor towania. Ponadto problem sortowania można sprowadzić do scalania, pońieważ możemy powtarzać scalanie coraz dłuższych podciągów, aż wszystko zostanie
168
5.2.4
SORTOWANIE
R y s. 29. Scalanie x i ^
^ x m z y\ ^
^ yn.
posortowane. Na scalanie można spojrzeć jako na rozwinięcie pomysłu sortowa nia, przez wstawianie: wstawianie nowego elementu do ciągu posortowanego jest szczególnym przypadkiem scalania dla n = 1. Jeśli chcemy przyśpieszyć proces sortowania, m ożna rozważyć wstawianie wielu elementów naraz, co w natural ny sposób prowadzi do ogólnej idei sortowania przez scalanie. Z historycznego punktu widzenia, sortowanie przez scalanie było jedną z najwcześniejszych me tod sortowania komputerowego; została ona zaproponowana przez Johna von Neum anna już w 1945 roku (zobacz podrozdział 5.5). Scalanie zbadamy szczegółowo w podrozdziale 5.4 w odniesieniu do algo rytmów sortowania zewnętrznego; w tym punkcie skoncentrujemy się na trochę prostszym pytaniu o sortowanie przez scalanie w szybkiej pamięci wewnętrznej. Tabela 1 ilustruje działanie sortowania przez scalanie, które „spala świeczkę z obu końców” w sposób podobny do procedury przeglądania używanej w sor towaniu szybkim i w sortowaniu pozycyjnym: Ciąg wejściowy jest przeglądany z lewa i z prawa w kierunku środka. Zapomnijmy przez chwilę o górnym wierszu tabeli. Rozważmy przejście z wiersza 2 do wiersza 3. Po lewej stronie mamy rosnący sekwens 503 703 765; po prawej zaś, patrząc z lewa na prawo, mamy sekwens 087 512 677. Scalenie tych dwóch ciągów daje ciąg 087 503 512 677 703 765, który zostaje umieszczony po lewej stronie w wierszu 3. Następnie scalamy klucze 061 612 908 z wiersza 2 z 170 509 897, a wynik (061 170 509 612 897 908) zapam iętujem y na prawym końcu wiersza 3. Na koniec scalamy 154 275 426 653 z 653 -- wykrywając wspólną część, zanim nie spowoduje ona żadnych kłopotów - i wynik umieszczamy po lewej stronie, za poprzednim sekwensem. Wiersz 2 w tabeli został utworzony z danych wejściowych w wierszu 1 w ten sam sposób. Odcinki pionowe w tabeli 1 reprezentują granice między sekwensami. Są to tak zwane kroki w dół, w których element mniejszy występuje po elemencie większym, zgodnie z kierunkiem czytania. Zazwyczaj w środku ciągu pojawia się niejednoznaczna sytuacja, kiedy ten sam klucz jest odczytywany z lewa na prawo, jak i z prawa na lewo. Nie powoduje to żadnego problemu, jeśli tylko jesteśm y trochę uważni, jak w algorytmie poniżej. Ta m etoda jest tradycyjnie nazywana „naturalnym ” scalaniem, ponieważ korzysta się w nim z sekwensów, które w ystępują naturalnie w danych wejściowych.
5.2.4
SORTOWANIE PRZEZ SCALANIE
169
Tabela 1 SORTOWANIE PRZEZ NATURALNE SCALANIE DWUWEJŚCIOWE
503| 087 512| 061 908| 170 897| 275 |653| 426 154 [509 1*612 ¡677 |765 503 703 765 >1 061 612 908 >1--------------------154 275 426 653 897 509 087 503 512 677 703 765)t----------------------154 275 426 ---------------------------------------------
703
170 1677 512 087
653 908 897 612 509
170 061
061 087 170 503 509 512 612 677 703 765 897 908 653 426 275
154
061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908
A lg o ry tm N {Sortowanie przez naturalne scalanie dwuwejściowe). Rekordy R i, • • • j R n są sortowane z użyciem dwóch obszarów pamięci, z których każdy może pomieścić N rekordów. Dla wygody mówimy, że rekordami w drugim obszarze są R n + i, • • •, R 2n , chociaż nie jest konieczne, żeby R n +i sąsiadował z Początkowa zawartość Rjv+i, ■• •, R 2N jest nieistotna. Po zakończeniu sortowania klucze będą w porządku K i < • ■• < K ^ . N I . [Inicjowanie] s *— 0 (Dla s — 0 rekordy z (iii, • • •, R n ) będą przeniesione do obszaru ( i f o + i , . . . , R 2n )\ gdy s = 1 , wówczas postąpim y odwrotnie). N 2 . [Przygotowywanie do przebiegu] Jeśli s = 0, to wykonaj i <— 1, j <— N, k ♦— N + 1, l 2N; jeśli s — 1, to wykonaj i N + 1 , j <— 2N, k <— 1, l N . (Zmienne i, j , k , l wskazują bieżące pozycje w „ciągu źródłowym” , które są odczytywane, i w „ciągu wynikowym” , które są zapisywane). W y konaj d +—1, / «— 1. (Zmienna d wyznacza bieżący kierunek wypisywania danych; / jest ustawiane na zero, jeśli są potrzebne dalsze przebiegi). N 3. [Porównywanie Ki i Kj ] Jeśli Ki > K j , to przyjdź do kroku N 8 . Jeśli i — j , to wykonaj R^ Rą i przejdź do N13. N 4. [Przeniesienie Ri] (Kroki N 4 - N 7 są analogiczne do kroków M 3 -M 4 z al gorytmu M). W ykonaj R^ <— Ri, k <— k -f d. N 5. [Czy krok w dół?] Zwiększ i o 1 . Wówczas, jeśli kroku N3. N 6 . [Przeniesienie Rj] W ykonaj Rk
Rj, k
1 < Ki , to powróć do
k + d.
N 7. [Czy krok w dół?] Zmniejsz j o 1 . Wówczas, jeśliK j + 1 < Kj , to powróć do kroku N 6 ; w przeciwnym razie przejdź do kroku N12. N 8 . [Przeniesienie Rj] (Kroki N 8-N 11 są dualne do kroków N 4 -N 7 ). W ykonaj Rk <— R j , k <— k ~b d. N 9. [Czy krok w dół?] Zmniejsz j o 1. Wówczas, jeśli K j + 1 < Kj , to powróć do kroku N3. N 1 0 . [Przeniesienie Ri] W ykonaj Rk
Ri, k
k + d.
N i l . [Czy krok w dół?] Zwiększ i o 1 .Wówczas, jeśli Ki _ 1 kroku N10. N 1 2 . [Zamienianie stron] W ykonaj / <— 0, d < kroku N3.
< Ki , to powróć do
d i zamień k
/. Wróć do
170
5.2.4
SORTOWANIE
i
i =j
N2. Przygotuj przebieg
NI. Inicjowanie
-^ N 3 . Porównaj K i '. K
ż / j , Ki
N13. Zamień obszary
Ki > Ki N8. Przenieś R a
R a
\s
V
ÓN5. Krok w dół? T ak .
Nie
Nie
N6. Przenieś R a
N9. Krok w dół? >r Tak N10. Przenieś R{ >
N7. Krok w dół?
Ni l . Krok w dół?
Nie
' Tak N12. Zamień strony
Sortowanie zakończone V
R y s. 30. Sortowanie przez scalanie.
N 1 3 . [Zamienianie obszarów] Jeśli / = 0, to wykonaj s <— 1 — s i wróć do N2. W przeciwnym razie sortowanie jest zakończone; jeśli s = 0, to wy konaj ( R u . . . , R n ) (R n + i) • • • j R 2n)- (To ostatnie kopiowanie nie jest konieczne, jeśli jest dopuszczalne, żeby wynik znajdował się w obszarze (R n + 1 i • ■• ) R 2n))- I Ten algorytm m a pewną ukrytą własność, którą wyjaśniamy w ćwiczeniu 5. Nie byłoby trudno zaprogramować algorytm N w języku maszyny MIX, mo żemy jednak wywnioskować główne fakty o jego zachowaniu bez pisania całego programu. Przy założeniu losowości danych liczba rosnących sekwensów w ciągu wejściowym wynosi około |7V, ponieważ Ki > z prawdopodobieństwem T szczegółowe informacje o liczbie sekwensów, przy trochę innych założeniach, zostały podane w punkcie 5.1.3. Każdy przebieg redukuje liczbę sekwensów o połowę (z wyjątkiem rzadkich przypadków, jak ten z ćwiczenia 6 ). Zatem liczba przebiegów będzie wynosić zazwyczaj około Ig = \ g N — 1. Każdy przebieg wymaga przeniesienia każdego z N rekordów, a z ćwiczenia 2 widzimy, że większość czasu zabierają kroki N3, N4, N5, N 8, N9. Możemy w następu jący sposób przedstawić zarys analizy czasu działania pętli wewnętrznej, przy założeniu małego prawdopodobieństwa wystąpienia równych kluczy: Krok N3 ’NA AT5 'ns Albo m
Albo
Operacje CMPA, JG, JE STA, INC INC, LDA, CMPA, JGE STX, INC DEC, LDX, CMPX, JGE
Czas 3.5 u 3u 6n 3u 6u
5.2.4
SORTOWANIE PRZEZ SCALANIE
171
Tak więc w każdym przebiegu czas poświęcony jednemu rekordowi wynosi około 12 .5u, a łączny czas działania będzie asymptotycznie równy 12.5iVlgiV, za równo w średnim, jak i pesymistycznym przypadku. To jest więcej niż średni czas sortowania szybkiego i może to nie być wystarczająco lepiej w porównaniu z sortowaniem przez kopcowanie, żeby usprawiedliwić zajęcie dwa razy większej pamięci. (Asymtotyczny czas działania program u 5.2.3H nigdy nie jest większy niż \ 8 N l g N ) . Odcinki graniczne między sekwensami są w algorytmie N wyznaczone całko wicie przez kroki w dół. Ma to tę przewagę, że ciągi wejściowe prawie uporządko wane rosnąco mogą być sortowane bardzo szybko i to samo tyczy się ciągów pra wie uporządkowanych malejąco; jednak spowalnia to obliczenia w pętli głównej. Zamiast szukania kroków w dół, można sztucznie wyznaczyć długości sekwensów, przyjmując, że wszystkie sekwensy w ciągu wejściowym m ają długość 1 , wszystkie sekwensy po pierwszym przebiegu (z wyjątkiem być może ostatniego) m ają długość 2 , . . . , wszystkie sekwensy po k przebiegach (z wyjątkiem być może ostatniego) m ają długość 2k. Tę nową m etodę nazywamy prostym scalaniem dwuwejściowym, jako przeciwieństwo scalania „naturalnego” z algorytm u N. Proste scalanie dwuwejściowe jest bardzo podobne do algorytm u N, a jego schemat blokowy jest w zasadzie taki sam; jednak są one wystarczająco różne, aby napisać cały algorytm od nowa. A lg o ry tm S (Sortowanie przez proste scalanie dwuwejściowe). Rekordy i i i , . . . , R n są sortowane za pomocą dwóch obszarów pamięci tak jak w algorytmie N. 51. [Inicjowanie] W ykonaj s <— 0, p <— 1. (Znaczenie zmiennych s, i , j , fc, l i d jest takie same jak w algorytmie N. T utaj p reprezentuje rozmiar rosnących sekwensów, które są scalane w bieżącym przebiegu; na zmiennych q i r są pam iętane liczby niescalonych elementów w aktualnie scalanych sekwensach). 52. [Przygotowywanie do przebiegu] Jeśli s — 0, to wykonaj i <— 1, j N, k N, l <— 2N + 1; jeśli s = 1, to wykonaj i <— N + 1 , j 2 N, A: ^— 0, l <— N + 1 . Następnie wykonaj d 1, ą p, r <— p. 53. [Porównywanie K i : Kj] Jeśli Ki > K j , to przejdź do kroku S 8 . 54. [Przeniesienie RĄ k +—k + d, Rk 55. [Czy koniec sckwcnsu?] i S3.
Ri-
ż + 1, #
q — 1. Jeśli q > 0, to wróć do kroku
56. [Przeniesienie Rj] W ykonaj k k-{-d. Następnie, jeśli k = Z, to przejdź do kroku S13; w przeciwnym razie Rk <— R j. 57. [Czy koniec sekwensu?] W ykonaj j j — 1, r <— r — 1. Jeśli r > 0, to przejdź z powrotem do kroku S6 ; w przeciwnym razie przejdź do S12. 58. [Przeniesienie Rj] k
k
+ d,
59. [Czy koniec sekwensu?] j kroku S3.
Rk
<—R j .
j — 1, r <— r — 1. Jeśli r > 0, to wróć do
172
SORTOWANIE
5.2.4
Tabela 2 SORTOWANIE PRZEZ PROSTE SCALANIE DWUWEJŚCIOWE
503 | 087 |512 | 061
|908 | 170 | 897 | 275 | 653
| 426
|154 | 509|612 | 677 |765 | 703
503
703 | 512 677 [ 509 908 | 426 897 | 653
275 | 170 154 | 612
061 | 765 087
087
503 703 765 | 154 170 509 9 0 8 1 897
653
426 275 | 677 612
512 061
061
087 503
512 612 677
703 7 6 5 1908
897
653 509 426 275
170 154
061
087 154 170 275 426
503 509 512
612
653 677
703 765 897 908
510. [Przeniesienie Ri] W ykonaj A: k + d. Następnie, jeśli k = Z, to przejdź do kroku S13; w przeciwnym razie wykonaj R^ <— Ri. 51 1 . [Czy koniec sekwensu?] z powrotem do kroku S 10 .
ż + 1,
g — 1 . Jeśli q > 0, to przejdź
5 1 2 . [Zamienianie stron] W ykonaj q p, r p, d < d, i zamień k <-+ L Jeśli j — i < p, to wróć do kroku S 10 ; w przeciwnym razie wróć do S3. 513. [Zamienianie obszarów] p p + p . Jeśli p < JV, wykonaj s 1 —s i wróć do S2 . W przeciwnym razie sortowanie jest zakończone; jeśli s — 0, wykonaj ( i ?i , . . . , R n )
(-Rn+i , . . . , R2 n )-
(O statnie kopiowanie jest wykonywane wtedy i tylko wtedy, gdy [lg N ] jest nieparzyste, niezależnie od rozkładu danych wejściowych. Dlatego z góry można przewidzieć miejsce, w którym pojawi się posortowane wyjście i ko piowanie nie będzie zazwyczaj potrzebne). | Przykład działania tego algorytmu można znaleźć w tabeli 2 . Jest trochę zadziwiające to, że ta m etoda działa równie dobrze, gdy N nie jest potęgą 2 ; nie wszystkie scalane sekwensy są długości 2fc, chociaż w jawny sposób nie zabezpieczono się przed takim i przypadkami! (Zobacz ćwiczenie 8). Poprzednie sprawdzanie w ystąpień kroków w dół zostały zamienione przez zmniejszanie o 1 q i r oraz porównywanie wyników z zerem; to redukuje asymptotyczny czas dzia łania maszyny MIX do H N \ g N jednostek, trochę szybciej niż w algorytmie N. W praktyce byłoby w arte zachodu połączyć algorytm S z prostym wsta wianiem; zam iast czterech pierwszych przebiegów w algorytmie S moglibyśmy posortować grupy, powiedzmy po 16 elementów, za pomocą prostego wstawiania, tym samym unikając stosunkowo bezużytecznych operacji organizujących scala nie krótkich ciągów. Jak już widzieliśmy to w przypadku sortowania szybkiego, takie połączenie m etod nie wpływa na asym ptotyczny czas działania, ale mimo to jest zauważalnym usprawnieniem. Zbadajm y teraz algorytmy N i S pod względem struktur danych. Dlaczego potrzebowaliśmy miejsca na 2iV rekordów zamiast N? Powód jest stosunkowo prosty: Mieliśmy do czynienia z czterem a listami o zmieniających się rozmiarach (dwoma listam i źródłowymi i dwoma listam i wynikowymi w każdym przebiegu); zastosowaliśmy także standardow y pomysł „rośnięcia razem ” , omawiany w punk cie 2.?.2, dla każdej pary sekwencyjnie alokowanych list. Jednakże połowa przy
5.2.4
SORTOWANIE PRZEZ SCALANIE
173
dzielonej pamięci była zawsze niewykorzystana, a chwila zastanowienia pozwala zauważyć, że moglibyśmy tak naprawdę wykorzystać alokację dowiązaniową dla naszych czterech list. Jeśli dodamy jedno pole na dowiązanie do każdego z N rekordów, to będziemy w stanie zrobić wszystko, co jest potrzebne w algorytm ach scalania, manipulując w prosty sposób dowiązaniami i nie ruszając w ogóle samych rekordów! W ogólności lepiej dodać N pól na dowiązania niż dodawać pamięci dla dodatkowych N rekordów, a ograniczony ruch rekordów może tak że oszczędzić czas, chyba że pamięć naszego kom putera szczególnie nadaje się do sekwencyjnego odczytywania i zapisywania. Dlatego powinniśmy wziąć pod uwagę algorytm scalania jak ten podany poniżej. A lg o ry tm L (Sortowanie przez scalanie listowe). O rekordach R i , . . . , R n za kładamy, że zawierają klucze K \ , . . . , K n razem z polami na dowiązania L i , . . . , L n mogącymi pomieścić liczby z zakresu od —(N + 1 ) do ( N + 1 ). Mamy także dwa dodatkowe pola na dowiązania L q i L n +i w sztucznych rekordach R q i R n +i dołączonych na początku i na końcu ciągu wejściowego. Ten algorytm jest algorytmem „sortowania listowego” , który ustala dowiązania w taki sposób, że rekordy zostają powiązane w porządku rosnącym. Po zakończeniu sortowania L 0 będzie indeksem rekordu o najmniejszym kluczu; natom iast L dla 1 < k < N, będzie indeksem rekordu, który następuje po R k , lub Lk = 0, jeśli Rk jest rekordem o największym kluczu. (Zobacz 5 .2 .1 - ( i 3 )). Podczas wykonywania tego algorytmu, Ro i R;v+i pełnią role głów list li niowych, których podlisty są właśnie scalane. Dowiązanie ujemne oznacza koniec podlisty, o której wiadomo, że jest uporządkowana; dowiązanie o wartości zero oznacza koniec całej listy. Przyjmujemy, że N > 2. Zapis „|LSJ p” oznacza „na L s przypisz p lub —p, zachowując poprzedni znak L s” . Ta operacja dobrze pasuje do maszyny MIX, ale niestety nie do większo ści komputerów; można zmodyfikować ten algorytm w prosty sposób i otrzym ać równoważną, efektywną metodę pasującą do większości maszyn. > L I. [Przygotowywanie dwóch list] W ykonaj L 0<—1, Lat+ i<—2, L*< (i-h 2 ), dla 1 < i < N —2 , oraz L n - i ^ L n ^ 0. (Stworzyliśmy dwie listy zawierające odpowiednio R i, R 3, R 5 , .. . i R 2, R 4, Rg , . . . ; ujemne dowiązania oznacza ją, że każda uporządkowana podlista składa się tylko z jednego elementu. W ćwiczeniu 12 omawiamy inny sposób wykonania tego kroku, kiedy to bierze się pod uwagę uporządkowania istniejące w źródłowych danych). L 2 . [Początek nowego przebiegu] W ykonaj s *— 0, t <— AT + 1, p < — L s, q Lt. Jeśli q — 0, to zakończ wykonywanie algorytmu. (Podczas każdego przebiegu p i q wędrują po scalanych listach; s zazwyczaj wskazuje ostatnio przetwa rzany rekord bieżącej podlisty, podczas gdy t wskazuje koniec poprzednio utworzonej podlisty). L3. [Porównywanie K p : K q\ Jeśli K p > K q, to przejdź do L 6 . L4. [Przesuwanie p] Wykonaj \LS\ <— p, s do L3.
p, p
L p. Jeśli p > 0, to wróć
174
5.2.4
SORTOWANIE
Tabela 3 SORTOWANIE ZA POMOCĄ SCALANIA LISTOWEGO
j
0
K3 Lj Lj Lj
— 1 2 4 4 4
h Lj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 703 0 0 -4 -5 -6 -7 -8 - 9 -10 -11 -12 -13 -14 -15 -16 -3 9 12 -16 14 0 0 15 1 -8 3 -10 5 -11 7 -13 -6 12 10 9 14 16 0 15 1 -11 2 -13 8 5 7 0 3 1 14 12 9 16 0 15 2 0 8 5 10 13 3 6 7 10 14 1 6 3 9 16 7 15 2 0 12 11 13 8 5
— 2 4 6 11 0
L5. [Uzupełnianie
podlisty] W ykonaj L s g, s t. Następnie wykonaj, jeden lub więcej razy, t qiq L q, aż q < 0. Na koniec przejdź do L 8 .
L6. [Przesuwanie s
Ą-i Q
g] (Kroki L 6 i L7 są dualne do L4 i L5). W ykonaj \LS\ L q. Jeśli g > 0, to wróć do L3.
L7. [Uzupełnianie podlisty] lub więcej razy, t
W ykonaj L s <— p, s p ip Lp, aż p < 0.
g,
t. Następnie wykonaj, jeden
L8. [Czy
koniec przebiegu?] (W tym miejscu, p < 0 i q < 0, ponieważ oba wskaźniki zostały przesunięte na końce odpowiadających im podlist). W y konaj p < p, q < g. Jeśli q = 0, to wykonaj \LS\ <— p, |L*| 0 i wróć do L 2 . W przeciwnym razie wróć do L3, |
Przykładowe działanie tego algorytm u ilustruje tabela 3, gdzie możemy prześle dzić dowiązania za każdym razem, gdy wchodzimy do kroku L2. Po wykonaniu naszego algorytmu, korzystając z m etody z ćwiczenia 5.2-12, można przemieścić rekordy i i i , . . . , R n w taki sposób, żeby ich klucze były uporządkowane. Istnieje interesujące podobieństwo między scalaniem listowym a dodawaniem rzadkich wielomianów (zobacz algorytm 2.2.4A). Zaprogramujmy teraz algorytm L, żeby zobaczyć, dlaczego listy m ają prze wagę zarówno pod względem szybkości, jak i wykorzystania pamięci.
Program L (Sortowanie
przez scalanie listowe). Dla wygody zakładamy, że rekordy m ają długość jednego słowa, z Lj w polu (0 : 2) i z K j w polu (3:5) o lokacji INPUT + j] r l l = p, rI2 = g, rI3 = s, rI4 = i, rA = K q; AT > 2. L 0 2 ABSL 03 KEY 04 START 05 06 07 08 09 01
11 12
13 U
Definicja nazw
1
N - 2 N - 2
LI. Przygotuj ■ Li <— —(i + 2).
A -2
N - 2
N - 2 ^ i > 0.
1 1 1 1 1 1
i—\ i o
10
EQU 0 :2 EQU 1 :2 EQU 3 :5 ENT1N-2 ENNA2,1 STA INPUT,1(L) DECU J1P * -3 ENTA1 STA INPUT(L) ENTA2 STA INPUT+N+KL) STZ INPUT+N-KL) STZ INPUT+NCL)
L n +i 2. L n - i <— 0. Ln 0.
5.2.4
15 16 L 3Q 17 L 3 P 18 19 L 4 20 21 22 23 L5 24 25 26 27 28 29 L6 30 31 32 33 LI 34 35 36 37 38 L 8 39 40 41 42 43 L 2 44 45 46 47
SORTOWANIE PRZEZ SCALANIE JMP L 2 LDA I N P U T , 2 CM PA IN PU T, 1 (K E Y ) JL
L6
ST1
IN P U T ,3 (A B S L )
ENT30,1 LD1
IN P U T ,1 (L )
J1P
L3P
ST2
IN P U T ,3 (L )
ENT30,4 ENT40,2 LD2
IN P U T ,2 (L )
J2P
*-2
1 C" + B C c a a a a Bf Bf
D( Df Df
JMP L 8
Bf
ST2
C" C" C” C"
IN P U T ,3 (A B S L )
ENT30,2 LD2
IN P U T ,2 (L )
J2P
L3Q
ST1
IN P U T ,3 (L )
ENT30,4 ENT40,1 LD1
IN P U T ,1(L )
J1P
*-2
E N N 10 ,1 ENN20,2 J2NZL3Q ST1
IN P U T ,3 (A B S L )
STZ
IN P U T ,4 (A B S L )
ENT30 ENT4N+1 LD1
IN PU T (L)
LD2
IN PU T+N +K L)
J2NZL3Q
B" Bn
D" D" D” B B B A A A+ l A+ 1 A + l A -h i A+ l
175
Do L2. L3. Porównaj K „: K n. Do L6 , jeśli K q < K p. L4. Przesuń y. |LS| <— p. s p. L p. Do L3, jeśli p > 0. L5. Uzupełnij podlisty. L s <— qs t. t <- q. q *- L q. Powtórz, jeśli q > 0 . Do L8 . L 6 . Przesuń q. \LS\ <— q. s <- 0. L7. Uzupełnij podlisty. L s p.
s <—t. ć <-p. p < L p. Powtórz, jeśli p > 0. L 8 . Czy koniec przebiegu? p < p. q < q. Wykonaj L3, jeśli q ^ 0 . \La\ < -p . \Lt \ « -0 . L 2 . Początek nowego przebiegu, s <— 0. t < - N
+ l.
p <- L s . q Lt. Do L3, jeśli q ^ 0.
|
Czas działania tego program u można zanalizować, korzystając z technik, które widzieliśmy już wiele razy wcześniej (zobacz ćwiczenia 13 i 14); okazuje się, że średnio jest on równy w przybliżeniu ( 10iVlg N + 4.92N ) u, przy m ałym odchy leniu standardowym rzędu y/N . W ćwiczeniu 15 pokazujemy, że czas działania można zredukować do 9N lg N kosztem trochę dłuższego programu. Tak więc przy scalaniu wewnętrznym mamy jasne zwycięstwo technik dowiązaniowych nad alokacją sekwencyjną: Mniejsze są wymagania pamięciowe, a pro gram działa około 1 0 -2 0 procent szybciej. Podobne algorytmy zostały opubliko wane przez L. J. W oodruma [ IB M Systems J. 8 (1969), 189-203] i A. D. Woodalla [Comp. J. 13 (1970), 110-111]. ĆW ICZENIA 1. [21] Uogólnij algorytm M tak, żeby stał się algorytmem scalania k-wejściowego dla ciągów x n ^ ^ x imi, i = 1 , 2 , . . . , k.
176
SORTOWANIE
5.2.4
[M2Ą] Przy założeniu, że każde z (m^ n) możliwych rozmieszczeń m wartości x wśród n wartości y jest jednakowo prawdopodobne, znajdź wartość oczekiwaną i odchylenie standardowe liczby wykonań w algorytmie M kroku M2. Jaką maksymalną, a jaką minimalną wartość przyjmuje ta wielkość? 2.
►
3. [20] ( Modyfikacja ) Mamy dane rekordy i ? i , . . . , Rm i i i i , , Rni których klucze są różne i uporządkowane tak, ż e K ! < • ■ ■ < K m i K [ < * * < K ' N . Pokaż, w jaki sposób zmodyfikować algorytm M, żeby w wynikowym ciągu zostały pominięte te rekordy Ri z pierwszego ciągu, których klucze występują w drugim ciągu. 4. [21] W tekście zauważyliśmy, że sortowanie przez scalanie można traktować ja ko uogólnienie sortowania przez wstawianie. Pokaż, że sortowanie przez scalanie jest także silnie związane z sortowaniem przez wybieranie drzewowe przedstawionym na rysunku 23.
► 5. [21] Udowodnij, że w krokach N 6 lub N10 i nie może nigdy być równe j. (Dlatego nie ma potrzeby sprawdzać w tych krokach, czy należy przejść do N13). 6 . [22] Znajdź permutację K i K 2 . . . Kie ciągu {1, 2 , . . . , 16} taką, że
K 2 > K^j
Ką > JĆ5 ,
Kq > K 7 ,
K$ > K 9 ,
Kio < K u ,
K 12 < K 1 3 ,
K u < JĆ15,
i którą algorytm N posortuje tylko w dwóch przebiegach. (Ponieważ istnieje osiem lub więcej sekwensów, można by oczekiwać, że będziemy mieli co najmniej cztery sekwensy po pierwszym przebiegu, dwa sekwensy po drugim przebiegu i sortowanie nie może się zakończyć w zwykły sposób wcześniej niż po trzech przebiegach. Jak to jest możliwe w tylko dwóch przebiegach?). 7. [16] Podaj wzór na dokładną liczbę przebiegów w algorytmie S jako funkcję N. 8 . [22] W algorytmie S, o zmiennych q i r zakłada się, że reprezentują liczby niesca-
lonych elementów w aktualnie przetwarzanych sekwensach; na początku q i r są równe p, chociaż sekwensy nie zawsze mają taką samą długość. Jak to jest możliwe, że to działa? 9. [24] Zaprogramuj algorytm S w języku maszyny MIX . Określ częstości wykonywa nia poszczególnych instrukcji w terminach wielkości analogicznych do A, £?', C \ ... z programu L. 10. [25] (D. A. Bell) Pokaż, że w prostym scalaniu dwuwejściowym z sekwencyjną alokacją pamięci można użyć tylko pamięci o rozmiarze §iV zamiast 2 iV, jak to jest w algorytmie S. 11. [21] Czy algorytm L jest stabilny? ►12. [22] Popraw krok LI w algorytmie L tak, żeby scalanie stało się „naturalne” i wykorzystywało istniejące początkowo rosnące sekwensy. (W szczególności, dla upo rządkowanych danych wejściowych obliczenia powinny kończyć się w kroku L2, zaraz po zakończeniu kroku LI). ►13. [M34] Zanalizuj średni czas działania programu L w stylu innych analiz z tego rozdziału: Podaj interpretację wielkości A, B, B f, . . . i wyjaśnij, jak obliczyć dokładnie ich średnie wartości. Ile czasu potrzebuje program L do posortowania 16 liczb z tabeli 3? 14. [M2Ą] Niech binarną reprezentacją N będzie 2 ei + 2e2 H 1- 2 e£, gdzie ei > €2 > ■■■> et ^ 0, t ^ 1 . Udowodnij, że maksymalna liczba porównań kluczy wykonywanych w algorytmie L wynosi 1 —2 e* + S t = i ( e*; k — l) 2 e/\
5.2.4
SORTOWANIE PRZEZ SCALANIE
177
15. [20] Ręczna symulacja algorytmu L pokazuje, że czasami są wykonywane operacje redundantne; przypisania \LS\ <— p, \LS \ q w krokach L4 i L6 są zbędne około połowę razy, ponieważ mamy L s = p (lub q) za każdym razem, gdy z kroku L4 (łub L6 ) powracamy do L3. Jak poprawić program L, żeby tę redundancję zlikwidować? 16. [28] Zaprojektuj algorytm scalania listowego, podobny do algorytmu L, ale sca lający trzy wejścia. 17. [20] (J. McCarthy) Niech N ma taką binarną reprezentację jak w ćwiczeniu 14 i załóżmy, że danych jest N rekordów w t uporządkowanych podciągach o rozmiarach, odpowiednio, 2ei, 2 e2, . . . , 2 et. Pokaż, w jaki sposób utrzymać taką organizację rekordów po dodaniu nowego ( N + l)-szego rekordu i wykonaniu N <— N + 1 . (Otrzymany algorytm można nazwać sortowaniem przez scalanie w trybie bezpośrednim). 18. [ĄO] (M. A. Kronrod) Dany jest ciąg N rekordów składających się tylko z dwóch sekwensów Ki ^ Km i K m +1 ^ ^ Kjy. Czy można posortować taki ciąg w pamięci wewnętrznej za pomocą O ( N ) operacji, korzystając tylko z malej, o stałej wielkości dodatkowej pamięci, niezależnie od wartości M i N? (Wszystkie algorytmy scalające opisane w tym punkcie korzystają z dodatkowej pamięci o rozmiarze proporcjonalnym do N). 19. [26] Rozważmy kolejową stację rozrządową o n „stosach” taką jak na rysunku 31 dla n = 5; stację z jednym stosem rozważaliśmy w ćwiczeniach od 2.2.1-2 do 2.2.1-5. W przypadku jednego stosu, jeśli na wejściu z prawej strony pojawi się N wagonów, to tylko stosunkowo niewiele z NI permutacji tych wagonów (składów pociągów) może pojawić się z lewej strony. Dla stacji z n stosami załóżmy, że 2 n wagonów wjeżdża z prawej strony. Udowodnij, że można sformować każdy z 2 n! możliwych składów pociągów, wykonując stosowny ciąg manewrów. (Każdy stos jest w rzeczywistości większy niż wynikałoby z rysunku jest wystarczająco duży, żeby zmieścić wszystkie wagony, jeśli zajdzie taka potrzeba). 2 0 . [47] Przy oznaczeniach z ćwiczenia 2.2.1-4 co najwyżej a $ permutacji N elemen tów można otrzymać za pomocą stacji rozrządowej z n stosami; zatem liczba stosów potrzebna do uzyskania wszystkich N \ permutacji wynosi co najmniej l o g N l / l o g a N « log4 N. W ćwiczeniu 19 pokazujemy, że wystarczy co najwyżej |~lg AT] stosów. Jakie jest rzeczywiste tempo wzrostu koniecznej liczby stosów przy N —►00 ? 2 1 . [23] (A. J. Smith) Wyjaśnij, w jaki sposób rozszerzyć algorytm L tak, aby oprócz
sortowania obliczał także liczbę inwersji w wejściowej permutacji. 2 2 . [28] (J. K. R. Barnett) Opracuj sposób przyśpieszenia sortowania przez scalanie dla kluczy wielosłowowych. (W ćwiczeniu 5.2.2-30 rozważamy analogiczny problem dla sortowania szybkiego).
178
SORTOWANIE
5.2.4
23. [M30] W ćwiczeniach 13 i 14 analizujemy wersję „z dołu do góry” (lub iteracyjną) sortowania przez scalanie, gdzie koszt c(N) posortowania N elementów spełnia równanie rekurencyjne
c(N) = c(2 k) + c(N -
2 k)
+ f { 2 k, N -
2 k)
dla 2 k < N ^
2 k+1
i /(m , n) jest kosztem scalenia m elementów z n elementami. Przeanalizuj zależność rekurencyjną „z góry do dołu” (lub dziel i zwyciężaj)
c(iV) = c([iV/2l) + c(LiV/2j) + /(rA r/2l, [N/ 2 J )
dla JV > 1 ,
która pojawia się w rekurencyjnej wersji sortowania przez scalanie.
5.2.5. Sortowanie przez rozrzucanie
Przejdziemy teraz do interesującej klasy m etod sortowania, które są zasadniczo odmienne od scalania, gdy patrzym y z punktu widzenia, o którym będzie mowa w punkcie 5.4.7. Te m etody przez wiele lat stosowano do sortowania kart dziur kowanych, na długo przed pojawieniem się komputerów. Te same rozwiązania można zaadaptować do programowania komputerów i są one powszechnie znane jako „sortowanie kubełkowe” , „sortowanie pozycyjne” czy „sortowanie cyfrowe” , ponieważ wykorzystują one strukturę cyfrową kluczy. Przypuśćmy, że chcemy posortować talię 52 kart do grania. Możemy przy jąć, że A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K jest porządkiem na wartościach kart, natom iast porządkiem na kolorach jest
*
< o < 9
< *.
(A oznacza asa, J - waleta, Q - damę, a K - króla). Jedna karta występuje przed drugą, gdy albo (i) jej kolor jest mniejszy od koloru drugiej karty, albo (ii) ich kolory są takie same, ale wartość pierwszej karty jest mniejsza od wartości drugiej karty. (Jest to szczególny przypadek porządku leksykograficznego między uporządkowanymi param i obiektów; zobacz ćwiczenie 5-2). Tak więc A*<2*<---
5.2.5
SORTOWANIE PRZEZ ROZRZUCANIE
179
Ten sam pomysł stosuje się do sortowania liczb w porządku alfabetycznym. Dlaczego to działa? Ponieważ (w naszym przykładzie z kartam i), jeśli dwie karty w ostatnim rozdaniu znajdą się w różnych kupkach, to są różnych kolorów i ta 0 niższym kolorze będzie wcześniej. Jednak, gdy dwie karty są tego samego koloru, (a co za tym idzie znajdą się w jednej kupce), to są już we właściwym porządku odziedziczonym po poprzednim sortowaniu. Innymi słowy, wartości kart w każdej z czterech kupek będą uporządkowane rosnąco po drugim roz daniu. Tego samego dowodu można użyć do wykazania, że w ten sposób da się sortować w porządku leksykograficznym; szczegóły znajdują się w ćwiczeniu 5-2, na początku tego rozdziału. W łaśnie opisana m etoda sortowania nie jest natychmiastowa i nie jest jasne, kto pierwszy zauważył jej przydatność. W 19-stronicowej broszurze na tem at inwentaryzacji „The Inventory Simplified” , wydanej w 1923 roku przez oddział IBM zajmujący się produkcją maszyn do automatycznego sporządzania zesta wień {Tabulating Machines Company), zawarty jest interesujący opis m etody do automatycznego tworzenia sum iloczynów na elektrycznych maszynach sortują cych: Załóżmy dla przykładu, że dla dużego pliku kart dziurkowanych chcemy pomnożyć liczby wydziurkowane w kolumnach 1 - 1 0 przez liczby wydrukowane w kolumnach 2 3 -2 5 , a następnie dodać do siebie wszystkie iloczyny. W tym celu możemy posortować karty najpierw względem kolumny 25, a następnie wykorzystać maszynę do tworzenia zestawień do znalezienia wszystkich wielkości 01 ,(12, . . . ,<*9, gdzie a& jest łączną liczbą kolumn 1 - 1 0 w kartach, w których w kolumnie 25 jest k . Następnie możemy posortować karty względem kolumny 24, znajdując analogiczną sumaryczną wielkość 61 , 62, . . . , 69; a na koniec także względem kolumny 23, otrzym ując Ci, C2, . . . , cg. Można zobaczyć, że poszukiwa na suma iloczynów wynosi di + 2a 2 H- ***"h 9ćzg + IO61 + 2062 ~h *• •
906g + lOOci 4- 200c2 ~h ***
900cg.
Opisana m etoda w sposób naturalny prowadzi do sortowania pozycyjnego typu „najmniej-znacząca-cyfra-najpierw” , prawdopodobnie znanej operatorom ma szyn, w których używano kart dziurkowanych. Pierwsze opublikowane odniesienie do tej zasady sortowania znajduje się w pracy L. J. Comriego na tem at urządzeń dziurkujących [Transactions o f the Office Machinery Users’ Assoc., Ltd. (1929), 2 5 -3 7 , szczególnie strona 28]. Żeby wykorzystać sortowanie pozycyjne do sortowania komputerowego, mu simy zdecydować, co zrobić z kupkami. Przypuśćmy, że mamy M kupek; mo glibyśmy przygotować na boku M obszarów pamięci i przesuwać każdy rekord z obszaru wejściowego do obszaru odpowiadającego stosownej dla niego kupce. Jednak takie rozwiązanie nie jest satysfakcjonujące, ponieważ każdy z obszarów musiałby być tak duży, żeby pomieścić wszystkie N rekordów, a co za tym idzie potrzebna byłaby pamięć dla (M + 1)1V rekordów. To był powód, dla którego ten pomysł był przez wiele lat odrzucany. Dopiero H. H. Seward [Master’s thesis, M.I.T. Digital Com puter Laboratory Report R-232 (1954), 25-28] zauważył, że ten sam efekt można otrzymać, korzystając tylko z pamięci na 2 N rekordów 1 M liczników pól. Należy po prostu policzyć, przebiegając wstępnie przez dane,
180
SORTOWANIE
5.2.5
ile elementów będzie leżało w każdej z M kupek. To powie nam dokładnie, ile pamięci trzeba zaalokować dla każdej z kupek. Czerpaliśmy już z tego pomysłu w „sortowaniu przez zliczanie” - algorytm 5.2D. Sortowanie pozycyjne można przeprowadzić w następujący sposób: Rozpo czynamy od sortowania kluczy przez rozrzucanie ze względu na ich najmniej znaczące cyfry (o kluczach przyjmujemy, że zapisane są w systemie pozycyj nym o podstawie M ), przenosząc rekordy z obszaru wejściowego do obszaru pomocniczego. Następnie ponownie wykonujemy sortowanie przez rozrzucanie względem kolejnej z najmniej znaczących cyfr, przenosząc rekordy z powrotem do oryginalnego obszaru wejściowego; postępujemy tak dalej, aż po ostatnim przebiegu (względem najbardziej znaczącej cyfry) wszystkie rekordy znajdą się w żądanym porządku. Jeśli dysponujemy kom puterem dziesiętnym z 12 cyfrowymi kluczami i jeśli N jest dość duże, wówczas możemy wziąć M = 1000 (traktując trzy cyfry dziesiętne jak jedną cyfrę w systemie o podstawie 1000); wówczas sortowanie zostanie wykonane w czterech przebiegach, niezależnie od rozmiaru N . Podobnie, gdy pracujem y z kluczami 40-bitowymi, możemy wziąć M = 1024 — 2 10 i także wykonać sortowanie w czterech przebiegach. Tak naprawdę każdy przebieg składa się z trzech faz (zliczania, alokacji, przemieszczania); E. H. Friend [JACM 3 (1956), 151] zaproponował połączenie dwóch z tych faz, kosztem dodatkowej pamięci rozm iaru M , przez jednoczesne wykonanie zliczania dla przebiegu k + 1 z przemieszczaniem rekordów w przebiegu k. Tabela 1 ilustruje zastosowanie sortowania pozycyjnego z M = 10 do na szych przykładowych 16 liczb. Sortowanie pozycyjne generalnie nie nadaje się dla tak m ałych 7V, tak więc taki m ały przykład jak ten pokazuje poprawność tej metody, a nie jej efektywność. Czujny Czytelnik zauważy jednakże, że pomysł z wykorzystaniem liczni ków cyfr do alokacji pamięci jest ściśle związany ze staromodnymi pomysłami Tabela 1 SORTOWANIE POZYCYJNE Zawartość obszaru wejściowego: 503 087 512 061 908 170 897 275 653 426 154 509 612 677 765 Liczniki cyfr jedności: 1 1 2 3 1 2 1 3 1 1 Alokacja pamięci zgodna z wartościami liczników:1 2 4 7 8 10 11 14 15 16 Zawartość obszaru pomocniczego: 170 061 512 612 503 653 703 154 275 765 426 087 897 677 908 Liczniki cyfr dziesiątek: 4 2 1 0 0 2 2 3 1 1 Alokacja pamięci zgodna z wartościami liczników: 467 7 7 9 11 14 15 16 Zawartość obszaru wejściowego: 503 703 908 509 512 612 426 653 154 061 765 170 275 677 087 Liczniki cyfr setek: 2 2 1 0 1 3 3 2 1 1 Alokacja pamięci zgodna z wartościami tych liczników: 2 4 5 5 6 9 12 14 15 16 Zawartość obszaru pomocniczego: 061 087 154 170 275 426 503 509 512 612 653 677 703 765 897
703
509
897
908
5.2.5
SORTOWANIE PRZEZ ROZRZUCANIE
181
reprezentacji danych sekwencyjnych. Wiemy, że alokacja dowiązaniowa została specjalnie zaproponowana do realizacji tabel o zmiennych rozmiarach, tak więc wybór dowiązaniowej struktury danych jest naturalny dla sortowania pozycyj nego. Ponieważ przez każdą kupkę przebiegamy sekwencyjnie, wszystko, czego potrzebujemy dla każdego elementu, to pojedyncze dowiązanie do jego następ nika. Ponadto nigdy nie potrzebujem y przemieszczać samych rekordów; jedynie aktualizujemy dowiązania i przebiegamy po listach. Tak więc potrzebujem y pa mięci dla (l + e)N + 2eM rekordów, gdzie e jest wielkością pamięci przeznaczonej na jedno dowiązanie. Formalne szczegóły tej procedury są też całkiem interesu jące, ponieważ dostarczają one doskonałego przykładu operowania na typowych strukturach danych, w których łączy się alokację sekwencyjną i dowiązaniową: A lg o ry tm R (Listowe sortowanie pozycyjne). O r e k o r d a c h R h , . . . , i? y v z a k ł a d a się , ż e k a ż d y z a w i e r a p o l e L IN K ( d o w i ą z a n i e ) . O k l u c z a c h z a k ł a d a s ię , ż e s ą p -tk a m i
(a i , o 2 1 • ■■, Cip) 5
0 ^ di
AL,
(i )
na których jest zdefiniowany porządek leksykograficzny taki, że (d i, a 2 j • • •) cip) < (b\ , b2 j *• •) bp)
(2 )
wtedy i tylko wtedy, gdy dla pewnego j , 1 < j < p mamy di = bi
dla wszystkich i < j,
ale
d j< b j.
(3 )
Na klucze można w szczególności patrzeć jak na liczby zapisane w systemie pozycyjnym o podstawie M , a iM p_1 + a 2 M p~2 ---- b ap- i M + ap,
(4 )
a w takim przypadku porządek leksykograficzny odpowiada zwykłemu porządko wi dla liczb nieujemnych. Kluczami mogą być także słowa nad uporządkowanym alfabetem itd. Sortowanie wykonujemy, pracując z M „kupkami” rekordów, w sposób do kładnie odpowiadający działaniu maszyny do sortowania kart. Kupki są tak naprawdę kolejkami w znaczeniu z rozdziału 2 , ponieważ są one zorganizowane w taki sposób, żeby można było je przeglądać zgodnie z zasadą pierwszy wchodzi, pierwszy wychodzi. Dla każdej kupki dane są także dwie zmienne wskaźnikowe T O P [i] i BOTM [ż], 0 < i < Af, i jak w rozdziale 2 zakładamy, że L I N K ( L O C (B O T M [ i ] )
) = BOTM f t ] .
(5)
R l . [Pętla po k\ Na początku wykonaj P <— LO C ( R n ) , czyli przypisz na P wskaźnik do ostatniego rekordu. Następnie wykonaj kroki od R 2 do R 6 dla k = 1, 2 , . . . ,p. (Kroki od R2 do R 6 składają się na jeden „przebieg” ). Wykonywanie algorytmu kończymy z P wskazującym na rekord z najm niej szym kluczem, z L I N K ( P ) wskazującym na rekord z kluczem następnym w kolejności, potem z L I N K ( L I N K ( P ) ) itd.; pole L I N K w ostatnim rekordzie będzie miało wartość A.
182
SORTOWANIE
5.2.5
R y s. 32. Listowe sortowanie pozycyjne.
R 2 . [Inicjowanie pustych kupek] W ykonaj TOP [z] <— L0C(B0TM[z]) i BOTM[z] A dla 0 < i < M . R 3 . [Pozyskiwanie £;-tej cyfry z klucza] Niech wartością klucza KEY(P), w re kordzie wskazywanym przez P, będzie (a1; a 2, .. -, ap)\ wykonaj z fc-ty bit w tym kluczu, licząc od najmniej znaczącego. R 4 . [Poprawianie dowiązań] W ykonaj LINK(T0Pt [z]) <- P.
P, a następnie TOP [z]
R 5 . [Przejście do następnego rekordu] Jeśli k = 1 (pierwszy przebieg) i jeśli P = L0C(R j ) dla pewnego j ^ 1 , to wykonaj P <— L 0C (R j_i) i wróć do R3. Jeśli k > 1 (kolejne przebiegi), to wykonaj P LINK(P) i wróć do kroku R3, gdy P ^ A . R 6 . [Algorytm H] (W szystkie elementy zostały właśnie podzielone na kupki). W ykonaj algorytm H, który „wiąże ze sobą” poszczególne kupki w jed ną listę, jako przygotowanie do następnego przebiegu. Następnie wykonaj P BOTM[0], czyli przypisz na P wskaźnik do pierwszego elementu nowo utworzonej listy. (Zobacz ćwiczenie 3). | A lg o r y tm H ( Wiązanie kolejek). Danych jest M kolejek, których elementy są powiązane tak jak w algorytmie R. W tym algorytmie zostaje zmienionych co najwyżej M dowiązań w taki sposób, że B0TM[0] wskazuje na jej pierwszy element, kupka 0 poprzedza kupkę 1 . . . poprzedza kupkę M —1 . H I . [Inicjowanie] i
0.
H 2 . [Wskazanie na wierzchołek kupki] P <— TOP [z]. H 3 . [Następna kupka] Powiększ i o 1. Jeśli z = M, to wykonaj LINK(P) <— A i zakończ wykonywanie algorytmu. H 4 . [Czy kupka jest pusta?] Jeśli BOTM[z] = A, to wróć do H3. H 5 . [Związanie kupek razem] LINK(P)
B0TM[ż]. Wróć do H2.
|
SORTOWANIE PRZEZ ROZRZUCANIE
5.2.5
183
Na rysunku 33 przedstawiono zawartość czterech kupek po każdej z trzech faz, kiedy to sortowanych jest 16 naszych przykładowych liczb z M - 10 . Algo rytm R jest bardzo łatwy do zaprogramowania w języku maszyny MIX, jeśli tylko znajdzie się wygodny sposób potraktow ania, „zmieniających się” z przebiegu na przebieg, kroków R3 i R5. W programie poniżej dokonujemy tego bez straty szybkości pętli wewnętrznej, nakładając na siebie dwie instrukcje. Zauważmy, że TOP [z] i BOTMfż] można upakować w tym samym słowie. TOP [0]
TOP[1 ]
TOP [2]
TOP[3 ]
TOP[4 ]
TOP [5 ]
TOP[6 ]
TOP [7 ]
TO P[8 ]
TOP[9 ]
A y
J
15121
653 /
087 A
V
897
275
V
V
V
V
170
061
612
703
154
765
426
677
908
509
BOTM[0]
BOTM[1]
BOTM[2 ]
BOTM[3]
BOTM[4 ]
BOTM[5 ]
BOTM[6 ]
BOTM [7 ]
BOTM[8 ]
BOTM [9 ]
TOP[O]
TOP[1 ]
TOP [2 ]
TOP[3 ]
TOP[4 ]
TOP [5 ]
TOP[6 ]
TOP[7 ]
TO P[8 ]
TOP[9 ]
154
765
A
A
653
061
BOTM[5 ]
BOTM[6 ]
BOTM[7 ]
BOTM[8 ]
BOTM[9 ]
TOP [5 ]
TOP[6 ]
TOP[7 ]
TO P[8 ]
TOP[9 ]
^
V
V
y|\
y|v
/|\.
4
509 A
908
I
512
703
ZE 612 T
T BOTM[0]
TOP [0 ]
v
V
503
BOTM[1 ]
TOP [1 ]
v 426
ZE BOTM[2]
TOP[2 ]
V
BOTM[3 ]
BOTM[4 ]
-L
J_
TOP[3 ]
TOP[4 ]
A
512
v 897
r
T
A
677
A
V
170
ZE 154 T BOTM[1 ]
V
087
509
v 426
275
ZT
BOTM[2]
ZE 503
v
T
A
BOTM[3 ]
BOTM [4 ]
BOTM [5 ]
± 1653 612 T BOTM[6 ]
BOTM[7 ]
v
v
897
908
r BOTM[8 ]
BOTM[9 ]
t
R y s. 33. Listowe sortowanie pozycyjne: zawartości dziesięciu kupek po każdym prze biegu.
P r o g r a m R (Listowe sortowanie pozycyjne). Rekordy dane są na pozycjach od INPUT+1 do INPUT+N i zakłada się o nich, że m ają p = 3 składowe ( a i , a 2, a 3) pamiętane odpowiednio w polach (1:1), (2 : 2 ) i (3:3). (Zatem o M zakłada się, że jest nie większe od rozmiaru b a jtu na maszynie MIX). Polem (4:5) w każdym
184
SORTOWANIE
5.2.5
rekordzie jest LINK. Przyjmujemy, że TOP [i] = PILES + ¿(1:2) i B0TM[i] = PILES + ¿(4:5) dla 0 < ¿ < M. Jest wygodnie, żeby mieć dowiązania zależne od lokacji INPUT, tak że L0C(B0TMKI ) = PILES + ¿ —INPUT. Żeby uniknąć ujemnych dowiązań, chcemy, żeby tablica PILES była umiejscowiona powyżej tablicy INPUT. Znaczenie rejestrów indeksowych jest następujące: r l l = P, rI2 = ¿, rI3 = 3 —fc, rI4 = TOP [¿]; podczas wykonywania algorytmu H jest rI2 = ¿ —M. 01 02 03 04 05 06 07 08 09 10 11 12 13 U 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
LINK EQU 4 : 5 TOP EQU 1 :2 1 START ENT1N R l . Pętla po k. P = LQC(Rn)* 1 ENT32 k+~l. R2. Inicjuj puste kupki. 2H ENT2M-1 3 ENTAPILES-INPUT,2 L0C(B0TM [¿] ) 3M STA P IL E S,2 (TOP) 3M —►TOP[¿] STZ P IL E S,2 (LINK) BOTM[¿] +-A. 3M DEC21 3M J2NN*-4 3M LDA R3SW,3 3 STA 3F Modyfikacja instrukcji do przebiegu 3 LDA R5SW,3 3 STA 5F 3 3H [LD2 INPUT,1 ( 3 : 3 ) ] R3. Pozyskaj k-ta cyfrę z klucza. 4H LD4 P IL E S,2 (TOP) R4. Popraw dowiazania. 3N ST1 INPUT,4 (LINK) 3N LINK (TOP [i]) <—P. ST1 P IL E S,2 (TOP) 3N TOPK] 4-P. 5H [DEC11] R5. Przejdź do następnego rekordu. Do R3, jeśli koniec przebiegu. J1NZ3B 3N R6. Algorytm H. 6H ENN2M 3 JMP 7F 3 Do H2 z i <—0. R3SW LD2 INPUT,1 ( 1 : 1 ) N Instrukcja dla R3, gdy k = 3. LD2 INPUT,1 ( 2 : 2 ) N Instrukcja dla R3, gdy k = 2. N Instrukcja dla R3, gdy k = 1. LD2 INPUT,1 ( 3 : 3 ) N R5SW LD1 INPUT,1 (LINK) Instrukcja dla R5, gdy k ~ 3. LD1 INPUT,1 (LINK) N Instrukcja dla R5, gdy k = 2. N Instrukcja dla R5, gdy k = 1. DEC11 9H LDA PILES+M, 2 (LINK) 3 M -3 H4. Czy kupka jest pusta? JAZ 8 F 3M —3 Do H3, jeśli B0 TM[i] = A. 3M —3—E 1 H5. Wiąż kupki. STA INPUT,1 (LINK) 7H LD1 PILES+M,2 (TOP) 3 M - E H2. Wskaż na wierzchołek kupki. H3. Następna kupka. ¿<—¿+ 1 . 8H INC21 3M Do H4, jeśli i ^ M . J2NZ9B 3M STZ INPUT,1 (LINK) 3 LINK(P) <-A. P BOTM[0] . LD1 PILES(LINK) 3 DEC31 3 Pętla dla 1 ^ k ^ 3. | J3NN2B 3
Czas działania program u R wynosi 32N + 48M + 38 — 4E, gdzie N jest liczbą rekordów wejściowych, M jest podstaw ą systemu pozycyjnego (liczbą
5.2.5
SORTOWANIE PRZEZ ROZRZUCANIE
185
kupek), a E jest liczbą, wystąpień niepustych kupek. To jest dużo lepiej niż przy innych programach zaprojektowanych przy podobnych założeniach (pro gramy 5.2.IM, 5.2.4L). W ersja p-przebiegowa tego programu działałaby w czasie ( l i p —1 ) N + 0 (p M ); kluczowym czynnikiem dla czasu działania jest wewnętrzna pętla, w której pięciokrotnie odwołujemy się do pamięci i jest wykonywana jedna instrukcja wyboru. Dla typowego kom putera będziemy mieli M — br i p = \ t / r ] , gdzie t jest liczbą cyfr w kluczach w systemie pozycyjnym o podstawie 6; zwiększając r, zmniejszamy p, tak więc powyższych wzorów można użyć do wyznaczenia najlepszej wartości r. Jedyną zmienną w funkcji czasu jest £ , liczba kupek pojaw iających się w kroku H4. Jeśli przyjmiemy, że każdy z M N ciągów cyfr w systemie o podstawie M jest jednakowo prawdopodobnych, to z naszych badań dotyczących „testu pokerowego” z punktu 3.3.2D wynika, że w każdym przebiegu pojaw ia się M —r pustych kupek z prawdopodobieństwem
gdzie jest liczbą Stirlinga drugiego rodzaju. Na podstawie ćwiczenia 6 dostajemy, że m ax(M —N , 0)p,
(7)
W ostatnich latach pojawia się coraz więcej komputerów z przetwarzaniem potokowym. Maszyny te są wyposażone w wielowejściowe jednostki arytm etyczne i układy wstępnego przetwarzania, tak że odwołania do pamięci i obliczenia mogą być wysoce zrównoleglone; na spadek efektywności takich maszyn zauważalny wpływ m ają instrukcje wyboru, chyba że wybory kierują zawsze w tę sam ą stro nę. W ewnętrzna pętla w sortowaniu pozycyjnym dobrze nadaje się do realizacji na takich maszynach, ponieważ składa się ze zwykłych obliczeń iteracyjnych zawierających typowe operacje arytm etyczne. Dlatego też na takich maszynach sortowanie pozycyjne jest zazwyczaj efektywniejsze od innych znanych metod sortowania wewnętrznego, pod warunkiem, że N jest nie za małe i klucze nie są za duże. Oczywiście sortowanie pozycyjne nie jest zbyt efektywne, gdy klucze są za długie. Na przykład wyobraźmy sobie 60-cyfrowe liczby dziesiętne sortowane po zycyjnie w 20 przebiegach, przy M = 103; zazwyczaj bardzo niewiele par takich liczb pokrywa się na 9 najbardziej znaczących pozycjach, tak więc pierwszych 17 przebiegów niewiele znaczy. W naszej analizie sortowania pozycyjnego przez zamienianie zauważyliśmy, że nie m a potrzeby oglądania wielu bitów w kluczach, które przeglądamy od strony lewej zam iast od prawej. Dlatego rozważmy raz jesz cze pomysł sortowania pozycyjnego, które rozpoczyna się od cyfry najbardziej znaczącej zamiast od najmniej znaczącej. Uczyniliśmy już uwagę, że m etoda „od cyfry najbardziej znaczącej” wydaje się naturalna; rzeczywiście nie jest trudno zobaczyć, dlaczego listy na poczcie są sortowane właśnie tą m etodą. W USA duży zbiór listów sortuje się najpierw do
186
SORTOWANIE
5.2.5
oddzielnych worków, które odpowiadają różnym obszarom geograficznym; każdy z tych worków zawiera mniejszą liczbę listów, które następnie są niezależnie sortowane do innych worków odpowiadających coraz mniejszym jednostkom po działu adm inistracyjnego kraju. (W rzeczywistości, worki z listami mogą zostać przetransportow ane blisko celu ich przeznaczenia przed ich dalszym sortowa niem). Zasada „dziel i zwyciężaj” jest bardzo pociągająca i jedynym powodem, dla którego nie pracuje ona zbyt dobrze w sortowaniu kart dziurkowanych, jest to, że zbyt dużo czasu poświęca się bardzo m ałym kupkom. Algorytm R jest stosunkowo efektywniejszy, chociaż zaczyna się od najmniej znaczącej cyfry. Dzieje się tak dlatego, że nigdy nie mamy więcej niż M kupek, a kupki muszą być wiązane ze sobą tylko p razy. Z drugiej strony nietrudno jest zaimplementować metodę z najbardziej znaczącą cyfrą jako pierwszą, za pomocą (ujemnych) do wiązań, jak w algorytmie 5.2.4L, do oznaczenia granic między kupkami. (Zobacz ćwiczenie 10). Główna trudność polega na tym, że puste kupki m ają tendencję do rozm nażania się i w metodzie z najbardziej znaczącą cyfrą jako pierwszą pochłaniają zbyt dużo czasu. Prawdopodobnie najlepszy kompromis został zaproponowany przez M. D. M acLarena [JACM 13 (1966), 404-411], który polecał, żeby używać sortowania z najm niej znaczącą cyfrą jako pierwszą, tak jak w algorytmie R, ale stosować go tylko do najbardziej znaczących cyfr. Po tym ciąg nie będzie w pełni posortowany, ale bliski uporządkowania, tak że pozostanie w nim niewiele inwersji; dlatego do dokończenia sortowania można użyć prostego wstawiania. Nasza analiza pro gramu 5.2.IM m a zastosowanie do tej sytuacji, tak więc, jeśli klucze są o roz kładzie jednostajnym , to po posortowaniu względem p najbardziej znaczących cyfr, średnia liczba pozostałych inwersji wynosi ^ N ( N — 1 ) M ~ P. (Zobacz rów nanie 5 .2 . 1 - ( i 7 ) i ćwiczenie 5.2.1-38). M acLaren obliczył średnią liczbę odwołań do pamięci na jeden sortowany element, a optymalnymi kandydatam i na M i p (przy założeniu, że M jest potęgą 2 , klucze są o rozkładzie jednostajnym i N / M p < 0 . 1 tak, że odchylenia od rozkładu jednostajnego są akceptowalne) okazały się wartości podane w poniższej tabeli: o
H
108
109
215
217
219
2
2
2
2
18.0
18.0
18.0
18.0
N = 100
1000
10000
100000
1000000
najlepsze M = 32 najlepsze p = 2 m = 19.3
128
512
1024
8192
2
2
2
18.5
18.2
18.1
T utaj f3(N) oznacza średnią liczbę odwołań do pamięci na sortowany element, n/i\ t\ ro 2p M N — 1 Hjy /}(J\0 = 5p + 8 + — + - ^ - — ;
(8)
a ta wartość jest ograniczona przy N —>oo, jeśli weźmiemy p = 2 i M > y/N. Tak więc średni czas sortowania wynosi wtedy O (N ), a nie N \ o g N . Zaprezentowana m etoda jest ulepszeniem sortowania z wieloma listami (program 5.2.IM), dla którego jest szczególnym przypadkiem z p =' 1. W ćwiczeniu 12 przedstawiamy interesującą procedurę, zaproponowaną przez MacLarena, dla końcowego upo rządkowania już częściowo posortowanego ciągu.
5.2.5
SORTOWANIE PRZEZ ROZRZUCANIE
187
Można także uniknąć pól z dowiązaniami, korzystając z m etod z algorytmu 5.2D i ćwiczenia 5.2-13, tak że potrzebna jest tylko dodatkowa pamięć roz miaru 0 (a/ 1V), poza pamięcią na zapam iętanie samych rekordów. Średni czas sortowania jest proporcjonalny do N , jeśli rozkład wejściowych rekordów jest jednostajny. Dobre wyniki otrzym ał W. Dobosiewicz [zobacz Inf. Proc. Letters 7 (1978), 1 -6 ; 8 (1979), 170-172], stosując sortowanie z najbardziej znaczącą cyfrą jako pierwszą, aż do uzyskania krótkich podciągów. Proces rozrzucania gwarantował, że pierwsze M / 2 kupek zawierało od 25% do 75% rekordów. To zapewniało, że średni czas sortowania kluczy o rozkładzie jednostajnym wynosił O (n), podczas gdy czas pesymistyczny wynosił 0 ( N log N ). Praca Dobosiewicza zainspirowała kilku innych badaczy do wymyślenia nowych algorytmów opartych na oblicza niu adresów, z których być może najbardziej pouczającym jest 2-poziomowy schemat pochodzący od M arkku Tamminena [J. Algorithms 6 (1985), 138-144]: Załóżmy, że wszystkie klucze są ułam kam i z przedziału [0.. 1). Najpierw rozrzucamy N rekordów do [A7/8J koszyków, wrzucając klucz K do koszyka [ K N /S J . Przypuśćmy teraz, że do koszyka k trafiło Nk rekordów; jeśli Nk < 16, to sortujemy ten koszyk za pomocą prostego wstawiania, w przeciwnym razie stosujemy rozrzucania typu MacLarena do M 2 koszyków w połączeniu z prostym wstawianiem, gdzie M 2 w 10iVfc. Tamminen udowodnił następujący, godny uwagi wynik: T w ie rd z e n ie T . Istnieje stała T taka, że w metodzie sortowania opisanej powyżej jest wykonywanych średnio co najwyżej T N operacji, jeśli tylko klu cze są niezależnymi liczbami losowymi, dla których funkcja gęstości f ( x ) jest ograniczona i całkowalna w sensie Riemanna dla 0 < x < 1. (Stała T nie zależy od / ) . Dowód. Zobacz ćwiczenie 18. Intuicyjnie, po pierwszym rozrzuceniu na N / S kupek znajdujemy przedziały, w których / jest w przybliżeniu stała; po drugim rozrzuceniu oczekiwany rozmiar koszyka będzie w przybliżeniu stały. | Kilka wersji sortowania pozycyjnego, które zostały pomyślane specjalnie do sortowania alfabetycznego dużych tablic napisów, zostało opisanych w pouczają cym artykule P. M. Mcllroya, K. Bostica i M. D. Mcllroya, Computing System s 6 (1993), 5 -2 7 . ĆW ICZENIA ► 1 . [20] W algorytmie z ćwiczenia 5.2-13 pokazano, w jaki sposób wykonać sortowanie przez rozrzucanie, w którym zapamiętuje się tylko N rekordów (i M liczników), zamiast skorzystać z pamięci dla 2N rekordów. Czy w ten sposób można ulepszyć algorytm sortowania pozycyjnego zilustrowany w tabeli 1 ? 2 . [13] Czy algorytm R jest stabilny?
3. [15] Wyjaśnij, dlaczego w algorytmie H na B0TM[0] zapamiętuje się wskaźnik na pierwszy rekord w „powiązanej” kolejce, mimo że kupka 0 mogła być pusta.
188
SORTOWANIE
5.2.5
► 4. [23] W algorytmie R utrzymuje się M kupek zorganizowanych w kolejki (pierwszy wchodzi, pierwszy wychodzi). Zbadaj pomysł zorganizowania kupek w stosy. (Strzałki na rysunku 33 byłyby skierowane w dół zamiast w górę, a tablica BOTM nie byłaby więcej potrzebna). Pokaż, że jeśli kupki „zwiążemy z sobą” we właściwej kolejności, to jest możliwe otrzymanie poprawnej metody sortowania. Czy w ten sposób dostaniemy prostszy lub szybszy algorytm? 5. [20] Jakie zmiany są konieczne w programie R, żeby można go użyć do sortowania kluczy ośmiobajtowych, a nie trzybajtowych? Załóżmy, że najbardziej znaczące bajty z klucza Ki są umiejscowione w KEY + ¿(1:5), natomiast trzy najmniej znaczące bajty bez zmian znajdują się w INPUT + ¿(1:3). Jaki jest czas działania tego programu po zmianach? 6 . [M2Ą\ Niech Qm n ( z ) = Y^PMNkZk , gdzie pMNk jest prawdopodobieństwem, że
pojawi się dokładnie k pustych kupek po jednym przebiegu sortowania pozycyjnego, zastosowanego do losowych danych rozmiaru N , przy podstawie systemu M. a) Pokaż, że g M ( N+ i ) { z ) = 5 mjv(^) + ((1 - z) /M )g 'MN(z). b) Wykorzystaj powyższą zależność, żeby znaleźć proste wzory na wartość oczekiwaną i wariancję dla takiego rozkładu prawdopodobieństwa, jako funkcje M i N. 7 . [20] Omów podobieństwa i różnice między algorytmem R a sortowaniem pozy cyjnym przez zamienianie (algorytm 5.2.2R). ► 8 . [20] W algorytmach sortowania pozycyjnego omawianych w tekście zakłada się, że wszystkie sortowane klucze są nieujemne. Jakich zmian należałoby dokonać w tych algorytmach, gdyby klucze były liczbami zapisanymi w notacji uzupełnieniowej do dwójki lub w notacji uzupełnieniowej do jedynki? 9. [20] Kontynuując ćwiczenie 8 , jakich zmian należałoby dokonać, gdyby liczby były zapisane w notacji znak-moduł? 10. [30] Ułóż efektywny, dowiązaniowy algorytm sortowania pozycyjnego typu „naj bardziej znacząca cyfra pierwsza”. (Gdy rozmiary podciągów maleją, mądrze jest zmniejszać M i stosować inne metody niż pozycyjne dla rzeczywiście krótkich podciągów). 11.
16 W ciągu szesnastu liczb wejściowych z tabeli 1 jest 41 inwersji; po zakończeniu sortowania wszystkie inwersje znikają. Ile inwersji pozostałoby, gdybyśmy wykonali sor towanie pozycyjne bez pierwszego przebiegu, czyli sortowali tylko po cyfrach dziesiątek i setek? Ile inwersji pozostałoby, gdybyśmy wykonali sortowanie pozycyjne bez dwóch pierwszych przebiegów? [
]
1 2 . [24] (M. D. MacLaren) Załóżmy, że algorytm R został zastosowany tylko dla p najbardziej znaczących cyfr; tak więc ciąg wejściowy jest teraz prawie posortowany, kiedy przechodzimy przez niego po dowiązaniach, jednakże klucze, które pokrywają się na pierwszych p cyfrach, mogą nie być uporządkowane. Ułóż algorytm, który przemieści rekordy w miejscu w taki sposób, żeby ich klucze były w porządku K i < K 2 < ■■■< K n • [Wskazówka: Specjalny przypadek, w którym ciąg jest w pełni posortowany, jest omawiany w odpowiedzi do ćwiczenia 5.2-12; bez straty efektywności można połączyć to rozwiązanie z prostym wstawianiem, ponieważ w ciągu pozostało już bardzo niewiele inwersji].
13. [40] Zaimplementuj metodę sortowania wewnętrznego zaproponowaną pod koniec tego punktu, otrzymując w ten sposób podprogram, który sortuje losowe dane w czasie O (N ), używając dodatkowej pamięci o rozmiarze tylko 0 ( y / N ).
5.2.5
SORTOWANIE PRZEZ ROZRZUCANIE
189
14. [22] Poniższy ciąg kart do gry
można posortować w porządku rosnącym A 2 . . . J Q K, patrząc od góry do dołu, za pomocą dwóch przebiegów, rozrzucając je tylko na dwie kupki. Należy rozrzucić karty przodem do dołu na dwie kupki zawierające odpowiednio A 2 9 3 10 i 4 J 5 6 Q K 7 8 (z dołu do góry); następnie należy położyć drugą kupkę na pierwszą, odwrócić przodem do góry i rozrzucić na dwie kupki A 2 3 4 5 6 7 8 , 9 10 JQK. Na koniec łączymy obie kupki, odwracamy przodem do góry i osiągamy to, co zamierzyliśmy. Udowodnij, że tego ciągu kart nie można posortować w dwóch przebiegach w po rządku malejącym K Q J . . . 2 A, patrząc z góry na dół, nawet jeśli dopuścimy możliwość użycia trzech kupek. (Karty muszą być zawsze pobierane z wierzchu talii i odwracane przodem do dołu po każdym rozrzuceniu. Na rysunku kierunkowi z góry do dołu odpowiada kierunek z prawa na lewo). 15. [M25] Rozważmy problem z ćwiczenia 14, gdy wszystkie karty muszą być roz rzucane przodem do góry, a nie przodem do dołu. Tak więc jeden przebieg wystarczy, żeby zmienić porządek rosnący na porządek malejący. Ile przebiegów potrzeba teraz do uporządkowania kart? ►16. [25] Ułóż algorytm sortowania słów a±, . . . , a n nad alfabetem m-literowym, w porządku leksykograficznym. Czas działania twojego algorytmu powinien wynosić 0 ( m + n + N ), gdzie N = \ai\ + • ■■+ |a n | jest łączną długością wszystkich słów. 17. [15] Dlaczego w dwupoziomowym sortowaniu przez rozrzucanie, zaproponowa nym przez Tamminena (zobacz twierdzenie T), na drugim poziomie rozrzucania wyko rzystano metodę podobną do metody MacLarena, ale nie wykorzystano jej na poziomie pierwszym? 18. [HM26] Udowodnij twierdzenie T. Wskazówka: Pokaż, że algorytm MacLarena rozrzucania ze wstawianiem wykonuje średnio O ( B N ) operacji, gdy zastosujemy go do niezależnych, losowych kluczy, dla których funkcja gęstości prawdopodobieństwa spełnia warunek f ( x ) ^ B dla 0 x ^ 1 .
Do posortowania źródłosłowów i słów wykorzystaliśmy 1100 pudełek oraz tace ze wzorcami.
— G E O R G E V. W IG R A M (1 8 4 3 )
190
SORTOWANIE
5.3
5.3. SORTOW ANIE O PTY M A LN E
Po tym jak zanalizowaliśmy bardzo wiele m etod sortowania wewnętrznego, nad szedł czas poszukania odpowiedzi na ogólniejsze pytanie: Jaki jest najlepszy sposób sortowania? Czy możemy podać ograniczenie na maksymalną szybkość sortowania, której nie da się przekroczyć, niezależnie od tego, jak dobry byłby program ista? Oczywiście nie istnieje najlepsza m etoda sortowania; musimy dokładnie zdefiniować, co znaczy „najlepsza” , a nie istnieje żaden najlepszy sposób zde finiowania „najlepsza” . Podobne pytania o teoretyczną optymalność algorytmów stawialiśmy już w punktach 4.3.3, 4.6.3 i 4.6.4, gdzie rozważaliśmy mnożenie o dużej dokładności i obliczanie wartości wielomianu. W każdym przypadku okazało się niezbędnym sformułowanie dość prostej definicji „najlepszego możli wego” algorytmu, po to żeby opisać w ystarczającą strukturę, która umożliwiała badanie rozważanych problemów. W każdym przypadku napotkaliśmy też na in teresujące problemy, które okazywały się tak trudne, że dotychczas nie są jeszcze w pełni rozwiązane. Taka sama sytuacja zachodzi dla sortowania; dokonano wielu interesujących odkryć, ale wiele fascynujących pytań pozostaje bez odpowiedzi. Badania nad złożonością sortowania, która wynika tylko z jego natury, były ukierunkowane zazwyczaj na minimalizowanie liczby porównań między kluczami potrzebnych do posortowania n elementów, scalenia m elementów z n elementami lub w ybrania A;-tego elementu spośród nieuporządkowanego zbioru n elementów. W punktach 5.3.1, 5.3.2 i 5.3.3 omawiamy te zagadnienia bez żadnych dodat kowych założeń, natom iast punkt 5.3.4 poświęcamy podobnemu tematowi przy dodatkowym, interesującym uwarunkowaniu, że kolejność wykonywanych porów nań musi być z góry ustalona. W ćwiczeniach do punktu 5.3.4 i w rozważaniach na tem at sortowania zewnętrznego (punkty 5.4.4, 5.4.8 i 5.4.9) poznamy kilka in nych typów interesujących, teoretycznych pytań odnoszących się do optymalnego sortowania. Skoro tylko pojawi się Maszyna Analityczna, będzie m iała wpływ na kierunek rozwoju nauki. Jeśli jakikolw iek wynik będzie możiiwy do osiągnięcia z je j pomocą, natychmiast pojawi się pytanie ~ W ja k i sposób przeprowadzać obliczenia, żeby te wyniki dostać w ja k najkrótszym czasie? — C H A R LE S B A B B A G E (1 8 64 )
5.3.1. Sortowanie z minimalną liczbą porównań
M inimalna liczba porównań kluczy potrzebna do posortowania n elementów wynosi oczywiście zero, ponieważ w m etodach pozycyjnych żadne porównania nie są potrzebne. Można nawet napisać program sortujący w języku maszyny MIX, który nie zawiera w ogóle warunkowych instrukcji skoku. (Zobacz ćwiczenie 5-8 z początku tego rozdziału). Dotychczas poznaliśmy też kilka m etod sortowania, które rzeczywiście są oparte na porównaniach kluczy, chociaż w praktyce domi nujący wpływ na ich czas działania m ają inne operacje, takie jak przemieszczenia danych, sterowanie itp.
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
191
Dlatego jest jasne, że liczenie porównań nie jest jedyną drogą mierzenia efektywności m etod sortowania. Mimo to przeprowadzenie pogłębionej analizy liczby porównań daje wiele satysfakcji, ponieważ badania teoretyczne na ten tem at dostarczają sporo wiadomości o naturze procesów sortowania, jak i są pomocne w zrozumieniu bardziej przyziemnych problemów, na które napotykamy w innych przypadkach. Żeby wykluczyć m etody pozycyjne, w których nie wykonuje się w ogóle porównań, ograniczymy nasze rozważania do technik sortowania, które wyłącznie są oparte na abstrakcyjnej relacji liniowego porządku zdefiniowanej na kluczach, tak jak opisaliśmy to na początku tego rozdziału. Dla prostoty ograni czymy naszą dyskusję do przypadku różnych kluczy, tak że wynikiem porównania dwóch kluczy Ki i K j jest albo Ki < K j , albo Ki > Kj . (Rozwinięcie omawianej teorii na ogólny przypadek, gdy dozwolone są takie same klucze, znajdziemy w ćwiczeniach od 3 do 12. Z ograniczeniami na pesymistyczny czas działania po trzebny na sortowanie liczb całkowitych, bez ograniczania się do m etod opartych na porównywaniu kluczy, można zapoznać się w pracach Fredm ana i W illarda, J. Computer and Syst. Sci. 47 (1993), 424-436, Ben-Amrama i Galila, J. Comp. S y s t Sci. 54 (1997), 345-370, jak i Thorupa, SODA 9 (1998), 550-555). Problem sortowania przez porównywanie można także wyrazić na inne, rów noważne sposoby. Dany jest zbiór n różnych odważników i waga szalkowa, pytam y o najmniejszą liczbę ważeń potrzebną do uporządkowania odważników względem wag, przy założeniu, że na szalki można kłaść tylko po jednym odważniku. Alternatywnie, dany jest zbiór n graczy startujących w turnieju, pytam y o naj mniejszą liczbę gier, które są potrzebne do ustalenia rankingu zawodników, przy założeniu, że umiejętności graczy można liniowo uporządkować i nie m a dwóch graczy o takich samych umiejętnościach. Każdą metodę sortowania dla n-elementów, która spełnia powyższe warun ki, można reprezentować za pomocą rozszerzonego drzewa binarnego, takiego jak na rysunku 34. Każdy węzeł wewnętrzny (okrąg na rysunku) zawiera dwa indeksy „ i: j ” oznaczające porównanie K i z K j. Lewe poddrzewo tego węzła reprezentuje kolejne porównania do wykonania, gdy K i < K j , natom iast prawe poddrzewo reprezentuje akcje, które należy podjąć, gdy Ki > K j. W każdym węźle zewnętrznym (prostokąt na rysunku) znajduje się perm utacja d\ 0,2 .. . an Poziom 0
Poziom 1
Poziom 2
Poziom 3
R y s. 34. Drzewo porównań do sortowania trzech elementów.
192
SORTOWANIE
5.3.1
R y s. 35. Przykład redundantnego porównania,
zbioru { 1 , 2 , . . . , n}, oznaczająca, że został ustalony porządek K ai < K a2 < - - - < K an. (Jeśli popatrzym y na ścieżkę prowadzącą od korzenia do takiego węzła zewnętrz nego, to okaże się, że każda z n — 1 zależności K ai < K ai+1, dla 1 < i < n, jest wynikiem pewnego porównania a ^a^+ i lub a ^ y .a i na tej ścieżce). W metodzie z rysunku 34 najpierw porównuje się K i z ^ i jeśli K i > K 2 , to przechodzimy (do prawego poddrzewa) do porównania K 2 z Ks, a następnie, jeśli K 2 < K s, to porównujemy K i z Ks', na koniec, jeśli K i > Ks, otrzymujemy K 2 < K s < K i. W rzeczywistym algorytmie sortowania są zazwyczaj przemieszczane także klucze, ale tu ta j interesują nas tylko porównania, tak więc ignorujemy ruch danych. Porównanie K i z K j w drzewie oznacza zawsze, że mamy do czynienia z oryginalnymi kluczami Ki i K j, a nie kluczami aktualnie znajdującym i się na pozycjach i oraz j , po przesunięciu rekordów. Możliwe jest wykonywanie redundantnych porównań; w przykładzie z ry sunku 35 nie ma powodu, żeby dokonywać porównania 3:1, ponieważ z tego, że K i < K 2 i K 2 < K s wynika, że K 1 < K 3. Nie istnieje żadna perm utacja, która odpowiada lewemu poddrzewu węzła 3:1 z rysunku 35, a zatem ta część algo rytm u nigdy nie będzie wykonywana! Ponieważ interesuje nas minimalizowanie liczby porównań, to możemy założyć, że żadne redundantne porównania nie są wykonywane. Zatem mamy do czynienia z rozszerzonymi drzewami binarnymi, w których każdy węzeł zewnętrzny odpowiada permutacji. Każda perm utacja kluczy wejściowych jest możliwa i definiuje jednoznacznie ścieżkę z korzenia do węzła zewnętrznego. W ynika stąd, że w każdym drzewie (bez redundantnych) porównań sortującym n elementów, jest dokładnie n\ węzłów zewnętrznych. N a jle p ie j w p e s y m is ty c z n y m p r z y p a d k u . Pierwszy naturalnie pojawia jący się problem polega na zminimalizowaniu maksymalnej liczby wykonanych porównań. (Później zajmiemy się średnią liczbą porównań). Niech S(n ) będzie minim alną liczbą porównań w ystarczającą do posortowa nia n elementów. Jeśli wszystkie węzły wewnętrzne w drzewie porównań znajdują się na poziomach < k, to wtedy oczywiście węzłów zewnętrznych w drzewie jest co najwyżej 2k . Zatem, biorąc k = S ( n ), dostajemy n\ <
2 s{n).
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
193
Ponieważ S(n ) jest liczbą całkowitą, to możemy inaczej zapisać tę nierówność i dostajemy dolne ograniczenie S{n) > \\g n\}.
(i)
figti!"] = n l g n - n / l n 2 + \ Ign + 0 ( 1 ),
(2 )
Wzór Stirlinga mówi nam, że
i dalej, że potrzebnych jest prawie n l g n porównań. Zależność ( 1 ) jest często nazywana teorio-informacyjną dolną granicą, ponie waż znawca teorii informacji powiedziałby, że w procesie sortowania zebranych zostaje lgn! „bitów informacji” , każde porównanie daje co najwyżej jeden bit informacji. Drzewa, takie jak to z rysunku 34, nazywane są także „kwestio nariuszami” ; matem atyczne własności kwestionariuszy zostały po raz pierwszy systematycznie zbadane w książce Claude’a Picarda Théorie des Questionnaires (Paris: Gauthier-Villars, 1965). Biorąc pod uwagę wszystkie m etody sortowania, które poznaliśmy, najm niej sza liczba porównań jest wykonywana w trzech z nich: we wstawianiu binarnym (zobacz punkt 5.2.1), wybieraniu drzewowym (zobacz punkt 5.2.3) i sortowaniu przez scalanie (zobacz algorytm 5.2 .4L). Można zauważyć, że liczba porównań w sortowaniu przez binarne wstawianie wynosi n
B (n ) = 5 Z r igfcl = n \ ls n ] - 2 l’ lg" 1 + 1 , fc= l
(3 )
co otrzymujemy na podstawie ćwiczenia 1.2.4-42, natom iast m aksym alną licz bę porównań w sortowaniu przez scalanie analizujemy w ćwiczeniu 5.2.4-14. W punkcie 5.3.3 przekonamy się, że w sortowaniu przez wybieranie drzewowe mamy takie same ograniczenia na liczbę porównań jak we wstawianiu binarnym lub w sortowaniu przez scalanie, w zależności od organizacji drzewa. We wszyst kich trzech przypadkach jest osiągana asym ptotyczna wartość n l g n ; biorąc pod uwagę te dolne i górne granice dla 5 (n ), dostajemy, że lim = 1. n^oo n l g n
(4 )
Tak więc mamy już przybliżony wzór na S (n), ale jest pożądane, żeby dostać bardziej precyzyjną informację. W poniższej tabeli zebrano dokładne wartości dolnych i górnych granic omawianych powyżej, policzone dla m ałych wartości n: n = l2 3 4 fig n!~| = 0 1 3 5 B(n)=0 1 3 5 L{n) = 01 3 5
5 6 7 8 9 7 10 13 16 19 8 11 14 17 21 9 11 14 17 25
10 22 25 27
11 26 29 30
12 29 33 33
13 14 33 37 37 41 38 41
15 41 45 45
16 17 45 49 49 54 49 65
Tutaj B (n ) i L(n) odnoszą się odpowiednio do binarnego wstawiania i sortowa nia przez scalanie. Można pokazać, że B (ń ) < L(ń) dla wszystkich n (zobacz ćwiczenie 2).
194
SORTOWANIE
5.3.1
Z powyższej tabeli wynika, że 5(4) — 5, ale 5(5) może wynosić albo 7, albo 8 . To sprowadza nas z powrotem do problemu postawionego na początku podrozdziału 5.2: Jaki jest najlepszy sposób posortowania pięciu elementów? Czy można posortować pięć elementów za pomocą tylko siedmiu porównań? Odpowiedź brzmi tak, ale siedmiokrokowa procedura nie jest zbyt łatwa do odkrycia. Rozpoczynamy, tak jak byśmy sortowali cztery elementy przez scalanie. Najpierw porównujemy K \ : K 2, potem a następnie większe elementy z obu par. Po tym dostajem y sytuację zilustrowaną na poniższym diagramie 6
d
(5) e
oznaczającym, że a < b < d i c < d. (Wygodnie jest reprezentować poznaną relację porządku za pomocą grafu skierowanego takiego jak ten, gdzie o x wia domo, że jest mniejsze od y wtedy i tylko wtedy, gdy istnieje w grafie ścieżka z x do y). Teraz wstawiamy piąty element = e na jego właściwe miejsce wśród {a, 5, d}; do tego celu są potrzebne tylko dwa porównania, ponieważ można najpierw porównać go z 6, a następnie z a lub d. W ten sposób dostajemy jeden z czterech przypadków, b
d
e
b
d
b
—>j»
e
•—
d
b
d
•—>3»—>•
e
(6) i w każdym z nich możemy wstawić c między elementy mniejsze od d za pomocą dodatkowych dwóch porównań. Ta m etoda sortowania pięciu elementów została pierwszy raz znaleziona przez H. B. D em utha [Ph.D. thesis, Stanford University (1956), 41-43]. S calan ie ze w sta w ia n iem . Ładne uogólnienie powyższej m etody zostało od kryte przez Lestera Forda, Jr. i Selmera Johnsona. Ponieważ zawiera ona pew ne aspekty scalania i pewne aspekty wstawiania, to nazwiemy ją scalaniem ze wstawianiem. Dla przykładu rozpatrzm y problem sortowania 21 elementów. Rozpoczynamy od porównań w parach K i : K 2, K %: . . . , K i g : K 2o]następnie sortujem y większe elementy zpar za pomocą scalania ze wstawianiem. W wyniku dostajem y konfigurację ai
a2
ag
a4
¿*5 &6
ag
&7
ag
aio
/ 7777/ 7777.
b1
62
bg
64
65
be
67
bg
69
<7>
610611
analogiczną do (5 ). W następnym kroku wstawiamy 63 między {61, a i, 02}, potem b2 między elementy, o których wiadomo, że są mniejsze od a2\ po tym dostajemy konfigurację ci C2 C3 C4 •— > •— > •— > •
C5 >•
C6
as
aĄ
>• —
ae
ag ag aio — >+— >+
aj
f f f ff f f
64
65
6e
67
bg
bg
610
^ 611
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
5.3.1
195
Nazwijmy górny wiersz elementów łańcuchem głównym. Element 65 można w sta wić na jego właściwe miejsce w łańcuchu głównym za pom ocą trzech porównań (najpierw porównując go z C4 , potem z C2 lub c$ itd.); następnie 64 można umieścić w łańcuchu głównym w trzech dodatkowych krokach, doprowadzając do d\
(¿2
ds
dĄ
£¿5
dg
•— >•— >9 — >•— >•— >9—
dj
ds
dg
dio
a§
a7
as
ag
— >•— >9— >9 — >9 — >9— >?— >9— .
.
¿»6
£>7
/
. £>8
/ ¿>9
a io
>9
. &10
«*> £>11
Następny krok jest kluczowy; czy jest jasne, co należy zrobić? Do łańcucha głów nego wstawiamy &n, (a nie 67) za pom ocą tylko czterech porównań. Następnie w ten sam sposób wstawiamy do łańcucha głównego ¿>10, ¿>9, ^7 ? be (w tym porządku), używając za każdym razem co najwyżej czterech porównań. Uważne policzenie wykonanych tu ta j porównań pokazuje, że 21 elementów można posortować w co najwyżej 10+5(10) + 2 + 2 + 3 + 3 + 4 + 4 + 4 + 4 + 4 4 - 4 = 66 krokach. Ponieważ 265 < 2 1 ! < 266,
to wiemy także, że w żadnym wypadku nie byłoby to możliwe za pomocą liczby porównań mniejszej niż 66 ; stąd
5 ( 21)
-
66.
(1 0 )
(Binarne wstawianie wymagałoby 74 porównań). W ogólności scalanie ze wstawianiem dla n elementów wygląda jak następu je: i) Wykonaj [ n / 2 J porównań rozłącznych param i elementów. (Jeśli n jest nie parzyste, to jeden element nie jest porównywany z żadnym innym). ii) Uporządkuj [n/2J większych liczb z porównywanych par za pom ocą scalania ze wstawianiem. iii) Nazwij elementy a x, a2, . - ., ayn/ 2j , 61, 62, . . . , 5pn/2] tak jak w ( 7 ), gdzie ai < a 2 < * • < a\n/ 2\ i h ^ ai dla 1 < i < [ n / 2 \ ; 61 i elementy a tworzą „łańcuch główny” . Korzystając z binarnego wstawiania, umieść pozostałe elementy b w łańcuchu głównym, wstawiając je w następującej kolejności i pom ijając wszystkie bj dla j > \n / 2 V^3 >
^4 >^11 >^10>• • • j ^6ł • • - )
—1 j • • • )
l+l i •• • ■
(l-O
Naszym celem jest zdefiniowanie ciągu (U? ¿2?¿3 , ¿4? ■**) = ( 1 , 3 , 5 , 1 1 , . . . ) , który pojawia się w ( 1 1 ) w taki sposób, żeby każdy z btk, ■*■, można było wstawić do łańcucha głównego przy użyciu co najwyżej k porównań. Uogólniając ( 7 ), (8) i (9 ), dostajem y diagram x2
•-------
x 2 t fc_ !
>9-
+l
a tfc -i+ 2
7 ~7
¡» tfc -i+ i
btk -
1+2
atu- 1
7 . b tk
196
SORTOWANIE
5.3.1
w którym główny łańcuch do a ife_ i włącznie zawiera 2tk- i 4- (tk ~ t k - i ~ 1) elementów. Ta liczba musi być mniejsza od 2fc; najlepiej jest uczynić ją równą 2 k — 1 , tak że t k- i + tk = 2 k .
(12)
Ponieważ t\ = 1, zatem biorąc dla wygody to = 1, dostajem y t k = 2 k - t k- ! = 2 k - 2fc_1 +
2 = • • • = 2 k - 2fc- 1 + • • • + (—l ) fc2°
= (2fe+1 + ( l )fe) / 3
(13)
przez sumowanie szeregu geometrycznego. (Osobliwie, ten sam ciąg pojawił się w analizie algorytmu obliczania największego wspólnego dzielnika dwóch liczb całkowitych; zobacz ćwiczenie 4.5.2-36). Niech F (ń ) będzie liczbą porównań wymaganą do posortowania n elementów za pomocą scalania ze wstawianiem. Oczywiście F{n) = [ n / 2 \ + F { [ n / 2 \) + G { \ n / 2 ]),
(14)
gdzie G reprezentuje ilość pracy potrzebną do wykonania kroku (iii). Jeśli tk - 1 < m < i*., to k-1 G( m) =
j ( t j - t j - i ) + k { m - i fc_i) = fcm - (i0 + ii + ---- 1- ife-i),
(15)
3=1
co dostajemy, sumując przez części. Weźmy Wk = to + ii + • *■+ tk - 1 = [2fc+1/ 3 j ,
( 16 )
tak że (wo, ^ 1 , ^ 2»^ 35^ 4, *■•) = (0, 1, 2, 5, 10, 2 1 , . . . ) . Ćwiczenie 13 pokazuje, że F (n ) - F (n - 1) = k
wtedy i tylko wtedy, gdy
w k < n < w k+i,
(17)
a ostatni warunek jest równoważny nierównościom 2&+i
2fe+2 < n <
g
lub fc + 1 < lg 3n < k + 2; stąd F ( n ) ~ F ( n — 1) = fig \ n \-
( 18 )
(Ten wzór pochodzi od A. Hadiana [Ph.D. thesis, Univ. of Minnesota (1969), 38-4 2 ]). W ynika stąd, że F (n ) można wyrazić zadziwiająco prosto, F (n ) =
(x9) k=1
Ten wzór jest bardzo podobny do wzoru (3) dla wstawiania binarnego. Zamkniętą postać tej sumy znajdziemy w ćwiczeniu 14.
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
5.3.1
197
Korzystając z ( 19 ), można łatwo skonstruować tabelę liczb F ( n ); mamy n = 1 [lgn!]=0 F (n) = 0
2 3 1 3 1 3
n = 18 flgn!] = 53 F(n) = 54
19 20 21 22 23 24 57 62 66 70 75 80 58 62 66 71 76 81
4 5 6 5 7 10 5 7 10
7 8 13 16 13 16
9 10 19 22 19 22
25 26 84 89 86 91
11 12 13 26 29 33 26 30 34
14 37 38
27 28 29 30 94 98 103 108 96 101 106 111
15 16 41 45 42 46
17 49 50
31 32 33 113 118 123 116 121 126
Zauważmy, że F{n) = [lg u!] dla 1 < n < 11i dla 20 < n < 21, tak więc widzimy, że scalanie ze wstawianiem jest optymalne dla n spełniających: S(n) = [lgn!] = F (n )
dla n = 1, . . . , 11, 20 i 2 1 .
(20)
W drugim wydaniu swojej klasycznej książki Kalejdoskop matematyczny, (w 1950 roku), Hugo Steinhaus postawił problem znalezienia S(n). Steinhaus opisał metodę wstawiania binarnego, która jest najlepszym sposobem sortowania n obiektów, jeśli rozpoczynamy od posortowania najpierw n — l z nich przed rozpatrzeniem obiektu n-tego; postawił także hipotezę, że wstawianie binarne powinno być optymalne w ogólności. Kilka lat później [Calcutta Math. Soc. Golden Jubilee Commemoration 2 (1959), 323-327] podał, że dwóch jego kolegów, S. Trybuła i P. Czen, pokazało „ostatnio” , że jego hipoteza jest nieprawdziwa i że wyznaczyli oni wartości S(n) dla n < 1 1 . Trybuła i Czen być może od kryli niezależnie metodę scalania ze wstawianiem, która została wkrótce potem opublikowana przez Forda i Johnsona [AMM 66 (1959), 387-389]. Tabela 1 WARTOŚCI SILNI W ZAPISIE BINARNYM
( 1)2 = ( 10)2 = (110)2 = (11000)2 = (1111000)2 =
1! 2!
3! 4! 5!
( 1011010000)2 = 6 !
(1001110110000)2 = 7! ( 1001110110000000)2 = 8 !
(1011000100110000000)2 = 9!
(1101110101111100000000)2 = 10! (10011000010001010100000000)2 = 11! ( 11100100011001111110000000000)2 = 12 !
(101110011001010001100110000000000)2 = 13! (1010001001100001110110010100000000000)2 = 14! (10011000001110111011101110101100000000000)2 = 15! ( 100110000011101110111011101011000000000000000)2 = 16! (1010000110111111011101110110011011000000000000000)2 = 17! ( 10110101111101110110011001010011100110000000000000000)2 = 18! (110110000001010111001001100000110100010010000000000000000)2 = 19! ( 10000111000011011001110111110010000010101101000000000000000000)2 = 20!
198
SORTOWANIE
5.3.1
Po odkryciu scalania ze wstawianiem, pierwszą nieznaną wartością S(n) było 5(12). Z tabeli 1 widać, że 12 ! jest całkiem bliskie wartości 229, z czego wynika, że istnienie 29-krokowej procedury sortującej dla 12 elementów jest trochę mało prawdopodobne. M ark Wells, za pomocą m etody przeszukiwania wyczerpującego, (około 60 godzin pracy kom putera Maniac), odkrył, że 5(12) = 30 [Proc. IFIP Congress 65 2 (1965), 497-498; Elements of Combinatońal Computing (Pergamon, 1971), 213-215]. Tak więc scalanie ze wstawianiem okazało się optym alne także dla n = 12 . * T ro c h ę g łę b s z a a n a liz a . Żeby zbadać 5 (n ) dokładniej, przyjrzyjmy się bliżej diagramowi częściowego porządku, takiem u jak ( 5 ). Po wykonaniu szeregu po równań zebraną informację można przedstawić za pomocą grafu skierowanego. Na mocy przechodniości relacji <, w takim grafie nie ma cykli, tak więc można go narysować w taki sposób, żeby wszystkie krawędzie (strzałki) były skierowa ne z lewa na prawo. Dlatego jest wygodnie, żeby na takim diagramie zamiast strzałek rysować odcinki. W ten sposób ( 5 ) zmienia się na
(21 ) e
Jeśli G jest takim grafem skierowanym, to niech T(G ) będzie liczbą perm utacji zgodnych z G, to jest liczbą sposobów przypisania liczb { 1 , 2 , . . . , n} do wierz chołków G w taki sposób, że liczba w wierzchołku x jest mniejsza od liczby w wierzchołku y, jeśli tylko x —> y jest krawędzią w G. Na przykład jedną z perm utacji zgodnych z (2 1 ) jest a = 1 , 6 = 4, c = 2 , d = 5, e = 3. Liczby T(G ) dla różnych G badaliśmy w punkcie 5.1.4, w którym zauważyliśmy, że T{G) jest liczbą sposobów posortowania topologicznie G. Dla n-elementowego grafu G, który można otrzymać po wykonaniu k po równań, definiujemy jego jakość
E = ¥ m
-
M
(To Frank Hwang i Shen Lin wpadli na ten pomysł). Dokładniej mówiąc, jakość nie jest funkcją samego grafu G, ale zależy od sposobu otrzym ania tego grafu w procesie sortowania. Wygodniej jest jednak o tym nie pamiętać. Po wykonaniu jednego więcej porównania między elementami i oraz j dostajem y dwa grafy G 1 i G 2, jeden dla przypadku Ki < K j i jeden dla przypadku Ki > Kj . Oczywiste jest, że T(G ) = T {G \) + T (G 2). Dla T (G i) > T (G 2) mamy
T(G) F ( r ) =
(
< 2T(Gi),
nl
2 fc+1T (G 1)
= E (G ) n c )
2T (G i)
F(r)
^
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
199
Tak więc każde porównanie prowadzi do co najmniej jednego grafu o mniejszej lub równej jakości; jakości nie można zwiększyć, wykonując dalsze porównania. Jeśli w grafie G nie m a żadnych krawędzi, to k = 0 i T(G ) = n!, a zatem początkowa jakość m a wartość 1 . Na drugim końcu, gdy graf G reprezentuje końcowy wynik sortowania, wówczas G wygląda jak linia i T{G) = 1. Tak więc dla przykładu, jeżeli chcemy znaleźć procedurę sortującą pięć elementów w sied miu krokach, musimy dostać lin ię .................., której jakością jest 5!/(2 7 x l ) = 120/128 = 15/16. W ynika stąd, że wszystkie grafy pojawiające się w procedurze sortowania muszą być o jakości > jeśli pojawiłby się graf o mniejszej jakości, co najmniej jeden z jego potomków też musiałby mieć mniejszą jakość i na koniec doszlibyśmy do linii o jakości < Na podstawie powyższego rozumowania dostajemy, że w ogólności wszystkie grafy odpowiadające węzłom drzewa sorto wania dla n elementów muszą mieć jakość > n \ / 2 \ gdzie l jest liczbą poziomów w drzewie (nie licząc węzłów zewnętrznych). Jest to jeszcze jeden dowód tego, że S(n) > [lgn!], chociaż uzasadnienie nie różni się w rzeczywistości bardzo od tego, co powiedzieliśmy wcześniej. Jakością grafu (21 ) jest 1 , ponieważ T(G ) = 15, a sam graf G został otrzy many w wyniku wykonania trzech porównań. Żeby przekonać się o tym, jakie wierzchołki porównać w następnej kolejności, możemy zbudować macierz porów nań a b e c d a ( 0 15 10 15 l l \ b 0 5 15 0 9 c 5 10 0 15 9 d 0 0 0 0 3 e U 8 6 12 0/ gdzie Cij równa się T (G \) dla grafu G\ otrzymanego przez dodanie do G krawędzi i —> j . Na przykład, jeśli porównamy K c z K e, to 15 perm utacji zgodnych z G zostanie podzielonych na Cec = 6 perm utacji zgodnych z K e j | , następnym porównaniem musi być K b : K e. Pojęcie jakości jest szczególnie użyteczne, gdy rozważamy spójne składowe grafów. Rozważmy dla przykładu graf
ma on dwie składowe
200
SORTOWANIE
5.3.1
i żadnych krawędzi między Gf a G". Tak więc taki graf powstał w wyniku wyko nania pewnych porównań całkowicie wewnątrz Gf i innych całkowicie wewnątrz G". W ogólności przyjmijmy, że G — Gf ® Gfł i nie m a żadnych krawędzi między Gf a G", gdzie Gf i G" m ają odpowiednio n f i n ff wierzchołków; łatwo można zobaczyć, że T (G ) = ( ” ' n '" ” ) T (G ,) T (G" ) ’
(25)
ponieważ każdą perm utację zgodną z G otrzymuje się przez wybranie n ; elemen tów przypisywanych do G;, a następnie przez niezależne utworzenie perm utacji zgodnych z G' i Gff. Jeśli wewnątrz Gf zostało wykonanych k! porównań, a we w nątrz G/f k n porównań, to dostajem y podstawowy fakt, że E (G ) = 2k'+k" T (G) = 2 k'T (G') 2k"T(G') =
^
^
ukazujący prosty związek między jakością grafu a jakościami jego składowych. Dlatego nasze rozważania można ograniczyć tylko do grafów o jednej składowej. Załóżmy teraz, że grafy Gf i Gtf składają się z pojedynczych składowych i że chcemy połączyć je razem, porównując wierzchołek x z Gf z wierzchołkiem y z G". Chcielibyśmy wiedzieć, jaka będzie jakość otrzymanego grafu. Do tego celu potrzebujem y funkcji, którą można oznaczyć przez p < q ), m n)
(27 )
definiowaną jako liczba perm utacji zgodnych z grafem a 1 a-2
dp (28)
61
62
6,
Stąd ( ^ < £ ) j^st równe (m^ n) razy prawdopodobieństwo, że p -ty najm niej szy element w zbiorze m liczb jest mniejszy od ą-tego najmniejszego elementu w niezależnie wybranym zbiorze n liczb. W ćwiczeniu 17 pokazujemy, że ( ^ < ^ ) można wyrazić na dwa sposoby za pomocą współczynników dwumianowych, ( P < Q\ _ ,m n)
^ k\ (m m — p + n — k \\ /( p — l1 + k' ^ V m —p / V p —1 ) 0^k
(Na marginesie, nie byłoby łatwo wykazać na gruncie algebraicznym, że te dwie sumy iloczynów współczynników dwumianowych są sobie równe). Zachodzą także następujące wzory: i’ < ? ) + ( ? < ) , ) = ( m + ” ) ; m nj \n mJ \ m /
(30)
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
( q < p ) = ( m + 1-P \n m) \ m
<
201
n + l-q
(3 1 )
n
C < • ' ) = ( > <■>) + ( ” < \ ) + l p < m ] l , = n ] ( m + n - 1 ) . \m n) Vm —1 n ) \m n —U \ m J
(32 )
Dla lepszego zrozumienia rozważmy teraz dwa grafy X 2
y1
G' =
3/3
G" =
(33) 3/ 2
3/ 4
Nie jest trudno obliczyć bezpośrednio, że T (G ') = 42 i T (G ") = 5; zatem , jeśli G jest 11 -wierzchołkowym grafem, którego składowymi są G ' i Gff, to z ( 25 ) dostajemy T( G) — ( 41) *42 • 5 = 69300. Jeśli chcielibyśmy dowiedzieć się, które z tych perm utacji spełniają < y j , dla każdych i oraz j , to liczba perm utacji do przejrzenia byłaby ogromna. Jednak stosowne obliczenia można wykonać ręcznie, szybciej niż w godzinę, w następujący sposób. Tworzymy macierze A{ Gf) i A(G"), gdzie Aik jest liczbą perm utacji zgodnych z Gf (lub Gff), w których X{ (lub yi) jest równe k . Tak więc liczba perm utacji zgodnych z G, w których jest mniejsze od yj, jest równa sumie p o l < p < 7 i l < ę < 4 iloczynów elementu (i,p) macierzy A ( G f), pomnożonemu przez ( 7 4 razy element (j,q) macierzy A(G"). Innymi słowy, naszym celem jest obliczenie iloczynu macierzy A ( Gf) • L ■A ( G //)t , gdzie L pq — Tak więc dostajem y <
/21 0 21 0 0 0 V0
16 5 16 0
5 0 0 0 0 \ /210 294 322 329\ 126 238 301 325 10 12 10 5 0 70 175 265 315 5 0 0 0 0 12 18 12 0 0 35 115 215 295 0 0 0 5 16 21 15 65 155 260 5 29 92 204 510 12 10 5 0 0 0 0 5 16 21/ V 1 8 36 120/
f2 3 0 0 \ 2 2 0 1 10 2 2
,0 0 3 2 /
)
/48169 22825 48169 22110 5269 22825 V 5269
42042 16005 42042 14850 2442 16005 2442
66858 53295 66858 54450 27258 53295 27258
64031\ 46475 64031 47190 21131 46475 2113l/
Zatem „najlepszym” sposobem związania Gf i G" jest porównanie X\ z 2/2; to prowadzi do 42042 przypadków, w których x\ < 7/2, i 69300 — 42042 = 27258 przypadków, w których x\ > 2/2• (2 symetrii wynika, że moglibyśmy także porównać x 3 z y
202
SORTOWANIE
Gi • 1
G5
5.3.1
G2 • — • 1
t t %
Ge
Gz
i
15
1
G?
16
15 16
15
n
16
1
G 21
» |i |
g 22
^
G23 .* 7 *T^* i i
g 24’s^ v *
f|
R y s. 36. Grafy i ich jakości otrzymywane na początku długiego dowodu, że 5(12) > 29.
grafy m iały co najwyżej 12 wierzchołków i jakość była > 12!/2 29 « 0.89221. Kiedy to jest możliwe, bierzemy wynikowy graf o mniejszej jakości i dodajemy go do naszego zbioru, chyba że jeden z dwóch grafów jest izomorficzny z ja kimś z wcześniej włączonych grafów. Jeśli oba otrzymywane grafy m ają taką sam ą jakość, wybieramy dowolny z nich. Tak długo, jak rozważamy dodawanie porównań do G f 0 dual(G //), jak i do G' 0 G", każdy graf można utożsamiać z jego grafem dualnym (otrzymywanym przez odwrócenie porządku). Kilka naj mniejszych grafów otrzymywanych w ten sposób, wraz z ich jakościami, zostało przedstawionych na rysunku 36. Za pomocą kom putera wygenerowano w ten sposób w całym procesie 1649 nie został otrzymany, możegrafów. Ponieważ graf * my wnioskować, że 5(12) > 29. Jest wielce prawdopodobne, że moglibyśmy w rozsądnym czasie przeprowadzić podobny eksperyment w celu pokazania, że 5(22) > 70, ponieważ przy 22!/2ro ^ 0.952 wymaga się bardzo wysokiej jakości sortowania w 70 krokach. (Tylko 91 z 1649 grafów co najwyżej 12-wierzchołkowych m a tak wysoką jakość). Pośrednie wyniki sugerują wyraźnie, że 5(13) = 33, a zatem scalanie ze wsta wianiem nie byłoby optymalne dla n — 13. Z pewnością powinno być możliwe do pokazania, że 5(16) < F(16), ponieważ F(16) składa się z nie mniej porów nań niż w sortowaniu 10 elementów za pomocą 5(10) porównań, a następnie wykonywanych jeszcze pojedynczo 6 wstawień elementów za pomocą binarnego wstawiania. Musi istnieć sposób poprawienia tego! Jednak obecnie najmniejszą wartością n, dla której z pewnością wiadomo, że F( n) nie jest optymalne, jest n = 47. Po posortowaniu 5 i 42 elementów za pomocą F ( 5) + F(42) = 178 porównań, możemy scalić wyniki za pomocą 22 dalszych porównań, korzystając z m etody zaproponowanej przez J. Schulte Móntinga, Theoretical Comp. Sci.
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
203
14 (1981), 19-37; to jest lepiej niż .F(47) = 201. (Glenn K. M anacher [J A C M 26 (1979), 441-456] udowodnił wcześniej, że począwszy od n = 189, istnieje nieskończenie wiele n, dla których S(n) < F (ń)). Ś re d n ia lic z b a p o ró w n a ń . Jak dotąd zajmowaliśmy się m etodam i, które są najlepsze ze względu na pesymistyczny przypadek; innymi słowy poszukiwaliśmy procedur sortowania, które minimalizują maksymalną liczbę porównań. Teraz skoncentrujemy się na procedurze, która minimalizuje średnią liczbę porównań przy założeniu, że dane wejściowe są losowe w znaczeniu, że każda perm utacja jest jednakowo prawdopodobna. Rozpatrzmy raz jeszcze drzewiastą reprezentację pewnej procedury sortowa nia, taką jak pokazano na rysunku 34. Średnia liczba porównań w tym drzewie wynosi 2 + 3 + 3 + 3 + 34-2 2 6
3’ gdzie średnią liczymy po wszystkich perm utacjach. W ogólności średnia licz ba porównań w rozważanej metodzie sortowania jest równa długości ścieżki zewnętrznej w drzewie podzielonej przez nl. (Przypominamy, że długość ścieżki zewnętrznej jest równa sumie odległości wszystkich węzłów zewnętrznych od korzenia; zobacz podpunkt 2.3.4.5). Na podstawie rozważań z podpunktu 2.3.4.5 łatwo można zauważyć, że najm niejsza długość ścieżki zewnętrznej w drzewie o N węzłach zewnętrznych pojawia się wtedy, kiedy 2q —N węzłów zewnętrznych znajduje się na poziomie q —1 , natom iast 2 N —2 q na poziomie q, gdzie q = [lg AT]. (Korzeń jest na poziomie zero). M inimalna długość ścieżki zewnętrznej wynosi dlatego (q - 1 )( 29 - N ) + q ( 2 N - 2») = (q + 1 ) N - 2«. (3 4 ) Minimalną długość ścieżki zewnętrznej można również scharakteryzować w inny, interesujący sposób: Dla ustalonej liczby węzłów zewnętrznych, długość ścieżki zewnętrznej w drzewie binarnym jest minimalna w tedy i tylko wtedy, gdy istnieje liczba l taka, że wszystkie węzły zewnętrzne występują na poziomach l i l + 1 . (Zobacz ćwiczenie 20). Jeśli weźmiemy q = lg AT + 9, gdzie 0 < 9 < 1, to otrzymujemy następujący wzór na minimalną długość ścieżki zewnętrznej: (3 5 )
N ( l g N + l + d - 2 e ).
Funkcję 1 + 9 —2 6 przedstawiono na rysunku 37; dla 0 < są dodatnie, ale bardzo małe i nigdy nie przekraczają
6
< 1 wartości funkcji
1 - (1 + ln ln 2 )/ ln 2 = 0.08607 13320 55934+.
0.1
-
0.0 L 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
R ys. 37. Funkcja 1 + 9 —29.
1.0
(36 )
204
SORTOWANIE
5.3.1
Zatem minimalna, możliwa średnia liczba porównań, otrzymywana w wyniku podzielenia (35 ) przez N, nigdy nie jest mniejsza od lg N i nigdy nie jest większa od lg N + 0.0861. (Ten wynik jako pierwszy otrzym ał A. Gleason w 1956 roku). Jeśli teraz weźmiemy N = n\, to dostaniemy dolne ograniczenie na średnią liczbę porównań w każdym schemacie sortowania. Rozważając asymptotycznie to dolne ograniczenie, wynosi ono lgn! + 0 (1 ) = n l g n —n / l n 2 + O (logn).
(37 )
Niech F( n) będzie średnią liczbą porównań wykonywanych w algorytmie scalania ze wstawianiem; mamy n = 1
2 3
4
5
6
7
8
dolna granica (34) = 0
2 16
112
832
6896
62368
619904
n\ F( n) = 0
2 16
112
832
6912 62784
623232
Tak więc sortowanie ze scalaniem jest optymalne dla n < 5 w obu przypad kach, ale dla n — 6 wykonuje się w nim średnio 6912/720 = 9.6 porównań, podczas gdy z naszego dolnego ograniczenia wynika, że średnia liczba porównań mogłaby wynosić 6896/720 = 9.577777... . Chwila zastanowienia wystarczy, żeby zobaczyć dlaczego tak jest: Pewne „dobre” perm utacje są sortowane przez scalanie ze wstawianiem za pom ocą tylko ośmiu porównań, a zatem w drzewie porównań węzły zewnętrzne w ystępują na trzech poziomach zamiast dwóch. To powoduje większą długość ścieżki zewnętrznej. W ćwiczeniu 24 pokazujemy, że można ułożyć procedurę sortującą dla sześciu elementów, która w każdym przy padku wymaga dziewięciu lub dziesięciu porównań. W ynika stąd, że w średnim przypadku ta m etoda jest lepsza od scalania ze wstawianiem i nie jest gorsza od scalania ze wstawianiem w przypadku pesymistycznym. Dla n = 7 , Y. Cesari [praca dyplomowa (Uniwersytet Paryski, 1968), stro na 37] pokazał, że żadna m etoda sortowania nie osiąga dolnego ograniczenia 62368 na długość ścieżki zewnętrznej. (Fakt ten można udowodnić bez użycia kom putera, korzystając tylko z wyników ćwiczenia 22). Z drugiej strony Cesari podał procedury, które osiągają dolną granicę (34) dla n = 9 i 10 . W ogólności problem minimalizacji średniej liczby porównań okazuje się znacząco trudniejszy od problemu wyznaczania S(n). Może się również zdarzyć, że dla pewnego n wszystkie metody, które m inimalizują średnią liczbę porównań, wym agają więcej niż S( n) porównań w przypadku pesymistycznym. Ć W IC ZEN IA 1. [20] Narysuj drzewo porównań do sortowania czterech elementów metodą (a) wsta wiania binarnego; (b) prostego scalania dwuwejściowego. Ile wynoszą długości ścieżek zewnętrznych w tych drzewach? 2 . [M24] Udowodnij, że B ( n ) ^ L(n) i znajdź wszystkie n, dla których zachodzi
równość. 3. [M22] Gdy dopuścimy równość kluczy, wówczas istnieje 13 możliwych wyników sortowania 3 elementów: K 1 = K 2 ^ a 3,
A i = K 2 < A 3,
A i = A 3 < A 2,
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
5.3.1
K2 = K 3 < K i,
Kx< K 2= K3
,
K 2 < K x = K a,
K 3 < K X= K 2
Ki < K 2 < K z,
K X < K 3 < K 2,
K 2 < K i < K 3,
,
K 2 < K 3 < iCi,
K3 <
< /Ć25
205
K 3 < ^ 2 < Rh-
Niech Pn oznacza liczbę możliwych wyników sortowania n elementów. Tak więc (Po, A , P2 , P 3 , P4 , P 5 , . . . ) = (1, 1,3, 13, 75, 54 1 , . . . ) . Udowodnij, że funkcja tworząca P ( z) = PnZn/n\ jest równa 1 /(2 —ez ). Wskazówka: Pokaż, że
4. [HM27] (O. A. Gross) Wyznacz asymptotyczną wartość liczb Pn z ćwiczenia 3, gdy n —>00 . [Możliwa wskazówka: Rozważ rozwinięcie cot 2 za pomocą ułamków prostych]. 5. [16] Gdy klucze mogą się powtarzać, to wynikiem każdego porównania może być: Ki < Kj^ Ki — K j } Ki > K j . W tej ogólnej sytuacji algorytmy sortowania można przedstawiać za pomocą rozszerzonych drzew temarnych, w których każdy węzeł wewnętrzny i : j ma trzy poddrzewa; lewe, środkowe i prawe poddrzewa odpowiadają odpowiednio trzem możliwym wynikom porównania. Narysuj rozszerzone drzewo ternarne, które definiuje algorytm sortowania dla n = 3, gdy dopuszczalne są klucze o tych samych wartościach. Takie drzewo powinno mieć 13 węzłów zewnętrznych odpowiadających 13 możliwym wynikom sortowania podanym w ćwiczeniu 3. ► 6 . [M22] Niech S'(n) będzie minimalną liczbą porównań konieczną do posortowania n elementów i wyznaczenia wszystkich par równych kluczy, gdy wynikiem każdego porównania jest jedna z trzech możliwości z ćwiczenia 5. Rozumowanie teorio-informacyjne zaprezentowane w tekście można w oczywisty sposób uogólnić i pokazać, że S'(n) ^ [log3 Pn], gdzie Pn jest funkcją badaną w ćwiczeniach 3 i 4; udowodnij jednak, że tak naprawdę S ^ n ) = S(n). 7. [20] Narysuj rozszerzone drzewo ternarne, w znaczeniu z ćwiczenia 5, sortujące 4 elementy, gdy o wszystkich kluczach wiadomo, że są równe 0 lub 1. (Tak więc jeśli K i < K 2 i K 3 < K ą , to wiemy, że K x = K 3 i K 2 = K ą \). Średnia liczba porównań po winna być minimalna przy założeniu, że każdy z 24 możliwych ciągów wejściowych jest jednakowo prawdopodobny. Upewnij się, że zostaną wyznaczone wszystkie równości; na przykład nie należy kończyć sortowania, gdy wiemy tylko, że K x $C K 2 ^ K 3 ^ /Ć4 . 8 . [26] Narysuj rozszerzone drzewo ternarne dla sortowania 4 elementów jak w ćwi czeniu 7, jeśli wiadomo, że wartością każdego klucza może być —1 , 0 lub + 1 . Średnia liczba porównań powinna być minimalna przy założeniu, że każdy z 3 4 możliwych ciągów wejściowych jest jednakowo prawdopodobny.
9. [M20] Jaka jest w pesymistycznym przypadku minimalna liczba porównań po trzebna do posortowania n elementów tak jak w ćwiczeniu 7 , wiedząc, że każdy klucz jest równy 0 lub 1 ? ►10. [M25] Jaka jest minimalna średnia liczba porównań potrzebna do posortowania n elementów tak jak w ćwiczeniu 7, wiedząc, że każdy klucz jest równy 0 lub 1 ? Odpowiedź wyraź jako funkcję n. 1 1 . [HM27] Sortujemy n elementów tak jak w ćwiczeniu 5 i wiemy, że wszystkie klucze są elementami zbioru { 1 , 2 , . . . , m}. Niech S m (n) będzie minimalną liczbą porównań po trzebną w przypadku pesymistycznym. [Tak więc z ćwiczenia 6 mamy, że S n (n ) = S(n)].
206
5.3.1
SORTOWANIE
Udowodnij, że dla ustalonego m, Sm(n) jest asymptotycznie równe n lgra + 0 ( l ) , przy n —* oo.
►1 2 . [M25] (W. G. Bouricius, około 1954) Załóżmy, że dopuszczamy występowanie takich samych kluczy, ale chcemy jedynie posortować elementy { K i , K 2, . . . , K n } w taki sposób, żeby wyznaczyć permutację a± a2 .. . an , dla której K ai ^ K a2 ^ ^ A an; nie musimy wiedzieć, czy klucze K ai i K ai+1 są takie same. Powiemy, że drzewo porównań silnie sortuje dany ciąg kluczy, jeśli sortuje ten ciąg w podanym wyżej znaczeniu, niezależnie od tego, po których gałęziach wyjdziemy z węzłów i : j , dla których K i — K j . (Rozważamy drzewa binarne, a nie ternarne). a) Udowodnij, że drzewo bez redundantnych porównań sortuje silnie każdy ciąg klu czy wtedy i tylko wtedy, gdy sortuje każdy ciąg różnych kluczy. b) Udowodnij, że drzewo porównań sortuje silnie każdy ciąg kluczy wtedy i tylko wtedy, gdy sortuje silnie każdy ciąg zer i jedynek. 13. [M28] Udowodnij ( 17 ). 14. [M2Ą] Znajdź zamkniętą postać sumy ( 19 ). 15. [M21] Określ asymptotyczne zachowanie się B(n) i F( n) z dokładnością do O (logn). [Wskazówka: Pokaż, że w obu przypadkach we współczynnikach przy n poja wia się funkcja przedstawiona na rysunku 37]. 16. [HM26] (F. Hwang i S. Lin) Udowodnij, że F(n) > [lgn!] dla n ^ 22. 17. [M20\ Udowodnij ( 29 ). 18. [20] Jeśli w wyniku wykonania procedury, której pierwsze kroki są pokazane na rysunku 36, dostalibyśmy linię * - - .................................. o jakości 12!/229, czy udowodnilibyśmy w ten sposób, że 5(12) = 29? 19. [40] Poeksperymentuj z następującą heurystyką decydowania o tym, którą parę porównywać w następnym kroku podczas budowy drzewa porównań, W każdej fazie sortowania { A l, . . . , K n } niech Ui będzie liczbą kluczy, o których wiadomo, że w wy niku wykonania dotychczasowych porównań są ^ Ki, i niech Vi będzie liczbą kluczy, o których wiadomo, że są ^ Ki dla 1 ^ i ^ n. Przenumerujmy klucze, uwzględniając rosnące wartości m / v i tak, żeby u \ / v \ ^ u 2/ v 2 ^ **• u n / v n. Teraz wykonujemy porównanie Ki : Ki+\ dla tego i , które minimalizuje \uiVi+i — Ui+iVi\. (Chociaż w tej metodzie bazujemy na dużo mniejszej informacji niż ta zawarta w pełnej macierzy porównań (takiej jak ( 24 )), to okazuje się, że daje ona w wielu przypadkach optymalne wyniki). ►2 0 . [M26] Udowodnij, że w rozszerzonym drzewie binarnym długość ścieżki zewnętrz nej jest minimalna wtedy i tylko wtedy, gdy istnieje liczba l taka, że wszystkie węzły zewnętrzne znajdują się na poziomach l i l + 1 (lub być może tylko na jednym pozio mie /). 2 1 . [M21] Wysokością rozszerzonego drzewa binarnego nazywamy maksymalny nu mer poziomu zawierającego węzły zewnętrzne. Jeśli x jest węzłem wewnętrznym w roz szerzonym drzewie binarnym, to niech t(x) będzie liczbą węzłów zewnętrznych poniżej x i niech l(x) oznacza korzeń lewego poddrzewa węzła x. Jeśli x jest węzłem zewnętrz nym, to niech t(x) = 1. Udowodnij, że wysokość rozszerzonego drzewa binarnego jest minimalna wśród drzew o takiej samej liczbie węzłów, jeśli dla wszystkich węzłów wewnętrznych x zachodzi | i ( x ) — 2t ( l ( x ) ) \ ^
—
t(x).
5.3.1
SORTOWANIE Z MINIMALNĄ LICZBĄ PORÓWNAŃ
207
22. [M2Ą] Kontynuując ćwiczenie 21, udowodnij, że długość ścieżki zewnętrznej w drze wie binarnym jest najmniejsza wśród drzew o takiej samej liczbie węzłów wtedy i tylko wtedy, gdy |t(x) — 2t(l(x))\ ^ 2 ^lg^x^ —t(x)
i
\t{x ) ~ 2t(Kx ))\ ^ K x ) ~ 2 *-lgi^x^
dla wszystkich węzłów wewnętrznych x. [Tak więc dla przykładu, w którym t(x) = 67, musimy mieć t(l(x)) = 32, 33, 34 lub 35. Jeśli chcemy jedynie minimalizować wysokość drzewa, to z poprzedniego ćwiczenia wynika, że możemy mieć 3 ^ ^ 64]. 23. [10] W tekście dowodzimy, że średnia liczba porównań wykonywana w każdej metodzie sortowania n elementów musi wynosić co najmniej [Ign!] ~ n lg n . Jednak wstawianie do wielu list (program 5.2 .IM) zabiera średnio tylko O(n) jednostek czasu. Jak to jest możliwe? 24. [27] (C. Picard) Znajdź drzewo sortujące dla sześciu elementów, w którym wszyst kie węzły zewnętrzne występują tylko na poziomach 10 i 11 . 25. [11] Jeśli istniałaby procedura sortująca dla siedmiu elementów, w której średnia liczba porównań byłaby równa liczbie wyznaczanej za pomocą ( 34 ), to ile węzłów zewnętrznych znalazłoby się na poziomie 13? 26. [MĄ2] Zaproponuj procedurę sortującą dla siedmiu elementów, która minimalizuje średnią liczbę wykonywanych porównań. [20] Przypuśćmy, że wiadomo, iż konfiguracje Rh < K 2 < R h , Rh < K 3 < R h , K 2 < K i < R h , K 2 < K 3 < R h , K 3 < K x < K 2, K 3 < K 2 < Rh pojawiają się odpowiednio z prawdopodobieństwami 0.01, 0.25, 0.01, 0.24, 0.25, 0.24. Znajdź drzewo porównań, które sortuje takie trzy elementy z najmniejszą średnią liczbą porównań.
► 27.
28. [40] Napisz program na maszynę MIX, który posortuje pięć jednosłowowych kluczy w najmniejszym możliwym czasie i zatrzyma się. (Przejrzyj początek podrozdziału 5.2 w celu przypomnienia sobie podstawowych reguł postępowania). 29. [M25] (S. M. Chase) Niech a x a2 .. . an będzie permutacją zbioru { 1 , 2 , . . . ,n }. Udowodnij, że każdy algorytm stwierdzający tylko za pomocą porównań między ele mentami a, czy taka permutacja jest parzysta lub nieparzysta (to znaczy, czy ma parzystą, czy nieparzystą liczbę inwersji), musi wykonać co najmniej n lg n porównań, nawet jeśli możliwe są tylko dwa wyniki działania algorytmu. 30. [M23] ( Optymalny algorytm sortowania przez zamienianie) Każdy algorytm sor towania przez zamienianie, tak jak się je definiuje w punkcie 5.2.2, można reprezento wać za pomocą drzewa porównań i zamian, czyli drzewa binarnego, w którym węzły wewnętrzne i : j dla i < j, odpowiadają następującym operacjom: „Jeśli Ki ^ K j , to przechodzimy do lewego poddrzewa; jeśli K i > K j, to zamień rekordy i oraz j, a następnie przejdź do prawego poddrzewa”. Po napotkaniu węzła zewnętrznego musi zachodzie Rh ^ K 2 iC **• ^ K n . Zatem drzewo porównań i zamian różni się od drzewa porównań tym, że opisuje ono ruch danych, jak i porównania, które należy wykonać. Niech S e(n) oznacza minimalną liczbę porównań-zamian potrzebnych do posor towania n elementów w przypadku pesymistycznym, za pomocą drzewa porównań i zamian. Udowodnij, że S e(n) ^ S(n) + n — 1 . 31. [M38] Kontynuując ćwiczenie 30, udowodnij, że S e (5) = 8 . 32. [MĄ2\ Kontynuując ćwiczenie 31, zbadaj S e(n) dla małych wartości n > 5. 33. [M30] (T. N. Hibbard) Drzewem poszukiwań o wartościach rzeczywistych, o rzę dzie x i rozdrobnieniu <5, nazywamy rozszerzone drzewo binarne, w którym w węzłach
208
5.3.1
SORTOWANIE
znajdują się nieujemne liczby rzeczywiste takie, że (i) liczba w każdym węźle zewnętrz nym jest ^ <5, (ii) liczba w każdym węźle wewnętrznym jest nie większa od sumy wartości w jego dzieciach, natomiast (iii) liczba w korzeniu jest równa x. W takim drzewie definiuje się długość ważonej ścieżki jako sumę po wszystkich węzłach zewnętrznych, iloczynów poziomu węzła zewnętrznego i znajdującej się w nim liczby. Udowodnij, że w drzewie poszukiwań o wartościach rzeczywistych, o rzędzie x i rozdrobnieniu 1 , długość ważonej ścieżki jest najmniejsza wśród wszystkich drzew 0 takim samym rzędzie i rozdrobnieniu wtedy i tylko wtedy, gdy w (ii) mamy równość 1 są spełnione dodatkowe, następujące warunki dla wszystkich par liczb rzeczywistych x q i x i znajdujących się w węzłach z tego samego rodzeństwa: (iv) Nie istnieje liczba całkowita k ^ 0 taka, że xo < 2k < x \ lub x \ < 2k < xo- (v) \xo~\ —xo + |"xi] - x\ < 1 . (W szczególności, jeśli x jest liczbą całkowitą, to z warunku (v) wynika, że wszystkie wartości w drzewie są liczbami całkowitymi, natomiast warunek (iv) jest równoważny wynikowi z ćwiczenia 22 ). Udowodnij także, że minimalna długość odpowiedniej ścieżki ważonej wynosi £ [Iga;] + [a;] —2 ^lg:c\ 34. [M50] Wyznacz dokładne wartości S(n) dla nieskończenie wielu n . 35. [Ą9] Wyznacz dokładną wartość 5(13). 36. [M50] (S. S. Kislicyn, 1968) Udowodnij lub zaprzecz: Każdy skierowany graf acykliczny G z T(G) > 1 ma dwa wierzchołki u i v takie, że grafy skierowane G i i G 2 j otrzymywane z G przez dodanie krawędzi u <— v i u —>v, są acykliczne i spełniają warunek 1 ^ T( G\ ) / T{ G 2) ^ 2 . (Zatem T(G\ )/ T(G) leży zawsze między | a | dla pewnych u i v).
*5.3.2. Scalanie za pomocą minimalnej liczby porównań
Zajmiemy się teraz następującym pytaniem: Jaki jest najlepszy sposób scalania uporządkowanego zbioru m-elementowego z uporządkowanym zbiorem n-elementowym? Scalane elementy oznaczamy przez Ai < A 2 < ■■■< A m
i
Bi < B 2 < ■■■< B n ,
(1)
i zakładam y o nich, podobnie jak w punkcie 5.3.1, że wszystkie m + n elementy są różne. Elementy A mogą wystąpić wśród elementów z B na (m^ n) sposobów, tak więc, argum entując tak samo jak przy sortowaniu, dostajemy natychmiast, że potrzeba co najmniej
porównań. Dla ustalonego m = a n i n —►00 ze wzoru Stirlinga dostajemy, że /an + n\ = ^ V an J
+
+ ^ - a l g a ) - ¿ l g n + 0 (l).
(3 )
W zwykłej procedurze scalania algorytm 5.2.4M wykonuje m + n —1 porównań w przypadku pesymistycznym. Niech M ( m , n ) będzie funkcją analogiczną do 5 (n ), czyli równą liczbie po równań, które wystarczą zawsze do scalenia m elementów z n elementami. Z po
5.3.2
SCALANIE ZA POMOCĄ MINIMALNEJ LICZBY PORÓWNAŃ
209
czynionej właśnie obserwacji dostajemy, że ^ M ( m , n) < ra + n — 1
dla wszystkich m, n ^ 1.
(4)
Wzór (3 ) pokazuje, jak bardzo dolna i górna granica mogą być od siebie odległe. Gdy a — 1 (czyli m = n), dolną granicą jest 2n — \ lg n 4 - 0 (1 ). Tak więc obie granice są tego samego rzędu, ale różnica między nimi może być dowolnie duża. Gdy a = 0.5 (czyli m = ^n), dolną granicą jest |n ( l g 3 - §) + O (logn), co jest równe około lg 3 — § « 0.918 razy górna granica. Gdy a maleje, dolna i górna granica oddalają się od siebie coraz bardziej, ponieważ zwykły algorytm scalania został zaprojektowany głównie dla ciągów z m & n. Dła m — n problem scalania ma całkiem proste rozwiązanie; okazuje się, że za słaba jest nie granica górna, lecz granica dolna z (4 ). Następujące twierdzenie zostało odkryte około 1968 roku, niezależnie przez R. L. G raham a i R. M. Karpa. T w ierd zen ie M . M (m, m ) = 2m — 1 dla rri > 1 . Dowód. Rozważmy dowolny algorytm scalania A i < • *- < A m z B i < • • < B m . Gdy jest wykonywane porównanie A i \ B j wybieramy Ai < B j , jeśli i < j , natom iast gałąź Ai > B j , jeśli i > j . Scalanie musi w końcu zakończyć się konfiguracją B x < A x < B 2 < A 2 < ••• < B m < A m , (5) ponieważ jest ona zgodna ze wszystkimi dokonanymi wyborami.Ponadto każde z 2m — 1 porównań B±: Ai ,
A i \ B 2,
B 2 : A2,
B m :A m
musiało zostać jawnie wykonane, bowiem w przeciwnym przypadku mielibyśmy co najmniej dwie konfiguracje zgodne z poznanymi faktami. Na przykład, jeśli A i nie zostałoby porównane z B 2, to konfiguracja B i < B 2 < A i < A 2 < - ■* < B m < A m nie byłaby odróżnialna od (5 ).
|
P rosta modyfikacja powyższego dowodu prowadzi do wzoru M ( m , m + 1 ) = 2m
dla rn > 0.
(6 )
K onstruow anie d oln ych granic. Twierdzenie M pokazuje, że„teorio-informacyjna” dolna granica (2 ) może być dowolnie odległa od prawdziwej wartości; tak więc technika zastosowana w dowodzie twierdzenia M daje nam inny sposób odkrywania dolnych granic. Na taką technikę dowodzenia można często patrzeć jak na tworzenie strategii przeciwnika, to jest osobnika, który stara się spowolnić wykonywanie algorytmów. Gdy algorytm scalający decyduje się wykonać porów nanie A i : B j , przeciwnik wyrokuje o wyniku tego porównania w taki sposób, żeby skierować algorytm na najtrudniejszą ścieżkę w dół w drzewie porównań. Jeśli
210
SORTOWANIE
5.3.2
potrafim y znaleźć właściwego przeciwnika, tak jak w dowodzie twierdzenia M, to możemy być pewni, że każdy poprawny algorytm scalający wykona rzeczywiście dużo porównań. Będziemy także korzystać z przeciwników z ograniczeniami, których moc jest ograniczona ze względu na wyniki pewnych porównań. W metodzie scalania, na której działanie m a wpływ przeciwnik z ograniczeniami, nie korzysta się z żadnej wiedzy na tem at ograniczeń, tak że muszą w niej być wykonane wszyst kie niezbędne porównania, nawet gdyby ich wyniki były z góry określone. Dla przykładu w naszym dowodzie twierdzenia M wszystkie wyniki porównań były uwarunkowane zależnością ( 5 ), jednak algorytm scalania nie mógł wykorzystać tego faktu do ominięcia jakiegokolwiek porównania. Ograniczenia, o których będzie mowa poniżej, odnoszą się do lewych i pra wych końców scalanych ciągów. Ograniczenia lewostronne oznaczamy symbolicz nie jak następuje: . (oznacza brak ograniczenia z lewej strony), \ (oznacza, że wszystkie wyniki muszą być zgodne z A \ < B 1 ), / (oznacza, że wszystkie wyniki muszą być zgodne z A \ > B i); Podobnie oznaczamy symbolicznie ograniczenia prawostronne. . (oznacza brak ograniczenia z prawej strony), \ (oznacza, że wszystkie wyniki muszą być zgodne z A m < B n ) 1 / (oznacza, że wszystkie wyniki muszą być zgodne z A m > B n). Mamy dziewięć rodzajów przeciwników, oznaczanych przez AMp, gdzie A jest ograniczeniem lewostronnym, a p jest ograniczeniem prawostronnym. Na przy kład przeciwnik \ M \ mówi, że A \ < B j i Ai < B n ; przeciwnik .M. nie ma żadnych ograniczeń. Dla m ałych wartości m i n przeciwnicy o pewnych ograni czeniach nie istnieją; dla m = 1 w oczywisty sposób nie istnieje przeciwnik \ M / . Podam y teraz dość skomplikowaną, ale wspaniałą konstrukcję przeciwnika dla scalania. Nie zawsze daje ona optym alne wyniki, ale dostarcza dolnych granic, które stosuje się w wielu interesujących przypadkach. Przypuśćmy, że dla danych m , n i ograniczeń lewostronnego A i prawostronnego p pytam y przeciwnika, który z dwóch elementów Ai i Bj jest większy. Żeby zredukować problem do przypadków z mniejszą wartością m + n, można zastosować sześć następujących strategii: Strategia A (k,l) dla Odpowiadamy, że Ai < B j , i wymagamy, żeby w kolejnych operacjach zostały scalone ciągi { A i , . . . , A k} z {B1;. . . , Bj _ i } i {Afc+i,. . . , A m} z { B h . . . , B n }. Tak więc w przyszłości wy nikami porównań A p : B q będą A p < B qi jeśli p < A; i q > Z; A p > B q, jeśli p > k i q < l] jeśli p < k i q < l, to wynik porównania ustali przeciwnik (A:,/—1 , A,.). Jeśli p > k i ą > Z, to wynik porównania ustali przeciwnik (m —fc, n + 1 —Z,., p). Strategia B (&,/) dla z < / c < m ż l < / < j . Odpowiadamy, że Ai < B j , i wymagamy, żeby w kolejnych operacjach zostały scalone ciągi {^4i,. . . , Ak} z { £ 1 , . . . , £ * } i {Afc+i , . . . , A m} z { E j , . . . , E n }, przy założeniu że A k < B t
5.3.2
SCALANIE ZA POMOCĄ MINIMALNEJ LICZBY PORÓWNAŃ
211
< A k+1 . (Zauważmy, że Bi znajduje się na obu scalanych listach. W arunek Au < Bi < Ak+i zapewnia, że informacje zdobyte podczas scalania jednej z grup nie są pomocne w scalaniu drugiej). Tak więc wynikami przyszłych porównań A p :B q będą A p < B q, jeśli p < A; i q > /; A p > B q, jeśli p > k i q < 1. Jeśli p < k i q < /, to wynik porównania ustali przeciwnik (/c, Z, A, \ ) ; jeśli p > k i ą > /, to wynik porównania ustali przeciwnik (m —A;, n + 1 —/ , / , p). Strategia C(k, l) dla i < < m i i < I < j . Mówimy, że A* < B j , i żądamy, żeby w kolejnych operacjach zostały scalone ciągi { A i , . . . , A&} z {¿ Ą, . . . , i} i {A*,,. . . , Am} z { Ą , . . . , B n }, przyjm ując < Ak < B t. (Analogia strategii B z zamienionym rolami A i B). Strategia A7(A:, l) dla 1 < fc < i / j < / < n. Odpowiadamy, że A$ > B j, i wyma gamy, żeby zostały scalone ciągi { A i , . . . , Afc_i} z { B\ , . . . , B t} i {A k, . . . , Am} z { Ą + i , . . . , B n }. (Analogicznie do strategii A). Strategia B '(A:, Z) dla 1 < A ; < z i j < / < n . Odpowiadamy, że A* > B j, i wyma gamy, żeby zostały scalone ciągi {A1;. . . , Afc_x} z { Ą , . . . , B {\ i {Afc, . . . , Am} z {£?/,... , £?n }, przy założeniu A ^ -i < Bi < A&. (Analogicznie do strategii B). Strategia Cf( k J ) dla 1 < A; < / / j < / < n. Odpowiadamy, że A* > Bj , i wy magamy, żeby zostały scalone ciągi { A i , . . . , A / J z {£?i,. . . , £?;} i {Ak, • **, Am} z { B ; +i , . . . , B n }, przy założeniu Bi < Ak < B i +1 . (Analogicznie do strategii C). Z powodu założonych ograniczeń, powyższych strategii nie można użyć w pewnych przypadkach, które zostały wymienione poniżej: Strategia A ( M ) , B(fc, 1 ), C(fc, 1 ) A' (l,l), B'(l,Z), C '(1 ,0 C( m, l )
A= \
A!(k, n ), B'(fc, n), C'(A;, n)
P= \
P= /
Niech AM/)(m, n) oznacza maksymalną dolną granicę dla scalania, która jest osiągalna dla przeciwnika z klasy opisanej powyżej. Każda strategia, jeśli jest sto sowalna, daje nam pewną nierówność wiążącą te dziewięć funkcji, a mianowicie, A {k, l):
AMp ( m, n) > 1 + AM. (A;, l —1) + . M p ( m —A;, n + 1 —/);
B(fc, i):
AMp ( m, n) > 1 + XM\ ( k , l) + / M p ( m —k, n + 1 —/);
C(fc, /):
AMp ( m, n) > 1 + AM/(A:, / —1) + \M p (m + l —A:, n + 1 —/);
A'(fc,/):
AM p(m ,n) > 1 + A M .( fc -l,/) + .Mp(m+1 —A:,n—/);
B'(A;, /): A M p(m ,n) > 1 + X M \ ( k —1 , /) + /M p(m + 1 —k 1 n + 1 —/); C'(fc, /):
AMp ( m, n) > 1 + AM/(A:, /) + \M p ( m + l—A;, n —/).
Dla ustalonych i oraz j przeciwnik przyjmuje strategię, która maksymalizuje dolną granicę wyznaczaną przez wszystkie możliwe prawe strony, gdy k i / są z zakresów dozwolonych przez i oraz j . Wówczas definiujemy AMp(m, n) jako minimum z tych dolnych granic, branych po 1 < i < m i 1 < j < n. Gdy m lub n jest równe zero, wówczas AMp(m, n) wynosi zero.
212
SORTOWANIE
5.3.2
Tabela 1 DOLNE GRANICE DLA SCALANIA WYMUSZONE PRZEZ „PRZECIWNIKA”
1 2 3 4 5 6 7 8 9 10
1
2
3
1 2 2 3 3 3 3 4 4 4
2 3 4 5 5 6 6 6 7 7
2 4 5 6 7 7 8 8 9 9
.M .(m ,n) 4 5 6 3 5 6 7 8 9 10 10 11 11
3 5 7 8 9 10 11 12 12 13
3 6 7 9 10 11 12 13 14 15
/M .(m ,n)
7
8
3 6 8 10 11 12 13 14 15 16
4 6 8 10 12 13 14 15 16 17
9 10 4 7 9 11 12 14 15 16 17 18
n
4 7 9 11 13 15 16 17 18 19
1
2
3
4
5
6
7
8
1 1 1 1 1 1 1 1 1 1
2 3 3 4 4 4 4 5 5 5
2 3 3 4 4 5 5 6 7 5 7 8 6 8 9 6 8 10 7 9 10 7 9 11 8 10 11 8 10 12
3 5 7 9 10 11 12 13 13 14
3 6 8 9 11 12 13 14 15 15
4 6 8 10 12 13 14 15 16 17
9 10 4 7 9 10 12 14 15 16 17 18
4 1 7 2 9 3 11 4 13 5 14 6 16 7 17 8 18 9 19 10
m
m
1 — 00 2 — 00 3 — 00 4 — 00 5 — 00 6 — 00 7 — 00 8 —00 9 —00 10 — 00
2 2 2 2 2 2 2 2 2 2
2 4 4 5 5 5 5 6 6 6
/ M \ ( m , n) 3 3 3 4 5 5 6 6 7 6 8 8 7 8 10 7 9 10 8 10 11 8 10 12 9 10 12 9 11 13
1
2
3
4
5
6
/M/ (m, n )
3 6 8 9 10 12 12 13 14 15
4 6 8 10 11 13 14 15 16 16
7
8
4 7 8 10 12 14 15 16 17 18
4 7 9 11 13 14 16 17 18 19
9 10
n
1 1 1 1 1 1 1 1 1 1
1 3 3 4 4 4 4 5 5 5
1 1 3 4 5 5 5 7 6 7 6 8 7 9 7 9 8 9 8 10
1
2
3
4
1 4 6 7 9 9 10 11 11 12
1 4 6 8 9 11 11 12 13 14
1 4 7 9 10 11 13 14 15 15
1 5 7 9 11 12 14 15 16 17
5
6
7
8
1 5 8 9 ■11 13 15 16 17 18
1 1 5 2 8 3 10 4 12 5 14 6 15 7 17 8 18 9 19 10
9 10
Dla przykładu rozważmy przypadki, gdy m = 2 i n = 3, i załóżmy, że nasz przeciwnik działa bez żadnych ograniczeń. Jeśli pierwszym porównaniem jest A i : B \ , przeciwnik może przyjąć strategię A '(l, 1 ), wym agającą .M .(0,1) + .M.(2,2) = 3 dalszych porównań. Jeśli pierwszym porównaniem jest A u # 3, przeciwnik może przyjąć strategię B(l , 2), wym agającą . M \ ( l , 2) + /M .( l, 2) — 4 dodatkowych porównań. Niezależnie od tego, które z porównań A i \ B j zostanie wykonane jako pierwsze, przeciwnik może spowodować, że muszą być jeszcze wykonane co najm niej trzy dodatkowe porównania. Zatem .M .(2 ,3) = 4. Nie jest łatwo przeprowadzić te obliczenia ręcznie, ale kom puter jest w stanie wyprodukować tabele z wartościami funkcji AMp dość szybko. Istnieją oczywiste symetrie, takie jak n) = .M \(m , n) = \ M . ( n , m ) = . M/ ( n , m) ,
(7)
co oznacza, że możemy zredukować dziewięć funkcji do zaledwie czterech, .M. (m,n),
/M.(m,n),
/M \(m ,rc ),
/M/(m,n).
W tabeli 1 przedstawiono wartości tych funkcji dla wszystkich m, n < 10; nasz przeciwnik w procesie scalania został zdefiniowany w taki sposób, że . M. ( m, n ) < M (m , n)
dla wszystkich
m, n > 0.
(8)
Ta zależność obejmuje twierdzenie M jako specjalny przypadek, ponieważ nasz przeciwnik będzie stosował prostą strategię z twierdzenia, gdy |ra —n| < 1 .
5.3.2
SCALANIE ZA POMOCĄ MINIMALNEJ LICZBY PORÓWNAŃ
213
Rozważmy teraz pewne proste zależności zachodzącte dla funkcji AJ: M (m, n) = AJ(n, ra);
(9 )
AJ(m, n) < M( m, n+ 1);
( 10 )
AJ(fc+m, n) < AJ(&, n) + AJ(m, n);
(1 1 )
AJ(ra, n) < m ax(M (m , n —1) + 1, AJ(m —1, n) + l)
dla m > 1, n > 1 ;
( 12 )
AJ(m, n) < m ax(AJ(m, n —2) + 1, AJ(m—1, n) + 2)
dla m > 1, n > 2 .
( 13 )
Zależność ( 12 ) wywodzi się ze zwykłej procedury scalającej, jeśli najpierw po równamy Zależność ( 13 ) otrzymuje się podobnie, porównując najpierw A i : B2] jeśli Ai > B 2, to potrzebujem y M ( m , n —2) dodatkowych porównań, ale jeśli A\ < B 2, to możemy wstawić Ai na jego właściwe miejsce i scalić { A 2, . . , , A m } z { B i , . . . , B n }. Uogólniając, możemy zobaczyć, że jeśli m > 1 i n > fc, to mamy M( m, n) < max (AJ (m, n —k) + 1, M ( m —l , n ) + 1 + [~lgAf|),
( 14 )
porównując najpierw A x \Bk i stosując wyszukiwanie binarne, gdy A\ < BkOkazuje się, że M( m, n) = .M .(m , n) dla wszystkich m ,n < 10, tak więc tabela 1 podaje rzeczywiście wszystkie optymalne wartości dla scalania. Fakt ten można udowodnić na podstawie zależności (9) - ( 14 ) i stosując specjalne konstrukcje dla (m, n) = (2 , 8), (3 , 6 ) i (5,9), które zostały podane w ćwiczeniach 8, 9 i 10. Nasz przeciwnik jednak nie zawsze daje najlepszą możliwą dolną grani cę; najprostszym przykładem jest m = 3, n = 1 1 , gdy .AJ. ( 3 , 1 1 ) = 9, ale M (3 ,11) = 10. Żeby przekonać się, że przeciwnik „zawodzi” w tym przypadku, musimy zbadać podstawy podejmowanych przez niego decyzji. Przyjrzawszy się bliżej, odkryjemy, że jeśli (Ąj) ^ (2 , 6 ), to przeciwnik jest w stanie znaleźć strategię, która wymusza 10 porównań; jednak kiedy (i , j ) = (2 , 6), w tedy żadna strategia nie jest lepsza od A ( 2 , 4), co prowadzi do dolnej granicy 1 + .AJ. (2 ,3) + .AJ. ( 1 , 8) = 9. Jest warunkiem koniecznym, ale nie w ystarczającym , żeby koń czyć, scalając {AX, A 2} z i { ^ 3 } z {-84 , . . . , i?n } ; więc dolna granica w tym przypadku nie jest ostra. Podobnie można pokazać, że .AJ. (2,38) — 10, podczas gdy AJ(2,38) = 11, a zatem nasz przeciwnik nie jest wystarczająco dobry dla przypadku m — 2 . Jednak istnieje nieskończona klasa wartości, dla których się sprawdza T w ie rd z e n ie K .
M (m, m + 2) = 2m + 1
dla rn > 2 ;
AJ(m, m +3) = 2m + 2
dla m > 4;
AJ(m, m +4) = 2m + 3
dla m > 6 .
Dowód. Możemy w zasadzie udowodnić to twierdzenie zamieniwszy AJ przez .AJ.; dla małych m powyższe wyniki otrzym ano za pom ocą kom putera, tak więc możemy założyć, że m jest wystarczająco duże. Możemy także przyjąć, że pierwszym porównaniem jest A i i B j , gdzie i < [m /2]. Jeśli j < i, to stosujemy
214
SORTOWANIE
5.3.2
strategię A'(i, i) i przez indukcję względem d dla d < 4 dostajemy, że .M .(m , m+d) > 1 +
1, i) + .M .(m +1 —i, m-\~d—i) = 2m + d - 1.
Jeśli j > i, to stosujemy strategię A ( / , / + l ) i indukcyjnie względem m dostaje my, że .M. ( m , m + d ) > 1 + .M. (i, i) + .M. ( m — / , m + d — / ) = 2 m + d - 1 .
|
Pierwsze dwie części twierdzenia K otrzymali F. Hwang i S. Lin w 1969 roku. Kilka lat później Paul Stockmeyer i Frances Yao pokazali, że wzorzec widoczny w tych trzech zależnościach zachodzi w ogólnym przypadku - dolne granice otrzymywane za pomocą strategii przeciwnika opisanych powyżej po zwalają stwierdzić, że AJ(m, m +d) = 2m + d — 1 dla m > 2d — 2. fSICOM P 9 (1980), 85-90]. G ra n ic e g ó rn e . Rozważmy teraz górne ograniczenia dla M (m , n); dobre górne granice odpow iadają efektywnym algorytmom scalania. Dla m = 1 problem scalania jest równoważny problemowi wstawiania i mamy n + 1 miejsc, na których można umieścić A i wśród B \ , .. . , B n . W tym przy padku można zauważyć, że każde rozszerzone drzewo binarne o n + 1 węzłach zewnętrznych jest drzewem odpowiadającym pewnej metodzie scalania! (Zobacz ćwiczenie 2). Możemy zatem wybrać optymalne drzewo binarne, osiągając w ten sposób teorio-informacyjną dolną granicę 1 + [lgnj = M { \ , n ) = flg(n + 1)].
( 15 )
Wyszukiwanie binarne (punkt 6.2.1) jest naturalnym , prostym sposobem otrzy m ania tej wartości. Przypadek m = 2 jest niezwykle interesujący, ale znacząco trudniejszy. Został on w pełni rozwiązany przez R. L. Graham a, F. K. Hwanga i S. Lina (zobacz ćwiczenia 11, 12 i 13), którzy podali ogólny wzór M ( 2 ,n ) = [ l g ^ ( n + 1 )] + [lg j f (n + 1 )].
( 16 )
Przekonaliśmy się, że zwykła procedura scalająca jest optym alna dla m = n, podczas gdy zasadniczo inna procedura wyszukiwania binarnego jest optymalna dla m = 1. To, czego potrzebujemy, to m etoda, która leży gdzieś pośrodku i łączy ze sobą zwykły algorytm scalania z wyszukiwaniem binarnym, zachowu jąc najlepsze cechy obu z nich. Zależność ( 14 ) sugeruje następujący algorytm zaproponowany przez F. K. Hwanga i S. Lina [SICOMP 1 (1972), 31-39]: A lg o r y tm H (Scalanie binarne). H I . Jeśli m lub n jest równe zero, zakończ działanie. W przeciwnym przypadku, jeśli m > n, wykonaj t [lg (^ /^ )J i przejdź do kroku H4. W przeciwnym razie wykonaj t [lg (^/^)J* H 2 . Porównaj Am :F?n+ 1_ 2t. Jeśli A m jest mniejsze, to wykonaj n i wróć do kroku H I.
n — 2l
5.3.2
SCALANIE ZA POMOCĄ MINIMALNEJ LICZBY PORÓWNAŃ
215
H 3. Za pomocą wyszukiwania binarnego (które wymaga dokładnie t dodatkowych porównań) wstaw A m na jego właściwe miejsce wśród {Bn+i_ 2t , . . . , B n }. Jeśli k jest maksymalne takie, że Bk < A m , wykonaj m m —l i n k. Wróć do H I. H 4. (Kroki H4 i H5 są takie jak H2 i H3, z wyjątkiem zamienionych rolami m i n , A i B). Jeśli B n < A m+i_ 2t, to wykonaj m m —2* i wróć do H I. H 5 . W staw B n na właściwe miejsce wśród elementów A . Jeśli k jest maksymalne takie, że Ak < B n , to wykonaj m<— k i n < — n — 1. Wróć do H I. | Jako przykład działania tego algorytmu w tabeli 2 pokazano proces scala nia trzech kluczy {087, 503, 512} z trzynastom a kluczami {061, 1 5 4 , . . . , 908}; w tym przykładzie wymaganych jest osiem porównań. Porównywane elementy są pogrubione. Tabela 2 PRZYKŁAD SCALANIA BINARNEGO
A 087 087 087 087 087 087 087 087
503 503 503 503 503 503
B 512 512 512 512
061 154 061 154 061 154 061 154 061 154 061 154 061 154 061 r~ 061 f087
170 170 170 170 170 170 170 154 154
275 275 275 275 275 275 275 170 170
426 426 426 426 426 426 426 275 275
509 509 509 509 509 509 | 426 426
Wynik
612 653 677 612 653 677 612 612 512 512 503 509 512 503 509 512 503 509 512
703 765 897 908 703" 653 677 703 653 677 703 612 653 677 703 612 653 677 703 612 653 677 703 612 653 677 703 612 653 677 703
765 765 765 765 765 765 765 765
897 908 897 908 897 908 897 908 897 908 897 908 897 908 897 908
Niech H ( m , n ) będzie m aksymalną liczbą porównań wykonywanych w algo rytmie Hwanga i Lina. Żeby policzyć możemy założyć, że w kroku H3 fc = n, a w kroku H5 k = m, ponieważ udowodnimy przez indukcję względem m, że H ( m — 1 , n) < H ( m —1 , n + 1) dla każdego n > m — 1. Zatem dla m < n mamy H ( m , n ) — m ax(M (m , n —2 ^ + 1 , H ( m —1 , n ) + t+ 1 ), ( 17 ) dla 2tm < n < 2i+ 1 m. Zamieniwszy n przez 2n + e, gdzie e = 0 lub 1, dostajem y H( m, 2n+e) = max (i/(m , 2n + e —2i+1) + 1 , H ( m —1 , 2n + e )-H + 2) dla 2 tm < n < 2i+ 1m; przez indukcję względem n dostajemy, że H ( m , 2n+e) = H ( m , n) + m
dla m < n i e = 0 lub 1.
( 18 )
Łatwo można także zauważyć, że H ( m , n ) = m + n — 1 , gdy m < n < 2m; stąd wynika, że wielokrotne zastosowanie zależności ( 18 ) daje ogólny wzór H( m, n) = m + [n/2t\ — 1 -1- tm
dla
m < n,
t = |_lg(n/m )J.
( 19 )
To implikuje, że H ( m , n ) < £7(m, n+ 1) dla wszystkich n > m, co dowodzi słuszności naszego założenia indukcyjnego o kroku H3.
216
5.3.2
SORTOWANIE
Biorąc m = a n i
6
— lg( n / m) — t, otrzymujemy
H( a n , n) = a n ( 1 + 2e - 9 - Iga) + 0 (1 )
(20)
przy n —> 00. Z 5.3.1-(36) wiemy, że 1.9139 < 1 + 2e — 6 < 2; możemy zatem porównać (20) z teorio-inform acyjną dolną granicą (3 ). Hwang i Lin udowodnili (zobacz ćwiczenia 17), że ( 21 ) Algorytm binarnego scalania Hwanga i Lina nie zawsze daje optymalne wyniki, ma on jednak tę zaletę, że można go dość łatwo zaprogramować. Re dukuje się do „nieześrodkowanego wyszukiwania binarnego” , gdy m — 1 , i do zwykłego scalania, gdy m & n. Tak więc jest on doskonałym kompromisem między obiema m etodam i. Ponadto jest on w wielu przypadkach optymalny (zobacz ćwiczenie 16). Lepsze algorytmy zostały zaproponowane przez F. K. Hwanga i D. N. Deutscha, J A C M 20 (1973), 148-159; G. K. Manachera, JA C M 26 (1979), 434-440. Algorytm najbardziej zasługujący na uwagę został podany przez C. Christena, FOCS 19 (1978), 259-266. Algorytm scalania Christena, nazywany algorytmem z testowaniem w przód i wstawianiem wstecz, oszczędza około m /3 porównań w stosunku do algorytm u H, gdy n / m —►00. Co więcej, algorytm C hristena osiąga dolną granicę .M .(m , n) = |_(Hra n — 3)/4j dla 5 m —3 < n < 7m4-2[m parzysty]; jest on zatem optymalny w takich przypadkach (odnosi się to też, co godne podkreślenia, do naszej dolnej granicy otrzymywanej z wykorzystaniem przeciwnika). W zór ( 18 ) sugeruje, że sama funkcja M mogłaby spełniać nierówność M (m, n) < M( m , [ n / 2 \ ) + m.
(22)
To jest rzeczywiście praw da (zobacz ćwiczenia 19). Z tabel dla M (m , n) wynika kilka innych wartych zauważenia zależności, takich jak M ( m + 1 , n) > 1 + M (m , n) > M( m, n + 1 )
dla m < n;
M ( m + 1 , n + 1 ) > 2 + M (m , n);
( 23) (24 )
ale żaden dowód tych nierówności nie jest znany. ĆW ICZENIA [15] Znajdź interesującą zależność między M (m , n) a funkcją 5 zdefiniowaną w punkcie 5.3.1. [Wskazówka: Rozważ S(m + n)]. 1.
► 2. [22] Dla m — 1 każdy algorytm scalający bez redundantnych porównań definiuje rozszerzone drzewo binarne o (m^ n) = n + 1 węzłach zewnętrznych. Udowodnij, że, na odwrót, każde rozszerzone drzewo binarne o n + 1 węzłach zewnętrznych odpowiada pewnemu algorytmowi scalającemu z rn ~ 1 . 3. [MŻĄ] Udowodnij, że dla każdego n, .M .(l,n ) — M (l,n ). 4. [MĄŻ] Czy dla wszystkich m i n, .M. (m ,n) ^ fig (mł^n)l? 5. [M30] Udowodnij, że .M .(m ,n ) ^ .M \(m ,n + 1 ).
5.3.2
SCALANIE ZA POMOCĄ MINIMALNEJ LICZBY PORÓWNAŃ
217
6 . [M26] Przedstawiony dowód twierdzenia K wymaga komputerowego sprawdzenia bardzo wielu przypadków. W jaki sposób można drastycznie zredukować liczbę takich przypadków?
7.
[21] Udowodnij ( n ) .
► 8 . [24] Udowodnij, że M (2, 8 ) ^ 6 , znajdując algorytm, który scala dwaelementy z ośmioma innymi za pomocą co najwyżej sześciu porównań. 9. [27] Udowodnij, że trzy elementy można scalić z sześcioma w co najwyżej siedmiu krokach. 10. [55] Udowodnij, że pięć elementów można scalić z dziewięcioma w co najwyżej dwunastu krokach. [Wskazówka: Doświadczenie z przeciwnikiem podpowiada, że naj pierw należy porównać A \ :B 2, a następnie, jeśli A \ < B 2, spróbować porównać A 5 : ¿?g]. 1 1 . [MĄO] (F. Hwang, S. Lin) Niech g2k = L2^ 52 fc+i = |_2 /c dla k ^ 0, tak że (50 , 51 , 52 , ■■•) = ( 1 , 1 , 2 , 3 , 4 , 6 , 9 , 1 3 , 1 9 , 2 7 , 3 8 , 5 4 , 7 7 , . . . ) . Udowodnij, że do
scalenia dwóch elementów z gt elementami potrzeba w pesymistycznym przypadku więcej niż t porównań; jednak dwa elementy można scalić z gt — 1 w co najwyżej t krokach. [Wskazówka: Pokaż, że jeśli n = gt lub n = gt — 1 i chcemy scalić { ^ 1, ^ 2 } z {E?i, £ 2 , • • •, B n } za pomocą t porównań, to nie możemy uczynić nic lepszego niż porównać A 2 : B gt_ l w pierwszym kroku]. 12. [M21] Niech R n (i ,j ) będzie najmniejszą liczbą porównań potrzebną do posorto wania różnych obiektów {a, f i , X 1, . . . , X n } J mając dane, że a< fi,
Xi < X2 < *
< X n,
a < X i+u
f i > X n- j .
(Gdy i n lub j ^ n, wówczas warunki a < X i +1 i fi > X n- j są pomijane. Dlatego i?n(n, n) = M{ 2 , n)). Oczywiście R n (0,0) = 0. Udowodnij, że R n ( i , j ) = 1 + min( min m ax(iin(fc—1 , j), R n- k { i ~ k , j)), 1^ k^.i min m a x ( R n ( i , k - l ) , R n - k ( i , j - k ) ) ) 1
dla 0 ^ i ^ n, 0 ^ j ^ n, i + j > 0 . 13. [M4 2 ] (R. L. Graham) Pokaż, że rozwiązanie równania rekurencyjnego z ćwiczenia 12 można wyrazić w następujący sposób. Definiujemy funkcję G(x) dla 0 < x < 0 0 , według poniższych zasad ( 1,
jeśli
0 < x ^ f;
G (a.) = J 2 + l G (8a: - 5)> Jeśli f < x ^ f; |G ( 2x - 1), jeśli I < X ^ 1; . 0,
jeśli
1 < x < 00.
(Zobacz rysunek 38). Ponieważ R n ( i ,j ) = R n (j,i ) 1 ^ n ( 0 , j ) — M ( l , j ) , zatem możemy przyjąć, że 1 ^ i ^ j ^ n. Niech p — [Ig żj, 5 = [Ig j \ , r = [Ig rzj i niech t — n ~ 2r + 1. Wówczas (Ą j) — p A g A S n(^, jO Tn (ż, j), gdzie 5 n i Tn są funkcjami o wartościach 0 lub 1 : Sn(i,j) = 1 Tn(i,j) = 1
wtedy i tylko wtedy, gdy wtedy i tylko wtedy, gdy
gdzie u - 2pG (i/ 2 p) i v = 2r~2G ( t / 2 r~2).
q < r lub (i — 2P ^ u i j —2r ^ u), p < r lub (t > f 2r_2 i ż —2 r ^ i?),
218
5.3.2
SORTOWANIE
R y s. 38. Funkcja Grahama (zobacz ćwiczenie 13). (To być może jest najbardziej skomplikowana zależność rekurencyjna, która kie dykolwiek została rozwiązana!) 14. [4 1 ] (F. K. Hwang) Niech h 3k = [ § 2kJ - 1, h3k+i = h3k + 3 • 2 k- 3, h3k+2 = \_~-2k — |J dla k ^ 3 i niech początkowe wartości będą zdefiniowane tak, że (ko, /l i , /i2, .. .) = (1,1, 2, 2, 3, 4, 5, 7,9,11, 14, 18,23, 29, 38,48,60, 7 6 , . . . ) . Udowodnij, że dla każdego £, M ( 3, ht ) > i i M ( 3 , / i t- l ) dokładne wartości M( 3, n) dla wszystkich n.
otrzymujemy w ten sposób
15. [12] Krok HI w algorytmie scalania binarnego może wymagać obliczenia wartości wyrażenia [lg(n/m)J dla n ^ m. Wyjaśnij, w jaki sposób można to łatwo wykonać bez dzielenia i liczenia logarytmu. 16. [18] Dla jakich m i n z zakresu l ^ m ^ n ^ l O algorytm scalania binarnego Hwanga i Lina jest optymalny? 17. [M25] Udowodnij ( 21 ). [ Wskazówka: Ta nierówność nie jest bardzo ścisła], 18. [MĄO] Zbadaj średnią liczbę porównań w algorytmie scalania binarnego. ►19. [23] Udowodnij, że funkcja M spełnia ( 22 ). 20. [20] Udowodnij, że jeśli dla każdego m ^ n mamy M (m , n+ 1) ^ Af(m +1, n), to dla każdego m ^ n zachodzi M (m , n + 1 ) ^ 1 + M (m , n). 21.
[MĄ7] Udowodnij lub zaprzecz prawdziwości ( 23 ) i ( 24 ).
2 2 . [MĄ 3] Zbadaj minimalną średnią liczbę porównań potrzebną do scalenia m ele
mentów z n elementami. 23. [M31] (E. Reingold) Niech { A i , . .. , A n} i { B i , . .. , B n} będą n-elementowymi zbiorami. Rozważmy algorytm, który sprawdza równość tych dwóch zbiorów tylko za pomocą testowania równości ich elementów. Oznacza to, że w algorytmie mogą być zadawane tylko pytania postaci „Czy Ai = B j ? n dla pewnych i oraz j, a dalsze kroki algorytmu zależą od odpowiedzi na to pytanie. Definiując odpowiedniego przeciwnika, wykaż, że każdy taki algorytm musi wyko nać w pesymistycznym przypadku co najmniej ~ n ( n + 1 ) porównań.
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
219
24. [22] (E. L. Lawler) Jaka jest maksymalna liczba porównań wykonywanych w nastę pującym algorytmie scalającym m elementów z n ^ m elementami? „Weź t <— [lg(n /m ) J i zastosuj algorytm 5.2.4M do scalenia A \ , A 2 , ■- ., A m z B 2t , B 2. B q.2t, gdzie q = [n/2*J. Następnie wstaw każde A j na jego właściwe miejsce między elementami B k\ ►25. [25] Niech (xij) będzie macierzą o wymiarach m x n, w której kolumny i wiersze są uporządkowane niemalejąco: Xij ^ ^(¿+1 )j dla 1 ^ i < m oraz Xij ^ ^¿0 + 1) dla 1 ^ j < n. Pokaż, że M (m, n ) jest minimalną liczbą porównań potrzebną do spraw dzenia, czy dana liczba x jest elementem macierzy, jeśli wykonujemy tylko porównania między x a pojedynczymi elementami macierzy.
*5.3.3. Wybór z minimalną liczbą porównań
Podobna klasa interesujących problemów pojaw ia się, gdy szukamy najlepszej procedury wyboru k-tego największego elementu spośród n elementów. Historia tego problemu sięga zabawnego eseju (jakkolwiek napisanego cał kiem serio) na tem at turniejów tenisowych, autorstw a wielebnego C. L. Dodgsona, który pojawił się na stronach 5 - 6 S t.J a m e s’s Gazette, 1 sierpnia 1883 r. Dodgson - który jest bardziej znany jako Lewis Carroll - zajął się problemem niesprawiedliwego przydziału nagród w turniejach tenisowych. Rozważmy dla przykładu rysunek 39 przedstawiający typowy turniej, w którym „przegrywający odpada” . W tym turnieju bierze udział 32 graczy ponumerowanych 01, 02, . . . , 32. W finale gracz 01 pokonuje gracza 05, tak więc jasne jest, że gracz 01 jest mistrzem i zasłużył na pierwsze miejsce. Pojaw iają się jednak wątpliwości, ponieważ gracz 05 zajmuje zazwyczaj drugie miejsce, chociaż równie dobrze ktoś inny mógłby być drugim w kolejności najlepszym graczem. W turnieju można zająć drugie miejsce, nawet jeśli jest się gorszym od połowy graczy biorących udział w zawodach! W rzeczywistości, jak zauważył Dodgson, drugi najlepszy w kolejności gracz zajmuje drugie miejsce wtedy i tylko wtedy, gdy m istrz i drugi najlepszy gracz znajdują się początkowo w przeciwnych połówkach turnieju; to zdarza się z prawdopodobieństwem 2 n~ 1/ ( 2 n — 1 ), gdy w turnieju bierze udział 2n zawodników. Tak więc prawie w połowie przypadków drugie miejsce zajmuje niewłaściwy gracz. Jeśli pokonani w półfinałach ( 25 i 17 na rysunku 39) grają o trzecie miejsce, jest bardzo mało prawdopodobne, że miejsce to zajmie trzeci z najlepszych graczy. Jest to powód, dla którego Dodgson postanowił zaprojektować turniej, który naprawdę ustala drugiego i trzeciego z najlepszych graczy, przy założeniu, że kla syfikacja graczy jest przechodnia. (Innymi słowy, Dodgson przyjął, że jeśli gracz A zwycięża gracza B , a gracz B zwycięża gracza C, to A pokonałby C). Wymyślił procedurę, która umożliwia pokonanym dalszy udział w turnieju, aż na pewno będzie wiadomo, że są oni słabsi od co najmniej trzech innych graczy. Przykład schematu rozgrywek zaproponowany przez Dodgsona znajduje się na rysunku 40. Ten turniej jest rozgrywany łącznie z turniejem z rysunku 39. Dodgson próbował łączyć w pary graczy o równoważnych osiągnięciach we wcześniejszych rundach; starał się także unikać meczy między graczami pokonanymi przez tę sam ą osobę. W tym szczególnym przypadku w pierwszej rundzie gracz 16 przegrywa z 1 1
220
SORTOWANIE
5.3.3
i 13 przegrywa z 12; następnie w rundzie drugiej gracz 13 wygrywa z 16. W tym momencie możemy wyeliminować gracza 16, o którym wiadomo, że jest słabszy od graczy 1 1 , 12 i 13. W rundzie 3 Dodgson nie dopuszcza do meczu między graczami 19 i 2 1 , ponieważ obaj zostali pokonani przez gracza 18; natychmiastowe wyeliminowanie pokonanego w pojedynku między graczami 19 i 21 nie jest możliwe. Zwycięzca = 01 Runda 5 (Finały) Runda 4
05
i---------------1---------------i
01
I
Runda 3
01 01
25
1
l— ^
Runda 2
01
,--------------- 1--------------- ,
03
1
02
1
25
l— 1— I
02
05
I------ 1
OĄ
I— 1— i
25
26
I
29
05
I— 1— I
29
30
I— 1— I
05
17
1 06
1
I------------ 1
11
17
I— 1— I
11
12
18
I— L~ i
17
20
l— 1— l
18
21
r h r h r h r h r h r h r h r h r h r ^ i r h r h r h r h H u r h
Runda 1 01 07 0310 02 08 OĄ 09 25 28 26 2729 32 30 31 0515 061Ą U 1 6 1 2 1 3 1 7 2Ą 20 2 3 1 8 1 9 21 22
R ys. 39. Turniej dla 32 graczy, w którym pokonany odpada. Byłoby miło zakomunikować, że turniej Lewisa Carrolla okazuje się optymal ny, ale niestety nie jest to prawda. Zapis w jego pamiętniku z 23 lipca 1883 roku mówi, że Carrol potrzebował na napisanie swojego eseju około sześciu godzin i miał poczucie, że „jest pełnia sezonu [tenisowego], tak więc lepiej opublikować go szybko niż dobrze napisać” . W zaproponowanej przez niego procedurze jest wykonywanych więcej porównań, niż jest to konieczne, a na dodatek sama pro cedura nie jest na tyle precyzyjna, żeby mówić o niej jak o algorytmie. Z drugiej strony, zawiera ona pewne, dość interesujące elementy pod względem obliczeń równoległych. Okazuje się też, że za pomocą tej procedury można zaplanować znakomity turniej tenisowy, ponieważ stwarza ona pewne efekty dramatyczne; dla przykładu Dodgson zaproponował, żeby finaliści pauzowali w rundzie 5 i rozegrali finał w rundzie 6 lub 7. Niestety dyrektorzy turniejów uważali zapewne, że propozycja Carrola jest zbyt wydum ana, tak więc jego system prawdopodobnie nigdy nie został wypróbowany. Zamiast tego stosuje się „rozstawianie” tak, żeby najlepszych graczy umieścić w różnych częściach drzewa. Podczas sem inarium m atem atycznego odbywającego się w latach 1929-1930 Hugo Steinhaus postawił problem wyznaczenia minimalnej liczby pojedynków tenisowych, potrzebnych do wyłonienia najlepszego i drugiego w kolejności gra cza turnieju, gdy do rozgrywek przystępuje n > 2 graczy. J. Schreier [Mathesis Polska 7 (1932), 154-160] zaproponował procedurę, która wymaga co najwy żej n — 2 + fig n] pojedynków, wykorzystując w zasadzie tę samą metodę jak ta z dwóch pierwszych faz algorytm u sortowania przez wybieranie drzewowe (zobacz punkt 5.2.3, rysunek 23), pominąwszy nic nie wnoszące porównania z —oo. Schreier także twierdził, że n — 2 + |~lgn] jest najlepsze z możliwych, ale jego dowód był niepoprawny, jak też niepoprawny był dowód J. Słupeckiego [Colloquium Mathematician 2 (1951), 286-290]. Musiało minąć trzydzieści dwa lata, zanim pojawił się w końcu poprawny, chociaż dość skomplikowany dowód S. S. Kislicyna [Sibirskij Mat. Żurnal 5 (1964), 557-564].
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
5.3.3
Trzecie miejsce = 03 l 1 i
Runda 9
03
Drugie miejsce = 02
05
I
Runda 8
05
02
03
I
Runda 6
1
02
I
i—
Runda 4 02 20 rh Runda 3 20 21
I------------
06
02
rh
Runda 2
l
02
Runda 7
Runda 5
221
"
06
r
12
06
rh
rh
23
12 19
06 27
23
rh
rh
rh
19 22
l
27 28
i
07 07 29
31
rh
i—
07
rh
08
1
03
rh
i— 1— i
1
03
03
rh
26
rh
03 OĄ 26 30
rh
23 2Ą 31 32 0 7 1 0 08 09
17
l
11
1 7 25
11 18
13
i— 1— i
13
1Ą
rh
rh
13 16 1Ą 15
Rys. 40. Turniej Lewisa Carrolla (rozgrywany łącznie z turniejem z rysunku 39). Niech Vfe(n) oznacza m inimalną liczbę porównań, potrzebną do wyznaczenia k -tego największego spośród n elementów dla 1 < k < n, i niech Wjt(n) będzie minimalną liczbą porównań potrzebną do wyznaczenia wszystkich k najwięk szych elementów, w kolejności od największego do najmniejszego. Z sym etrii mamy Vfc(n) = Vn+i - k (n), (i) i oczywistym jest, że 14(n) = lC1(n),
(2)
Vk (n) < W k {ń),
(3)
W n (n) = W n- 1 (n) = S(n).
(4 )
W lemacie 5.2.3M zauważyliśmy, że V i ( n ) = n - 1.
(5)
Dowód tego faktu jest zadziwiająco prosty, ponieważ każdy w turnieju, z wy jątkiem zwycięzcy, musi przegrać co najm niej jeden pojedynek! Rozwijając ten pomysł i korzystając z „przeciwnika” jak w punkcie 5.3.2, możemy udowodnić bez większego problemu twierdzenie Shreiera-Kislicyna: T w ie rd z e n ie S. V2 (n) = W 2 (n) = n - 2 + [lgn] dla n > 2 . Dowód. Załóżmy, że w pewnym turnieju bierze udział n graczy i że w tym turnieju zostaje wyłaniany drugi w kolejności najlepszy gracz. Niech aj będzie liczbą graczy, którzy przegrali j lub więcej pojedynków. Łączna liczba rozegranych meczy wynosi a i + a 2 + a 3 H . Nie można wyłonić drugiego gracza w kolejności bez wyłonienia najlepszego gracza (zobacz ćwiczenie 2 ), zatem z poprzednich rozważań mamy a\ = n —1 . Żeby zakończyć dowód, pokażemy, że zawsze istnieje ciąg wyników pojedynków, który powoduje, że a 2 > [Ig n l ” 1 * Przypuśćmy, że w całym turnieju mistrz grał (i wygrał) z p innymi graczami; jeden z nich jest drugim najlepszym, a pozostali musieli przegrać jeszcze co
222
SORTOWANIE
5.3.3
najm niej jeden pojedynek. Tak więc <22 > p — 1. Dlatego do zakończenia dowodu wystarczy skonstruować przeciwnika, który decyduje o wynikach pojedynków w taki sposób, żeby m istrz był zmuszony grać z co najmniej [lgn] innymi osobami. Przeciwnik twierdzi, że A jest lepszy od B , jeśli A nie został dotychczas poko nany, a B przegrał dotąd co najwyżej raz, lub jeśli obaj dotychczas nie przegrali i jak dotąd B wygrał mniej meczy od A. W innych okolicznościach przeciwnik może podjąć dowolną decyzję zgodną z pewnym częściowym porządkiem. Rozważmy wynik całego turnieju, w którym o rezultatach poszczególnych meczy decydował przeciwnik. Powiemy, że „A góruje nad R ” wtedy i tylko wtedy, gdy A = B lub A góruje nad graczem, który pierwszy pokonał B. (W tej relacji ważna jest tylko pierwsza porażka gracza; kolejne gry takiego gracza są ignorowane. Zgodnie z mechanizmem działania przeciwnika, każdy gracz, który jest pierwszym zwycięzcą dla innego gracza, musi być do tego momentu niepokonanym). W ynika stąd, na podstawie analizy rozegranych meczy, że gracz, który wygrał pierwszych p meczy, góruje nad co najwyżej 2 P graczami. (Jest to jasne dla p = 0, natom iast dla p > 0 mecz p był rozgrywany albo przeciwko komuś, kto wcześnie przegrał, albo przeciwko komuś, kto góruje nad co najwyżej 2P_1 graczami). Tak więc mistrz, który góruje nad każdym, musiał rozegrać co najm niej [lgn] meczy. | Twierdzenie S w pełni rozwiązuje w sensie „mini-maksowym” problem znaj dowania drugiego w kolejności gracza. W ćwiczeniu 6 pokazujemy, że można podać prosty wzór na m inim alną liczbę porównań potrzebną do wyznaczenia elementu drugiego co do wielkości w zbiorze, gdy jest znany wcześniej pewien dowolny częściowy porządek na elementach tego zbioru. C o b ę d z ie , je ś li k > 2? W pracy cytowanej powyżej, Kislicyn rozważał także większe wartości k i udowodnił, że Wfc(n) < n — k +
^ [Ig i] n+l —k
dla n > k.
(6)
Jak już zobaczyliśmy, dla k = 1 i k = 2 w tym wzorze mamy równość; dla k = 3 m ożna uzyskać trochę lepszy wynik (zobacz ćwiczenie 21). Udowodnimy twierdzenie Kislicyna, pokazując, że w pierwszych k fazach wybierania drzewowego wykonuje się co najwyżej n — k -V X]n+i-fc
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
223
cn_i cn_2 . . . Ci, w którym Cj jest liczbą porównań potrzebną do umieszczenia j w korzeniu drzewa, gdy element j+ 1 zostanie zastąpiony przez —oo. Na przykład, jeśli a jest drzewem postaci
i jeśli 7r = 5 3 1 4 2, dostaniemy kolejno drzewa postaci s
c3
=
2
C2 —0
ci —0
Jeśli 7r byłoby równe 3 1 5 4 2, to ciąg cą C3 o2 ci m iałby postać 2 1 1 0 . Nietrudno zauważyć, że ci jest zawsze równe zero. Niech /x(a, 7r) będzie multizbiorem {cn_i , cn_ 2, . . . , Ci} określonym jedno znacznie przez a i 7r. Jeśli a = a
a
i jeśli elementy 1 i 2 nie występują jednocześnie w a! lub w a n, to łatwo można się przekonać, że /¿(a, 7r) = (//(a', 7r') + l) l±l (/z(a", 7r") + l) W{0}
(8)
dla odpowiednich perm utacji 7r' i tt", gdzie /i + 1 oznacza m ultizbiór otrzymywany w wyniku dodania 1 do każdego elementu z ¡x. (Zobacz ćwiczenie 7). Z drugiej strony, jeśli elementy 1 i 2 występują razem w a \ mamy tt) = (M a ' tO + e) w
T1-") + 1 ) W{0},
gdzie /i + e oznacza multizbiór otrzymywany w wyniku dodania 1 do pewnych elementów z p i 0 do pozostałych. Podobny wzór zachodzi, gdy 1 i 2 w ystępują ra zem w a n. Powiemy, że multizbiór /xi dominuje nad ¡1 2 , jeśli oba /¿i i ¿22 zawierają taką samą liczbę elementów i jeśli dla każdego k , A;-ty największy element z /¿i jest nie mniejszy od k~tego największego elementu z /¿2. Zdefiniujmy ^ (a ) jako zbiór dominujący /¿(a, 7 r ) , wzięty po wszystkich perm utacjach 7r i w takim znaczeniu, że p(a) dominuje nad /¿(a, 7r) dla każdej perm utacji 7r, oraz fi(a) — /x(a, 7r) dla
224
SORTOWANIE
5.3.3
pewnej perm utacji n. Z powyższych wzorów wynika, że « ( □ ) = *,
M O ) = (**(<*') + 1 ) « W a'
) + 1 ) w {0};
( 9)
a"
tak więc ¿¿(a) jest multizbiorem wszystkich odległości od korzenia do węzłów wewnętrznych w drzewie a. Czytelnik, który nadążał za tokiem tego rozumowania, widzi już, że jesteśmy gotowi do dowodu twierdzenia Kislicyna (6 ). Rzeczywiście, W k {n) jest mniejsze lub równe od n — 1 plus k — 1 największych elementów z //(a), gdzie a jest dowolnym drzewem w algorytmie sortowania z wybieraniem drzewowym. Za a możemy wziąć zupełne drzewo binarne o n węzłach zewnętrznych (zobacz podpunkt 2 .3.4.5), dla którego n( a) = { Lig 1 J , Lig2J , . . . , L lg(n- 1 ) J } = { f i g 2"! —1 , ri g 3l - l , . . . , f l g n l - l } .
( 10)
Nierówność (6) otrzymamy, gdy rozważymy k —1 największych elementów z tego multizbioru. Twierdzenie Kislicyna daje dobre ograniczenie górne na W k{n). Kislicyn wskazał, że K3 (5) = 6 < Wa(5) = 7, ale nie był w stanie znaleźć lepszego ograni czenia dla Vfe(n) niż dla Wk(n). A. Hadian i M. Sobel pokazali, w jaki sposób to zrobić, korzystając z wybierania z podmianą, zamiast z wybierania drzewowego; podana przez nich nierówność [Univ. of Minnesota, Dept. of Statistics Report 121 (1969)] Vfc(n) < n - k + (fc - 1 ) [lg(n + 2 - k ) ] ,
n > fc,
(n )
jest podobna do górnego ograniczenia Kislicyna na W k (n) z (6 ), z wyjątkiem tego, że każdy składnik sumy został zastąpiony przez składnik mniejszy. Twierdzenie H adiana i Sobela ( i i ) można udowodnić, korzystając z następu jącej konstrukcji: Na początek budujemy drzewo binarne dla turnieju, w którym pokonany odpada, dla n — k + 2 elementów. (To zabiera n —k + 1 porównań). Największy element jest większy od n — k + 1 pozostałych, więc nie może być fc-tym co do wielkości. Podmieniamy go w jego węźle zewnętrznym przez jeden z k — 2 elementów trzym anych w rezerwie i znajdujemy największy element wśród n — k + 2 elementów umieszczonych w drzewie; to wymaga co najwyżej [lg(n + 2 — fc)] porównań, ponieważ musimy przeliczyć na nowo tylko jedną ścieżkę w drzewie. Tę operację powtarzam y k — 2 razy, po razie dla każdego ele m entu z rezerwy. Na koniec zamieniamy ostatnio znaleziony największy element przez “ OO i wyznaczamy największy spośród n - \ - l — k pozostałych; to wymaga [lg(n + 2 — fc)] — I porównań, w wyniku czego element A;-ty co do wielkości znajdzie się w korzeniu drzewa. Sumując porównania dostajem y ( n ) . W nierówności ( i i ) powinniśmy oczywiście zamienić po prawej stronie k przez Ti + 1 — fc, gdy tylko n + 1 — k daje lepszą wartość (jak na przykład dla n = 6 i fc = 3). Osobliwie, ta nierówność daje mniejsze ograniczenie dla łh(13)
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
225
niż dla Viś(13). Górne ograniczenie z ( n ) jest dokładne dla n < 6 , ale, gdy n i k stają się większe, można otrzym ać dużo lepsze oszacowanie dla 1 4 (n). Dla przykładu, następującą elegancką metodę (zaproponowaną przez Davida G. Dorena) można zastosować do pokazania, że 14(8) < 12 . Niech da nymi elementami będą X \ , . . . Najpierw porównujemy X \ \ X 2 i X ^ .’X^, a następnie zwycięzców. Potem podobnie porównujemy X^: Xq^ X ? : X 8 i ich zwycięzców. Zmieńmy etykiety elementów tak, żeby X \ < X 2 < X 4 > X 3 , X 5 < X 6 < X 8 > X 7 , a następnie porównajmy X 2 :Xq. Przez sym etrię załóżmy, że X 2 < X$, Doszliśmy zatem do konfiguracji
(Teraz nie musimy już rozważać X i i X 8, zatem pozostaje znaleźć element trzeci co do wielkości wśród {X 2, . . . , -XV}). Porównujemy X 2 :X? i zapominamy o mniejszym z nich; w pesymistycznym przypadku mamy X 2 < X j i musimy znaleźć trzeci co do wielkości wśród 5*------- »6 •7 3*------- *4
To można zrobić w 14(5) —2 — 4 dodatkowych krokach, ponieważ w procedurze z dowodu ( 1 1 ), dla której 14(5) = 6 , porównywane są najpierw elementy w dwóch rozłącznych parach. Inne podobne sztuczki można wykorzystać do uzyskania wyników przedsta wionych w tabeli 1 ; jak dotąd nie znaleziono żadnej ogólnej m etody wyznaczenia tych ograniczeń. W 1996 roku W. Gasarch, W. Kelly i W. Pugh udowodnili, że podane wartości dla 14(9) = 14(9) i 14(10) = 14(10) są optymalne [SIGACT News 2 7 ,2 (June 1996), 88-96], wykorzystując do tego celu kom puter. Zupełnie dobre ograniczenie dla problemu wyboru, gdy k jest małe, otrzym ał David G. Kirkpatrick [JACM 28 (1981), 150-165]: Jeśli 2 < fc < (n + l )/ 2, to
k—2 14 (ti) ^ Ti + k —3 + ^ ^ Ig j =o
n —k + 2 k+j
( 12 )
W swojej pracy doktorskiej [Toronto, 1974], Kirkpatrick udowodnił także, że Vs(n) < n + l +
. n —1 lg 4
+
_ n —1 lg 5
( 13 )
to górne ograniczenie pokrywa się z ograniczeniem dolnym ( 12 ) dla lg | ~ 74% wszystkich liczb naturalnych n i jest większe od ( 12 ) co najwyżej o 1. Z analizy dokonanej przez Kirkpatricka wynikała w sposób naturalny hipoteza, że w ( 13 ) mamy równość dla wszystkich n > 4, jednak J u tta Eusterbrock pokazała za dziwiający kontrprzykład, że 14(22) = 28 [Discrete Applied Math. 41 (1993),
226
5.3.3
SORTOWANIE
Tabela 1 WARTOŚCI Vi.(n) DLA MAŁYCH n
Vi(n) V2(n) V3 {n) V4(n) V5(n) V6(n) V7(n) V8 (n) V9 {n) Vl0(n)
n 1 2
3 4 5
0 1 2
1
3 4
6
3 4 5
7
6
8
8
7
9
9
8
10
9
11 12
6
7
2
4
3
6 8 10 11 12
6 8 10 * 12
4 7
5
10 12
8 11
14 15
14* 16**
14 16**
14*
6
9
7
12
11
15
14*
8 12
9
* W ćwiczeniach 1 0 - 1 2 podajemy konstrukcje, które poprawiają w tych przypadkach oszacowanie ( n ) . ** Zobacz K. Noshita, Trans, o f the IE CE o f Japan E 5 9 , 12 (December 1976), 17-18.
131-137]. Lepsze dolne granice dla większych wartości k znaleźli S. W. Bent i J. W. John (zobacz ćwiczenie 26): Vfc(n) > n + m — 2 1"y/ m ],
ni — 2 4- lg
n+
1
~ k
(m )
Ta nierówność dowodzi w szczególności, że Van( n ) > ( l + a l g l + (1 - a ) l g —— ) n + 0 ( \ / n ) . V a 1 —a /
( 15 )
M e to d a lin io w a. Gdy n jest nieparzyste i k — \ n / 2], element A:-ty z najwięk szych (i A;-ty z najmniejszych) nazywamy medianą. Z ( 1 1 ) mamy, że medianę z n elementów można znaleźć za pomocą około ^ n l g n porównań; to jest tylko około dwa razy szybciej niż dla sortowania, chociaż żądamy znacznie mniej. Przez wiele lat dużo osób starało się znaleźć lepsze ograniczenie niż ( 1 1 ) dla dużych k i n. W końcu, w 1971 roku, Manuel Blum odkrył metodę, w której potrzeba tylko 0 ( n log log n) kroków. Rozwiązanie Bluma stało się podstawą nowej klasy technik, które doprowadziły do następującej konstrukcji pochodzącej od R. Rivesta i R. Tarjana [J. Comp. and Sys. Sci. 7 (1973),448-461]: T w ie rd z e n ie L. Vk(n) < 15n — 163 dla n > 32 i 1 < A; < n. Dowód. Twierdzenie jest oczywiste dla m ałych n, ponieważ V*(n) < S(n) < lOn < 15n —163 dla 32 < n < 210. Dodawszy co najwyżej 13 sztucznych elemen tów —oo, możemy założyć, że n = 7 ( 2 1 ) dla pewnej liczby całkowitej q > 73. Teraz, żeby znaleźć A;-ty największy element, możemy zastosować następującą metodę: K r o k 1 . Dzielimy elementy na 2q + 1 grup, każda po siedem elementów, a na stępnie sortujem y każdą z grup. To wymaga co najwyżej 13(2q + 1) porównań.
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ Obszar A
227
Obszar B
R ys. 41. Algorytm wyboru Rivesta i Tarjana (q = 4). K ro k 2 . Znajdujemy medianę wśród 2 # + l środkowych elementów wyznaczonych w kroku 1 . Nazwijmy ją x. Indukcyjnie względem q dowodzimy, że wymaga to co najwyżej Vq+i( 2 q -f 1 ) < 30# — 148 porównań. K ro k 3. Pozostałe n — 1 elementy, inne niż x , zostały w ten sposób podzielone na trzy zbiory (zobacz rysunek 41): 4# 4- 3 elementy, o których wiadomo, że są większe od x (obszar B); 4# + 3 elementy, o których wiadomo, że są mniejsze od x (obszar C); 6# elementów, o których nie wiadomo, w jakiej są relacji z x (obszary A i D).
Wykonując 4q dodatkowe porównania, możemy wyznaczyć wszystkie elementy z obszarów A i D, które są mniejsze od x. (Najpierw porównujemy x ze środko wym elementem z każdej trójki). K ro k 4. W łaśnie znaleźliśmy r elementów większych od x oraz n —1 —r elemen tów mniejszych od x dla pewnego r. Jeśli k = r + 1 , odpowiedzią jest x\ jeśli k < r + 1 , musimy znaleźć fc-ty największy wśród r dużych elementów; jeśli k > r + 1 , to musimy znaleźć (k —1 —r)-ty największy element wśród n — 1 —r m ałych ele mentów. Kluczowym jest to, że r i n —1 —r niewiele się różnią od 10#+3 (rozmiar obszarów A i D, powiększonych albo o B, albo o C). Przez indukcję względem q dowodzimy, że krok ten wymaga co najwyżej 15(10# + 3) — 163 porównań. Łączna liczba porównań wynosi zatem co najwyżej 13(2# + 1) + 30# - 148 + 4# + 15(10# + 3) - 163 - 15(14# - 6 ) - 163. Na początku mieliśmy co najmniej 14# —6 elementów, co kończy dowód.
|
Z twierdzenia L wynika, że wybór można zawsze przeprowadzić w czasie liniowym, czyli V*(n) = 0( n ) . W oczywisty sposób m etoda użyta w dowodzie jest mało subtelna, ponieważ zapom ina się w niej o pożytecznej informacji zdobytej w kroku 4. Głębsza analiza problemu prowadzi do dużo ostrzejszych górnych granic; dla przykładu, A. Schdnhage, M. Paterson i N. Pippenger [J. Comp. Sys.
228
SORTOWANIE
5.3.3
Sci. 13 (1976), 184-199] udowodnili, że m aksymalna liczba porównań potrzebna do znalezienia mediany wynosi co najwyżej 3n + 0 ( n lo g n )3/ 4. W ćwiczeniu 23 znajdziemy pewną dolną granicę i odnośniki do świeższych wyników na ten tem at. Ś r e d n ia lic z b a p o ró w n a ń . Zamiast minimalizować maksymalną liczbę po równań w pesymistycznym przypadku, możemy zapytać o algorytm, który mini malizuje średnią liczbę porównań, zakładając losową kolejność danych wejścio wych. Jak zazwyczaj, problem minimalizacji wartości oczekiwanej jest znacząco trudniejszy od problemu minimalizacji w najgorszym przypadku; tak naprawdę, problem minimalizacji wartości oczekiwanej jest nadal nierozwiązany, nawet dla przypadku A: = 2. O tym problemie wspomina Claude Picard w swojej książ ce Théorie des Questionnaires (1965), a rozległe próby jego zbadania podjął M ilton Sobel [Univ. of M innesota, Dept. of Statistics Reports 113 and 114 (November 1968); Revue Française d ’Automatique, Informatique et Recherche Opérationnelle 6,R -3 (December 1972), 23-68]. Sobel zaproponował procedurę przedstawioną na rysunku 42, która znajduje drugi największy element z sześciu, wykonując średnio tylko 6 | porównań. W pe symistycznym przypadku wymaga ona 8 porównań, a to jest gorzej niż 1^(6) = 7;
R ys. 42. Procedura znajdowania drugiego największego elementu spośród {Xl , A 2, Xs , Xą, X^ , Xq}, wykonująca średnio 6 | porównań. Każde „symetryczne” poddrzewo jest takie samo jak jego brat, ale z przepermutowanymi we właściwy sposób nazwami. Para „j k” w węźle zewnętrznym oznacza, że X 7 jest drugim największym, a Xk największym elementem; liczba permutacji prowadzących do takiego węzła jest podana bezpośrednio pod nim.
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
229
w rzeczywistości D. Hoey wykazał za pom ocą obliczeń komputerowych, że jeśli ograniczymy liczbę porównań do co najwyżej 7, to najlepszy algorytm wykonuje średnio 6 | | porównań. Tak więc nie istnieje algorytm wyznaczający drugi n aj większy element spośród sześciu, który jest optymalny jednocześnie w średnim i w pesymistycznym przypadku.
n
Tabela 2 ŚREDNIA LICZBA PORÓWNAŃ DLA WYBIERANIA V 5(n) V 6(n) Vs ( n) V4n) V 1 ( n ) V 2 (n )
1
0
2
1
3
2
4
3
5
4
6
5
7
6
V 7(n)
1 2
3
4
4
3 15
65 7 149 ' 210
7' — 18 0 509
630
15
7—
' 18 9_32_ y 105
4 63 0 509 630
5 7 149
' 210
6
Niech Vk(n) oznacza najm niejszą średnią liczbę porównań potrzebną do znalezienia A;-tego największego spośród n elementów. W tabeli 2 pokazano, kom puterowo obliczone przez D. Hoeya, dokładne wartości tej funkcji dla małych n. W 1970 roku R. W. Floyd pokazał, że medianę z n elementów można znaleźć, wykonując średnio tylko | n + 0 ( n 2/3 log n) porównań. Kilka lat później subtel niejsza analiza tego rozwiązania umożliwiła mu i R. L. Rivestowi skonstruowanie eleganckiego algorytmu, który dowodził, że Vk(n) < n -F min (A:, n —k) + 0 ( V n l o g n ).
( 16 )
(Zobacz ćwiczenia 13 i 24). Korzystając z innego podejścia, którego podstawą było uogólnienie jednej z konstrukcji Sobela dla k — 2, David W. M atula [Washington Univ. Tech. Re port AMCS-73-9 (1973)] pokazał, że Vk(n) < n + A:[lgfc](ll + lnInn).
( 17 )
Tak więc dla ustalonego k średnią liczbę porównań można zredukować do n + O (log log n). Elegancka dolna granica dla V k(n) została podana w ćwi czeniu 25. Problemy sortowania i wyboru są szczególnymi przypadkam i dużo bardziej ogólnego problemu znajdowania perm utacji n danych elementów, która jest zgod na z zadanym częściowym porządkiem. A. C. Yao [SICOMP 18 (1989), 6 7 9 -689] pokazał, że jeśli częściowy porządek jest zdefiniowany przez acyklicz ny graf skierowany G o n wierzchołkach, k spójnych składowych, to minimal na liczba porównań konieczna do rozwiązania takiego problemu wynosi zawsze 0 (lg (n !/T (G )) + n —fc), zarówno w pesymistycznym, jak i średnim przypadku, gdzie T(G ) jest łączną liczbą perm utacji zgodnych z tym częściowym porządkiem (liczbą topologicznych uporządkowań G).
230
SORTOWANIE
5.3.3
ĆW IC ZEN IA 1. [15] Dlaczego w turnieju zaproponowanym przez Lewisa Carrolla (rysunki 39 i 40) zawodnik 13 zostaje wyeliminowany pomimo zwycięstwa w trzeciej rundzie? 2. [M25 ] Udowodnij, że po znalezieniu fc-tego największego elementu spośród n elementów za pomocą wykonania ciągu porównań, znamy także k —1 elementów, które są od niego większe, oraz n — k elementów, które są od niego mniejsze. 3. [20] Udowodnij, że V*,(n) > Vk(n — 1) i Wk(n) > W k (n — 1) dla 1 ^ k < n. 4. [M25] (F. Fussenegger i H. N. Gabow) Udowodnij, że Wk(n) ^ n —k + [ l gn— ]. 5. [10] Udowodnij, że Ws(n) ^ Va(n) + 1. 6 . [M26] (R. W. Floyd) Dane są, n różnych elementów { Jći , . . . , X n} oraz zbiór zależności X i < X 3 dla pewnych par (i, j) . Chcemy wyznaczyć drugi największy element. Jeśli wiadomo, że X i < X 3 oraz X t < Xk, dla j ^ k, to X t na pewno nie może być drugim największym elementem i można go wyeliminować. W wyniku dostajemy zależności poniższej postaci
•—
•
! > •
^
a mianowicie m grup elementów, które można reprezentować w postaci multizbioru {Zi, ¿2 , • • • j Im}] j -ta grupa zawiera lj 4 - 1 elementów, z których o jednym wiadomo, że jest większy od pozostałych. Dla przykładu, powyższą konfigurację można przedstawić za pomocą multizbioru {0,1, 2,2, 3, 5}; gdy nie jest znana żadna zależność, wówczas mamy multizbiór złożony z n zer. Niech /(Zi, ¿2 , • • •, Im) będzie minimalną liczbą porównań potrzebną do znalezienia drugiego największego elementu w takim częściowo uporządkowanym zbiorze. Udowod nij, że /(/i, ¿2 , • ■■, Im) — m — 2 + |"lg(2il + 2*2 + *• • + 2im)"|. [Wskazówka: Pokaż, że najlepsza strategia polega na porównywaniu zawsze najwięk szych elementów w dwóch najmniejszych grupach, aż m zostanie zredukowane do jedynki; zastosuj indukcję ze względu na l\ + I2 H------ 1- Im + 2 m]. 7. [M20] Udowodnij ( 8 ). 8 . [M21] Wzór Kislicyna ( 6 ) otrzymuje się, wykorzystując sortowanie przez wybie ranie drzewowe za pomocą zupełnego drzewa binarnego o n węzłach zewnętrznych. Czy dla dowolnych k i n metoda wybierania drzewowego, wykorzystująca jakieś inne drzewo, dałaby lepsze ograniczenie? 9. [20] Narysuj drzewo porównań, które znajduje medianę z pięciu elementów w co najwyżej sześciu krokach, wykorzystując do tego celu metodę podmiany i wyboru Hadiana-Sobela [zobacz ( 11 )]. 10. [55] Pokaż, że medianę z siedmiu elementów można znaleźć w co najwyżej 10 krokach. 11. [38] (K. Noshita) Pokaż, że medianę z dziewięciu elementów można znaleźć w co najwyżej 14 krokach, z których pierwszych siedem jest identycznych jak w metodzie Dorena. 12. [21] (Hadian i Sobel) Udowodnij, że Vs(n) ^ Vs(n — 1) + 2. [Wskazówka: Roz pocznij od pozbycia się elementu najmniejszego spośród { X i , X^, X-$, JĆ4 }].
5.3.3
WYBÓR Z MINIMALNĄ LICZBĄ PORÓWNAŃ
231
►13. [HM28] (R. W. Fłoyd) Pokaż, że jeśli rozpoczniemy od znalezienia mediany wśród { X \ , . . . , X n 2/3 } za pomocą pewnej metody definiowanej rekurencyjnie, to możemy na stępnie wyznaczyć medianę wśród { X i , . . . , X n }, wykonując średnio | n + 0 (n 2/3 logn) porównań. ►14. [20] (M. Sobel) Niech Uk(n) będzie minimalną liczbą porównań potrzebną do wy znaczenia k największych elementów spośród n elementów, bez konieczności poznania ich względnego porządku. Pokaż, że £/2(5) ^ 5. 15. [22] (I. Pohl) Przypuśćmy, że zamiast minimalizować czas, chcemy minimalizować pamięć. Jaka jest minimalna liczba słów pamięci potrzebnych do wyznaczenia fc-tego największego z n elementów, jeżeli każdy element jest wielkości jednego słowa i jeśli do pojedynczego rejestru można wprowadzać jednorazowo tylko jeden element? ►16. [25] (I. Pohl) Pokaż, że w n-elementowym zbiorze można wyznaczyć jednocześnie maksimum i minimum, wykonując co najwyżej [|n"| —2 porównań; pokaż również, że tej liczby nie można zmniejszyć. [Wskazówka: Każdą fazę takiego algorytmu można reprezentować jako czwórkę (a, 5, c, d), gdzie a jest liczbą elementów, które nigdy nie były jeszcze porównywane, b jest liczbą elementów, które wygrywały, ale nigdy nie przegrały, c jest liczbą elementów, które przegrywały, ale nigdy nie wygrały, d jest liczbą elementów, które zarówno wygrywały, jak i przegrywały. Zaprojektuj przeciwnika]. 17. [20] (R. W. Floyd) Pokaż, że ze zbioru n-elementowego można wybrać kolejno k największych i l najmniejszych elementów, wykonując co najwyżej \ | n] — k — l +
+ L n + i - « ^ n r i g i l porównań. 18. [M20] Jeśli w twierdzeniu L grupy rozmiaru 7 zamienimy na grupy rozmiaru 5, to jak zmieni się teza twierdzenia? 19. [MĄ2] Uzupełnij tabelę 2 do n — 8 . 20. [MĄ 7] Jaka jest asymptotyczna wartość V 2 (u) —n, gdy n —►00? 2 1 . [32] (P. V. Ramanan i L. Hyafil) Udowodnij, że W k (2l + 2i+1“ fc) ^ 2l + 2l+1~k +
( A ; - l ) ( / - l ) dla / ^ k ^ 2; pokaż także, na podstawie ćwiczenia 4, że dla nieskończenie wielu l i k zachodzi równość. [ Wskazówka: Weź dwa drzewa typu przegrywający odpada i scalaj mądrze wyniki ich działania]. 2 2 . [2Ą] (David G. Kirkpatrick) Pokaż, że gdy 4-2* < n — 1 ^ 5-2*, ograniczenie górne ( 11 ) dla V3 (n) można zmniejszyć o 1 w następujący sposób: (i) utwórz cztery drzewa typu przegrywający odpada o rozmiarach 2l; (ii) znajdź minimum z czterech maksimów i usuń wszystkie 2l elementy z jego drzewa; (iii) wykorzystując zdobytą informację zbuduj pojedyncze drzewo typu przegrywający odpada o rozmiarze n —1 —2 *; (iv) dalej postępuj tak jak w dowodzie ( 11 ).
23. [MĄ9] Jaka jest asymptotyczna wartość V\n/ 2 '\ (n), przy n —►00? 24. [HMĄO] Udowodnij, że Vk (n ) ^ n -|- k + 0 ( y j n lo g n ) dla k ^ |"™/2]. Wskazówka: Pokaż, że przy takiej liczbie porównań można w istocie jednocześnie znaleźć elementy \_k — y/k ln n J-ty i \k + \//c ln n ] -ty, co pozwala już łatwo zlokalizować element k-ty. ►25. [M35] (W. Cunto i J. I. Munro) Udowodnij, że Vk(p) ^ ri-b k — 2 dla k ^ fn /2 ]. 26. [M32] (A. Schónhage, 1974) (a) Przy oznaczeniach z ćwiczenia 14, udowodnij, że Uk(n) ^ min (2 + Uk{n — 1) ,2 + U k - i { n — 1 )) dla n ^ 3. [Wskazówka: Zaprojektuj przeciwnika, dokonując redukcji z n d o n - 1 , skoro tylko bieżący częściowy porządek nie jest całkowicie złożony ze składowych postaci • lub •— •]. (b) Podobnie udowodnij, że Uk (n) ^ min (2 + Uk (n — 1),3 + U k - i ( n - 1),3 + Uk(n - 2))
232
SORTOWANIE
5.3.3
dla n ^ 5, projektując przeciwnika, który radzi sobie ze składowymi •, •— •, , (c) Mamy zatem Uk(n) ^ n + k + min(|_(n — k ) / 2 \ , k ) — 3 dla 1 ^ k ^ n/2. [Nierówności z (a) i (b) mają także zastosowanie, gdy U zastąpimy przez V lub W , co dowodzi optymalności kilku wartości z tabeli 1]. ►27. [M3Ą] Przeciwnikiem probabilistycznym nazywamy algorytm przeciwnika, który dopuszcza rzuty monetą w celu podejmowania decyzji. a) Niech A będzie przeciwnikiem probabilistycznym i niech Pr (Z) będzie prawdopodo bieństwem, że A osiąga liść Zw danym drzewie porównań. Pokaż, że jeśli Pr (Z) ^ p dla wszystkich Z, to wysokość drzewa porównań jest ^ lg (l/p ). b) Rozważmy następującego przeciwnika dla problemu wyboru fc-tego największe go elementu spośród n elementów, dla danych parametrów ą i r, które zostaną określone później:
A l. Wybierz losowy zbiór K o k elementach; wszystkie (£) możliwości są jedna kowo prawdopodobne. (Zapewnimy, że k — 1 największych elementów będzie należało do K ) . Niech S = { 1 , n } \ K będzie zbiorem pozostałych ele mentów i wykonaj So <— S, Ko K; So i Ko będą reprezentowały elementy, które mogą zostać Zc-tym największym.
A 2 . Dopóki \Ko\ > r, dopóty o wszystkich porównaniach x : y decyduj jak nastę puje: Gdy x € S i y € K, odpowiedz, że x < y. Gdy x £ S i y E S, rzuć monetą w celu podjęcia decyzji i usuń z S q mniejszy element, jeśli był w S q . Gdy x £ K i y G K, rzuć monetą w celu podjęcia decyzji i usuń większy element z Ko, jeśli był w K 0.
A3. Skoro tylko \Ko\ = r, podziel elementy na trzy klasy P , Q , R jak następuje: Jeśli \So\ < q niech P = S, Q = Ko, R = K \ Ko- W przeciwnym razie, dla każdego y € Ko, niech C( y ) będzie zbiorem elementów z S już porównanych z y i wybierz yo tak, że |C7(yo)| jest minimalna. Niech P — ( S \ S o ) u C ( y o ) , Q = (,S o \ C ( y o ) ) U { y o }, R = K \ { y o } . O wszystkich przyszłych porównaniach x : y decyduj, mówiąc, że elementy z P są mniejsze od elementów z Q, natomiast elementy z Q są mniejsze od elementów z R ; rzuć monetą, gdy x i y są w tej samej klasie. Udowodnij, że jeśli 1 ^ r ^ k i |C(j/o)| ^ Q ~ r na początku kroku A3, to każdy liść jest osiągalny z prawdopodobieństwem ^ (n + 1 — k ) / ( 2 n~q (”)). Wskazówka: Pokaż, że wykonywanych jest co najmniej n —q rzutów monetą. c) Kontynuując (b), pokaż, że zachodzi
Vk(n) ^ min(n - 1 + (r - l)(q +
1
- r), n - q + l g( ( £) / ( n + 1 - k)))
dla wszystkich całkowitych q i r. d) Wyprowadź ( 14 ), dobierając właściwie q i r.
*5.3.4. Sieci sortujące
W tym podrozdziale rozważamy specjalny rodzaj sortowania, które jest szcze gólnie interesujące ze względu na zastosowania i bogate podstawy teoretyczne. W takim sortowaniu wymaga się, żeby ciąg porównań był wykonywany bez odwoływania się do historii. Oznacza to, że po każdym porównaniu Ki z K j kolejne porównania dla przypadku K i < K j są dokładnie takie same jak dla przypadku Ki > K j, ale z zamienionymi indeksami i, j.
5.3.4
SIECI SORTUJĄCE
J=J £L> < N (H X
Cd
c? cd XcdI *^ £O a x o *C HD
CO
¡-I
o m
*
0 X 'flcd rM
1 0 oN > pD 'flcd a 1(h a X
i
CD
I ¡S h
Q
co w >i Pi
233
234
SORTOWANIE
5.3.4
Na rysunku 43(a) pokazano drzewo porównań, dla którego ten warunek jednolitości jest spełniony. Zauważmy, że na każdym poziomie jest wykony wanych tyle samo porównań, tak więc po wykonaniu m porównań mamy 2m możliwych wyników. Ale n! nie jest potęgą 2 ; pewne porównania muszą być zatem redundantne w takim znaczeniu, że jedno z poddrzew takiego porównania nigdy się w rzeczywistości nie pojawi. Innymi słowy, na pewnych gałęziach w drzewie jest wykonywanych więcej porównań niż jest to konieczne. Celem tego jest zagwarantowanie, żeby wszystkie odpowiadające sobie gałęzie sortowały właściwie. Ponieważ w takim drzewie każda ścieżka z góry w dół wyznacza całe drze wo, taki schemat sortowania najprościej reprezentować jako sieć; zobacz rysu nek 43(b). W takiej sieci prostokąty reprezentują „moduły porównujące” o dwóch wejściach (reprezentowanych przez linie wchodzące do m odułu z góry) i dwa wyjścia (reprezentowane przez linie prowadzące w dół); wynik na wyjściu z lewej strony jest mniejszy od wyniku na wyjściu z prawej strony. Na spodzie sieci K [ jest najm niejszym elementem wśród {Ab, K 2, A 3, K 4}, K 2 jest drugim naj mniejszym itd. Nie jest trudno pokazać, że każdej sieci odpowiada pewne drzewo bez odwołań do historii, a każdemu drzewu bez odwołań do historii odpowiada pewna sieć modułów porównujących. Na marginesie można zanotować, że z inżynierskiego punktu widzenia mo duły porównujące są bardzo łatwe do wytwarzania. Załóżmy dla przykładu, że po liniach wędrują liczby binarne w taki sposób, iż w jednym takcie do m odułu porównującego jest wprowadzany 1 bit, przy czym bit najbardziej znaczący jest wprowadzany jako pierwszy. Każdy moduł porównujący ma trzy stany i działa w następujący sposób: Takt t Stan Wejście 0 0 0 0 1 2
0 0 1 1
Takt (t + 1 ) Stan Wyjście
0 1 0 1
0 1 2 0 1 2
x y x y
0 0 0 1
0 1 1 1
x y y x
Początkowo wszystkie m oduły są w stanie 0 i wyprowadzają na wyjście 0 0. Gdy tylko cyfry wejściowe różnią się, m oduł przechodzi albo do stanu 1 , albo do stanu 2 . Liczby, które pojaw iają się u góry rysunku 43(b) w takcie i, zaczynają pojawiać się na dole w takcie t + 3, jeśli odpowiednio opóźnimy przesyłanie po liniach K[ i K'4. I
A l ------4
I
a2
-4-
A3 — 3 K
a
------9
■
I
2-
t
2 4 2— A K2
—i— 3 — A 4 4 — K*
R ys. 44. Inny sposób repre zentacji sieci z rysunku 43, która sortuje ciąg czterech liczb (4,1, 3, 2).
5.3.4
SIECI SORTUJĄCE
235
Żeby rozwinąć teorię sieci sortujących, jest wygodnie reprezentować takie sieci w trochę inny sposób, zilustrowany na rysunku 44. T utaj liczby są wpro wadzane z lewej strony, a m oduły porównujące są reprezentowane przez pionowe łączniki (odcinki) między dwiema liniami; każdy moduł zamienia, jeśli potrzeba, elementy na wejściach tak, że większy z nich, po przejściu przez m oduł, jest wyprowadzany na dolnej linii. Po prawej stronie diagramu wszystkie liczby są uporządkowane od góry do dołu. W dotychczasowych rozważaniach na tem at optymalnego sortowania kon centrowaliśmy się na minimalizacji liczby porównań i nie poświęcaliśmy większej uwagi na sposób przepływu danych lub złożoność struktury sterowania, która może być konieczna do organizowania tego przepływu. Z tego względu sieci sortujące m ają oczywistą przewagę, ponieważ dane mogą być przechowywane w n lokacjach, a struktura sterowania jest „linią prostą” - nie m a potrzeby pamię tania wyników wcześniejszych porównań, ponieważ harm onogram porównań jest z góry ustalony. Inną pozytywną cechą sieci sortujących jest możliwość jednocze snego wykonywania wielu operacji (na odpowiedniej maszynie). Dla przykładu, pięć kroków z rysunków 43 i 44 można ścisnąć do trzech, jeśli pozwolimy na jednoczesne wykonanie nie nakładających się na siebie porównań: pierwsze dwa kroki i dwa ostatnie kroki można połączyć. Tę własność sieci sortującej zbadamy dokładniej w dalszej części tego punktu. Tak więc sieci sortujące mogą być bardzo użyteczne, chociaż nie jest wcale oczywiste, że dla dużych n można zbudować w ydajną n-elementową sieć sortującą; można zauważyć, że do tego aby struktura sterowania była stru k tu rą bez odwołań do historii, potrzebujem y wielu dodatkowych porównań. Istnieją dwa proste sposoby budowania sieci sortującej dla n -h i elemen tów z danej sieci n-elementowej. Podstaw ą pierwszego z nich jest wstawianie, natom iast podstawą drugiego jest wybór. Na rysunku 45(a) pokazano, w jaki sposób, po posortowaniu pierwszych n elementów, można wstawić na właściwe miejsce element (n + 1 ); w części (b) tego rysunku przedstawiono, w jaki sposób należy wybrać element największy przed posortowaniem pozostałych. W wyniku wielokrotnego zastosowania rysunku 45(a) otrzymamy sieć, która jest analogiem sortowania przez proste wstawianie (algorytm 5.2.1 S), natom iast wielokrotne
R y s. 45. Otrzymywanie (n + 1) sorterów z n sorterów: (a) wstawianie, (b) wybór.
236
5.3.4
SORTOWANIE
L .. l - l
r= rn
a (a)
I
(b)
R y s. 46. Sieci odpowiadające podstawowym schematom sortowania wewnętrznego, otrzymywane przez wielokrotne zastosowanie konstrukcji z rysunku 45: (a) proste wsta wianie, (b) sortowanie bąbelkowe.
zastosowanie rysunku 45(b) prowadzi do sieci odpowiadającej sortowaniu bą belkowemu (algorytm 5.2.2B). Na rysunku 46 pokazano takie sieci dla sześciu elementów. Zauważmy, że jeśli ściśniemy każdą z tych sieci tak, żeby umożliwić jednoczesne wykonywanie operacji, to obie m etody redukują się w rzeczywistości do tej samej (2n —3)-fazowej procedury sortującej (rysunek 47).
—
T
T
u
j l . 1
!
— :
R y s. 47. W warunkach równoległości proste wstawianie = sortowanie bąbelkowe!
Można udowodnić, że sieć z rysunków 43 i 44 posortuje poprawnie każdy ciąg czterech liczb, ponieważ pierwsze cztery m oduły porównujące (inaczej kom paratory) przemieszczą najm niejszy i największy element na właściwe miejsca, a ostatni kom parator uporządkuje pozostałe elementy. Jednakże nie zawsze jest tak łatwo powiedzieć, czy dana sieć sortuje wszystkie możliwe ciągi wejściowe; dla przykładu obie sieci
są poprawnymi 4-elementowymi sieciami sortującymi, ale dowody ich poprawno ści nie są oczywiste. W ystarczyłoby testować n-elementowe sieci na wszystkich n! perm utacjach n różnych liczb, jednak w rzeczywistości możemy posłużyć się mniejszą liczbą testów. T w ierd zen ie Z (Zasada zero-jedynkowa). Jeśli sieć z n wejściowymi liniami sor tuje w porządku niemałejącym każdy z 2n ciągów 0 i 1 , to posortuje w porządku niemalejącym dowolny ciąg n liczb. Dowód. (Jest to specjalny przypadek twierdzenia Bouriciusa, ćwiczenie 5.3.1-12). Jeśli f ( x ) jest dowolną funkcją monotoniczną, dla której f ( x ) < /(y ), gdy tylko x < y, i jeśli dana sieć przekształca { x \ , . . . ,arn ) w ( y i , . . . , yn)> to łatwo można zauważyć, że taka sieć przekształca ( f ( x i ) , . . . , f ( x n)) w {/ (y i ), ; . . , f ( y n ))- J^śli yi > yi +1 dla pewnego ś, rozważmy funkcję monotoniczną / , która dla wszystkich
5.3.4
SIECI SORTUJĄCE
237
liczb < yi przyjmuje wartość 0, a dla liczb > yi wartość 1 ; w ten sposób definiujemy ciąg { /( jr ) , . ■., f { x n)) złożony z 0 i 1 , który nie jest sortowany przez tę sieć. Tak więc, jeśli każdy ciąg 0-1 jest sortowany, to mamy yi < yi+i dla 1 < i < n. | Zasada zero-jedynkowa jest wyjątkowo pomocna w konstruowaniu sieci sor tujących. Nietrywialnym przykładem jest uogólniona wersja algorytm u Batchera sortowania przez „scalanie z zam ianam i” (algorytm 5.2.2M). Pomysł polega na tym, żeby posortować m + n elementów, sortując pierwsze m i ostatnie n elementów, niezależnie, a następnie do wyników zastosować (m, n)-sieć scalającą. Sieć (ra, n)-scalającą można skonstruować indukcyjnie w następujący sposób: a) Jeśli m = 0 lub n = 0, sieć jest siecią pustą. Jeśli m = n — 1, sieć składa się z jednego m odułu porównującego. b) Jeśli m n > 1 , niech scalanymi ciągami będą ( x i, . . . , x m) i (yi, ■■-, 2/n)* Sca lamy „ciągi nieparzyste” (x±, rz3, . . . , i {s/1 , 2/3 , • ■• otrzy mując posortowany ciąg , otrzym ując posortowany ciąg {wi,W 2 , ■.., /cc[m/ 2j + \n/ 2j )* Na koniec wykonujemy operacje porównań-zamian w x :v2,
w 2 : v 3,
w 3 :v4,
W|m/2J + |n/2j -V*
(i)
na ciągu ( ^ 1 5 ^ 1 1 ^2? ^ 2 5 ^ 3 ; W3 , * • * ) ^ [ m /2 j + Ln / 2 J ł ^ L m /2J + Ln /2J 5 ^
^
)’
(^ )
otrzymując posortowany ciąg. (!) T utaj z;* = z;[m/2j + Ln/2j+ i nie istnieje, jeśli oba m i n są parzyste, natom iast z;** = zĄm/ 2j + [n/2j +2 nie istnieje, chyba że oba m i n są nieparzyste; łączna liczba modułów porównujących występujących w (i) wynosi [(m + n — 1 ) / 2J. Sieć (m ,n)-scalająca Batchera jest nazywana siecią scalającą nieparzysto-parzystą. Na rysunku 48 pokazano sieć (4 ,7)-scalającą zbudowaną zgodnie z powyższymi regułami. ---------- 1 i-------------------------- ^ 1
Zl '
t ^
r-
-Id -. CU 1
^ y
Z2 Z3
'- Z I
A
y
t >
'1 1 1 j CU4
A Y
p|
ic/uj Ę 5
A y
¿4 ¿5 Z6 Z7 Z8
& £ \s s 0
Ph
Z9
► -------- t > 6
-----------------
210 Zll
R y s . 48. Scalanie nieparzysto-parzyste dla m = 4 i n = 7.
Żeby udowodnić poprawność tej trochę dziwnej procedury dla m n > 1 , skorzystamy z zasady zero-jedynkowej, testując wszystkie ciągi 0 i 1 . Po wstęp nym posortowaniu ciągów długości m i n (m-sortowanie i n-sortowanie), ciąg
238
5.3.4
SORTOWANIE
( a r , . . . , x m) będzie składał się z k zer poprzedzających m — k jedynek, nato m iast ciąg ( y i , . . . , ym) będzie zawierał l zer poprzedzających n —l jedynek, dla pewnych k i L Zatem ciąg (t>i, ^ 2, . . •) będzie zawierał dokładnie [fc/2] + |7/2"| zer, poprzedzających jedynki; a {w\ , u>2, . . . ) będzie zawierał [fc/2j + |_Z/2j zer, poprzedzających jedynki. Teraz dochodzimy do kluczowego momentu: ( rfe/21 + \ l / 21 ) - ( L^/2j + U / 2J ) = 0, 1 lub 2.
(3 )
Jeśli ta różnica wynosi 0 lub 1, to ciąg (2 ) jest już uporządkowany, natom iast jeśli różnicą jest 2 , jedna operacja porównania-zamiany w ( 1 ) wszystko naprawia. To jest koniec dowodu. (Zauważmy, że zasada zero-jedynkowa redukuje liczbę przypadków, które należy rozważyć w problemie scalania z (m^ n) do tylko (m + 1 )(n + 1 ), reprezentowanych przez dwa param etry k i l ) . Niech C (m , n) będzie liczbą modułów porównujących używanych w sca laniu nieparzysto-parzystym dla m i n, nie licząc początkowego m-sortowania i n-sortowania; mamy f m n,
jeśli m n < 1 ;
^ (m,n)
\<7(|"m/2"|, |"n/ 2] ) + C ( | m / 2j, | n / 2_|) + | _ ( m + n - l ) / 2_|, jeśli m n > l . (4) W ogólności nie jest to bardzo prosta funkcja od m i n, ale widząc, że <7(1, n) = n oraz <7(m + 1, n + 1 ) —<7(m, n) = 1 + <7(|_m/2j + 1 , | n / 2j + l) - C(|_m/2J, | n / 2J)>
jeśli m n > 1,
możemy otrzym ać zależność <7(m + 1 , n -h 1 ) —<7(m,n) = [\gm \ +
2
+ [ n / 2 ^gm^ l \,
jeśli n > m > 1 . (5 )
W konsekwencji <7(m, m + r) — i?(m ) + m + i i m(r)
dla m > 0 i r > 0,
( 6)
gdzie B ( m ) jest funkcją „wstawiania binarnego” Y1T=i z ćwiczenia 5.3.1 ^( 3 ) i gdzie Rm(r) oznacza sumę pierwszych m składników szeregu r+ 0
+
r +1
+
r+ 2
+
r+ 3
+
r+ 4
r +j + _2 L1s j J +1_
(7)
W szczególności, dla r = 0 otrzymujemy ważny, specjalny przypadek <7(m, m) = B ( m ) + m.
(8)
Prócz tego, jeśli t = j~lgm], i?m(r + 24) = ^ ( r ) + 1 • 2i_1 + 2 • 2(“ 2 + ■• • + 2*“ 1 • 2° + m
= # m(r) + m + i • 2 i_1. Tak więc C (m , n + 2*) —C (m , n) ma prostą postać i <7 (m, n) = ^
n -f 0 ( 1 )
dla ustalonego m, n —> oo, t = flgmj;
(9 )
5.3.4
SIECI SORTUJĄCE
239
składnik 0 (1 ) jest ogonową funkcją okresową zmiennej n o okresie 2*. Przy n —>oo mamy C ( n ,n) = n \ g n + O(n), co wynika z (8) i ćwiczenia 5.3.1-15. Sieci o m inim alnej liczb ie porów n ań. Niech 5 (n) będzie m inim alną liczbą komparatorów w sieci sortującej dla n elementów; oczywiście S(ń) > 5 (n), gdzie 5 (n ) jest minimalną liczbą porównań potrzebną w dowolnej, niekoniecznie typu bez odwołań do historii, procedurze sortującej (zobacz punkt 5.3.1). Mamy 5(4) = 5 = 5(4), tak więc nowe uwarunkowanie nie powoduje straty w ydaj ności dla n — 4; jednak już dla n = 5 okazuje się, że 5(5) = 9, podczas gdy 5(5) = 7. Problem wyznaczania 5 (n ) wydaje się nawet trudniejszy od problemu wyznaczania 5(n); nawet nie wiemy, jak asymptotycznie zachowuje się 5 (n ). Jest sprawą interesującą prześledzenie historii tego problemu, ponieważ każ dy krok wymagał pokonania pewnej trudności. Sieci sortujące były po raz pierw szy badane przez P. N. Armstronga, R. J. Nelsona i D. J. 0 ’Connora około 1954 roku [zobacz U.S. Patent 3029413}. Oto słowa z ich wniosku patentowego: „Wykorzystując ich możliwości, można zbudować n-liniowe przełączniki sortują ce za pomocą ograniczonej liczby dwuliniowych przełączników sortujących” . Po tym, jak zauważyli, że S (n + 1 ) < 5 (n ) + n, podali specjalną konstrukcję dla 4 < n < 8, używając odpowiednio 5, 9, 12, 18 i 19 komparatorów. Następnie Nelson razem z R. C. Bose pokazali, że 5 (2 n) < 3n — 2 n dla każdego n; stąd S (ń ) — 0 ( n lgS) = 0 ( n 1 585). Bose i Nelson opublikowali swoją interesującą metodę w JA C M 9 (1962), 282-296, gdzie postawili hipotezę, że ten wynik jest najlepszy z możliwych; T. N. H ibbard [JACM 10 (1963), 142-150] odkrył podobną, ale trochę prostszą konstrukcję, która używała takiej samej liczby komparatorów, wzmacniając tym samym powyższą hipotezę. W 1964 roku R. W. Floyd i D. E. K nuth odkryli nowy sposób podejścia do tego problemu, który doprowadził ich do asymptotycznego ograniczenia w po staci 5 (n ) = 0 ( n 1+c/ v/^ ^ ) . Pracując niezależnie, K. E. Batcher odkrył ogólną strategię scalania przedstawioną powyżej. Korzystając z rekurencyjnej definicji liczby komparatorów c(l) — 0,
c(n) = c(|"n/ 2]) + c ( [ n / 2_|) +
C '([n / 2], \ n / 2 \) dla n > 2 ,
( 10 )
udowodnił, że (zobacz ćwiczenie 5.2.2-14) c(2t ) — (£2 —£ -f 4)2 i-2 —1; co w konsekwencji daje 5 (n) = 0 ( n ( l o g n ) 2). Ani Floyd z Knuthem , ani Batcher nie opublikowali swoich konstrukcji od razu [Notices o f the Amer. M ath. Soc. 14 (1967), 283; Proc. A F IP S Spring Joint Com puter Conf. 32 (1968), 307-314]. Kilka osób odkryło sposoby zredukowania liczby kom paratorów używanych w konstrukcji Batchera scalania z zamianami; poniższa tabela zawiera najlepsze, znane do tej pory, górne ograniczenia na 5(n ): n = 1 c(n) = 0 5 (n) < 0
2 34 1 35 1 35
5 6 7 8 9 10 11 12 13 14 15 16 9 12 16 19 26 31 37 41 48 53 59 63 9 12 16 19 25 29 35 39 45 51 56 60
(n )
240
SORTOWANIE
5.3.4
Ponieważ dla 8 < n < 16 Ś(n) < c(n), scalanie z zamianami jest nieoptymalne dla wszystkich n > 8 . Dla n < 8 scalanie z zamianami używa takiej samej liczby porównań jak konstrukcja Bosego i Nelsona. W latach 1964-1966 Floyd i K nuth udowodnili, że gdy n < 8 , podane wartości S(n) są dokładne. [zobacz A Survey o f Combinatorial Theory (North-Holland, 1973), 163-172]; dla n > 8 wartości S(n) są nadal nieznane. Konstrukcje, które prowadzą do wartości z ( n ) , są pokazane na rysun ku 49. Sieć dla n — 9, wykorzystująca interesujące scalanie trzywejściowe, została odkryta przez R. W. Floyda w 1964 roku; jej poprawność można wykazać, korzystając z ogólnej zasady opisanej w ćwiczeniu 27. Sieć dla n — 10 odkrył A. W aksman w 1969 roku, rozważając na wejściu perm utacje zbioru { 1 , 2, . . . , 10} i próbując zredukować, ile się tylko da, liczbę możliwych wartości, które mogą się pojawić na każdej linii w danej fazie, zachowując jednocześnie pewną symetrię. Sieć przedstawiona dla n = 13 m a zupełnie inny rodowód: Hughes Juille [.Lecture Notes in Com p. Sci. 929 (1995), 246-260] do jej skonstruowania wykorzystał kom puter, symulując proces ewolucyjny pewnej populacji. W tej sieci kom paratory nie są rozmieszczone w żaden oczywisty sposób, ale sieć jest popraw na - i jest krótsza od każdej innej skonstruowanej dotychczas na drodze logicznego rozumowania. Sieć 62-komparatorowa dla 16 elementów została odkryta przez G. Shapiro w 1969 roku, i było to dość niespodziewane, ponieważ wydawało się, że m etoda B atchera (63 porównania) jest bezkonkurencyjna, gdy n jest potęgą 2 . W krótce po usłyszeniu o konstrukcji Shapiro, M. W. Green zaskoczył wszystkich potrój nie, znajdując sieć sortującą za pomocą 60 porównań, przedstawioną na rysunku 49. Pierwsza część konstrukcji Greena jest całkiem prosta do zrozumienia; po wykonaniu 32 porównań-zamian z lewej strony przerywanej linii można linie przenoszące dane poetykietować 16 podzbiorami zbioru {a, 6, c, d} w taki sposób, że o linii o etykiecie s wiadomo, że zawiera liczbę mniejszą lub równą zawartości linii o etykiecie i, jeśli tylko s jest podzbiorem t. Stan sortowania w tym punk cie jest omawiany dalej w ćwiczeniu 32. Jednakże porównania wykonywane na kolejnych poziomach sieci Greena sta ją się coraz bardziej tajemnicze i jak dotąd nikt nie potrafił uogólnić tej konstrukcji w celu otrzym ania równie efektywnych sieci dla większych wartości n. Shapiro i Green rozważali także sieć dla n = 12 . Gdy n — 11,14 lub 15, dobre sieci można znaleźć, usuwając dolną linię z sieci dla n + 1 razem ze wszystkimi kom paratoram i, które ją dotykają. Najlepsza z dotychczas znanych sieci sortujących dla 256 elementów pochodzi od D. Van Voorhisa. Pokazał on, że 5(256) < 3651, co można po równać z 3839 z m etody Batchera. [Zobacz R. L. Drysdale i F. H. Young, SIC O M P 4 (1975), 264-270]. Dla n —> oo okazało się, że tak naprawdę 5 (n) = 0 ( n log n); to zadziwiające górne ograniczenie zostało udowodnione przez Ajtaia, Komlósa i Szemerediego w Combinatorica 3 (1983), 1 -1 9 . Sieć, którą skonstru owali, nie m a praktycznego zastosowania, ponieważ wprowadzono do niej wiele kom paratorów tylko po to, żeby zaoszczędzić czynnik logn; m etoda Batchera jest dużo lepsza, chyba że n jest większe od sumarycznej pojemności wszyst-
5.3.4
SIECI SORTUJĄCE
-Ą U r -i " TT^ - y - 4 . ........
-
241
U ?- -- 1 1
--------------(
X —t— .-----
n~ 9
25 modułów, opóźnienie 9
= u —T” ' —i- o , , r
1 T =
—t - - „ i —i-H —f —
",
n = 10
29 modułów, opóźnienie 9
ru r
4 — -4 -
t u
— •—J ----i-Hh-
r = t=
„ I n = u ;
n —12
39 modułów, opóźnienie 9
n = 16
u l ::u ± =
-f 1—i-
T = -A-f“ ----4- >---------
4-#
^ Z n = 13
r r ..
45 modułów, opóźnienie 10
60 modułów, opóźnienie 10
R y s . 49.
E f e k t y w n e s ie c i s o r tu ją c e .
kich komputerów na Ziemi! Jednak twierdzenie Ajtaia, Komlósa i Szemerediego ukazuje z dokładnością do stałego czynnika prawdziwe asym ptotyczne tem po wzrostu S(n). Sieci o m in im aln ym czasie d ziałan ia. W rzeczywistych realizacjach sie ci sortujących i na komputerach równoległych można nie nakładające się na siebie operacje porównań-zamian wykonywać w tym samym czasie; dlatego mi nimalizowanie czasu opóźnienia jest całkiem naturalne. Chwila zastanowienia pokazuje, że czas opóźnienia sieci sortującej jest równy maksymalnej liczbie komparatorów w kontakcie z dowolną „ścieżką” przechodzącą przez sieć, jeśli ścieżkę zdefiniujemy jako m arszrutę z lewej strony na prawą stronę, na której w kom paratorach następują, być może, zmiany linii. Z każdym kom paratorem możemy związać numer porządkowy oznaczający najwcześniejszy tak t, w którym może on zostać wykonany; ten numer jest o jeden większy od największego
242
5.3.4
SORTOWANIE 1
2
3
1
2
3
4
4
3
5
6
1
6
2
3
4
"
1
5
6
T
1
- ♦ ------------------------ 11 ------------
------------* \---------- • ---------- • — --------------------------( ,----------------- ,
(a)
(b)
R y s. 50. Wykonanie każdego porównania w najwcześniejszym możliwym czasie.
z n u m e r ó w p o r z ą d k o w y c h k o m p a r a t o r ó w , k t ó r e p o j a w i a j ą się w c z e ś n ie j n a j e g o lin ia c h w e jś c i o w y c h . ( Z o b a c z r y s u n e k 5 0 ( a ); w c z ę ś c i (b ) t e g o r y s u n k u p r z e d s t a w io n o t ę s a m ą s ie c , a le p r z e r y s o w a n ą w t a k i s p o s ó b , ż e k a ż d y k o m p a r a t o r j e s t w y k o n y w a n y w n a j w c z e ś n i e j s z y m m o ż l i w y m c z a s ie ) . N ie p a r z y s to -p a r z y s ta
s ie ć
s c a la ją c a
B a tch e r a
o p is a n a
pow yżej
T e ( m , n ) j e d n o s t e k c z a s u , g d z i e T e ( m , 0) = T b ( 0 , n ) = 0, T g ( 1 , 1 ) =
T b ( tti, n ) = 1 +
m a x ( T s ( [ m / 2 j , |_n/2_|), T b ( [ 771/ 2 ] , [ n / 2 ] ) )
z a b ie r a 1, a
d la r a n > 2.
M o ż e m y w y k o r z y s t a ć t ę z a le ż n o ś ć d o d o w o d u p r z e z in d u k c ję t e g o , ż e
T #(m , n+1)
>
>
T b ( 771 , 71 ); z a t e m
T sim ^ n )
1 +
—
T b ([7 7 i/2 ], [ti/2 ])
d la
m n
2, a s t ą d
w y n ik a , że Ts{m ^n) =
W
1 +
[ ~ lg m a x ( r a ,n ) ]
d la m n > 1.
(1 2 )
ć w i c z e n iu 5 p o k a z u je m y , ż e c z a s o p ó ź n i e n ia w m e t o d z i e s o r t o w a n ia B a t c h e r a
w yn o si za te m /1 +
[lg n ] \
63) N i e c h T ( n ) b ę d z i e n a j m n i e j s z y m m o ż l i w y m c z a s e m o p ó ź n ie n ia w d o w o ln e j s ie c i s o r t u ją c e j
d la
n
e le m e n t ó w .
M o ż n a p o p r a w ić
n i e k tó r e
z s ie c i o p is a n y c h
p o w y ż e j w t a k i s p o s ó b , ż e b y m i a ł y k r ó t s z y c z a s d z i a ła n ia , a le n ie u ż y w a ł y w ię c e j k o m p a ra to ró w t a k ja k to p o k a za n o n a ry su n k u 5 1 n
=
10 w
ć w i c z e n iu
7.
M ożna
o s ią g n ą ć j e s z c z e
d la n
k ró tszy
=
6 i n
czas
=
9, a d la
d z i a ła n ia , je ś li
d o d a m y j e d e n lu b d w a d o d a t k o w e m o d u ł y p o r ó w n u ją c e , t a k j a k t o j e s t w g o d n y c h u w a g i s ie c ia c h d l a n =
10 , 1 2 i l 6 z r y s u n k u 5 1 . T e k o n s t r u k c je d a j ą n a s t ę p u j ą c e
g ó r n e o g r a n ic z e n i a n a T ( n ) d la m a ł y c h n : n
=
1
2 3 4 5 6 7
8 9
f (n ) < 0 1 3 3 5 5 6 6 7 D la n
<
10
11
12
13
14
15
16
7
8
8
9
9
9
9
64)
10 w i a d o m o , ż e w a r t o ś c i t u p o d a n e s ą d o k ł a d n e ( z o b a c z ć w ic z e n ie 4 ).
S ie c i z r y s u n k u 5 1 z a s ł u g u j ą n a u w a ż n e p r z e s t u d io w a n ie , p o n ie w a ż n ie m a ż a d n y c h o c z y w is ty c h d o w o d ó w te w
la ta c h
(7 1 =
10 , 1 6 ) .
19 6 9 -19 7 1
n a to , że o n e w
przez
G.
S h a p ir o
(n
o g ó le s o r t u ją ; z o s t a ł y o n e o d k r y =
6, 9,
12 )
i D. Van
V o o r h is a
5.3.4
SIECI SORTUJĄCE
, I T • I i I ... —l-H I
7i = 6
IT T — *— < —t — f
, ... 1 . . T I ...
i
12 modułów, opóźnienie 5
h = -h—4 ------
$
n :
r ; r : j i
n = 10
'r T f ..-4— -4—«-4— - = b -t— ^4— i : ; —
* _
—
* —
—
i —
4
-
1 >-------------
1 —
“
T “
_
i
" "
>-------------- 1 >—
1
1
.........
—
—
|
„ < (—
"
4 I
i
_
i
—
,
i
n = 12
~T~ę
n = 16
25 modułów, opóźnienie 8
t
31 modułów, opóźnienie 7
I, I. I .. I. I, I. -L,
:u _
i
n —9
v .
243
40 modułów, opóźnienie 8
►I I nI "I uI I *
I
61 modułów, opóźnienie 9
R y s. 51. Sieci sortujące, o których wiadomo, ze są najszybsze, jeśli porównania są wykonywane równolegle.
Sieci sc a la ją c e . Niech M( m, n) oznacza m inimalną liczbę modułów porównują cych potrzebnych w sieci scalającej m elementów x \ < • *• < x m z n elementami yi ^ ^ yxi ^ jeden posortowany ciąg Z\ ^ ^ ZynĄ-n. Jak dotąd nie odkryto żadnej sieci scalającej, która byłaby lepsza od scalania nieparzysto-parzystego opisanego powyżej; tak więc funkcja C (m , n) z (6) reprezentuje najlepsze górne ograniczenie dla M (m , n). R. W. Floyd odkrył interesujący sposób wyznaczania dolnych granic dla takiego problemu scalania. T w ie rd z e n ie F . M (2n, 2n) > 2M( n, n) + n dla każdego n > 1. Dowód. Rozważmy sieć zawierającą M (2n, 2n) modułów porównujących, zdolną sortować wszystkie ciągi wejściowe {¿i,. . . , z4n), takie że 24 < Z3 < ■• • < z4n_i i Z2 < z 4 < ■• • < z4n. Możemy przyjąć, że każdy m oduł zamienia (z ^ Z j ) na
244
SORTOWANIE
5.3.4
(min(zi, Zj), m ax(zi, Zj)), dla pewnych i < j (zobacz ćwiczenie 16). Dlatego kom paratory można podzielić na trzy klasy: a) i < 2 n i j < 2n; b) i > 2 n i j > 2n; c) i < 2n i j > 2n. Klasa (a) musi zawierać co najmniej M ( n , n ) komparatorów, ponieważ Z2n+1 ? ^2n+ 2? • *•, mog^ już na samym początku sortowania znajdować się na swo ich docelowych pozycjach; podobnie mamy co najmniej M (n, n) komparatorów w klasie (b). Co więcej, ciąg wejściowy ( 0 , 1 , 0, 1 , . . . , 0 , 1 ) pokazuje, że klasa (c) zawiera co najm niej n komparatorów, ponieważ n zer musi być przesuniętych z {Z2n + l , - - - , 24n) do { z X, . . . , Z2n) ■ I W ielokrotne zastosowanie twierdzenia F dowodzi, że zachodzi M( 2 m,2m) > | ( m + 2)2m; stąd M ( n , n ) > \ n \ g n + 0 ( n ) . Z twierdzenia 5.3.2M wiemy, że scalanie bez ograniczeń sieciowych wymaga tylko M( n, n) = 2n — 1 porównań; udowodniliśmy zatem , że scalanie sieciowe jest znacząco trudniejsze niż scalanie ogólne. Scalanie nieparzysto-parzyste pokazuje, że M( m , n) < <7(m, n) = \ ( m + n) lgm in(m , n) + 0 ( m + n). P. B. Miltersen, M. Paterson i J. Tarui [JACM 43 (1996), 147-165] poprawili twierdzenie F, uzyskując dolne ograniczenie M (m , n) > - ((m + n) lg(m + 1 ) —m / l n 2)
dla 1 < rn < n.
Stąd wynika, że M( m , n) — ^ (m + n) lgmin(m, n) + 0 ( m + n). A. C. Yao i F. F. Yao podali dokładny wzór na M( 2 , n) = C ( 2 , n) = [ |n ] [JACM 23 (1976), 566-571]. O wartości M (m , ń) wiadomo także, że jest równa C (m , n) dla m = n < 5; zobacz ćwiczenie 9. S ortow an ie b ito n iczn e. Gdy dopuścimy jednoczesne wykonywanie porównań, wówczas z ( 12 ) wynika, że scalanie nieparzysto-parzyste zużywa [lg( 2n)] jedno stek czasu dla 1 < m < n. Batcher wymyślił inny typ sieci scalającej, nazywanej sorterem bitonicznym, której czas działania zmniejsza się do [lg(m + n) |, cho ciaż wymaga ona więcej modułów porównujących. [Zobacz U.S. Patent 3428946 (1969)]. Powiemy, że ciąg ( z i , . . . , ^ ) złożony z p liczb jest bitoniczny, jeśli z\ > **■ > Zk < *■* < zv dla pewnego /c, przy czym 1 < k < p. (Porównajmy to ze zwykłą definicją ciągów „monotonicznych” ). Sorter bitoniczny rzędu p to sieć komparatorów, która sortuje w porządku niemalejącym każdy ciąg bitoniczny o długości p. Problem scalania X\ < • • • < x m z yi < ■*- < yn jest szczegól nym przypadkiem problemu sortowania bitonicznego, ponieważ scalenia można dokonać za pom ocą bitonicznego sortera rzędu m + n zastosowanego do ciągu (Xnm • *• ? j Vl) • • *?2/n)*
5.3.4
SIECI SORTUJĄCE n
245
=
-------—
R y s. 52. Sorter bitoniczny Batchera rzędu 7.
Zauważmy, że jeżeli ciąg ( z i , . . . , z p) jest bitoniczny, to bitoniczne są także wszystkie jego podciągi. Krótko po odkryciu sieci scalających nieparzysto-parzystych Batcher zauważył, że można zbudować w analogiczny sposób sorter bito niczny rzędu p, najpierw sortując niezależnie podciągi bitoniczne {z\,zs, Z5 , . . . ) i {^2: ¿4 : ***)> następnie porównując i zamieniając z\ \ z^, 23 . . . . (Dowód znajdziemy w ćwiczeniu 10 ). Jeśli przez C f(p) oznaczymy liczbę modułów po równujących w takiej sieci, to C'(p) = C ’{ \p /21) + C"(LP/2J) + LP/2J
dla p > 2;
( 15 )
a czas opóźnienia wynosi oczywiście [ l gp] . Na rysunku 52 pokazano zbudowany w ten sposób sorter bitoniczny rzędu 7: Można go użyć jako (3,4)- jak i (2,5)-sieć scalającą, o opóźnieniu trzy jednostki; sieć nieparzysto-parzysta dla m = 2 i n = 5 oszczędza jeden kom parator, ale dodaje jeden poziom opóźnienia więcej. Szczególnie interesujący jest sorter bitoniczny B atchera rzędu 2 i ; składa się on z i poziomów, z których każdy zawiera 2 i_1 komparatorów. Jeśli linie wejściowe ponumerujemy Zo?2j_, • • *, ^2*—1 » 1 ° element Zi jest porównywany z Zj na poziomie l wtedy i tylko wtedy, gdy i oraz j różnią się tylko na l-tym , najb ar dziej znaczącym bicie w swoich reprezentacjach binarnych. Ta prosta stru k tu ra prowadzi do równoległych sieci sortujących, które są tak samo szybkie jak sca lanie z zamianami (algorytm 5 .2 .2M), ale wyraźnie łatwiejsze w implementacji. (Zobacz ćwiczenia 11 i 13). Scalanie bitoniczne jest optymalne w takim znaczeniu, że żadna m etoda równoległego scalania, oparta na jednoczesnym wykonywaniu rozłącznych po równań, nie może sortować w mniej niż [lg(m + n)] fazach, niezależnie od tego czy jest ona typu bez odwołań do historii, czy nie. (Zobacz ćwiczenie 46). W ćwiczeniu 57 omawiamy inny sposób osiągnięcia optymalnego czasu; w tym przypadku wymaga się mniej porównań, ale schemat sterowania jest bardziej skomplikowany. Dla 1 < m < n, n-te najmniejsze wyjście w sieci (m, ń) scalającej zależy od 2 m + [m < n] wejść (zobacz ćwiczenie 29). Jeśli można by je policzyć za pomocą komparatorów znajdujących się na l poziomach, to zależałoby ono od co najwyżej 2l wejść; zatem 2l > 2m + [ m [~lg(2m-K [m
246
5.3.4
SORTOWANIE XI yi 2/2
23
c
2/3
24 2/4
< 25 <
2/5
26
X
2/6
27
R y s. 53. Scalanie jednego elementu z sześcioma innymi z powielaniem wartości na wyjściu, w celu osiągnięcia najmniejszego możliwego czasu opóźnienia.
przedstawiona na rysunku 53. Oczywiście sieci tego typu nie spełniają przyjętych przez nas założeń i jest nietrudno pokazać, że każda (l,n )-sieć scalająca bez możliwości powielania wartości wyjściowych musi działać w czasie lg(n + 1 ) lub dłuższym. (Zobacz ćwiczenie 45). S ieci w y b o ru . Sieci można także wykorzystać do rozwiązania problemu z punk tu 5.3.3. Niech Uk{n) oznacza m inimalną liczbę komparatorów potrzebną w sieci w celu przemieszczenia k największych z n różnych wejść na k wskazanych linii wyjściowych; na wskazanych liniach wyjściowych poszukiwane liczby mogą się pojawić w dowolnym porządku. Niech Vk(n) oznacza m inimalną liczbę kompa ratorów potrzebną do przemieszczenia k największych z n różnych wejść na k wskazanych linii wyjściowych; niech Wfc(n) oznacza m inim alną liczbę kompa ratorów potrzebną do przemieszczenia k największych z n różnych wejść na k wskazanych linii wyjściowych w porządku niemalejącym. Można wydedukować (zobacz ćwiczenie 17), że Uk(n) < Vk (n) < W k (n).
( 16 )
Przypuśćm y na początek, że mamy 2k elementów ( x i , . . . ,X 2k) i że chcemy wybrać k największych elementów. W. T. Aleksiejew [KibiernietiJca 5, 5 (1969), 99-103] zauważył, że możemy tego dokonać, sortując najpierw (oą, . . . , Xk) i .. ■, X2k), a następnie porównując i zamieniając Xl *X2k 7
X2
—1,
Xk •
•
(*7)
Ponieważ żadna z tych par nie może zawierać więcej niż jednego z k największych elementów (dlaczego?), procedura Aleksiejewa musi wybrać k największych elementów. Jeśli chcemy wybrać k największych spośród nk elementów, możemy zasto sować procedurę Aleksiejewa n — 1 razy, eliminując za każdym razem k ; stąd Uk (nk) < (n-l )( 2Ś( j f e) + fe).
( 18 )
Aleksiejew otrzym ał także dla problemu wyboru interesującą dolną granicę.
5.3.4
SIECI SORTUJĄCE (1,7)
( 1 ,8 )
(1,5)
(1,4)
(2,8)
(2 ,7 )
( 2 ,6 )
(2 ,4 )
(1 ,7 )
(2 ,7 )
(3 ,7 )
(2 ,4 )
( 2 ,8 )
(4 ,8 )
(4,8)
(1 ,4 )
(1 ,7 )
(1 ,5 )
(1,5)
(5,8)
( 2 ,8 )
(2 ,7 )
( 2,6 )
(5 ,7 )
(1 ,7 )
(2 ,7 )
(3 ,7 )
(5 ,7 )
( 2 ,8 )
(4 ,8 )
(4,8)
(5,8)
247
R y s. 54. Rozdzielanie czte ech największych od czterech najmniejszych. (Liczby na liniach są wykorzystywane w dowodzie twierdzenia A).
T w ierd zen ie A . Uk{n) > (n —k) [lg(fc + 1 )]. Dowód. Najwygodniej będzie rozważyć równoważny problem wyboru k naj mniejszych elementów. Z każdą linią w sieci komparatorów możemy związać liczby (l,u), tak jak na rysunku 54, gdzie l i u oznaczają odpowiednio mini m alną, i maksymalną wartość, które mogą się pojawić w tym miejscu, jeśli na wejściu pojawia się perm utacja zbioru { 1 , 2 , . . . ,n}. Niech l, i lj będą dolnymi ograniczeniami na liniach i oraz j przed porównaniem x l : x } i niech Z' oraz /' będą odpowiednimi ograniczeniami dolnymi po tym porównaniu. Jest oczywiste, że Z' = min (Z,, lj): w ćwiczeniu 24 dowodzimy (nieoczywistej) zależności lj < h + lj-
( 19 )
R y s. 55. Inna interpretacja dla sieci z rysunku 54.
Zinterpretujmy teraz operacje wykonywane w sieci w inny sposób (zobacz rysunek 55): Zakładamy, że na wszystkich liniach wejściowych znajdują się zera, a każdy „komparator” umieszcza mniejszą ze swoich danych na górnej linii, a większą plus jeden na dolnej linii. Wynikowe liczby (mj, . . . , m n) m ają własność, że 2 m* > h
(2 0 )
248
5.3.4
SORTOWANIE
w całej sieci, ponieważ jest ona spełniona na początku i jest zachowywana przez każdy kom parator, co wynika z ( 19 ). Ponadto końcowa wartość m i +
7712 H
b
mn
jest równa łącznej liczbie kom paratorów w sieci, ponieważ każdy kom parator wnosi jeden do tej sumy. Jeśli sieć wybiera k najmniejszych liczb, to n —k z wartości li jest > k + 1; stąd n ~ k z wartości m i musi być > |~lg(fc + 1 )]. I Tabela 1 PORÓWNANIA NIEZBĘDNE W SIECIACH WYBORU (Ufc(n), Ufc(n), W k ( n ) )
k = 1 n n n n n n
—1 —2 —3
—4 —5 —6
k = 2
k = 3
k =4
k = 5
k = 6
(0,2,3) (3,5,5) (6,7,8) (8 , 1 0 , 1 0 )
(0,3,5) (4,7,9) ( 8, 10 ,1 2)
(0,4,9) (5,9,12)
( 0 , 5, 1 2)
(0,0,0) (1.1.1) (2,2,2)
( 0 , 1, 1) (2,3,3)
(3,3,3)
(4,5,5)
(4,4,4)
(6,7,7) (8,9,9)
(5,5,5)
Dolna granica z twierdzenia okazuje się dokładna dla k = 1 i fc = 2 (zobacz ćwiczenie 19). W tabeli 1 podano pewne wartości ¿4 (n ), Vk (n) i Wfc(n) dla ma łych k i n. Andrew Yao [Ph.D. thesis, U. of Illinois (1975)] podał dla ustalonego k, w jaki sposób zachowuje się asym ptotycznie Ć4 (n), pokazując, że ¿^(n) = 2n + l g n - h O( l ) i Uk(n) = n|"lg(A: + l)] -b O ^ lo g n )^ * -!) przy n ^ qq- minimalny czas opóźnienia wynosi l gn- b [lgk\ l g l g n + O (logloglogn). N. Pippenger [SICOMP 20 (1991), 878-887] udowodnił za pomocą m etod niekonstruktywnych, że dla każdego e > 0 istnieje sieć wyboru, dla której U\nf 2 \{n ) < (2 + e )nl gn, dla w ystarczająco dużych n (zależnie od e). Ć W IC ZEN IA - zestaw pierwszy W następujących kilku ćwiczeniach rozwijamy szczegółowo teorię sieci sortujących i w tym celu wygodnie jest wprowadzić pewne oznaczenia. Przez [i:j] oznaczamy moduł porównująco-zamieniający. Sieć o n wejściach i r modułach porównujących zapisujemy w postaci [ii :ji] [12 :J2] • • • [ir-jr], gdzie każde i, j jest ^ n; taką sieć będziemy nazywali krótko n-siecią. Powiemy, że sieć jest standardowa, jeśli iq < j q dla 1 ^ q ^ r. Tak więc na przykład rysunek 44 ze strony 234 przedstawia standardową 4-sieć, oznaczaną jako ciąg komparatorów [1:2] [3:4] [1:3] [2:4] [2:3]. Umowa dotycząca rysowania schematów sieci, którą przyjęliśmy w głównym tekś cie, umożliwia prezentację tylko sieci standardowych; każdy komparator [i:j] jest re prezentowany przez odcinek łączący i z j , gdzie i < j. Jeśli musimy narysować sieć niestandardową, możemy do tego celu użyć strzałki z i do j , pokazującej miejsce, do którego wędruje większa z porównywanych liczb. Dla przykładu na rysunku 56 przedstawiono sieć niestandardową dla 16 elementów, składającą się z komparatorów [1:2] [4:3] [5:6] [8:7] itd. W ćwiczeniu 11 dowodzimy, że sieć z rysunku 56 jest siecią sortującą.
5.3.4
SIECI SORTUJĄCE Faza 1 \
Faza 2
Faza 3
— i>— >(
f
>f y
Faza 4
- - - - < 1- - - - - - - - - ( t— >f
f
>f
)
\f
\
f
J\ yK
t
f
> >f >f
>
\f
>f y
>f \
)
\7
y
f
y
1
f
>f >f
\
‘<
y\
y
y y
,
1
> y
f
>f >f
>f
f
i
f \< >t
>
ł^
y
>f
r
.
y\ ''
>f
>f
\f
\t
1
r ^
yv >f
249
>f
t yv
' y
>f >t
)
>f
>(
f
f >f
>
Rys. 56. Sieć niestandardowa dla sortowania bitonicznego. Jeśli x = {x\ , . . . , x n) jest n-wektorem i a jest n-siecią, to przez x a oznaczamy wektor liczb { ( x a ) i , . . . , (x a )n) otrzymywany w wyniku działania a na wektorze danych x. Dla zwięzłości zapisu przyjmujemy oznaczenia a V b — max(a, 6), a A b — min(a, 6), a — 1 —a. Zatem (x[i:j])i — Xi A Xj, (x[i:j])j = Xi V Xj i (x[i:j])k = Xk dla i / k ^ j. Powiemy, że a jest siecią sortującą, jeśli dla każdego x i każdego 1 < i < n, (x a )i < ( x a) i+1. Zapis e 6 ) oznacza wektor jednostkowy z jedynką na ż-tej pozycji i zerami na pozostałych pozycjach; zatem (e(A = i « . Przez D n oznaczamy zbiór wszystkich 2 n n-elementowych wektorów 0 i 1 , natomiast Pn oznacza zbiór wszystkich n! wektorów, które są permutacjami zbioru {1, 2 , . . . , n}. Przez x A y i x V y oznaczamy wektory
2. [¿JjS] Pokaż, że algorytm sortowania V. Pratta (ćwiczenie 5.2.1-30) prowadzi do sieci sortującej dla n elementów, która w przybliżeniu ma (log 2 n)(log 3 n) poziomów opóźniających. Narysuj taką sieć dla n = 12 . 3. [M20] (K. E. Batcher) Znajdź prostą zależność między C ( m ym —1) a C ( m , m ) . ► 4. [M23] Udowodnij, że T ( 6 ) = 5. 5. [M16] Udowodnij, że ( 13 ) jest czasem opóźnienia dla sieci sortującej odpowiada jącej ( 10 ). 6 . [28] Niech T ( n ) będzie minimalną liczbą faz potrzebną do posortowania n różnych
liczb za pomocą jednoczesnego wykonywania rozłącznych porównań (bez konieczności zachowywania warunków dotyczących sieci); takie porównania można reprezentować jako węzeł zawierający zbiór par { i x : j i , i 2 :j 2 , **• , V :jr}, gdzie ¿1, j i , ^ , J2 , .. . , i r , j r są
250
Faza 2
x -I |- x
x -T ]- mln(x, y) y -L J- max(x, y)
Faza 3
Faza 4
SORTOWANIE
Faza 1
max(x, y ) max(x min(x, V)
R y s . 57. Sortowanie 16 elementów za pomocą doskonałego tasowania.
5.3.4
S
5.3.4
SIECI SORTUJĄCE
251
różne, i który ma 2r rozgałęzień odpowiadających poszczególnym przypadkom (RĄ < K j n K i 2
, **■? K i r < K j r )y
{Kii ^ K j 1, K i2 < K j 2, . . . , K i r < Ayr)
itd.
Udowodnij, że T(5) = T ( 6 ) — 5. 7. [55] Pokaż, że jeśli w sieci z rysunku 49 dla n = 10 zamienimy trzy ostatnie komparatory przez „słabszy” ciąg [5: 6 ] [4:5] [6 :7], to taka sieć nadal będzie sortowała. 8 . [M20] Udowodnij, że M (m i+ m 2, n\ + 112 ) ^ M (m i, n i) + M (ra2, n 2 )+ m in (m i, 112) dla m i, m 2, n i , n 2 ^ 0 .
9. [M25] (R. W. Floyd) Udowodnij, że M (3, 3) = 6 , M (4 ,4) = 9, M (5, 5) = 13.
10. [M22] Udowodnij, że sortowanie bitoniczne Batchera, tak jak zostało zdefinio wane w uwagach poprzedzających ( 15 ), jest poprawne. [Wskazówka: Wystarczy tylko pokazać, że zostanie posortowany każdy ciąg składający się z k jedynek, po których występuje l zer, a na końcu pojawia się n — k —l jedynek]. 1 1 . [M23] Udowodnij, że sortowanie bitoniczne Batchera rzędu 2 * nie tylko sortuje ciągi (zo, z 1, . . . , z2t_i), dla których zq ^ ^ Zk ^ ^ z 2t~ 1, ale także posortuje
każdy ciąg, dla którego zq ^ ^ Zk ^ ^ z 2t~\. [Wynika stąd, że sieć z rysunku 56 posortuje 16 elementów, ponieważ każda faza składa się z sorterów bitonicznych lub sorterów bitonicznych sortujących w odwrotnym porządku, zastosowanych do ciągów, które zostały posortowane w przeciwnych kierunkach]. 12. [M20} Udowodnij lub zaprzecz: jeśli x i y są ciągami bitonicznymi o takiej samej długości, to ciągami bitonicznymi są także x V y i x A y. ►13. [24] (H. S. Stone) Pokaż, że sieć sortującą dla 2 * elementów można zbudować, postępując zgodnie ze wzorcem z rysunku 57. Każdy z t 2 kroków z tego schematu składa się z „doskonałego tasowania” pierwszych 2t ~ 1 elementów z ostatnimi 2 i_1 ele mentami, a następnie z wykonywanych jednocześnie operacji na 2 i_1 parach sąsiednich elementów. Każdą z tych operacji jest albo „0” (żadne porównanie-zamiana nie jest wykonywane), „+” (standardowy moduł porównujący) lub ” (moduł porównujący przeciwnie). Sortowanie wykonuje się w t fazach po t kroków w każdej fazie; w ostatniej fazie wszystkimi operacjami są „+”. W fazie s, dla s < £, wykonywanych jest t — s kroków, w których wszystkimi operacjami są „0 ” , a następnie wykonywanych jest s kroków takich, że w kroku q na przemian wykonywanych jest po 2q~ 1 operacji „+” i po 2 q~l operacji „—” dla q — 1 , 2 , . . . , s. [Zauważmy, że taki schemat sortowania można zrealizować za pomocą dość proste go urządzenia złożonego z jednego układu „tasowanie/operacja”, którego wyjście jest kierowane z powrotem na jego wejście. Pierwsze trzy kroki z rysunku 57 można by oczy wiście usunąć; zachowaliśmy je tylko dla pełnej przejrzystości opisywanego schematu, Stone zauważył, że taki sam wzorzec „tasowanie/operacja” pojawia się w kilku innych algorytmach, jak na przykład w szybkiej transformacji Fouriera (zobacz 4.6.4-(4o))]. ►14. [M27\ (W. E. Aleksiejew) Niech a — [U : j i ] . . . [ir :jr\ będzie n-siecią; dla 1 ^ s definiujemy a s = [*', : j [ ] . . . [i's_ i :jś-i][* . -js] • • • [v -jr], gdzie i'k i j'k otrzym uje się z i k i jk przez zamianę i s na j s oraz zamianę j s na i s w każdym miejscu ich wystąpienia. Na przykład, jeśli a = [1:2] [3:4] [1:3] [2:4] [2:3], to a 4 = [1:4] [3:2] [1:3] [2:4] [2:3]. a) Udowodnij, że D na = D n ( a s). b) Udowodnij, że (cU)* = (a*)5. c) Sprzężeniem a nazywamy dowolną sieć postaci ( . . . ( ( a Sl)S2) . . . ) Sfc. Udowodnij, że a ma co najwyżej 2r_1 sprzężeń.
252
SORTOWANIE
5.3.4
d) Niech gCi(x) = [x E D na] i niech f a {x) — (x^ V X j 1 ) A • • • A (xir V X j r ) . Udowodnij, że got(x) = V { f a '( x ) | oc jest sprzężeniem et}. e) Niech Ga będzie grafem skierowanym o wierzchołkach { l , . . . , n } i krawędziach i s —>j s dla 1 < s < r. Udowodnij, że a jest siecią sortującą wtedy i tylko wtedy, gdy w G af istnieje ścieżka zorientowana od i do i 4 -1 dla 1 < i < n i wszystkich a' sprzężonych z a . [Ten warunek jest w pewnym sensie godny uwagi, ponieważ G a nie zależy od kolejności komparatorów w et]. 15. [20] Znajdź niestandardową sieć sortującą dla czterech elementów, która składa się tylko z czterech modułów porównujących. 16. [M22] Udowodnij, że następujący algorytm przekształca dowolną sieć sortującą [U - j i ] . . . [¿r :j r ] na sieć standardową o tej samej długości: T l . Niech q będzie najmniejszym indeksem takim, że iq > j q. Jeśli taki indeks nie istnieje, koniec wykonywania algorytmu. T 2 . We wszystkich komparatorach [i8 :js], dla q < s < r, zamień każde wystąpienie i q przez j q. Wróć do T l. | Na przykład, sieć [4:1] [3: 2 ] [1:3] [2 :4] [1:2] [3:4] zostaje najpierw przekształcona na [1 :4][3: 2 ][4:3][2 : 1][4: 2 ][3: 1], następnie na [1 :4][2 :3][4:2 ][3: 1][4:3][2 : 1], potem na [1 :4] [2 :3] [2 :4] [3: 1] [2 :3] [4: 1] itd ., w końcu na standardową [1 :4] [2 :3] [2 :4] [1 :3] [1 :2 ] [3 :4]. 17. [M25] Niech D kn będzie zbiorem wszystkich (£) ciągów {x\ , . . . , x n) zer i jedynek zawierających dokładnie k jedynek. Pokaż, że Uk (n) jest minimalną liczbą kompa ratorów w sieci, która sortuje wszystkie elementy Dkn] Vk{n) jest minimalną liczbą komparatorów potrzebnych do posortowania Dkn U D(k- 1)™; natomiast W k {n) jest minimalną liczbą komparatorów potrzebnych do posortowania (Jo
u k — m ax{(pa)fc | p € Pn }
oznaczają dolną i górną granicę na zakres wartości, które mogą pojawić się na k-tej linii na wyjściu. Niech lk i u k będą zdefiniowane podobnie dla sieci a — a[i:j]. Udowodnij, że l[ = li A l j ,
lj < li + l j ,
u'i ^ Ui + Uj - (n + 1 ),
u) ~ u { V Uj.
[Wskazówka: Dla danych wektorów x i y w D n przy (xa)i — (ya)j = 0, C(^) — h, C(y) — Iji znajdź wektor z w D n przy (z a ) j = 0, C(z) < h + lj].
5.3.4
SIECI SORTUJĄCE
253
25. [M30] Niech lk i Uk będą takie, jak zdefiniowano w ćwiczeniu 24. Udowodnij, że wszystkie liczby całkowite między lk a Uk włącznie należą do zbioru {(pa)fc | p jest w Pn}. 26. [M2Ą] (R. W. Floyd) Niech a będzie n-siecią. Udowodnij, że zbiór D na = { x a \ x jest w D n } można określić za pomocą zbioru Pna = {pa | p jest w Pn }', na odwrót, Pna można określić na podstawie D na. ►27. [M20] Niech x i y będą wektorami i niech x a , y a będą posortowane. Udowodnij, że (asa)* {y&)j wtedy i tylko wtedy, gdy dla każdego wyboru j elementów z y można wybrać i elementów z x w taki sposób, że każdy wybrany element z x jest od pewnego elementu z y. Wykorzystaj powyższą zasadę, aby udowodnić, że je śli p o so rtu je m y w iersze dow olnej m acierzy, a następnie j e j kolum ny, to w iersze p o z o s ta n ą nadal p o so rto w a n e . ►28. [M20] Poniższy diagram ilustruje fakt, że można w systematyczny sposób wypro wadzać formuły wyznaczające zawartości wszystkich linii, zależnie od danych wejścio wych: a
■a A b-
(a A 6) A (c A d ) ---------------- ( a A b) A (c A d)
b
■a V b -
(a V b) A (c V d ) ------ --------- ((a V b) A
c
■o A d -
(a A b) V (c A d ) ----- -------- ((a V b) A (c V d)) V ((a A b) V (c A d))
d
■c V d-
(a V b) V (c V d ) --------------- (a V 6) V (c V d)
(c V d)) A ((a A 6) V (c A d))
Korzystając z praw przemienności x A y = y A x , x V y = y \ / x , praw łączności x A ( y A z ) = (x A y) A z, x V (y V z) = (x V y) V z, praw rozdzielności a; A (y V z) = (a; A y) V (x A z), x\ J (y A z) — ( x y y) A { xM z), praw pochłaniania x A (x V y) — x V (x A y) — x i praw idempotentności x A x ~ x V x = x, możemy zredukować formuły z prawej strony tej sieci odpowiednio do(a A b A c A d ) , (a A b A c) V(a A b A d) V (a A c A d) V (b A c A d), (a A b) V (a A c) V(a A d) V (b A c) V (b A d) V (c A d) oraz a V b V c V d. Udowodnij, że w ogólności fc-ty największy element z { m , . . . , x n } jest wyznaczany przez „elementarną funkcję symetryczną” ( Tk( xi , . .. ,Xn) = \ J {Xix A Xi2 A • • • A Xik I 1 ^ ¿1 < i 2 < *• • < ik ^ n}.
[W sumie V mamy razem (”) składników. Tak więc problem znalezienia sieci sortujących o minimalnych kosztach jest równoważny problemowi policzenia elementarnej funkcji symetrycznej o minimalnej liczbie bramek „and/or”, gdzie w każdej fazie żądamy zastąpienia dwóch wielkości A %j) i V ip\. 29. [M20\ Wiedząc, że x\ ^ x 2 ^ x 3, yi ś y 2 ś y3 ś P4 ś ys i ¿e zj ^ z 2 ś ś zs to wynik scalenia ciągu x z ciągiem y , znajdź formuły wyznaczające elementy ciągu 2 w zależności od elementów x i y , wykorzystując w tym celu operatory A i V. 30. [HM24] Udowodnij , że każdą formułę zbudowaną z A, V i niezależnych zmiennych { x \ , . . . , x n } można, za pomocą tożsamości z ćwiczenia 28 zredukować do postaci „kanonicznej” n V r2 V • • • V 7>, gdzie k ^ 1; każde n jest postaci / \ { x j \ j w Si}, a Si jest podzbiorem {1, 2 , . . . , n } i żaden zbiór Si nie jest zawarty w Sj dla i ^ j . Udowodnij także, że dwie takie postacie kanoniczne są równe dla wszystkich x \ , . . . , x n wtedy i tylko wtedy, gdy są identyczne (z dokładnością do kolejności). 31. [M2Ą] (R. Dedekind, 1897) Niech Sn będzie liczbą różnych kanonicznych postaci dla x \ , . . . , x n w znaczeniu z ćwiczenia 30. Zatem Si = 1, S2 — 4, ¿3 = 18. Ile wynosi 5ą?
254
SORTOWANIE
5.3.4
32. [M28\ (M. W. Green) Niech G i = {0 0 , 0 1 , 11 } i niech Gt+i będzie zbiorem wszyst kich słów 6, ^w, 0 ^ i należą do G*. Niech a będzie siecią składającą się z czterech pierwszych poziomów sieci sortującej dla 16 elementów pokazanej na rysunku 49. Pokaż, że D i e a — G ą i udowodnij, że zbiór ten zawiera dokładnie Są + 2 elementów. (Zobacz ćwiczenie 31). ►33. [M22] Nie każda z 8n funkcji dla ( x i , . . . , x n), o których mowa w ćwiczeniu 31, może pojawić się w sieciach komparatorów. Na potwierdzenie tego udowodnij, że funk cja (xi A X 2 ) V (x 2 A £ 3 ) V (x 3 A £ 4 ) nie może pojawić się jako wyjście jakiejkolwiek sieci komparatorów zastosowanej do ( x i , . . . , x n). 34. [23] Czy poniższa sieć jest siecią sortującą?
1 * 1
i
,
i
WW I n
,
1 *
I
- U 35. [20] Udowodnij, że w każdej standardowej sieci sortującej musi pojawić się co najmniej raz każdy z sąsiedzkich komparatorów [¿:i+l] dla 1 ^ i < n. ►36. [22] W sieci z rysunku 47 wykonywane są tylko sąsiedzkie porównania [i:i+1]; nazwijmy taką sieć siecią prostą. a) Udowodnij, że każda n-elementowa prosta sieć sortująca musi składać się z co najmniej (™) komparatorów. [Wskazówka: Rozważ inwersje permutacji]. b) (R. W. Floyd, 1964) Niech a będzie prostą siecią dla n elementów i niech x będzie wektorem takim, że (m )i > (xa)j dla pewnego i < j. Udowodnij, że {yot)i > (yot)j, gdzie y jest wektorem ( n , n —1 , . . . , 1 ). c) Jako wniosek z (b) prosta sieć jest siecią sortującą wtedy i tylko wtedy, gdy sortuje wektor (n, n —1 , . . . , 1 ). 37. [M22] Nieparzysto-parzystym sortowaniem przestawiającym dla n liczb, n ^ 3, nazywamy sieć n-poziomową składającą się z ^ n (n —1 ) komparatorów, rozmieszczonych zgodnie ze wzorcem z rysunku 58. (Dla n parzystego mamy dwie możliwości). Takie sortowanie jest bardzo łatwe do realizacji sprzętowej, ponieważ wykonywane są naprze miennie tylko dwie akcje. Udowodnij, że taka sieć jest rzeczywiście siecią sortującą. [ Wskazówka: Zobacz ćwiczenie 36].
n= 5
n= 6
n= 6
R y s. 58. Nieparzysto-parzyste sortowanie przestawiające. ►38. [43] Niech N = ( 2). Znajdź wzajemnie jednoznaczne odwzorowanie między tableaux Younga o kształcie (n — 1, n — 2 , . . . , 1) a prostymi sieciami sortującymi [ ii :ii + 1] • • • [iN :^jv + 1]* [W konsekwencji z twierdzenia 5.1.4H mamy, że istnieje do kładnie ___________ N\___________ ]n - 1 3 n -2 571-3 ( 2 n —3)1
5.3.4
SIECI SORTUJĄCE
255
takich sieci sortujących]. Wskazówka: W ćwiczeniu 36(c) pokazujemy, że sieci proste nie zawierające redundantnych komparatorów odpowiadają ścieżkom z 1 2 . . . n d o n . . . 2 1 w wielościanie takim jak ten z rysunku 1 w punkcie 5.1.1. 39. [25] Załóżmy, że o prostej sieci komparatorów o n liniach wiadomo, że sortuje poprawnie ciąg wejściowy 1 0 1 0 . . . 10. (Zobacz ćwiczenie 36; załóż, że n jest parzyste). Pokaż, że „środkowa trzecia część” tej sieci, składająca się ze wszystkich komparatorów, które łączą tylko linie od [n/3~| do [~2n/3"| włącznie, posortuje każde dane wejściowe. 40. [HM44] Komparatory [i \:źi+1][ż2 :¿2+1] ■■■[v :ir41] wybieramy losowo, przy za łożeniu, że wszystkie wartości z i k e { 1 , 2 , . . . , n — 1} są jednakowo prawdopodobne; proces budowy sieci kończymy, gdy powstała sieć zawiera jako podsieć konfigurację dla sortowania bąbelkowego taką jak ta z rysunku 47. Udowodnij, że r < 4n2 4- 0 ( n 3^2 lg n) z wyjątkiem zachodzącym z prawdopodobieństwem O (n-100°). 41. [M47] Komparatory [ii :ji][i 2 :J2] . . . -jr] są wybierane losowo w taki sposób, że nieredundantne wybory 1 < i k < j k < n są jednakowo prawdopodobne; proces wyboru kończymy, gdy dostajemy sieć sortującą. Oszacuj oczekiwaną wartość r; czy jest to 0 ( n 1+e) dla każdego e > 0? ►42. [25] (D. Van Voorhis) Udowodnij, że Ś (n ) ^ Ś ( n — 1) + figri~|. 43. [4 8 ] Znajdź (m, n)-sieć scalającą z mniej niż C ( m , n ) komparatorami łub udo wodnij, że taka sieć nie istnieje. 44. [50] Podaj dokładną wartość £(n ) dla pewnego n > 8. 45. [M20] Udowodnij, że (l,n )-sieć scalająca, w której nie powiela się wyjść, musi zawierać co najmniej |"lg(n 4 1)] poziomów opóźnienia. ►46. [30] (M. Aigner) Pokaż, że minimalna liczba faz potrzebna do scalenia m elemen tów z n elementami za pomocą algorytmu, który dopuszcza jednoczesne wykonywanie rozłącznych porównań tak jak w ćwiczeniu 6, wynosi co najmniej |~lg(m 4 n ) ] ; tak więc bitoniczna sieć scalająca ma optymalne opóźnienie. 47. [47] Czy dla pewnego n wartość funkcji T{n) z ćwiczenia 6 jest dużo mniejsza od T(n)? ►48. [26] Sieci sortujące można interpretować w inny sposób, pozwalając na prze noszenie po każdej linii multizbioru m liczb zamiast pojedynczej liczby; przy takiej interpretacji operacja [i:j] zamienia odpowiednio Xi i Xj na X i ^ X j i Xi\$Xj, najmniejsze m liczb i największe m liczb z 2m liczb WXj. (Poniższy diagram
{U 3 } ------- {1)3}
{1 ) 2}
{1 , 2}
— {1 , 8} - i —{ 5 ,8 }------ {5,8}
{5,8}
■{5,7}
{3, 0 } — {3,
ft
{1 , 2} — |
{2,3}
— {2,9}------ {2, 9} —•— {2,2} {2, 2j - * - {2,3}
{2, 3} —i — {5, 7} —
{7 ,9 }------- {7,9}
-{8,9}------- {8,9} —
jest przykładową ilustracją tej interpretacji dla m = 2; każdy komparator scala swoje wejścia i oddziela dolną połowę od górnej). Jeśli a i b są multizbiorami po m liczb w każdym, to piszemy, że a < 6 wtedy i tylko wtedy, gdy a Ą b — a (równoważnie a V b = b; największy element z a jest nie większy od najmniejszego elementu z b). Zatem a Ą b C o V b. Niech a będzie n-siecią i niech x — ( x i , . . . , x n) będzie wektorem, w którym każde Xi jest multizbiorem m elementów. Udowodnij, że jeśli (xa)i nie jest
256
5.3.4
SORTOWANIE
[W konsekwencji sieć sortująca dla n elementów staje się siecią sortującą dla m n elementów, jeśli zastąpimy porównania przez sieci scalające dla ciągów o długości m. Na rysunku 59 pokazano 8-elementową sieć sortującą powstałą z 4-elementowej sieci sortującej w wyniku zastosowania powyższej obserwacji]. ► --------------------------------------------- <
f
I
1f
I - I
______________________
-
R y s . 59. 8-elementowa sieć sortująca powstała z 4-elementowej sieci w wyniku zasto sowania interpretacji ze scalaniem. 49. [M23] Przy oznaczeniach z ćwiczenia 48 pokaż, że (x y) z = x ^ (y ^ z) i (x ^ y) V z = x V {y V z)i jednakże (x V y) b z n*e zawsze jest równe (x ^ z) ^ (y ^ z), a (x ^ y) ^ (x ^ z) ^ (y b z ) n ^e zawsze jest równe środkowym m elementom z x^Sy\S z. Znajdź poprawną formułę, która umożliwia wyznaczenie tych środkowych elementów za pomocą operacji ^ i ^ w zależności od x, y, 2 . 50. [HMĄ6 ] Zbadaj własności operacji ^ i ^ zdefiniowanych w ćwiczeniu 48. Czy wszystkie tożsamości w tej algebrze można scharakteryzować w ładny sposób lub wy prowadzić je ze skończonego zbioru tożsamości? Pod tym względem tożsamości takie jak x f \ x f \ x = x x lub x (x ^ (x ^ (a; ^ y))) — x ^ (x ^ y), które zachodzą dla m ^ 2, są stosunkowo mało interesujące; rozważ tylko tożsamości, które są prawdziwe dla wszystkich m. ►51. [M2 5] (R. L. Graham) Komparator [i:j] jest nazywany redundantnym w sieci a i [i:j]ot 2 j jeśli albo ( x a \ ) i ^ (x a i ) j dla wszystkich wektorów x , albo (x ai )i ^ (x a \ ) j dla wszystkich wektorów x. Udowodnij, że jeśli sieć a zawiera r nieredundantnych komparatorów, to istnieje co najmniej r różnych, uporządkowanych par (i ,j ) różnych indeksów takich, że (xa:)i ^ (xa)j dla wszystkich wektorów x. (Wynika stąd, że sieć bez redundantnych komparatorów zawiera co najwyżej ( 2 ) modułów). ►52. [32] (M. O. Rabin, 1980) Udowodnij, że ze względu na wewnętrzną strukturę pro blemu jest niezmiernie trudno stwierdzić w ogólności, czy dany ciąg komparatorów de finiuje sieć sortującą. W tym celu rozważ sieci o postaciach naszkicowanych na rysunku 10. Wygodnie jest ponumerować wejścia od xq do x n , gdzie N = 2m u+m +2n; dodatnie liczby całkowite m i n są parametrami. Pierwszymi komparatorami są [ j: j + 2nk] dla 1 ^ j ^ 2n i 1 ^ k ^ m. Następnie mamy [2j—l:2j][0:2j] dla 1 ^ j ^ n, równolegle ze specjalną podsiecią, w której używane są tylko indeksy > 2n. Następnie porównujemy [0 :2 m n + 2 n + i] dla 1 ^ j ^ m. Na końcu mamy pełną sieć sortującą, dla (asi,. . . , xjv), a za nią komparatory [0:1][1:2]... [N —t —1 :N —i], gdzie t ~ m n + n + 1. a) Opisz wszystkie dane wejściowe (xo, X i , . . . , xjv), których ta sieć nie sortuje, w za leżności od zachowania się sieci specjalnej. b) Dla danego zbioru klauzul takich jak (yi Vi/2 Vt/3 )A(2/2Vi/3Vi/4 ) A. . . , wyjaśnij, w jaki sposób skonstruować specjalną podsieć taką, że sieć z rysunku 60 sortuje wszystkie
5.3.4
SIECI SORTUJĄCE
257
3 4
56
7 8 9 10
10
11 12
11
13 14 15 16 17 18 19
13 14 15 16 17 18 19 20
12
20 21
21
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
OJ O aw a
38
39 40 41 42 43
R y s. 60. Rodzina sieci, dla których trudno jest pokazać, że sortują. Przykłady dla m = 3 i n = 5. (Zobacz ćwiczenie 52). wejścia wtedy i tylko wtedy, gdy powyższe klauzule nie są spełnialne. [Tak więc problem stwierdzenia, czy dany ciąg komparatorów tworzący sieć sortującą jest co-NP-zupełny w znaczeniu z podrozdziału 7.9). 53. [30] {Okresowe sieci sortujące) Poniższe dwie 16-elementowe sieci sortujące ilu strują ogólne rekurencyjne konstrukcje sieci ¿-poziomowych dla n = 2* w przypadku ¿ = 4: i i i
i i i
(a)
iif H
(b)
jeśli ponumerujemy linie wejściowe od 0 do 2l — 1 w przypadku (a), na /-tym poziomie mamy komparatory gdzie i mod 2t+1~l < 2ł~l i j = i® (2t+l~l - 1); razem mamy £2t“ 1 komparatorów, to jest tyle, ile w scalaniu bitonicznym. W przypadku (b) na pierwszym poziomie mamy komparatory [2^:2,; + 1] dla 0 ^ j < 2t_1, a na poziomie /-tym, 2 ^ / ^ ¿, znajdują się komparatory [2j + 1 : 2j + 2t+1_i] dla 0 ^ j < 2t_1 —2t_i ; razem mamy (t — l ) 2 i_1 + 1 komparatorów, to jest tyle, ile w scalaniu nieparzysto-parzystym.
258
SORTOWANIE
5.3.4
Udowodnij, że jeśli wejściowe liczby są 2fc-uporządkowane w znaczeniu z twierdze nia 5.2.1H dla pewnego k ^ 1, to obie sieci przekształcają je w ciąg 2ic~ 1-uporządko wany. Dlatego 2* liczb można posortować, przepuszczając je przez każdą z tych sieci t razy. [Dla dużych t w omawianych sieciach sortujących jest wykonywanych dwukrotnie więcej porównań niż w algorytmie 5.2.2M; jednak całkowite opóźnienie jest takie same jak na rysunku 57, a implementacja jest łatwiejsza, ponieważ wielokrotnie jest używana ta sama sieć]. 54. [42] Zbadaj własności sieci sortujących wykonanych z modułów m-sortujących zamiast modułów 2 -sortujących. (Na przykład G. Shapiro zaprojektował sieć
która sortuje 16 elementów za pomocą czternastu modułów 4-sortujących. Czy ta kon strukcja jest najlepsza z możliwych? Udowodnij, że m 2 elementów można posortować za pomocą 16 poziomów modułów m-sortujących, dla wystarczająco dużego m).
55. [23] Siecią permutacyjną nazywamy ciąg modułów [4 : j i ] . . . [ir :jV], w którym każdy moduł [i:j] można ustawić z zewnątrz w taki sposób, żeby przepuszczał prze pływające dane bez zmian lub zamieniał x% z xj (niezależnie od wartości X j), i taki, że na wyjściowych liniach można otrzymać dowolną permutację danych wejściowych dla pewnego ustawienia tych modułów. Każda sieć sortująca jest oczywiście siecią permutacyjną, ale stwierdzenie przeciwne nie jest prawdziwe: Znajdź sieć permutacyjną dla pięciu elementów składającą się tylko z ośmiu modułów. ►56. [25] Przypuśćmy, że wektor bitowy x E Dn nie jest posortowany. Pokaż, że istnieje standardowa n-sieć a x , która nie posortuje x, chociaż posortuje każdy inny element z Dn .
57. [M35] Scalanie parzysto-nieparzyste jest podobne do scalania nieparzysto-parzystego Batchera, z wyjątkiem kiedy m n > 2, gdy rekurencyjnie są scalane ciągi ix>rn mod 2+ 1>• • • j Xm—3) Xm —1) i {yi; 2/3j ■■■52/2 [n/2] —l) Oraz mod 2+ 1) ***;*£m—2 >^m) z (i/2 ,l/ 4 , . . . , 2/2 Ln/2j) przed wykonaniem [m /2] 4- [n/2] — 1 porównań-zamian ana logicznych do (i). Pokaż, że w scalaniu parzysto-nieparzystym osiągamy optymalny czas opóźnienia dla scalania bitonicznego [lg(m 4 n)], nie wykonując większej licz by porównań niż w metodzie bitonicznej. W rzeczywistości udowodnij, że liczba po równań A(m, n) wykonywanych w scalaniu parzysto-nieparzystym spełnia nierówności C (m, n) < A(m, n) < ~ (m + n) lg min(m, n) 4 m + | n. Ć W IC ZEN IA - zestaw drugi Poniższe ćwiczenia dotyczą kilku różnych typów pytań odnoszących się do optymalności sortowania. Podstawą kilku pierwszych problemów jest interesujące „wielogłowicowe”
5.3.4
SIECI SORTUJĄCE
259
uogólnienie sortowania bąbelkowego, zbadane przez P. N. Armstronga i R. J. Nelsona już w 1954 roku. [Zobacz U.S. Patents 3029413, 3034102]. Niech 1 — hi < h2 < • • • < h m — n będzie rosnącym ciągiem liczb całkowitych; taki ciąg będziemy nazywali „ciągiem głowicowym” o długości m i rozpiętości n, i wykorzystamy go do zdefiniowania metody sortowania pewnego szczególnego rodzaju. Sortowania rekordów R i . . . R n do konuje się w kilku przebiegach, z których każdy składa się z N + n —1 kroków. W kroku j , dla j = 1 - n, 2 - n, . . . , N - 1, badane są rekordy R j+h[1], R j+h[2\ , . . ., R j+h[m] i jeśli zachodzi taka potrzeba przestawia się je tak, żeby ich klucze były uporząd kowane. (O rekordach Rj+h[i] 5••*, Rj+h[m\ mówimy, że znajdują się pod „głowicami czytająco-piszącymi”. Gdy j + h[k] jest < 1 lub > iV, rekordu R j +h[k] nie rozważa się; w efekcie klucze Kq, A_ i , A _ 2, . . . są traktowane jak —oo, a Ajv+i, K n + 2 , • • • są traktowane jak + 00 . Dlatego krok j jest w rzeczywistości trywialny, gdy j ^ —h[m —1] lub j > N - h [ 2]). Dla przykładu w poniższej tabeli przedstawiono jeden przebieg sortowania dla m — 3, N = 9 i hi — 1, /12 = 2, /i3 = 4. K - 2 A - i Ko A i K 2 K 3 A 4 A 5 K q K 7 A 8 K 9 K 10 A u A 12 j j j j j j j j j j j j
= —3 — —2 = -1 = 0 = 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8
__ __
^ 1 4 5 9 2 6 8 __ 3 4 5 9 2 6 __ _ 3 _ 1 _ 4 ^ 5 9 2 6 J^_3_4_5^9 2 6 1 _ 3 ^ ^ 5 _ 9 ^ 2 6 1 3 _ 2 _ J ^ 9 _ 5 _ 6 1 3 2 _ £ _ 6 _ 5 _ 9 _ 1 3 2 4 _ 5 _ _ 6 _ 9 _ 8 1 3 2 4 5 J ^ ^ 8 _ 1 3 2 4 5 6 ^ _ ^ 1 3 2 4 5 6 7 _ 8 ^ 1 3 2 4 5 6 7 8 _
7 8 7 8 7 8 7 8 7 8 7 8 7 ^ 7 9 ^ 9 _ _ j ^ 9 _ _
__
Dla m = 2, hi = 1 i /12 = 2 opisana metoda wielogłowicowa redukuje się do sortowania bąbelkowego (algorytm 5.2.2B). 58. [21] (James Dugundji) Udowodnij, że jeśli dla pewnego /c, 1 ^ k < m, h[k + 1] = h[k] + 1, to algorytm wielogłowicowy zdefiniowany powyżej posortuje w końcu każdy plik wejściowy w skończonej liczbie przebiegów. Jednak jeśli h[k + 1] ^ h[k] + 2 dla 1 ^ k < m, to ciąg wejściowy może nigdy nie zostać posortowany. ►59. [30] (Armstrong i Nelson) Udowodnij, że jeśli h[k + 1] ^ h[k] + k dla 1 ^ k < m i N ^ n —1, t o n —1 największych elementów znajdzie się zawsze na swoich docelowych pozycjach po pierwszym przebiegu. [Wskazówka: Skorzystaj z zasady zero-jedynkowej; udowodnij, że podczas sortowania zer i jedynek, przy mniej niż n jedynkach nie jest możliwe, żeby wszystkie głowice czytały jedynki, zanim wszystkie zera nie znajdą się na lewo od głowic]. Udowodnij, że sortowanie zakończy się po co najwyżej \ ( N —1 )/( n — 1)] przebie gach, gdy głowice spełniają podane warunki. Czy istnieje plik wejściowy, który wymaga takiej liczby przebiegów? 60. [26] Udowodnij, że jeśli n ~ A, to można zagwarantować, że w pierwszym przebie gu najmniejszy klucz znajdzie się na pozycji R i wtedy i tylko wtedy, gdy h[fc+l] ^ 2h[k] dla 1 < k < m.
260
SORTOWANIE
5.3.4
61. [3Ą] (J. Hopcroft) „Doskonałym sorterem” dla N elementów nazywamy sorter wielogłowicowy z N = n, który zawsze sortuje w jednym przebiegu. W ćwiczeniu 59 dowodzimy, że ciąg {hi, h,2 , /u , • • •, h m) = (l, 2,4, 7 , . . . , 1 + (™)) definiuje doskonały sorter dla N = (™) -f 1 elementów z m — (\/8 N — 7 + l ) / 2 głowicami. Na przykład ciąg głowicowy (1,2,4, 7,11,16, 22} definiuje doskonały sorter dla 22 elementów. Udowodnij, że natomiast ciąg głowicowy (1,2,4, 7,11, 16,23) definiuje doskonały sorter dla 23 elementów. 62. [49] Zbadaj największe N , dla którego istnieją doskonałe m-sortery przy danym m. Czy N = 0 ( m 2)? 63. [23] (V. Pratt) Ile przebiegów jest koniecznych do posortowania ciągu z \ z 2• • .z2m-i zer i jedynek, gdzie Zj — 0 wtedy i tylko wtedy, gdy j jest potęgą 2, jeśli każda głowica hk znajduje się na pozycji 2h~ l dla 1 < k < m? 64. [24] (Sortowanie statyczne) W drzewie z rysunku 34 z punktu 5.3.1 porównanie 2:3 jest wykonywane na poziomie 1 w każdym rozgałęzieniu, natomiast na poziomie 2 porównanie 1:3 jest wykonywane w każdym rozgałęzieniu, chyba że jest ono redundantne. Uogólniając, można rozważyć klasę algorytmów, w których porównania są statyczne w powyższym znaczeniu; założywszy, że M — (^) par {(a, b) | 1 < a < b < N } zostało ustawionych w ciąg (o i, &i), (<1 2 , &2), ■■•, («M, bu),
możemy kolejno wykonywać każde z porównań K a i :K bl, K a i : K b2, . . . , których wyniki nie są jeszcze znane. Każde z M \ ustawień par (a, b) definiuje algorytm statycznego sortowania. Pojęcie sortowania statycznego pochodzi od H. L. Beusa [JACM 17 (1970), 482-495], którego praca zasugerowała kilka następnych ćwiczeń. Jest wygodnie zdefiniować formalnie sortowanie statyczne w języku teorii grafów. Niech G będzie grafem skierowanym o wierzchołkach { 1 , 2 , . . . , A7} nie mającym począt kowo żadnych krawędzi. Dla i = 1, 2 , . . . , M do G dodajemy krawędzie jak następuje: Przypadek 1. G zawiera ścieżkę od ai do bi. Do G dodajemy krawędź a* —* bi. Przypadek 2. G zawiera ścieżkę od bi do ai. Do G dodajemy krawędź bi —►a^. Przypadek 3. G nie zawiera ścieżki ani od ai do bi, ani od bi do ai. Porównujemy K ai 'Kbi] następnie do G dodajemy krawędź ai —*■6*, jeśli K ai < K bi, a krawędź bi -» a i, jeśli K ai > K bi. Głównie będzie nas interesowała liczba porównań kluczy wykonywanych w algorytmie sortowania statycznego, a nie sposób unikania wykonywania redundantnych porównań. Zatem grafu G nie trzeba budować w jawny sposób; wykorzystuje się go głównie jako pomoc w zdefiniowaniu pojęcia sortowania statycznego. Rozważymy także ograniczone sortowanie statyczne, w którym w przypadkach 1, 2 i 3 powyżej liczą się tylko ścieżki długości 2. (W algorytmie ograniczonego sortowa nia statycznego mogą być wykonywane pewne redundantne porównania, ale w takim przypadku analiza jest trochę prostsza, co pokazuje ćwiczenie 65). Udowodnij, że ograniczone sortowanie statyczne jest tym samym co sortowanie statyczne dla ciągu par danych w porządku leksykograficznym (1, 2) (1, 3) ( 1 , 4 ) . . . (1, N){ 2 , 3 ) ( 2 , 4 ) .. . (2 , N ) . . . ( N - 1, N). Pokaż, że w istocie oba algorytmy są równoważne sortowaniu szybkiemu (algorytm 5.2.2Q) dla różnych kluczy i po usunięciu z sortowania szybkiego redundantnych porów
5.3.4
SIECI SORTUJĄCE
261
nań w sposób opisany w ćwiczeniu 5.2.2-24. (Nie zwracaj uwagi na rzeczywistą kolejność wykonywania porównań w sortowaniu szybkim; rozważ tylko pary porównywanych kluczy). 65. [M38\ Dla danego ciągu par (a i , b i) ... (m ), jak w ćwiczeniu 64, niech d będzie liczbą par (j, k) takich, że j < k < i i (a;, bi), (a^, b^), (a^, bk) tworzą trójkąt. a) Udowodnij, że średnia liczba porównań wykonywanych w algorytmie ograniczonego sortowania statycznego wynosi YliLi V ( + 2)b) Wykorzystaj wynik z (a) i ćwiczenie 64 do wyznaczenia średniej liczby nieredundantnych porównań wykonywanych w algorytmie sortowania szybkiego. c) Następujący ciąg par został zainspirowany przez sortowanie przez scalanie (ale nie jest mu równoważny): (1, 2)(3,4)(5, 6 ) . . . (1, 3)(1,4)(2,3)(2,4)(5, 7 ) . . . (1, 5)(1,6)(1, 7)(1, 8)(2, 5 ) . . . Czy w metodzie statycznej z użyciem tego ciągu wykonywanych jest w średnim przypadku mniej, czy więcej porównań niż w sortowaniu szybkim? 66. [M29] W najgorszym przypadku w sortowaniu szybkim wykonywanych jest (^) porównań. Czy każdy algorytm ograniczonego sortowania statycznego (w znaczeniu z ćwiczenia 64) wykonuje w pesymistycznym przypadku (^) porównań? 67. [MĄ8] (H. L. Beus) Czy średnia liczba porównań w sortowaniu szybkim jest najmniejsza wśród wszystkich algorytmów (ograniczonego) sortowania statycznego? 68. [25] Praca doktorska „Electronic Data Sorting” napisana przez Howarda B. Demutha (Stanford University, October 1956) była być może pierwszą publikacją poru szającą szczegółowo pytania dotyczące złożoności obliczeniowej. Demuth rozważał kilka abstrakcyjnych modeli dla urządzeń sortujących i podał dolne i górne ograniczenia na oczekiwane i maksymalne czasy działania osiągane przez każdy z tych modeli. Przedmiotem tego ćwiczenia jest jego najprostszy model - „jednokierunkowa pamięć kołowa” (rysunek 61).
R y s. 61. Urządzenie, dla którego strategia sortowania bąbelkowego jest optymalna. Rozważmy urządzenie, które sortuje R \ R 2 . . . R n pewnej liczbie przebiegów, gdzie każdy przebieg składa się z następujących N + 1 kroków: w
Krok 1. R <— R \. ( R jest wewnętrznym rejestrem w tym urządzeniu). Krok i dla 1 < i ^ N. Albo (i) Ri~\ <— R, R <— Ri, albo (ii) R i - i zostaje zmienione. Krok N + 1. R n <— R>
Ri i R nie
262
SORTOWANIE
5.3.4
Zadanie polega na znalezieniu sposobu wyboru za każdym razem między przypadkami (i) i (ii) w celu zminimalizowania liczby przebiegów potrzebnych do posortowania ciągu wejściowego. Udowodnij, że technika „sortowania bąbelkowego” jest optymalna dla tego modelu. Innymi słowy pokaż, że strategia polegająca na wyborze przypadku (i), jeśli R ^ Ri, natomiast przypadku (ii), jeśli R > Ri, prowadzi do minimalnej liczby przebiegów.
Ci, którzy tkają sieci, będą potępieni. — Izajasz 1 9 : 9
5.4
SORTOWANIE ZEWNĘTRZNE
263
5.4. SORTOW ANIE ZEW N ĘTR ZN E
Nadszedł czas zapoznania się z interesującymi problemami, które pow stają, gdy liczba rekordów do posortowania jest większa niż nasz kom puter może zmie ście w swojej szybkiej pamięci wewnętrznej. Sortowanie zewnętrzne jest całkiem odmienne od sortowania wewnętrznego, nawet jeśli w obu przypadkach celem jest posortowanie danego pliku w porządku niemałejącym. Jest tak dlatego, że efektywny dostęp do danych w plikach zewnętrznych jest bardzo poważnie ogra niczony. Struktury danych muszą być zorganizowane w taki sposób, żeby stosun kowo wolne urządzenia pamięci zewnętrznych (taśmy, dyski, bębny itd.) mogły szybko radzić sobie z wymaganiami algorytmów sortowania. W konsekwencji, większość technik sortowania wewnętrznego, które poznaliśmy dotychczas (przez wstawianie, zamienianie, wybieranie), nie m a w rzeczywistości zastosowania do sortowania zewnętrznego i dlatego w tym przypadku problem sortowania wyma ga ponownego rozważenia. Przypuśćmy dla przykładu, że mamy posortować plik złożony z pięciu mi lionów rekordów # i #2 . . . #5000000 i że długość każdego rekordu R ą wynosi 20 słów (chociaż klucze K i nie muszą być koniecznie takiej długości). Co zrobimy, jeśli tylko milion takich rekordów zmieści się w pamięci wewnętrznej kom putera? Jedno z całkiem oczywistych rozwiązań polega na niezależnym posortowaniu pięciu podplików #1 . . . # 1000000? #1000001 • ■*# 2000000? • **? #4000001 *■*# 5000000? a następnie scaleniu razem wynikowych podplików. Szczęśliwie w procesie scala nia używa się tylko bardzo prostych struktur danych, mianowicie list liniowych, które są przetwarzane sekwencyjnie jak stosy lub jak kolejki; tak więc scalanie można wykonać bez żadnych trudności na najtańszych urządzeniach pamięci zewnętrznych. Opisany właśnie proces - sortowanie wewnętrzne, a następnie scalanie ze wnętrzne - jest powszechnie stosowany i większość naszych rozważań na tem at sortowania zewnętrznego poświęcimy różnym wariantom tego schematu. W literaturze na tem at sortowania uporządkowane rosnąco ciągi rekordów, otrzymywane w jednej fazie sortowania wewnętrznego, nazywa się często łańcu chami; ten term in jest szeroko rozpowszechniony, ale nieszczęśliwie jest w konflik cie ze swoim innym, nawet bardziej rozpowszechnionym zastosowaniem w innych działach informatyki, gdzie „łańcuchy” oznaczają dowolne ciągi symboli. Nasze rozważania na tem at perm utacji dały już doskonalą nazwę dla posortowanych fragmentów plików, które są zazwyczaj nazywane rosnącymi sekwensami lub po prostu sekwensami Dlatego będziemy konsekwentnie używać słowa „sekwensy” do opisu posortowanych fragmentów pliku. Rozważmy na początek proces sortowania zewnętrznego, w którym jako pamięci zewnętrznej używamy taśm magnetycznych. Być może najprostszym i najbardziej pociągającym sposobem scalania dwóch taśm jest zrównowdzone scalanie dwuwejściowe, oparte na pomyśle zastosowanym w algorytmach 5.2.4N, S oraz L. W tym procesie korzystamy z czterech „taśm roboczych” . Podczas pierwszej fazy, na taśm ach 1 i 2 są umieszczane na przem ian rosnące sekwensy otrzymywane w wyniku sortowania wewnętrznego, aż do wyczerpania danych wejściowych. Następnie taśmy 1 i 2 zostają przewinięte do początków i roz-
264
5.4
SORTOWANIE
poczyna się scalanie sekwensów z obu tych taśm, w wyniku czego dostajemy sekwensy dwukrotnie dłuższe; nowe sekwensy są zapisywane podczas ich tworze nia, na przem ian na taśm ach 3 i 4. (Jeśli na taśmie 1 znajduje się o jeden więcej sekwens niż na taśm ie 2 , przyjmujemy, że na taśmie 2 znajduje się dodatkowy „domyślny” sekwens o długości 0). Następnie wszystkie taśmy są przewijane, a zawartości taśm 3 i 4 zostają scalone w sekwensy cztery razy dłuższe, które są zapamiętywane na przem ian na taśm ach 1 i 2. Ten proces kontynuujemy, podw ajając za każdym razem długości sekwensów, aż pozostanie tylko jeden sekwens (mianowicie, całkowicie posortowany plik). Jeśli w wyniku sortowania wewnętrznego dostaliśmy S sekwensów i jeśli 2 k ~ 1 < S < 2^, to w opisanej właśnie procedurze zrównoważonego scalania dwuwejściowego wykonywanych jest dokładnie k = flg S] przebiegów scalania przez wszystkie dane. Na przykład w sytuacji wspomnianej wcześniej, gdy mamy posortować 5000000 rekordów i pojemność pamięci wewnętrznej wynosi 1000000, 5 = 5. W wyniku wykonania początkowej fazy rozrzucania pięć sekwensów zostaje rozmieszczonych na taśm ach w następujący sposób: Taśma Taśm a Taśma Taśma
1
R i .. . # 1000000; #2000001 • • • # 3000000;#4000001 • • *# 5000000*
2 3 4
#1000001 • • • # 2000000; #3000001 *• ■# 4000000*
,x
(pusta). (pusta).
W pierwszej fazie scalania na taśm ach 3 i 4 pojaw iają się dłuższe sekwensy, zgodnie z kolejnością odczytu z taśm 1 i 2 : Taśma 3
#1 .. . # 2000000; #4000001 ■• ■# 5000000*
Taśma 4
#2000001
/\
(2 )
• ■• # 4000000*
(Fikcyjny sekwens został niejawnie dodany na końcu taśmy 2 , tak że ostatni sekwens #4000001 • **#5000000 n& taśm ie 1 jest po prostu kopiowany na taśm ę 3). Po przewinięciu wszystkich taśm następny przebieg przez dane daje Taśma 1
# 1 . . . # 4000000*
Taśma 2
#4000001 *• • # 5000000*
^
(Ponownie sekwens #4000001 • • • #5000000 został po prostu skopiowany; jednak gdybyśmy rozpoczęli od 8000000 rekordów, taśm a 2 zawierałaby w tym mo mencie #4000001 • • • # 8000000)* Na koniec, po pewnym czasie spędzonym na prze wijaniu, na taśm ie 3 zostają wyprodukowane rekordy # 1 . . . #5000000 1 sortowanie jest zakończone. Scalanie zrównoważone można łatwo uogólnić na przypadek T taśm, dla każ dego T > 3. W tym celu należy wybrać dowolną liczbę P spełniającą 1 < P < T i rozdzielić T taśm na dwie „pule” , lewą zawierającą P taśm i prawą zawierającą T — P taśm . Następnie początkowe sekwensy należy rozrzucić jak najbardziej równomiernie na P taśm z lewej puli; po tym wykonujemy P -wejściowe scalanie z lewa na prawo, a potem (T — #)-wejściowe scalanie z prawa na lewo itd., aż sortowanie zostanie zakończone. Okazuje się, że zazwyczaj najlepszym wyborem na P jest [T /2] (zobacz ćwiczenia 3 i 4).
5.4
SORTOWANIE ZEWNĘTRZNE
265
Zrównoważone scalanie dwuwejściowe to szczególny przypadek, gdy T = 4, P = 2. Rozważmy jeszcze raz powyższy przykład przy wykorzystaniu większej ilości taśm, biorąc T = 6 i P = 3. Po początkowym rozrzuceniu dostajem y teraz Taśma 1 Taśma 2 Taśma 3
R \ . . . # 1000000; #3000001 • ■*#4000000 • #1000001 ■• *# 2000000; #4000001 **• # 5000000* #2000001 **• # 3000000*
(4 )
W wyniku pierwszego przebiegu scalania otrzymujemy Taśma 4
#1 . . . # 3000000*
Taśma 5 Taśma 6
#3000001
• ■• # 5000000*
(5 )
(pusta).
(Zakładamy, że na taśmie 3 znajduje się fikcyjny sekwens). Drugi przebieg scala nia kończy sortowanie, a rekordy #1 . . . #5000000 znajdą się na taśm ie 1. W tym szczególnym przypadku T — 6 daje w zasadzie to samo co T — 5, ponieważ szósta taśm a jest używana tylko, gdy S > 7. Scalanie trzy wejściowe wymaga więcej czasu procesora niż scalanie dwu wejściowe; jednak ten czas jest w ogólności pomijalny w porównaniu z kosztem odczytywania, zapisywania i przewijania taśm . Zatem zupełnie dobre oszaco wanie czasu wykonania otrzymamy, rozważając tylko ilość operacji taśmowych. W przykładzie z (4 ) i (5 ) są wymagane tylko dwa przebiegi przez dane, co możemy porównywać z trzem a przebiegami dla T = 4, tak więc dla T = 6 scalanie zajmuje dwie trzecie czasu scalania dla T = 4. Scalanie zrównoważone jest bardzo proste, jednak jeśli przyjrzymy się bliżej, natychmiast odkryjemy, że nie jest ono najlepsze dla tych szczególnych przy padków, o których mówiliśmy wyżej. Zamiast przejść od ( 1 ) do ( 2) i przewinąć wszystkie taśmy, powinniśmy zakończyć pierwszy przebieg scalania po tym , jak na taśmach 3 i 4 znajdą się odpowiednio # 1 . . . #2000000 i #2000001 • **# 4000000, z taśm ą 1 gotową do czytania rekordów #4000001 **• # 5000000- Wówczas mogliby śmy przewinąć taśmy 2, 3, 4 i zakończyć sortowanie, wykonując scalanie trzywejściowe na taśmie 2. Łączna liczba odczytów rekordów w takiej procedurze wynosiłaby tylko 4000000 + 5000000 = 9000000, w porównaniu z 5000000 + 5000000 + 5000000 = 15000000 odczytam i w scalaniu zrównoważonym. Dyspo nując odpowiednim komputerem, nie mielibyśmy kłopotów z przeprowadzeniem takich obliczeń! W rzeczywistości, w przypadku pięciu sekwensów i czterech taśm , możemy postąpić nawet lepiej, rozrzucając sekwensy w następujący sposób: Taśma 1
R i .. . # 1000000; #3000001 •• • # 4000000*
Taśma 2
#1000001 • • • # 2000000;#4000001
Taśm a 3
#2000001 • • • # 3000000-
Taśma 4
(p u sta ).
• • *# 5000000*
Następnie wykonujemy scalanie trzy wejściowe na taśmie 4, przewijamy taśm y 3 i 4 i kończymy, wykonując scalanie trzywejściowe na taśm ie 3. W całym sortowaniu dokonujemy tylko 3000000 + 5000000 = 8000000 odczytów rekordów.
266
SORTOWANIE
5.4
Oczywiście, gdybyśmy dysponowali sześcioma taśm am i, wówczas mogliby śmy umieścić wyjściowe sekwensy na taśm ach od 1 do 5 i zakończyć sortowa nie w jednym przebiegu, wykonując scalanie pięciowejściowe na taśmie 6 . Te rozważania pokazują, że proste scalanie zrównoważone nie jest najlepsze i jest interesującym zadaniem poszukanie lepszych schematów scalania. W kolejnych fragmentach tego podrozdziału zbadamy głębiej problem sor towania zewnętrznego. P unkt 5.4.1 poświęcimy fazie sortowania wewnętrznego, w której są tworzone wyjściowe sekwensy; szczególnie interesującą jest technika „wyboru z podm ianą” , w której do tworzenia długich wyjściowych sekwensów wykorzystuje się częściowe uporządkowanie większości danych. Długości tak po w stających sekwensów mogą być w rzeczywistości znacząco większe od pojem ności' pamięci wewnętrznej. W punkcie 5.4.1 omawiamy też struktury danych stosowane do scalania wielowejściowego. Najważniejsze schematy scalania są omawiane w punktach od 5.4.2 do 5.4.5. Przed przystąpieniem do rozważań nad rzeczywistymi napędam i taśmowymi i danymi do sortowania, jest wygodnie przyjąć uproszczoną koncepcję sortowania taśmowego. Dla przykładu możemy przyjąć miłe założenie (tak jak zrobiliśmy wcześniej), że podczas wstępnej fazy rozrzucania rekordy wejściowe pojaw iają się w magiczny sposób; w rzeczywistości takie rekordy wejściowe mogą wystę pować na jednej z naszych taśm , a nawet mogą zajmować wiele taśm, ponieważ taśm y nie są nieskończone! Najlepiej zrezygnować z takich przyziemnych rozwa żań, zanim nie zrozumiemy w pełni klasycznych schematów scalania. Wówczas w punkcie 5.4.6 sprowadzimy nasze dociekania na ziemię i omówimy rzeczywi ste uwarunkowania, które m ają istotny wpływ na wybór właściwego schematu. W punkcie 5.4.6 porównujemy podstawowe schematy sortowania z punktów od 5.4.2 do 5.4.5, rozważając kilka założeń, które pojaw iają się w praktyce. W punktach 5.4.7 i 5.4.8 omawiamy jeszcze inne podejścia do sortowania zewnętrznego, w których nie korzysta się ze scalania. Na koniec, w punkcie 5.4.9 uzupełniam y nasz przegląd sortowania zewnętrznego, rozpatrując ważny problem sortowania w pamięciach masowych takich jak dyski i bębny. W czasie, gdy powstawała ta książka, taśm y magnetyczne były w powszech nym użyciu, natom iast napędy dyskowe były drogie. W latach osiemdziesiątych dyski okazały się zdecydowanie lepsze i w drugiej połowie lat dziewięćdziesią tych prawie całkowicie w yparły jednostki taśmowe z większości systemów kom puterowych. Dlatego też kluczowa kwestia schematów scalania taśmowego ma ograniczone znaczenie dla aktualnych potrzeb. Nie zmienia to faktu, że wiele z omawianych schematów jest naprawdę pięknych, a przedstawione algorytmy są odzwierciedleniem najlepszych badań w informatyce przeprowadzonych w jej wczesnych latach; zastosowane techniki są zbyt piękne, żeby je wyrzucić na śmietnik historii. W rzeczywistości szczególnie pouczające jest łączenie w tych m etodach praktyki z teorią. Dlatego schematy scalania omawiamy poniżej starannie i w pełnym zakresie, co może się okazać ich ostatnią wielką prezentacją. W brew tem u, co się nam obecnie wydaje, te m etody mogą raz jeszcze okazać się niezastąpione.
— PAVEL CURTIS (1997)
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
267
ĆW ICZENIA 1. [15] W tekście proponujemy, żeby najpierw wykonać sortowanie wewnętrzne, a na stępnie scalanie zewnętrzne. Dlaczego nie pominąć fazy sortowania wewnętrznego, sca lając od samego początku rekordy w coraz dłuższe sekwensy? 2 . [10] Jaka będzie zawartość taśm, analogicznie do ( 1 ), ( 2 ) i ( 3 ), podczas sortowania przykładowych rekordów R \ R 2 . . . R $000000 za pomocą 3-taśmowej metody zrównowa żonej przy P — 2 ? Porównaj to do scalania 4-taśmowego; ile razy przebiegamy przez dane po wstępnym rozrzuceniu sekwensów? 3. [20] Pokaż, że zrównoważone scalanie (P, T —P)-wejściowe, zastosowane do S wyj ściowych sekwensów, zabiera 2k przebiegów, gdy P k (T — P ) k~ 1 < S ^ P k ( T — P )k; natomiast zabiera 2k l przebiegów, gdy P k ( T —P ) k < S ^ p fe+1(p —p ) fc. Podaj prosty wzór na (a) dokładną liczbę przebiegów jako funkcję 5 , gdy T — 2 P; (b) przybliżoną liczbę przebiegów, przy S —>0 0 , dla dowolnych P i T. 4. [PM15] Dla jakiego P , 1 ^ P < T, P (T —P ) jest maksymalne?
5.4.1. Scalanie wielowejściowe i wybór z podmianą
W punkcie 5.2.4 zajmowaliśmy się m etodam i sortowania wewnętrznego wyko rzystującymi scalanie dwuwejściowe, polegające na łączeniu dwóch uporządko wanych ciągów w jeden ciąg uporządkowany. Nietrudno jest uogólnić pojęcie scalania dwuwejściowego do pojęcia scalania P-wejściowego, polegającego na połączeniu P wejściowych sekwensów w jeden sekwens wyjściowy. Załóżmy, że danych jest P niemalejących sekwensów, tzn. ciągów rekordów, których klucze są uporządkowane niemalejąco. Oczywisty sposób ich scalenia polega na rozpatrzeniu pierwszych rekordów we wszystkich sekwensach i wybra niu rekordu z najmniejszym kluczem; taki rekord jest wyprowadzany na wyjście i usuwany z wejścia, a cały proces jest powtarzany. W każdej chwili musimy brać pod uwagę tylko P kluczy (po jednym z każdego sekwensu) i wybierać n aj mniejszy z nich. Jeśli dwa lub więcej kluczy m a taką sam ą najm niejszą wartość, wybieramy dowolny z nich. Gdy P nie jest zbyt duże, to takiego wyboru jest wygodnie dokonać, znaj dując najmniejszy wśród bieżących kluczy za pomocą P — 1 porównań. Jednak gdy P wynosi, powiedzmy 8 lub więcej, możemy oszczędzić pracy, korzystając z drzewa wyboru opisanego w punkcie 5.2.3; wówczas za każdym razem, po tym jak tylko drzewo zostanie zbudowane, jest wykonywanych około lg P porównań. Rozważmy na przykład przypadek scalania czterowejściowego z użyciem dwupoziomowego drzewa wyboru: 087 503 00 170 908 00 Krok 1 . 087 154 426 653 00 612 cx)
Krok 2. 154 V
154 426 653 oo 612 00
268
SORTOWANIE
Krok 3.
5.4.1
503 oo 170 908 oo
087 154 170
426 653 oo 612 oo
oo Krok 9.
087 154 170 426 503 612 653 908 oo 00
00 00
oo oo
Żeby scalanie kończyło się gładko, na końcu każdego sekwensu w powyższym przykładzie został umieszczony dodatkowy klucz „oo” . Ponieważ w sortowaniu zewnętrznym mamy zazwyczaj do czynienia z bardzo długimi sekwensami, do danie rekordów z kluczami oo nie wpływa zasadniczo na długość danych lub na ilość pracy potrzebnej do wykonania scalania, a tacy wartownicy często są wykorzystywani jako wygodny sposób rozgraniczania sekwensów w pliku. Każdy krok w tym procesie, z wyjątkiem pierwszego, polega na podmianie najmniejszego elementu przez kolejny element z jego sekwensu i zmianie odpo wiadającej mu ścieżki w drzewie wyboru. Tak więc trzy miejsca w drzewie, które zawierają 087 w kroku 1, zostają zmienione w kroku 2; trzy miejsca zawierające 154 w kroku 2 zostają zmienione w kroku 3; i tak dalej. Proces podmiany w drzewie wyboru jednego klucza przez inny nazywamy wyborem z podmianą. Na scalanie czterowejściowe możemy patrzeć na kilka sposobów. Z jednego punktu widzenia jest ono równoważne trzem dwuwejściowym scalaniom wykony wanym współbieżnie jako współprogramy; każdy węzeł w drzewie reprezentuje jeden z ciągów biorących udział w procesie współbieżnego scalania. Samo drzewo wyboru zachowuje się zaś jak kolejka priorytetowa pracująca zgodnie z zasadą „najmniejszy wchodzi, pierwszy wychodzi” . Podobnie jak w punkcie 5.2.3 taką kolejkę priorytetową moglibyśmy zaimple mentować za pom ocą kopca zamiast drzewa wyboru. (Kopiec byłby oczywiście zorganizowany w taki sposób, żeby na jego szczycie, zamiast elementu naj większego, znajdował się element najm niejszy. W tym celu wystarczy odwrócić porządek 5.2.3-(3)). Ponieważ kopiec nie m a stałego rozmiaru, zatem mogliby śmy uniknąć stosowania kluczy oo; scalanie byłoby uznawane za zakończone, gdy kopiec stawałby się pusty. Z drugiej strony, w zastosowaniach sortowania zewnętrznego mamy zazwyczaj do czynienia ze stosunkowo długimi rekordami i kluczami, tak więc w kopcu zam iast kluczy umieszcza się wskaźniki do tych kluczy; zobaczymy dalej, że drzewa wyboru można wygodnie reprezentować za pomocą wskaźników w taki sposób, że w tej sytuacji są one prawdopodobnie lepsze od kopców. D rz e w o p o k o n a n y c h . Na rysunku 62 przedstawiono zupełne drzewo binarne o 12 (prostokątnych) węzłach zewnętrznych i 11 (okrągłych) węzłach wewnętrz nych. Węzły zewnętrzne zawierają klucze, natom iast w węzłach wewnętrznych „znajdują się zwycięzcy” , jeśli to drzewo potraktujem y jako turniej, w którym
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
269
R ys. 62. Turniej, w którym wybierany jest najmniejszy klucz za pomocą zupełnego drzewa binarnego, którego węzły ponumerowano od 1 do 23.
jest wybierany najmniejszy klucz. Małe liczby nad poszczególnymi węzłami poka zują tradycyjny sposób alokacji kolejnych miejsc w pamięci dla węzłów zupełnych drzew binarnych. Gdy w drzewie wyboru z rysunku 62 należy zamienić najm niejszy klucz 061 przez inny klucz i wyznaczyć nowy stan drzewa, musimy obejrzeć tylko klucze 512, 087 i 154. Patrząc na drzewo jak na turniej, te trzy klucze odpow iadają pokonanym w meczach granych przez 061. To sugeruje, że zam iast zwycięzców w węzłach wewnętrznych powinniśmy w zasadzie pamiętać pokonanych; w takim przypadku informacja niezbędna do aktualizacji drzewa byłaby w oczywisty sposób osiągalna.
Rys. 63. Ten sam turniej co na rysunku 62, ale ukazujący pokonanych zamiast zwy cięzców; zwycięzca turnieju jest ukazany na samej górze.
270
5.4.1
SORTOWANIE
Na rysunku 63 przedstawiono takie samo drzewo jak na rysunku 62, ale z zapam iętanym i pokonanymi zamiast zwycięzców. Dodatkowo na samym wierz chołku drzewa został dodany węzeł o numerze 0 w celu wskazania zwycięzcy turnieju (m istrza). Każdy klucz, z wyjątkiem mistrza, jest pokonany tylko raz (zobacz punkt 5.3.3), a zatem każdy klucz występuje raz w węźle zewnętrznym i raz w węźle wewnętrznym. W praktyce węzły zewnętrzne z dołu drzewa z rysunku 63 będą repre zentowały dość długie rekordy przechowywane w pamięci komputera, a węzły wewnętrzne będą reprezentowały wskaźniki do tych rekordów. Zauważmy, że w scalaniu P-wejściowym wymaganych jest dokładnie P węzłów zewnętrznych i P węzłów wewnętrznych, każde na kolejnych pozycjach w pamięci, zatem kilka efektywnych m etod alokacji pamięci narzuca się samych. Nietrudno jest zoba czyć, w jaki sposób wykorzystać drzewa pokonanych w wyborze z podmianą; szczegóły omawiamy w dalszej części. G en erow an ie p o czą tk o w y ch sek w en sów przez w yb ór z p od m ian ą. Tech nikę wyboru z podm ianą można także zastosować w pierwszej fazie sortowania zewnętrznego, jeśli w istocie wykonamy P-wejściowe scalanie danych wejściowych na nich samych. W takim przypadku wybieramy tak duże P , żeby wykorzystać całą pamięć wewnętrzną. Rekord wyprowadzany na wyjście jest podmieniany przez następny rekord na wejściu. Jeśli nowy rekord ma klucz mniejszy od właśnie wyprowadzonego na wyjście, nie możemy go włączyć do aktualnie tworzonego sekwensu; jednak w przeciwnym razie taki rekord można wprowadzić do drzewa wyboru w zwykły sposób i będzie on częścią właśnie tworzonego sekwensu. Tak więc każdy sekwens może zawierać więcej niż P rekordów, nawet jeśli w każdym momencie liczba rekordów w drzewie wyboru nie przekracza P . W tabeli 1 zilustrowano ten proces dla P = 4; liczby w nawiasach oczekują na włączenie do następnego sekwensu. Tabela 1 PRZYKŁAD CZTEROWEJŚCIOWEGO WYBORU Z PODMIANĄ
Zawartość pamięci 503 503 503 503 (275) (275) (275) (275) (275) 275 275
087 087 170 897 897 897 897 (154) (154) 154 612
512 512 512 512 512 653 (426) (426) (426) 426 426
061 908 908 908 908 908 908 908 (509) 509 509 itd.
Wyjście 061 087 170 503 512 653 897 908 (koniec sekwensu) 154 275
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
271
Ta ważna m etoda tworzenia początkowych sekwensów została po raz pierw szy opisana przez Harold H. Sewarda [M aster’s Thesis, Digital Com puter Labo ratory Report R-232 (Mass. Inst, of Technology, 1954), 29-30], który dał dowody na to, żeby uwierzyć, że sekwensy będą zawierać więcej niż 1.5P rekordów, gdy wybór z podm ianą zastosujemy do danych losowych. Na ten sam pomysł wpadł także A. I. Dumey około roku 1950, w związku z planowaną budową specjalnego urządzenia sortującego przez firmę Engineering Research Associa tes, jednak nigdy swojego pomysłu nie opublikował. A utoren nazwy „wybór z podm ianą” (replacement selection) jest E. H. Friend [JACM 3 (1956), 154], który sformułował następującą uwagę: „oczekiwana długość tworzonych ciągów nie daje się zanalizować, ale eksperymenty wskazują, że 2P jest tą wartością” . Sprytny sposób pokazania, że 2P jest rzeczywiście oczekiwaną długością sekwensu został odkryty przez E. F. Moore, który przyrównał proces tworzenia sekwensów do zgarniania śniegu przez poruszający się po okręgu pług śnieżny [U.S. Patent 2983904 (1961), columns 3 -4 ]. Rozważmy sytuację przedstawioną na rysunku 64: P łatki śniegu padają równomiernie na kolistą drogę, którą nie przerwanie odśnieża pług śnieżny. Śnieg usunięty z drogi znika z systemu. Punkty na drodze są oznaczone liczbami rzeczywistymi x, 0 < x < 1 ; śnieg spadający w punkcie x reprezentuje rekord wejściowy z kluczem natom iast pług śnieżny reprezentuje wyjście dla algorytmu wyboru z podm ianą. Prędkość poruszania się pługu jest odwrotnie proporcjonalna do wysokości napotykanego śniegu, a sytu acja jest w pełni zrównoważona w znaczeniu, że w każdym momencie łączna ilość śniegu na drodze wynosi P . Nowy sekwens zostaje utworzony na wyjściu za każdym razem, gdy pług przejeżdża przez punkt 0. Intuicyjnie jest oczywiste, że po pewnym czasie system się stabilizuje tak, że pług porusza się ze stałą prędkością (z powodu symetrii drogi w postaci okręgu). To oznacza, że wysokość napotykanego przez pług śniegu jest stała i że wysokość śniegu przed pługiem maleje liniowo tak, jak to pokazano na rysunku 65. W ynika
272
SORTOWANIE
5.4.1 Padający śnieg
R y s. 65. Przekrój ukazujący zmieniającą się przed pługiem wysokość śniegu, gdy system znajduje się w stanie równowagi.
stąd, że objętość usuwanego w jednym obiegu śniegu (to jest długość sekwensu) jest dwukrotnie większa od objętości śniegu zalegającego w każdej chwili na drodze (to jest P ). W wielu komercyjnych zastosowaniach dane wejściowe nie są w pełni losowe; zawierają w sobie już pewną dozę uporządkowania. Dlatego sekwensy tworzone za pom ocą wyboru z podm ianą m ają skłonność do zawierania nawet więcej niż 2P rekordów. Przekonamy się, że czas wymagany na sortowanie zewnętrzne zależy głównie od liczby sekwensów wytworzonych we wstępnej fazie rozrzucania. Z tego powodu wybór z podm ianą szczególnie zasługuje na uwagę; inne rodzaje sortowania wewnętrznego dają około dwa razy mniej początkowych sekwensów, co jest spowodowane ograniczeniami na rozmiar pamięci wewnętrznej. Rozważmy teraz szczegółowo proces tworzenia początkowych sekwensów za pomocą wyboru z podm ianą. Następujący algorytm pochodzi od Johna R. W altersa, Jam esa P aintera i M artina Zalka, którzy wykorzystali go w programie sortowania przez scalanie dla maszyny Philco 2000, napisanym w 1958 roku. W tym programie, przy wykorzystaniu stosunkowo prostej i jednolitej organi zacji danych, w ładny sposób rozwiązano problemy inicjowania drzewa wyboru i rozróżniania rekordów należących do różnych sekwensów, jak i problem wypro wadzenia na wyjście ostatniego sekwensu. (Właściwe potraktowanie ostatniego sekwensu wytwarzanego przez wybór z podm ianą okazuje się być dość złożone i często jest trudne do pokonania dla programistów). Podstawowy pomysł polega na potraktow aniu każdego klucza jako pary ( 5 ,i i) , gdzie K jest oryginalnym kluczem, a S jest numerem sekwensu, do którego należy rekord o tym kluczu. Po uporządkowaniu takich rozszerzonych kluczy leksykograficznie, z S jako kluczem głównym i K jako kluczem wtórnym, otrzym am y ciąg wynikowy utworzony za pom ocą wyboru z podm ianą. Poniższy algorytm korzysta ze struktury danych złożonej z P węzłów repre zentujących drzewo wyboru; o j-ty m węźle X [ j ] zakłada się, że zawiera c słów o początkach w L0C(X[j]) = L 0 -b cj dla 0 < j < P i że reprezentuje zarówno węzeł wewnętrzny j , jak i węzeł zewnętrzny P + j z rysunku 63. W każdym węźle wyróżniamy kilka pól: KEY RECORD
LO SER
= klucz pam iętany w węźle zewnętrznym; = rekord pam iętany w węźle zewnętrznym (razem z tego pola);
KEY
jako elementem
= wskaźnik do „pokonanego” pam iętany w węźle wewnętrznym;
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
273
RN = n u m e r s e k w e n s u , d o k t ó r e g o n a l e ż y r e k o r d w s k a z y w a n y p r z e z L O SE R ; PE
= wskaźnik do węzła wewnętrznego w drzewie powyżej węzła zewnętrz nego;
PI
= wskaźnik do węzła wewnętrznego w drzewie powyżej węzła wewnętrz nego.
Na przykład dla P = 12 węzeł wewnętrzny o numerze 5 i węzeł zewnętrzny o numerze 17 z rysunku 63 będą reprezentowane w X[5] w polach K E Y — 170, L O SE R = Lq 4- 9c (adres węzła zewnętrznego o numerze 21), P E = Lq + 8c, P I = L 0 + 2c. Pola P E i P I m ają stałe wartości, tak więc nie muszą formalnie występować w pamięci; jednakże czasami w fazie inicjowania, żeby w pełni wykorzystać szybkość urządzeń wejścia/wyjścia, konieczne jest przechowywanie tych redundantnych wartości w pamięci, zamiast każdorazowo wyliczać je na nowo.
R y s. 66. Tworzenie początkowych sekwensów za pomocą wyboru z podmianą.
A lg o ry tm R ( Wybór z podmianą). W tym algorytmie rekordy są odczytywane z wejścia jeden po drugim i zapisywane na wyjście jeden po drugim, tworząc RMAX sekwensów o długościach co najmniej P (wyjątkiem jest ostatni sekwens). Mamy P > 2 węzłów, X[0],. . . , X [P — 1], o polach opisanych powyżej. R l . [Inicjowanie] RMAX <- 0, RC <- 0, LASTKEY oc, Q <- LOC(X[0]), RQ <- 0. (RC jest numerem właśnie tworzonego sekwensu, natom iast LASTKEY jest kluczem w ostatnio zapisanym rekordzie. Początkowa wartość LASTKEY po winna być większa od każdego możliwego klucza; zobacz ćwiczenie 8). Dla 0 < j < P polom X[j] nadajem y początkowe wartości jak następuje, gdzie J = L0C(X[j]): LOSER(J) PE(J)
J;
L0C (X [[(P + j ) / 2J]);
RN( J) *- 0; P I ( J ) ^ L0C(X[|_j/2j]).
(Nadanie takich początkowych wartości LOSER(J) i RN(J) odpowiada ini cjowaniu drzewa, przy założeniu istnienia nigdy nie wyprowadzonego na wyjście sekwensu o numerze 0. To jest sprytne; zobacz ćwiczenie 10).
274
SORTOWANIE
5.4.1
R 2.
.[Koniec sekwensu?] Jeśli RQ — R C , przejdź do kroku R3. (W przeciwnym razie RQ — R C + 1 i właśnie zakończyliśmy tworzenie sekwensu o numerze RC; w tym miejscu są wykonywane działania wymagane przez schemat scalania dla kolejnych przebiegów sortowania). Jeśli RQ > RMAX, przerwij; w przeciwnym razie wykonaj RC RQ.
R 3.
[Wyprowadzenie rekordu z wierzchołka drzewa] (Teraz Q wskazuje na „mi strza” , a RQ jest numerem sekwensu, do którego należy mistrz). Jeśli RQ ^ 0, wyprowadź R E C 0 R D (Q ) i wykonaj L A S T K E Y <— K E Y ( Q ) .
R 4.
[Wprowadzenie nowego rekordu] Jeśli plik wejściowy został wyczerpany, wykonaj RQ <— RMAX + 1 i przejdź do kroku R 5 . W przeciwnym razie weź za R E C 0 R D (Q ) następny rekord z pliku wejściowego. Jeśli K E Y (Q ) < L A S T K E Y (tak więc nowy rekord nie należy do właśnie tworzonego sekwensu), wykonaj RQ RQ -f 1 , a następnie, jeśli RQ > RMAX, wykonaj RMAX RQ.
R 5.
[Przygotowanie aktualizacji] (Teraz Q wskazuje nowy rekord, który należy do sekwensu o numerze R Q ). T P E ( Q ) . (T jest zmienną wskaźnikową, która będzie przesuwać się w górę drzewa).
R 6.
[Nowy pokonany] Jeśli R N ( T ) < RQ lub jeśli R N (T ) = RQ i K E Y ( L O S E R ( T ) ) < K E Y ( Q ) , zamień L O S E R ( T ) Q, R N (T ) «-► RQ. (W zmiennych Q i RQ są pam iętane aktualny zwycięzca i numer jego sekwensu).
R 7.
[Przejście w górę] Jeśli T = L0C(X[1]), to przejdź z powrotem do R2, w przeciwnym razie wykonaj T <— PI(T) i wróć do R 6 . |
W algorytmie R w jednym momencie jest wczytywany lub zapisywany tylko jeden rekord, podczas gdy w praktyce najlepiej czytać i zapisywać sporo większe bloki rekordów. Dlatego w rzeczywistości wejście i wyjście są buforowane, a to oznacza istotne zmniejszenie rozm iaru P . Zilustrujemy to w punkcie 5.4.6. * O p ó ź n io n a re k o n s tru k c ja sek w en só w . R. J. Dinsmore [CACM 8 (1965), 48] zaproponował bardzo interesujący sposób usprawnienia wyboru z podmianą, wprowadzając pojęcie stopni swobody. Jak widać, każdy blok rekordów z tego samego sekwensu jest uporządkowany niemalejąco, tak że jego pierwszy element jest najmniejszy, a jego ostatni element największy. W zwykłym procesie wyboru z podm ianą najm niejszy element z bloku zawartego w sekwensie nigdy nie jest mniejszy od największego elementu z bloku go poprzedzającego i należącego do tego samego sekwensu; to jest „1 stopień swobody” . Dinsmore zaproponował osłabienie tego warunku do „m stopni swobody” , gdy najmniejszy element w każ dym bloku może być mniejszy od największego elementu z bloku poprzedzającego tak długo, jak długo nie jest niniejszy od największych elementów z m różnych bloków z tego samego sekwensu, poprzedzających dany blok. Rekordy w poszcze gólnych blokach są, jak poprzednio, uporządkowane, ale sąsiednie bloki nie muszą znajdować się w dobrej kolejności. Dla przykładu przypuśćmy, że każdy blok składa się tylko z dwóch rekordów; następujący ciąg bloków tworzy sekwens z trzem a stopniam i swobody:
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
275
Kolejny blok, który miałby być składową tego samego sekwensu, musiałby zaczy nać się od elementu, który nie jest mniejszy od trzeciego największego elementu w {50,90,27,67,89}, to jest 67. Ciąg (i) nie mógłby tworzyć sekwensu, jeśli byłyby tylko dwa stopnie swobody, ponieważ 17 jest mniejsze zarówno od 50, jak i 90. Sekwens o m stopniach swobody może zostać „zrekonstruowany” podczas wczytywania w następnej fazie sortowania, tak więc we wszystkich praktycznych zastosowaniach jest to sekwens w zwykłym sensie. Rozpoczynamy od wczytania pierwszych m bloków do m buforów i wykonujemy na nich scalanie m-wejściowe; po wyczerpaniu jednego bufora zastępujemy go przez blok (m + 1 ) i tak dalej. W ten sposób można odzyskać cały sekwens jako pojedynczy ciąg, ponieważ pierwsze słowo z każdego nowo wczytanego bloku musi być większe lub równe od ostatniego słowa właśnie wyczerpanego bloku (właściwie będzie mniejsze od największych elementów z m różnych bloków, które go poprzedzają). Ta m eto da rekonstrukcji sekwensu jest w zasadzie podobna do scalania m-wejściowego z użyciem pojedynczej jednostki taśmowej dla wszystkich wejściowych bloków! Procedura rekonstrukcji zachowuje się jak współprogram, który dostarcza po jed nym rekordzie z sekwensu. Moglibyśmy rekonstruować różne sekwensy, z różnych jednostek taśmowych o różnych stopniach swobody, i scalać je wszystkie w tym samym czasie w zasadzie w ten sam sposób, w jaki scalanie czterowejściowe, przedstawione na początku tego punktu, może być rozumiane jako kilka scaleń dwuwejściowych wykonywanych jednocześnie. Ten niezwykły pomysł jest trudno precyzyjnie zanalizować, ale T. O. Espelid pokazał, w jaki sposób uogólnić analogię z pługiem śnieżnym, żeby podać przy bliżony wzór na zachowanie się opisanego algorytmu [BIT 16 (1976), 133-142], Zgodnie z podanym przez niego wzorem aproksymacyjnym, który dobrze zgadza się z wynikami eksperymentów, długość sekwensu będzie wynosiła około
gdzie b jest rozmiarem bloku i m > 2 . Taki przyrost nie może być w ystarczają cym usprawiedliwieniem dla dodatkowego skomplikowania algorytmu; z drugiej strony, może to znaleźć zastosowanie, gdy mamy miejsce dla dość dużej liczby buforów w drugiej fazie sortowania. * N a tu ra ln y w y b ó r. W. D. Frazer i C. K. Wong [CACM 15 (1972), 910-913] zbadali inny sposób zwiększania długości sekwensów tworzonych za pomocą wyboru z podmianą. Ich pomysł to postępowanie zgodne z algorytmem R, z wy jątkiem tego, że nowy rekord nie zostaje umieszczony w drzewie, jeśli jego klucz jest mniejszy od LASTKEY; zamiast tego jest on przesuwany do zewnętrznego zbiornika i wczytywany jest nowy rekord. Ten proces jest kontynuowany, aż zbior nik zostanie zapełniony pewną liczbą rekordów P ł\ wówczas końcówka właśnie tworzonego sekwensu jest usuwana z drzewa na wyjście, a zawartość zbiornika jest wykorzystywana jako wejście dla następnego sekwensu. Korzystanie ze zbiornika przyczynia się do powstawania dłuższych sekwen sów niż te, które pow stają za pomocą zwykłego wyboru z podm ianą. Dzieje
276
SORTOWANIE
5.4.1
się tak dlatego, że „martwe rekordy” przynależące do następnego sekwensu nie „zapychają” drzewa; wymaga to jednak dodatkowego czasu na obsługę zbiornika. Dla P f > P może się zdarzyć, że pewne rekordy zostaną umieszczone w zbiorniku dwukrotnie, ale gdy P f < P , taka sytuacja nigdy nie zajdzie. Frazer i Wong przeprowadzili wiele empirycznych testów swojej metody, zauważając, że gdy P jest umiarkowanie duże (powiedzmy P > 32) i P f = P , wówczas średnia długość sekwensu dla losowych danych wynosi w przybliżeniu eP , gdzie e w 2.718 jest podstaw ą logarytmu naturalnego. To zjawisko i fakt, że ta m etoda jest ewolucyjnym usprawnieniem prostego wyboru z podmianą, w naturalny sposób uprawniło autorów do nazwania swojej m etody naturalnym wyborem. „N aturalne” prawo dotyczące długości sekwensów można udowodnić, roz ważając jeszcze raz pług śnieżny z rysunku 64 i stosując elementarne metody analizy m atem atycznej. Niech L będzie długością odśnieżanej drogi i niech x(t) będzie pozycją pługu w chwili t dla 0 < t < T. Zakładamy, że zbiornik jest pełny w chwili T, kiedy to śnieg przestaje chwilowo padać, a pług powraca na swoją początkową pozycję (usuwając P jednostek śniegu zalegającego na drodze). Sytuacja jest taka sam a jak poprzednio, z wyjątkiem innego „warunku równowagi” ; zam iast P jednostek śniegu zalegającego w każdej chwili na drodze mamy P jednostek śniegu przed pługiem i zbiornik (za pługiem), który może pomieścić co najwyżej P ' = P jednostek. W przedziale czasu dt pług przesuwa się do przodu o dx, jeśli wyprowadzonych zostaje h ( x , t ) d x rekordów, gdzie h(x,t) jest wysokością śniegu w chwili t w punkcie x = x(t), mierzoną w stosownych jednostkach; stąd h(x, t) = h(x, 0) + K t dla wszystkich x, gdzie K jest szybkością opadu śniegu. Ponieważ liczba rekordów w pamięci jest stała, h( x, t ) dx jest także liczbą rekordów, które są wprowadzane przed pługiem, to jest K dt ( L —x) (zobacz rysunek 67). Zatem dx K ( L — x) = . (2 ) dt h(x, t) Szczęśliwie okazuje się, że h ( x 1 t) jest stale równe KT , jeśli tylko x = x(t) i 0 < t < T. Jest tak dlatego, że śnieg pada równomiernie w punkcie x(t) przez T —t jednostek czasu, po przejściu pługu przez ten punkt, plus t jednostek czasu, zanim pług dotrze do tego punktu ponownie. Innymi słowy, po osiągnięciu stanu równowagi, w którym każdy przejazd pługu jest taki sam, pług na swojej drodze widzi cały czas śnieg o takiej samej wysokości. Tak więc ogólna ilość usuniętego
R y s. 67. Tyle samo śniegu przybywa, ile się go usuwa; pług przesuwa się o dx w czasie dt.
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
277
śniegu (długość sekwensu) wynosi L K T ; a ilość śniegu w pamięci jest ilością śniegu usuwanego po czasie T, czyli K T ( L —x(T)}. Rozwiązaniem ( 2) takim , że x ( 0) = 0 jest x(t) = L{ 1 - e~t / T); ( 3) stąd P — L K T e ~ l — (długość sekwensu)/e; czyli to, co chcieliśmy udowodnić. W ćwiczeniach od 21 do 23 pokazujemy, że powyższą analizę m ożna roz szerzyć na przypadek dowolnego P '; na przykład dla P f — 2P średnia długość sekwensu okazuje się być równa ee(e — 0 ) P , gdzie 6 — (e — y/e 2 —4 ) / 2 . Jest to wynik, którego prawdopodobnie nie dałoby się wymyślić od ręki! W tabeli 2 pokazano, w jaki sposób długość sekwensu zależy od rozm iaru zbiornika; uży teczność naturalnego wyboru dla danej maszyny można ocenić, posiłkując się tą tabelą. Wartości w tabeli dla rozmiarów zbiornika < P odpow iadają ulepszonej technice omawianej w ćwiczeniu 27. Pomysły opóźnionej rekonstrukcji sekwensu i naturalnego w yboru można połączyć, co pokazali T. C. Ting i Y. W. Wang w Comp. J. 20 (1977), 298-301. Tabela 2 DŁUGOŚCI SEKWENSÓW OTRZYMYWANYCH PRZEZ WYBÓR NATURALNY
Rozm. zbiór.
Dług. sekw.
k+6
Rozm. zbiór.
Dług. sekw.
k+e
0.10000P 0.50000P 1.00000P 2.00000P 3.00000P 4.00000P 5.00000P 10.00000P
2.15780P 2.54658P 2.71828P 3.53487P 4.16220P 4.69446P 5.16369P 7.00877P
0.32071 0.69952 1.00000 1.43867 1.74773 2.01212 2.24938 3.17122
0.00000P 0.43428P 1.30432P 1.95014P 2.72294P 4.63853P 21.72222P 5.29143P
2.00000P 2.50000P 3.00000P 3.50000P 4.00000P 5.00000P 10.00000P 5.29143P
0.00000
0.65348 1.15881 1.42106 1.66862 2.16714 4.66667 2.31329
Wielkość k + 9 jest zdefiniowana w ćwiczeniu 22, jak i (dla k — 0) w ćwiczeniu 27.
* A n a liz a w y b o ru z p o d m ia n ą . Wróćmy teraz do przypadku wyboru z podm ia ną bez dodatkowego zbiornika. Analogia z pługiem śnieżnym daje zupełnie dobre oszacowanie średniej długości sekwensów otrzymywanych za pomocą wyboru z podm ianą po osiągnięciu stanu równowagi. K orzystając jednak z faktów na tem at sekwensów w perm utacjach, o których mowa w punkcie 5.1.3, można otrzymać bardziej precyzyjne informacje o algorytmie R. W tym celu wygodnie jest założyć, że plik wejściowy jest dowolnie długim ciągiem liczb rzeczywistych, losowo wybieranych z przedziału między 0 a 1 . Niech g p ( z i , z 2 , . . . , z k) =
ap(Zi,/ 2, . . . , Z fe)z[l 4 2 - - - 4 fc UJ 2 Jfc^O
będzie funkcją tworzącą dla długości sekwensów otrzymywanych za pomo cą P -wejściowego wyboru z podm ianą zastosowanego do takiego pliku, gdzie a p ( h j 2 , - - - J k ) jest prawdopodobieństwem, że pierwszy sekwens m a długość
278
5.4.1
SORTOWANIE
¿i, drugi m a długość l2, a k-ty ma długość /&. Następujące „twierdzenie 0 niezależności” jest kluczowe, ponieważ sprowadza analizę do przypadku P — 1: T w ie rd z e n ie K . gP (zu ¿ 2, • . z k) = g i ( z u z2, .. . , z k)p . Dowód. Niech wejściowymi kluczami będą X i, X 2, X $ , .. . . Algorytm R dzieli je na P podciągów w zależności od przynależności do węzła zewnętrznego w drze wie; podciąg zawierający X n jest wyznaczany przez wartości X i , . . . , X n- \ . Dla tego każdy z tych podciągów jest niezależnym ciągiem liczb losowych wybiera nych niezależnie z przedziału między 0 a 1 . Ponadto, wynik zastosowania wyboru z podm ianą jest dokładnie taki sam jak wynik wykonania scalania P-wejściowego na tych podciągach; dany element należy do ¿-tego sekwensu w podciągu wtedy 1 ty lk o w te d y , g d y w yb o ru
n a le ż y o n d o ¿ - te g o se k w e n su o tr z y m y w a n e g o
z p o d m ia n ą
( p o n ie w a ż w
k r o k u 4 , L A S T K E Y i K E Y (Q )
za pom ocą
n a le ż ą d o te g o
sa m e g o p o d c ią g u ) .
Innymi słowy, możemy równie dobrze założyć, że algorytm R działa na P nie zależnych losowych plikach wejściowych, a w kroku R4 jest wczytywany następny rekord z pliku odpowiadającego węzłowi zewnętrznemu Q; w tym sensie algorytm jest równoważny scalaniu P-wejściowemu ze „schodkami w dół” oznaczającymi końce sekwensów. Zatem na wyjściu pojaw iają się sekwensy o długościach (Zi,.. . , l k) wtedy i tylko wtedy, gdy podciągi zawierają sekwensy o poszczególnych długościach ( Zn, . . . , , (Zpi, • • •, Zpfc), gdzie kj są nieujemnymi liczbami całkowitymi, dla których zachodzi hj = h dla 1 < ¿ < h. W ynika stąd, że ap(Zi , . . . J k ) ~
^2 hi H
Mpi = h
hfcH
1- l p k = l k
a i(Znj • ■• , h k ) .. .oi (Zpi , .. . ,/pfc),
a to jest równoważne tezie twierdzenia.
|
W punkcie 5.1.3 omawialiśmy średnią długość L k dla k-tego sekwensu, gdy P — 1, a stosowne wartości zostały podane w tabeli 5.1.3-2. Z twierdzenia K wynika, że średnia długość fc-tego sekwensu dla dowolnego P wynosi P razy średnia długość dla P = 1 , czyli L kP ; wariancja jest także P razy większa, tak więc odchylenie standardowe dla długości sekwensu jest proporcjonalne do y/P. Te wyniki zostały po raz pierwszy otrzym ane przez B. J. Gassnera około 1958 roku. Tak więc pierwszy sekwens wytwarzany przez algorytm R będzie zawierał, w przypadku losowych danych, około (e —1 ) P « 1.718P rekordów; drugi sekwens będzie zawierał około (e 2 — 2e)P « 1.952P rekordów; trzeci - około 1.996P; liczba rekordów w kolejnych sekwensach będzie bardzo bliska 2P , poza dwoma ostatnim i sekwensami (zobacz ćwiczenie 14). Odchylenie standardowe dla więk szości długości tych sekwensów wynosi w przybliżeniu —10)P ~ 0.934\/P [CACM 6 (1963), 685-687]. Ponadto, w ćwiczeniu 5.1.3-10 pokazujemy, że łączna długość pierwszych k sekwensów jest dość bliska (2A; — | ) P , z odchylę-
5.4.1
SCALANIE WIELOW EJŚCIOWE I WYBÓR Z PODMIANĄ
279
niem standardowym ((ffc + § ) P ) 1//2. W ćwiczeniach 5.1.3-9 i 11 wyprowadzamy funkcje tworzące gi(z, z , .. . ,z) i g i ( l , . . . , 1 , 2 ). W powyższej analizie założyliśmy, że plik wejściowy jest nieskończenie dłu gi, jednak dowód twierdzenia K pokazuje, że takie samo prawdopodobieństwo ap(l 1 , . . . , Zfc) dostaniemy dla każdego losowego ciągu wejściowego zawierającego co najmniej l\ Ą b h + P elementów. Tak więc, m ając na uwadze małe odchy lenie standardowe, powyższe wyniki m ają zastosowanie do plików o rozmiarze, powiedzmy N > (2k + 1)P. Przekonamy się, iż w pewnych zastosowaniach schemat scalania wymaga, żeby pewne sekwensy były rosnące, natom iast inne malejące. Ponieważ po sfor mowaniu rosnącego sekwensu liczby pozostające w pamięci są średnio trochę mniejsze niż liczby losowe, zmiana kierunku uporządkowania powoduje zmniej szenie się długości sekwensów. Rozważmy dla przykładu pług, który odśnieża prosty odcinek drogi i zawraca za każdym razem, gdy osiągnie którykolwiek z końców; pług będzie pokonywał bardzo szybko właśnie odśnieżony kawałek drogi. Długości sekwensów o kierunkach zmieniających się na przeciwne w ahają się dla losowych danych między 1.5P a 2P (zobacz ćwiczenie 24). ĆW ICZENIA 1. [10] Jak wygląda krok 4 w przykładzie scalania czterowejściowego z początku tego punktu? 2. [12] Jakie zmiany zaszły by w drzewie z rysunku 63 po zastąpieniu klucza 061 przez klucz 612? 3. [16] (E. F. Moore) Co będzie wynikiem działania czterowyjściowego wyboru z pod mianą zastosowanego do kolejnych słów z następującego zdania w języku angielskim: fo u rsc o re and seven y e a rs ago our f a th e r s bro u g h t f o r t h on t h i s c o n tin e n t a new n a tio n conceived in l i b e r t y and d e d ic a te d to th e p ro p o s itio n t h a t a l l men a re c re a te d e q u a l. (Zastosuj zwykły porządek alfabetyczny, traktując każde słowo jak pojedynczy klucz).
4. [16] Zastosuj czterowejściowy naturalny wybór do zdania z ćwiczenia 3, wykorzy stując zbiornik o pojemności 4. 5. [00] Prawda czy fałsz: wybór z podmianą za pomocą drzewa ma zastosowanie tylko wtedy, kiedy P jest potęgą 2 lub sumą dwóch potęg 2. 6. [15]W algorytmie R wymaga się, żeby P było ^ 2; jakie stosunkowo małe zmiany należałoby wprowadzić, żeby działał on poprawnie dla wszystkich P ^ 1? 7.
[17]Jak zachowuje się algorytm R, gdy wejście jest puste?
8. [20]W algorytmie R korzysta się ze sztucznego klucza „00 ”, który musi być większy od każdego innego, możliwego klucza. Pokaż, że algorytm mógłby zachować się niepoprawnie, jeśli rzeczywisty klucz byłby równy 00 , i wyjaśnij, w jaki sposób należy zmodyfikować algorytm w przypadku, gdy zaimplementowanie prawdziwej wartości 00 jest niewygodne. ► 9. [23] W jaki sposób dokonałbyś modyfikacji algorytmu R, żeby pewne, określone sekwensy (zależnie od RC) wyprowadzał w porządku rosnącym, a pozostałe w porządku malejącym?
280
5.4.1
SORTOWANIE
10. [26] Początkowe ustawienie wskaźników LOSER w kroku R1 zazwyczaj nie od powiada jakiemukolwiek rzeczywistemu turniejowi, ponieważ węzeł zewnętrzny P + j może nie leżeć w poddrzewie poniżej węzła j . Wyjaśnij, dlaczego algorytm R mi mo wszystko działa. [Wskazówka: Czy algorytm ten zadziałałby, jeśli w kroku R1 {LOSER (L0C( X [ 0 ] ) ) , . . . , LOSER(L0C(X[P — 1]))} zostałyby zainicjowane elementami dowolnej permutacji {L0C(X[0]),. . . , L0C(X[P — 1])}?]. 11. [M25 ] Prawda czy fałsz: prawdopodobieństwo, że w kroku R4 mamy KEY(Q) < LASTKEY, przy założeniu losowych danych, wynosi
12.
[MĄ6] Przeprowadź szczegółową analizę liczby wykonań poszczególnych fragmen tów algorytmu R; na przykład, jak często są wykonywane zamiany w kroku R6? 13. [13] Dlaczego drugi z sekwensów wytwarzanych za pomocą wyboru z podmianą jest zazwyczaj dłuższy od pierwszego? ►14. [HM25] Skorzystaj z analogii z pługiem śnieżnym do oszacowania średniej długości dwóch ostatnich sekwensów otrzymywanych za pomocą wyboru z podmianą zastoso wanego do długiego ciągu danych wejściowych. 15. [20] Prawda czy fałsz: ostatni sekwens otrzymywany za pomocą wyboru z pod mianą nigdy nie zawiera więcej niż P rekordów. Przeprowadź dyskusję na temat swojej odpowiedzi. 16. [M26] Znajdź „prosty” warunek konieczny i wystarczający na to, żeby plik R i R 2 . . . R n został całkowicie posortowany w jednym przebiegu P-wejściowego wyboru z podmianą. Podaj prawdopodobieństwo tego zdarzenia jako funkcję P i N, przy założeniu, że na wejściu dana jest losowa permutacja zbioru ( 1 , 2 , . . . , N} . 17. [20] Jaki jest wynik działania algorytmu R, gdy klucze wejściowe pojawiają się w porządku malejącym, K \ ^ K 2 ^ P"n? ►18. [22] Co stanie się, gdy algorytm R uruchomimy ponownie dla pliku wyjściowego utworzonego przez algorytm R? 19. [HM22] Wykorzystaj analogię z pługiem do dowodu, że pierwszy sekwens wytwo rzony za pomocą wyboru z podmianą zawiera w przybliżeniu (e — 1)P rekordów.
20.
[HM24] Ile wynosi w przybliżeniu długość pierwszego sekwensu otrzymywanego
za pomocą naturalnego wyboru, gdy P = P'?
21.
► [HM23] Określ przybliżoną długość sekwensów otrzymywanych za pomocą natu ralnego wyboru, gdy P ' < P.
22. [HMĄO] Celem tego ćwiczenia jest wyznaczenie średniej długości sekwensu otrzy mywanego za pomocą naturalnego wyboru, gdy P f > P. Niech k — k 4- 0 będzie liczbą rzeczywistą ^ 1, gdzie k = |_KJ 1 ® = K m°d 1; rozważmy funkcję F ( k ) = Fk{6), gdzie Fk (9) jest wielomianem zdefiniowanym przez funkcję tworzącą J 2 F k (6)zk = e - ez/ ( l - z e 1- z ).
k^O Tak więc Fo(0) = 1, Fi (9) — e —9, F2(9) = e2 — e — eO + | 0 2 itd. Załóżmy, że pług startuje w chwili 0 i symuluje proces naturalnego wyboru. Załóż my też, że po T jednostkach czasu za pługiem spadł śnieg o objętości P. Wówczas po tej samej drodze zaczyna się poruszać drugi pług, osiągając w chwili t + T pozycję, na której pierwszy pług znajdował się w chwili t. Po k T jednostkach czasu za pierwszym pługiem spadł śnieg o objętości równej dokładnie P'; w tym momencie pług zgarnia momentalnie resztę śniegu z drogi i znika.
5.4.1
SCALANIE W IELOW EJŚCIOW E I WYBÓR Z PODMIANĄ
281
Wykorzystując ten model do reprezentacji procesu naturalnego wyboru, wykaż, że gdy
P '/P = k + l + ee ( kF(k) - ^ \
j
F{k ~ j ) j ,
=o
/
to dostaniemy sekwens o długości e9F ( k ) P . 23. [HM35] W poprzednim ćwiczeniu analizowaliśmy naturalny wybór przy założeniu, że rekordy ze zbiornika są zawsze wczytywane w tej samej kolejności, w jakiej były zapisywane, to jest „pierwszy na wejściu, pierwszy na wyjściu” . Wyznacz przybliżoną długość sekwensu przy założeniu, że rekordy ze zbiornika przynależne do poprzedniego sekwensu są wczytywane w zupełnie losowym porządku, tak jakby między sekwensami rekordy w zbiorniku zostały kompletnie pomieszane. 24. [HM39] Celem tego ćwiczenia jest zanalizowanie wyniku działania wyboru z pod mianą, jeśli zaryzykujemy zmianę kierunków uporządkowania sekwensów. a) Niech g p ( z ^, Z2 , ■• ■, Zk) będzie funkcją tworzącą zdefiniowaną w twierdzeniu K, ale z uwzględnieniem dla każdego z k sekwensów, czy jest on uporządkowany rosnąco, czy malejąco. Na przykład moglibyśmy powiedzieć, że wszystkie sekwensy o nu merach nieparzystych są rosnące, a wszystkie o numerach parzystych są malejące. Pokaż, że twierdzenie K jest prawdziwe dla każdej z 2k funkcji tworzących tego typu. b) Na podstawie (a) możemy założyć, że P = 1 . Możemy także założyć, że na wejściu dany jest ciąg liczb między 0 a 1 , wylosowanych niezależnie z rozkładem jednostajnym. Niech a( x, y) = ,
el ~x — ev~x , jeśli x ^ y\ ,_x e1 -x , jeśli x > y.
Wiedząc, że f ( x ) dx jest prawdopodobieństwem, że pewien rosnący sekwens za czyna się od x, udowodnij, że (/J a(x, y ) f ( x ) dx) dy jest prawdopodobieństwem zdarzenia, że następny sekwens rozpoczyna się od y. [ Wskazówka: Dla każdego n ^ 0, rozważ prawdopodobieństwo, że x ^ X\ ^ ^ X n > y , gdy x i y są dane]. c) Rozważmy sekwensy, które zmieniają swój kierunek z prawdopodobieństwem p ; innymi słowy, kierunek każdego sekwensu, poza pierwszym, jest z prawdopodobień stwem q = (1 —p) taki sam, jak kierunek sekwensu go poprzedzającego, natomiast przeciwny - z prawdopodobieństwem p. (Tak więc, gdy p = 0, wszystkie sekwensy mają ten sam kierunek; gdy p = 1 , sekwensy mają na przemian różne kierunki; a jeśli p = ~, kierunki sekwensów są niezależne losowo). Niech / i ( x ) = l,
f n+1( y ) = p
Jo
a{x,y)fn{ l- x ) d x - \~ q /
Jo
a ( x , y ) f n (x)d x.
Pokaż, że prawdopodobieństwo tego, że n-ty sekwens zaczyna się od x wynosi f n (x) d x , gdy sekwens (n — l)-szy jest rosnący, a / n(l —x) d x , gdy sekwens (n — l)-szy jest malejący. d) Znajdź rozwiązanie ze względu na / układu równań f(y) = P
Jo
a (x i y ) f { 1 - x ) d x + q /
a(x, y ) f { x ) d x ,
Jo
[Wskazówka: Pokaż, że f ,f(x) nie zależy od x\.
/
Jo
f ( x ) dx = 1.
282
5.4.1
SORTOWANIE
e) Pokaż, że ciąg f n(x) z punktu (c) zbiega dość szybko do funkcji f(x) z punktu (d). f) Pokaż, że średnia długość rosnącego sekwensu rozpoczynającego się od x wyno si e l ~x. g) Na koniec połącz wszystkie wyniki razem i udowodnij następujące twierdzenie: Jeśli w algorytmie wyboru z podmianą kierunki kolejnych sekwensów są niezależnie przeciwne z prawdopodobieństwem p, to średnia długość sekwensu zbliża się do (6 /(3 + p))P . (Twierdzenie to w przypadku p = 1 zostało po raz pierwszy otrzymane przez Knutha [CACM 6 (1963), 685-688]; przypadek p — \ pierwszy udowodnił A. G. Konheim w 1970 roku). 25. [HMĄO] Rozważmy następujący algorytm: N I . Wczytaj jeden rekord do jednosłowowego „zbiornika”. Następnie wczytaj na stępny rekord R i niech K będzie jego kluczem. N 2 . Podaj na wyjście rekord ze zbiornika i opróżnij zbiornik, w LASTKEY zapamię taj klucz z tego rekordu. N 3 . Jeśli K < LASTKEY, to podaj na wyjście R i wykonaj LASTKEY przejdź do N5.
K, a następnie
N 4 . Jeśli zbiornik jest niepusty, wróć do N2; w przeciwnym razie wprowadź R do zbiornika. N 5 . Wczytaj nowy rekord R i niech K będzie jego kluczem. Przejdź do N3.
|
Ten algorytm jest w zasadzie równoważny naturalnemu wyborowi dla P — 1 i P f — 1 lub 2 (zależnie od tego, czy chcemy opróżniać zbiornik w momencie zapełnienia, czy w momencie przepełnienia), z wyjątkiem tego, że tworzone są sekwensy malejące, a działanie algorytmu nigdy się nie kończy. Te ostatnie anomalie są wygodnymi i nie szkodliwymi założeniami, wykorzystywanymi w tym zadaniu. Postępując tak jak w ćwiczeniu 24, niech f n(x,y) dydx będzie prawdopodobień stwem tego, że x i y są odpowiednio wartościami LASTKEY i Kzaraz po n-tym wykonaniu kroku N2. Udowodnij, że istnieje funkcja jednej zmiennej gn(x) taka, że f n(%,y) = gn (x),
gdy
x
<
y,
a
f n (x ,y ) = gn (x)
-
jest definiowana za pomocą zależności rx
9 n+i(x)
px
e~v (g„(x) g\
g„(y)),
gdy
x
>
y.
Funkcja
gn (x)
(x) = 1, n\
= / eugn( u)du+ / dv(v + 1 ) / du ((ev - l)g„(u) + g„(v)) Jo Jo Jv + x
j J X
dv
i
du((ev -
l ) g „ ( u ) + gn (v)).
j V
W dalszym ciągu pokaż, że oczekiwana długość n-tego sekwensu wynosi f
Jo
dx
f
Jo
dy (gn ( x ) ( e y -
1) + g n ( y ) ) ( 2 -
\ y 2) +
í
d x (1 -
x)gn(x)ex .
Jo
[ Uwaga: Znalezienie rozwiązania tego układu równań okazuje się bardzo skomplikowane; J. McKenna rozwiązał go numerycznie i pokazał, że długości sekwensów zbliżają się do wartości granicznej « 2.61307209. Twierdzenie K nie ma zastosowania do naturalnego wyboru, tak więc przypadek P — 1 nie przenosi się na inne P\.
5.4.1
SCALANIE WIELO WE J ŚCIO W E I WYBÓR Z PODMIANĄ
283
26. [M33] Przyjmując algorytm z ćwiczenia 25 za algorytm naturalnego wyboru, gdy P f = 1, znajdź oczekiwaną długość pierwszego sekwensu, gdy P ' = r, dla dowolnego r ^ 0. W tym celu wykonaj co następuje. a) Pokaż, że długość pierwszego sekwensu wynosi n z prawdopodobieństwem
(n-fr)
'n -f r '
n^r n
^ ( n + r + l)!.
b) Zdefiniujmy „stowarzyszone liczby Stirlinga” [[^]] jak następuje:
_mj
m
= ( n + m —1)
"71—1"
_.
m
..
+
i i— \ }
n
i i .....
■0
. _m — 1. .
dla n > 0.
Udowodnij, że
r r i - fc=o t (:::)[[:]] c) Udowodnij, że średnia długość pierwszego sekwensu wynosi zatem cre —r —1, gdzie
= £
o
r r + k+ 1 .A:. (r + A;)!
►27. [i2M<20] (W. Dobosiewicz) Podczas stosowania naturalnego wyboru z P f < P, nie musimy kończyć tworzenia sekwensu, gdy zbiornik staje się pełny; rekordy, które nie należą do aktualnie tworzonego sekwensu, możemy przechowywać w głównej kolejce priorytetowej jak w wyborze z podmianą, aż pozostanie tylko P r rekordów z właśnie formowanego sekwensu. Wówczas możemy wyprowadzić je wszystkie na wyjście i wpro wadzić w ich miejsce rekordy ze zbiornika. O ile ta metoda jest lepsza od prostszego podejścia analizowanego w ćwiczeniu 21? 28. [25] W głównym tekście rozważaliśmy tylko przypadek, w którym wszystkie sorto wane rekordy są stałego rozmiaru. W jaki sposób można sensownie wykorzystać wybór z podmianą w przypadku rekordów zmiennej długości? 29. [22] Rozważmy 2k węzłów w zupełnym drzewie binarnym, które zostało prawo stronnie „sfastrygowane”, jak zilustrowano dla k = 3:
(Porównaj z 2.3.1-(io); węzeł na samym szczycie jest głową listy, a linie kropkowane reprezentują dowiązania „fastrygi”. W tym ćwiczeniu nie interesuje nas sortowanie, ale raczej struktura zupełnych drzew binarnych z dodanym węzłem 0 (głową listy) powyżej węzła 1, jak w drzewie pokonanych z rysunku 63). Pokaż, w jaki sposób przypisać 2n+fc węzłów wewnętrznych z pewnego, dużego drzewa pokonanych do 2k węzłów-gospodarzy naszego drzewa, żeby (i) każdy węzeł-gospodarz miał przypisanych dokładnie 2n węzłów z dużego drzewa; (ii) sąsiednie węzły w dużym drzewie zostały przypisane do tego samego gospodarza lub do dwóch sąsied nich (powiązanych ze sobą) węzłów-gospodarzy; (iii) żadne dwie pary węzłów sąsiednich w dużym drzewie nie były rozdzielone tym samym dowiązaniem w drzewie-gospodarzu.
284
SORTOWANIE
5.4.1
[W ten sposób wiele wirtualnych procesorów z dużej sieci o architekturze drzewa bi narnego można by odwzorować na rzeczywiste procesory, bez nadmiernego obciążania łączy komunikacyjnych]. 30. [M29] Udowodnij, iż jeśli n ^ k ^ 1, to konstrukcja z poprzedniego ćwiczenia jest optymalna w znaczeniu, że każdy 2fe-węzłowy graf-gospodarz spełniający (i), (ii) i (iii) musi posiadać co najmniej 2k + 2k~ 1 — 1 krawędzi (łączy) między węzłami.
*5.4.2. Scalanie wielofazowe
Teraz, gdy już wiemy, w jaki sposób utworzyć wstępne sekwensy, rozważymy kilka m etod rozrzucania sekwensów na taśm y i scalania ich, aż pozostanie tylko jeden sekwens. Na początek załóżmy, że dysponujemy trzem a jednostkami taśmowymi T l, T2 i T3. W takim przypadku możemy skorzystać z techniki „scalania zrównowa żonego” opisanej na początku podrozdziału 5.4. Dla P = 2 i T = 3 otrzymujemy wówczas następujący algorytm: B I . Rozrzuć wstępne sekwensy na przemian na taśmy T l i T2. B 2 . Scal sekwensy z T l i T 2 na T3; jeśli T3 zawiera tylko jeden sekwens, zakończ wykonywanie algorytmu. B 3 . Skopiuj sekwensy z T3 na przemian na T l i T2, a następnie wróć do B 2.
|
Jeśli na początku rozrzucamy 5 sekwensów, to po pierwszym przebiegu na T3 znajdzie się \S/2] sekwensów, po drugim przebiegu dostaniemy [5/4] sekwensów itd. Tak więc jeśli, powiedzmy, 17 < 5 < 32, to będziemy mieli 1 przebieg rozrzucania, 5 przebiegów scalania i 4 przebiegi kopiowania. W ogólności, jeśli 5 > 1 , liczba przebiegów przez wszystkie dane wynosi 2 [lg 5 ]. W takim postępowaniu przebiegi kopiowania są niepożądane, ponieważ w wyniku ich działania liczba sekwensów nie zmniejsza się. Połowy kopiowania można uniknąć, jeśli zastosujemy algorytm dwufazowy: A l . Rozrzuć wstępne sekwensy na przem ian na taśmy T l i T2. A 2. Scal sekwensy z T l i T2 na T3; jeśli T3 zawiera tylko jeden sekwens, zakończ wykonywanie algorytmu. A 3. Skopiuj połowę sekwensów z T3 na T l. A 4. Scal sekwensy z T l i T3 na T 2 ; jeśli T 2 zawiera tylko jeden sekwens, zakończ wykonywanie algorytmu. A 5 . Skopiuj połowę sekwensów z T2 na T l. Wróć do A 2 .
|
Ponieważ teraz w każdym z kroków A3 i A5 jest wykonywana tylko „połowa przebiegu” , liczba wszystkich przebiegów przez dane spada do § [lg 5] + \ ; w ten sposób oszczędzamy na czasie około 25 procent. W rzeczywistości kopiowanie można całkowicie wyeliminować, jeśli rozpocz niemy od Fn sekwensów na T l i F n_ i sekwensów na T2, gdzie Fn i Fn^ i są kolejnymi liczbami Fibonacciego. Rozważmy dla przykładu przypadek, gdy n — 7, 5 = F n + F n_! = 13 + 8 - 21:
5.4.2
SCALANIE WIELOFAZOWE
Faza 1 2 3 4 5 6 7
Zawartość T l
Zawartość T2 Zawartość T3
1,1,1,1,1,1,1,1,1,1,14)1 1 ) 1 4 4 4 4 4 4 1,1,1,1,1 3,3,3,3,3 5,5,5 3,3 5 13 21 -
2,2,2,2,2,2,2,2 2,2,2 8,8 8 -
285
Uwagi Wstępny podział Scal 8 sekwensów na Scal 5 sekwensów na Scal 3 sekwensy na Scal 2 sekwensy na Scal 1 sekwens na Scal 1 sekwens na
T3 T2 Tl T3 T2 Tl
Tutaj ciąg „2,2,2,2,2,2,2,2” na przykład oznacza osiem sekwensów o względnych długościach równych 2 , jeśli przyjmiemy, że względne długości wstępnych se kwensów wynoszą 1. W tej tabeli liczby Fibonacciego są wszechobecne! Tylko fazy 1 i 7 są pełnymi przebiegami przez dane; w fazie 2 jest przetwarza nych tylko 16/21 wstępnych sekwensów, w fazie 3 tylko 15/21 itd., zatem łączna liczba „przebiegów” dochodzi do (21 + 1 6 + 1 5 + 1 5 + 1 6 + 1 3 + 21)/21 = 5 |, jeśli przyjmiemy, że długości wstępnych sekwensów są w przybliżeniu takie same. Dla porównania, algorytm dwufazowy potrzebuje 8 przebiegów, żeby posortować 21 wstępnych sekwensów. Przekonamy się, że w ogólności „metoda Fibonacciego” potrzebuje w przybliżeniu 1.04 lg S + 0.99 przebiegów, co czyni ją konkurencyj ną dla zrównoważonego scalania czierotaśmowego, chociaż sam a wymaga tylko trzech taśm. Ten sam pomysł można uogólnić na T taśm , dla każdego T > 3, przez zasto sowanie scalania (T — l)-wejściowego. Przekonamy się, że na przykład w przy padku czterech taśm wykonywanych jest tylko około 0.703 lg S + 0.96 przebiegów przez dane. W tej nowej metodzie wykorzystuje się uogólnione liczby Fibonac ciego. Rozważmy następujący przykład z sześcioma taśmami: Faza
1 2 3 4 5 6 7
Tl i 31 i 15 r i 3
i1 -
1291
T2 l 30 l 14 l6 l2 _
651 —
T3
T4
j^ 2 8
,2 4
l 12 l4 -
332 331 —
l8 -
174 172 171 _
T5 i 16 -
98 94 92 91 —
T6 —
5 16 58 54 52 51 —
Przetworzone wstępne sekwensy
31
+
30
+
28
+
16 16 x 5 8x9= 4 x 17 = 2 x 33 = 1 x 65 = 1 x 129 =
24
+
= -
129 80 72 68 66 65 129
Tutaj l 31 oznacza 31 sekwensów o względnych długościach równych 1 itd.; scale nia są pięciowejściowe. Ten uogólniony schemat został zaproponowany przez R. L. Gilstada [Proc. Eastern Joint Computer Conf. 18 (1960), 143-148], który na zwał go scalaniem wielofazowym. Przypadek z trzem a taśm am i został wcześniej odkryty przez B. K. Betza [nieopublikowana notatka, Minneapolis-Honeywell Regulator Co. (1956)]. Żeby scalanie wielofazowe można było wykonywać w taki sposób jak w po wyższym przykładzie, jest wymagane, aby rozkład sekwensów na taśm ach po każdej fazie był „doskonałym rozkładem Fibonacciego” . Patrząc na powyższą tabelę od dołu widzimy, że dla T = 6 pierwszymi siedmioma doskonałymi rozkładami Fibonacciego są {1,0,0,0,0}, {1,1,1,1,1}, { 2 , 2 , 2 , 2 , 1 }, {4, 4, 4, 3 , 2 },
286
5.4.2
SORTOWANIE
{8, 8 , 7, 6 ,4}, {16,15,14,12,8} oraz {31,30,28,24,16}. Podstawowe pytania, przed którym i stajemy, to: 1. Jaka zasada rządzi doskonałymi rozkładam i Fibonacciego? 2 . Co należy zrobić, jeśli S nie odpowiada doskonałemu rozkładowi Fibonac ciego? 3. W jaki sposób zaprojektować wstępne rozrzucanie sekwensów, żeby na ta śmach otrzym ać żądaną konfigurację? 4. Ile „przebiegów” przez dane jest wykonywanych w T-taśmowym scalaniu wielofazowym? Odpowiedź należy wyrazić jako funkcję S (liczby wstępnych sekwensów). Rozważymy te cztery pytania po kolei, udzielając najpierw „łatwych odpowie dzi” , a następnie dokonując bardziej pogłębionej analizy. Doskonałe rozkłady Fibonacciego można otrzymać, wykonując wstecz algo rytm scalania i wykonując cykliczne rotacje zawartości taśm. Na przykład dla T = 6 mamy następujące rozkłady sekwensów: Poziom
Tl
T2
T3
T4
T5
Łącznie
Ostateczny wynik znajdzie się na
0 1 2 3 4 5 6 7 8
1 1 2 4 8 16 31 61 120
0 1 2 4 8 15 30 59 116
0 1 2 4 7 14 28 55 108
0 1 2 3 6 12 24 47 92
0 1 1 2 4 8 16 31 61
1 5 9 17 33 65 129 253 497
Tl T6 T5 T4 T3 T2 Tl T6 T5
n n+ 1
dn
bn
Cn
dn
Cn
tn
T(fc)
dn
t n 4- 4an
T (k - 1)
dn + bn
dn
4" Cn
dn
4“ d n
dn
4“ Cn
(Po wstępnym rozrzuceniu taśm a T 6 będzie zawsze pusta)Z zasady rządzącej przejściem z poziomu n na poziom n -h i wynika, że na każdym poziomie jest spełniony warunek On ^ bn ^
dn ^ Cn .
( 2)
W rzeczywistości m ożna zauważyć na podstawie ( 1 ), że en = dn—i , dn = Q*n—1 4“ ^n —1—On—1 4“ ^n —2i Cn
—
b ji =
&n —l
4”
d n _ i= & n—\
0*71 — 2
4“
Q "n — 1
4“
C n — 1 = O n — 1 - |- CLn —2
4"
(ln — d n —\
+
4“
= d n —1 -j- Un—2 4“
O n —3)
3
“h U n _
3 4“
(3 )
4,
4 4“ Un_5,
gdzie a 0 = 1 i gdzie przyjmujemy a n — 0 dla n = —1 , - 2 , - 3 , - 4 .
5.4.2
SCALANIE WIELOFAZOWE
287
Liczby Fibonacciego rzędu p F,[p> definiuje się jak następuje: K iP) = F ™ 1 + F l% + • • • + F {n % dla n > p F
for 0 < n < p — 2;
F¿p\
= 1.
Innymi słowy, rozpoczynamy od p — 1 zer, a następnie jedynki. K ażda następna liczba jest sumą p liczb ją poprzedzających. Dla p = 2 jest to zwykły ciąg Fibonacciego. Dla większych wartości p powyższy ciąg był najprawdopodobniej po raz pierwszy badany przez V. Schlegela w El Progreso M atem ático 4 (1894), 173-174. Schlegel podał funkcję tworzącą 1
*yP 1
VP
V F ^ z n = _______ - ___________ = _— ___ — __ 1 - z - z 2 ------ zP
Z-í n
1 - 2 0 + zP + 1 '
10
Ostatnie równanie w (3 ) pokazuje, że w sześciotaśmowym scalaniu wielofazowym liczba sekwensów na taśmie T l jest liczbą Fibonacciego rzędu 5: an — 4. W ogólności, jeśli weźmiemy P = T — 1 , rozkład sekwensów na T taśm ach w scalaniu wielofazowym odpowiada w taki sam sposób liczbom Fibonacciego rzędu P . W rozkładzie doskonałym z n-tego poziomu na fc-tej taśm ie znajdzie się _L___ L
_L
r nĄ-P- 2 ^ r n + P - 3
^
^ r n+k- 2
wstępnych sekwensów dla 1 < k < P . Tak więc ogólna liczba sekwensów na wszystkich taśm ach wynosi tn =
P
f
£>p _2 + (P
-
1)
f
£
]p _ 3 + • • • +
(6 )
To rozwiązuje kwestię „doskonałych rozkładów Fibonacciego” . Co powinni śmy jednak zrobić, jeśli, dla żadnego n, S nie jest równe dokładnie t n? W jaki sposób rozmieścić na początku wstępne sekwensy na taśm ach? Gdy S nie jest doskonałe (a zazwyczaj nie jest), możemy postąpić do kładnie tak samo jak w przypadku zrównoważonego scalania P-wejściowego: dodać sztuczne „domyślne sekwensy” i przyjąć, że S jest doskonałe. Istnieje kilka sposobów dodania domyślnych sekwensów i w tym miejscu nie jesteśm y jeszcze w stanie przeprowadzić analizy wyboru „najlepszego” z nich. Omówimy najpierw pewną metodę rozrzucania wstępnych sekwensów i rozmieszczenia domyślnych sekwensów. Chociaż ta m etoda nie jest w pełni optymalna, to charakteryzuje się prostotą i okazuje się lepszą od innych, równie prostych metod. A lg o ry tm D (Sortowanie metodą scalania wielofazowego z rozrzucaniem „po ziom ym ”). W tym algorytmie wstępne sekwensy rozdziela się pojedynczo na poszczególne taśmy, aż do wyczerpania ich źródła. Następnie jest ustalany sposób scalania sekwensów, przy założeniu, że dysponujemy T = P + 1 > 3 jednostka mi taśmowymi, a scalanie jest P-wejściowe. Możemy założyć, że dane wejścio we znajdują się na taśmie T, ponieważ nie umieszcza się na niej żadnego ze wstępnych sekwensów. W trakcie wykonywania algorytmu wykorzystywane są następujące tablice:
288
SORTOWANIE
5.4.2
A Cj] , 1 < j < T: Doskonały rozkład Fibonacciego, który staram y się uzy skać. D[ j ] , 1 < j < T: Liczba domyślnych sekwensów, o których zakłada się, że znajdują się na początku logicznej jednostki taśmowej o nu merze j. TAPEtj], 1 < j < T : Numer fizycznej jednostki taśmowej odpowiadającej jedno stce logicznej o numerze j . (W ygodnie jest operować na „logicznych jednostkach taśmowych” , których przy pisanie do fizycznych jednostek taśmowych zmienia się podczas wykonywania algorytmu.)
R ys. 68 . Sortowanie metodą scalania wielofazowego. D l . [Inicjowanie] W ykonaj A[j] <— D[j] — 1 i TAPE[/c] <— j dla 1 < j < T. W ykonaj A[T] <— D[T] 0 i TAPE[T] T . Następnie wykonaj Z <— 1, 3 L D 2 . [Zapis na taśm ę j\ Zapisz jeden sekwens na taśmę o numerze j i zmniejsz D[ j] o 1. Jeśli dane wejściowe zostały wyczerpane, przewiń wszystkie taśmy i przejdź do kroku D5. D 3 . [Kolejne j] Jeśli D[J] < D[j + 1 ], zwiększ j o l i wróć do D 2 . W przeciw nym przypadku, jeśli D[j] = 0, to przejdź do kroku D4. W przeciwnym przypadku wykonaj j <— 1 i wróć do D 2 . D 4 . [Jeden poziom w górę] W ykonaj l l -j- 1, a A [1], a następnie dla j = 1, 2, . . . , P (w tej kolejności) wykonaj D[j] <— a + A[j + 1] —A[j] i A [j ] - o,+ A[j -F 1]. (Przyjrzyj się (i) i zauważ, że A[P + 1] jest zawsze równe zero. W tym miejscu będziemy mieli D[1] > D[2] > ••• > D[T]). Teraz wykonaj j <— 1 i wróć do D2. D 5 . [Scalanie] Jeśli l = 0, sortowanie jest zakończone, a posortowany plik znajduje się na TAPE [1]. W przeciwnym razie scalaj sekwensy z TAPE [1] , . . . , TAPE [P ] na TAPE [T] aż do m omentu, w którym TAPE [P ] jest pusta i D[P ] = 0. Proces
SCALANIE WIELOFAZOWE
5.4.2
289
scalania należy przeprowadzić następująco. Jeśli dla każdego j , 1 < j < P , D[j] > 0, to zwiększ D[T] o 1 i zmniejsz każde D[J] o 1 dla 1 < j < P ; w przeciwnym razie scal po jednym sekwensie z każdej taśm y TAPE [ j ] takiej, że D [j] — 0 i zmniejsz D [j] o 1 dla każdego z pozostałych j . (W ten sposób wyobrażamy sobie, że domyślne sekwensy znajdują się na początku taśmy, a nie na końcu). D 6. [Jeden poziom w dół] Z <— Z — 1. Przewiń TAPELP] i TAPE[T]. (W rze czywistości przewijanie TAPEfP] mogłoby się rozpocząć w kroku D5, zaraz po wczytaniu ostatniego bloku z tej taśm y). Następnie wykonaj kolejno (TAPE [1] , TAPE [ 2 ] , . . . , TAPE [ T ] ) <- (TAPE [T] , TAPE [ 1 ] , . . . , TAPE [T - 1 ] ), (D [1] , D [2] , . . . , D [ T ] ) <—(D [T] , D [ 1 ] , . . . , D [T — 1]) i wróć do kroku D5. | Zasada podziału sekwensów wyrażona tak wyraźnie w kroku D3 tego algo rytm u jest pomyślana w taki sposób, żeby wyrównać liczby domyślnych sekwen sów na wszystkich taśmach, najlepiej jak to jest tylko możliwe. Na rysunku 69 pokazano sposób podziału sekwensów przy przejściu z poziomu 4 (33 sekwensy) na poziom 5 (65 sekwensów) w sortowaniu na sześciu taśmach; jeśli mielibyśmy tylko, powiedzmy, 53 wstępnych sekwensów, wszystkie sekwensy o numerach 54 i wyższych byłyby traktowane jako domyślne. (Sekwensy są w rzeczywistości dopisywane na końcu taśmy, ale najlepiej wyobrazić sobie, że są one dopisywane na początku, ponieważ o domyślnych sekwensach zakłada się, że są na początku). IIJSM ...ip ----
Ili
1111
■i 34 35 38 42 46 51 56 61
R y s. 69. Rozmieszczenie sekwensów od 34 do 65 na taśmach przy przejściu z poziomu 4 na poziom 5. (Zo bacz tabelę doskonałych rozkładów (i)). Obszary zacieniowane reprezentują rozkład pierwszych 33 sekwen sów po osiągnięciu poziomu 4. Dolny wiersz odpowiada początkom taśm.
Ti
¡1111
¡¡11 ¡111
Ili ¡¡¡¡I llll !|||I BI ¡¡¡¡I lii! 36 39 43 47 52 57 62 T2
37 40 44 48 53 58 63 T3
41 45 49 54 59 64 T4
50 55 60 65 T5
W łaśnie udzieliliśmy odpowiedzi na trzy pierwsze pytania z wymienionych powyżej i pozostaje rozważyć liczbę „przebiegów” przez dane. Porównując nasz przykład dla sześciu taśm z tabelą (i), widzimy, że dla S = te wstępne sekwensy są przetwarzane łącznie a$t\ + a 4^2 + <23^3 -1- d 2 t± + 0Lit§ + £^¿6 razy, wyłączając z tego wstępną fazę rozrzucania. W ćwiczeniu 4 wyprowadzamy funkcje tworzące a (z) = “ / ■.
anz11
0
Y- ,
t{z) = ^ t nz 1
= 1-----------~ ~z l — z — z*T — n
=
5z + 4 z 2 + 3z 3 +
_
_
_
_
2z 4 + _
Z5
(7)
290
SORTOWANIE
5.4.2
W ynika stąd, że w ogólnym przypadku dla S = t n wstępne sekwensy są prze twarzane tyle razy, ile wynosi współczynnik przy z n w a(z)t(z), plus t n (dla początkowego przebiegu rozrzucania). Dzięki tem u można pokazać, jak asymp totycznie zachowuje się scalanie wielofazowe (ćwiczenia od 5 do 7). W wyniku dostajem y następującą tabelę: Tabela 1
Taśmy 3 4 5 6 7 8 9 10 20
ASYMPTOTYCZNE ZACHOWANIE SIĘ SORTOWANIA PRZEZ SCALANIE WIELOFAZOWE Współczynnik Przebieg Fazy Przebiegi /faza wzrostu
2.078 ln 5 + 0.672 1.641 ln 5 + 0.364 1.524 ln 5 + 0.078 1.479 ln S —0.185 1.460 InS' —0.424 1.451 ln 5 - 0.642 1.447I n S - 0.838 1.445 ln 5 - 1.017 1.443I n S - 2.170
1.504 ln S + 0.992 1.015 ln 5 + 0.965 0.863 InS + 0.921 0.795 ln S + 0.864 0.762 ln 5 + 0.797 0.744 ln S + 0.723 0.734 ln 5 + 0.646 0.728 ln 5 + 0.568 0.721 ln 5 — 0.030
72% 62% 57% 54% 52% 51% 51% 50% 50%
1.6180340 1.8392868 1.9275620 1.9659482 1.9835828 1.9919642 1.9960312 1.9980295 1.9999981
T= 3
Io3 u w O) 1
T = 4 T= 5
IfeO 0) 3CD
T —6 T= 8
T = 10
ISI
a 03 XN * o
10
20
50
100
200
500
1000 2000
5000
Początkowe sekwensy, S
R y s. 70. Efektywność scalania wielofazowego za pomocą algorytmu D.
5.4.2
SCALANIE WIELOFAZOWE
291
„Współczynnik wzrostu” w tej tabeli jest równy limn^oo t n+ i / t n , czyli przy bliżonemu czynnikowi, o jaki rośnie liczba sekwensów na każdym poziomie. W ko lumnie „przebiegi” podano, ile razy średnio jest przetwarzany każdy wstępny sekwens, czyli 1 /5 z łącznej liczby przetworzeń wstępnych sekwensów w fazach rozrzucania i scalania. Podane liczby przebiegów i faz są poprawne dla rozkładów doskonałych przy S —►oo, z dokładnością do 0 ( 5 ~ €), dla pewnego € > 0. Na rysunku 70 pokazano ile razy średnio, w zależności od 5 , scalany jest każ dy rekord, gdy zastosujemy algorytm D do przypadku niedoskonałego rozkładu. Zauważmy, że dla trzech taśm pojaw iają się „szpice” względnej nieefektywności, tuż po wykonaniu doskonałego rozrzucania, ale to zjawisko zanika dla większej liczby taśm. Użycie ośmiu lub większej liczby taśm daje tylko nieznacznie lepsze wyniki w stosunku do sześciu lub siedmiu taśm . G łę b s z a a n a liz a . W całym algorytmie sortowania za pom ocą scalania zrówno ważonego, wymagającego k przebiegów, każdy rekord jest przetwarzany dokład nie k razy. Tak jednak nie jest w algorytmie wielofazowym. Pewne rekordy mogą być przetwarzane znacznie częściej niż inne. To zjawisko można wykorzystać do przyspieszenia algorytmu, rozmieszczając domyślne sekwensy w miejscach najczęściej przetwarzanych. Zbadajmy zatem dokładniej rozkład sekwensów w scalaniu wielofazowym. Zamiast patrzeć tylko na liczbę sekwensów na każdej taśmie jak w (i), przypisz my każdemu sekwensowi liczbę scaleń, czyli liczbę mówiącą o tym, ile razy taki sekwens będzie przetwarzany podczas całego sortowania wielofazowego. W ten sposób w miejsce (i) dostajem y następującą tabelę: Poziom 0 1 2 3 4 5 n n+ 1
Tl
T2
T3
T4
T5
0 1 1 1 1 1 21 21 21 2 21 3221 3221 3221 322 32 43323221 433232 43323221 4332322 4332 5443433243323221 544343324332322 54434332433232 544343324332 54434332 —
(.A n + l ) £ n
Bn ( An + 1) C n
Cn (An + l)L*n
_
Dn (An + 1) E n
—
En An + 1
Tutaj A n jest słowem zbudowanym z an wartości reprezentujących liczby scaleń dla wszystkich sekwensów z T l, jeśli zaczynamy od rozkładu z poziomu n; B n jest takim słowem dla T 2 itd. n(A n + l ) B nn oznacza słowo „A n z każdą wartością powiększoną o 1 , zakończone słowem B n” . Na rysunku 71(a) przedstawiono słowa A 5, £ 5 , C 5 , £>5 , E 5 zapisane od dołu, ukazujące liczby scaleń sekwensów na taśmach. Zauważmy dla przykładu, że sekwensy na początku każdej taśm y są przetwarzane pięć razy, podczas gdy sekwens na końcu T l będzie przetwarzany tylko raz. Na rysunku 71 (b) przed stawiono optymalny sposób rozrzucenia sekwensów w scalaniu wielofazowym z pięcioma poziomami, polegający na umieszczaniu każdego nowego sekwensu na wolnej pozycji o najmniejszej dostępnej liczbie scaleń. Algorytm D nie jest
292
SORTOWANIE
5.4.2
1
Początek taśmy (a)
2 4 16 7 19 23 42 11 27 32 46 37 51 56 61 (b)
3 5 17 8 20 24 43 12 28 33 47 38 52 57 62
6 18 9 21 25 44 13 29 34 48 39 53 58 63
10 22 26 45 14 30 35 49 40 54 59 64
15 31 36 50 41 55 60 65
R ys. 71. Analiza pięciopoziomowego rozkładu wielofazowego dla sześciu taśm: (a) licz by scaleń, (b) optymalny rozkład. tak dobry (zobacz rysunek 69), ponieważ zapełnia pewne pozycje o liczbie scaleń 4, zanim wykorzysta wszystkie pozycje o liczbie scaleń 3. Zależności rekurencyjne (8) pokazują, że B n , C n, D n i E n są początkowy mi podsłowami A n. W rzeczywistości możemy wykorzystać (8) do otrzym ania zależności E n — (An—i ) + 1 , D n — ( A n - i A n - 2 ) + 1) C n = ( ^ 71—1^ 71—2 ^ 71—3 ) + 1? E n
—
( A n — \ A n — 2 A n —? > A n ^ A )
(9 )
4“ 1,
A n — (An—\An—2An—^An—ĄLA n—'^) H- 1,
uogólniających (3), w których braliśmy pod uwagę tylko długości tych słów. Po nadto, ze wzoru definiującego słowa A wynika, że zasadniczo taka sama struktura pojawia się na początku każdego poziomu; mamy A n — Tl
( l o
)
gdzie Q n jest słowem o an wartościach, zdefiniowanym następująco: Qn = Q n -l(Q n -2 + l)(Q n -3 + 2)(Q n - 4 + 3)(Q n-5 + 4) Qo = 0;
Qn = 6
(puste słowo)
dla 71 > 1 ;
dla n < 0.
( 11 )
Ponieważ Q n rozpoczyna się od Q n- 1 , możemy rozważać nieskończone słowo Qoo, którego pierwszych an elementów tworzy Qn. Słowo Qoo charakteryzuje w istocie wszystkie liczby scaleń w rozkładach wielofazowych. W przypadku sześciu taśm Qoo = 011212231223233412232334233434412232334233434452334344534454512232 ■ ( 12 )
W ćwiczeniu 11 omawiamy interesującą interpretację tego słowa.
5.4.2
SCALANIE WIELOFAZOWE
293
Dla danego słowa A n w postaci m im 2 . . . m an niech A n (x) = x mi + x m2 H
h
będzie odpowiadającą mu funkcją tworzącą, za pomocą której można wyznaczyć ilość wystąpień każdej liczby scaleń. Podobnie zdefiniujmy B n (:r), Cn (x), D n (x), E n (x). Na przykład Aą(x) = x 4 + x 3 + x 3 + x 2 + x s -\-x2 + x 2 + x = x 4 + 3 x 3 + 3 x 2 + x. Z zależności ( 9) mamy, że E n {x) — x(^An~i (^r)), D n (x) = x ( An_i(a;) + An_ 2(x)), — %[An—1(^) “b
2(*^) 4“
■^n(^) — ^ (-^ n — -1(*^) "b
3(^)) ?
(^ 3)
2(*^) “b ^ n —3(*^) “b ^ n —4(*^));
^ n (^ ) — ^ (^ n —1(^) "b 2ln_ 2 (x ) ~h bln_3(*^) “b A n ^ 4 ( 3?) ~b .Ari_5(;c)^,
dla n
> 1 ,gdzie .¿o 0*0 = 1 i ^n0*0 = 0 dla ™= - 1 , - 2 , - 3 , —4. Stąd
^ 2 K { x ) z n = ------, * 3 4 5' = Y \ Xk (z + z 2 + z 3 + z 4 + z 5 ) k . l - x ( z + z * + z * + z* + z*) ^ (14) Biorąc pod uwagę sekwensy na wszystkich taśmach, rozważmy Tn {x) = A n (x) + B n (x) + Cn (x) + D n (x) + E n (x),
n > 1;
( 15 )
z ( 13 ) wynika natychm iast, że ^n(^) ™ ó^4n_i(x) ~b 4x4n_2(#) -b 3i4n_3(o:) H- 2x4n_4(ir) H~ A n—5 ( 3?),
a stąd V * on_n _ z ( 5 z + 4^2 + 32:3 + 2z4 + Z5) / -Ln \ ^ j ^ — 1 —x(z + Z2 + ;z3 + z 4 + Z 5) n^l
(l6)
Z ( 16 ) można już obliczyć współczynniki Tn (x): z z2 X
5
X2 0 X3 0 X4 X5
0 0
4 5
z3 z4
0
3 9 5
0 0
0 0
2
z5
z6 z7
1 0
0
12 14 15 10 14 26 40 55 5 19 45 85 0 5 24 69
Z8
z9
z 10
z 11
Z 12
z 13
z 14
0 0 0 0 0 3 1 0 0 0 0 60 57 48 20 35 10 4 140 195 238 260 255 220 170 154 294 484 703 918 1088 1168 0 6
0
(!7)
Z kolumn tej tabeli otrzymujemy Tn (x ); na przykład T ą ( x ) = 2x + 12x 2 + 14x3 4- 5x4. Poza elementami z pierwszego wiersza każdy element tabeli jest sumą pięciu elementów z wiersza powyżej, leżących zaraz na lewo od elementu położonego bezpośrednio nad nim. Liczba sekwensów w „doskonałym” rozkładzie z n-tego poziomu wynosi Tn ( 1), natom iast T^( 1) mówi, ile razy te sekwensy są przetwarzane podczas scalania. Teraz 5 z + 4 z 2 + 3 z 3 + 2z 4 + z 5
294
5.4.2
SORTOWANIE
biorąc x = 1 w ( 16 ) i ( 18 ), otrzymujemy wynik, który jest w zgodzie z wcze śniej zademonstrowanym i mówiącym, że liczba razy, w których sekwensy są przetwarzane w przypadku doskonałego rozkładu z n-tego poziomu, jest współ czynnikiem przy w a(z)t(z); zobacz ( 7 ). Funkcje Tn (x) można wykorzystać do wyznaczenia ilości niezbędnej pracy w przypadku, gdy w sposób optymalny dodamy domyślne sekwensy. Niech £ n (m) będzie sum ą najmniejszych m liczb scaleń w rozkładzie z n-tego poziomu. Te wartości można w oczywisty sposób policzyć, korzystając z tabeli ( 17 ). Stąd dostajem y tabelę liczb £ n (m). m= 1 2 3 4 5 n n n n n n n
=1 =2 = = = — =
12 1 2 31 2 412 51 3 62 4 72 4
3 4 3 4 3 5 4 6 5 7 6 8 6 8
6
7
8
9 10 11 12 13 14 15 16 17 18 19 20 21
5ooocoooooooooooooooooooooooooooo 6 8 10 12 14 o o o o o o o o o o o o o o o o o o o c o o o o 7 9 11 13 15 17 19 21 24 27 30 33 36 00 00 00 00 8 10 12 14 16 18 20 22 24 26 29 32 35 38 41 44 47 9 11 13 15 17 19 21 23 25 27 29 32 35 38 41 44 47 10 12 14 16 18 20 22 24 26 28 30 33 36 39 42 45 48 10 12 14 16 18 20 23 26 29 32 35 38 41 44 47 50 53
(19 )
Dla przykładu, łączny koszt posortowania 17 sekwensów przy wykorzystaniu rozkładu z poziomu 3 wynosi £ 3( 17 ) = 36. Jeśli jednak skorzystamy z rozkładu z poziomu 4 łub 5 i optymalnie rozmieścimy domyślne sekwensy, łączny koszt przetwarzania sekwensów w fazach scalania wynosi tylko £ 4( 17 ) = £s(17) = 35. Tabela 2 LICZBA SEKWENSÓW, DLA KTÓRYCH DANY POZIOM JEST OPTYMALNY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
T =3 2 3 4 6 9 14 22 35 56 90 145 234 378 611 988 1598 2574 3955 6528
T = 4 2 4 6 10 18 32 55 96 173 280 535 820 1635 2401 4959 7029 14953 20583 44899
T = 5 2 5 8 14 23 35 76 109 244 359 456 1197 1563 4034 5379 6456 18561 22876 64189
T =6 2 6 10 14 29 43 61 154 216 269 779 1034 1249 3910 4970 5841 19409 23918 27557
T =7 2 7 12 17 20 53 73 98 283 386 481 555 1996 2486 2901 10578 13097 15336 17029
00 II
Poziom
2 8 14 20 24 27 88 115 148 168 640 792 922 1017 4397 5251 5979 6499 30164
T =9 2 9 16 23 28 32 35 136 171 213 240 1002 1228 1432 1598 1713 8683 10069 11259
T = 10 2 Mi 10 m 2 18 M3 26 M a 32 M5 37 M6 41 M7 44 Mg 199 M9 243 M10 295 M n 330 M12 1499 M13 1818 Mu 2116 M15 2374 Mie 2576 M17 2709 Mis 15787 ■ M19
5.4.2
SCALANIE WIELOFAZOWE
295
Lepiej zatem skorzystać z poziomu 4, nawet jeśli 17 odpowiada „doskonałemu” rozkładowi z poziomu 3! Faktycznie, gdy S staje się duże, optym alna liczba poziomów jest dużo większa niż ta z algorytm u D. W ćwiczeniu 14 dowodzimy, że istnieje niemalejący ciąg liczb M n taki, że poziom n jest optymalny dla M n < S < M n+ i, ale nie jest optymalny dla S > M n+i* W przypadku sześciu taśm , korzystając z właśnie policzonej tabeli dla E n (m), dostajemy, że M 0 = 0,
M i = 2,
M 2 = 6,
M 3 = 10,
M 4 = 14.
Powyższe rozważania dotyczyły tylko przypadku sześciu taśm , ale jest oczy wiste, że te same rozważania m ają zastosowanie w scalaniu wielofazowym z T taśmami dla dowolnego T > 3. W ystarczy we wszystkich właściwych miejscach zastąpić 5 przez P = T —1. W tabeli 2 zaprezentowano ciągi M n otrzym ane dla szeregu wartości T. Tabela 3 i rysunek 72 pokazują, ile razy łącznie są przetwa rzane wstępne sekwensy po optymalnym rozmieszczeniu domyślnych sekwensów. (Formuły na dole tabeli 3 powinny być traktow ane z pewną dozą ostrożności, ponieważ są to tylko przybliżenia uzyskane m etodą najmniejszych kwadratów na przedziale 1 < 5 < 5000 (lub 1 < S < 10000 dla T — 3). Jak widać, w da nym przedziale wartości S zachowanie się algorytmu nie jest jednakowo dobre dla wszystkich T. Przy S —►oo liczba przetwarzanych wstępnych sekwensów, po wykonaniu optymalnego wielofazowego rozrzucenia, wynosi asym ptotycznie S logpS ', ale zbieżność do tej asymptotycznej granicy jest niezmiernie wolna).
Tabela 3 W STĘPNE SEKWENSY PRZETWARZANE PODCZAS OPTYMALNEGO SCALANIA WIELOFAZOWEGO
10 20 50 100 500 1000 5000 oo
co li hi
5
36 90 294 702 4641 10371 63578 f (1.51 l (-.U
T = 4 24 60 194 454 3041 6680 41286 0.951 +.14
T =5 19 49 158 362 2430 5430 32905 0.761 +.16
T = 6 17 44 135 325 2163 4672 28620 0.656 +.19
T = 7 15 38 128 285 1904 4347 26426 0.589 +.21
T =8 14 36 121 271 1816 3872 23880 0.548 +.20
T - 9 13 34 113 263 1734 3739 23114 0.539 +.02
T = 10 12 33 104 254 1632 3632 22073 0.488) x 5 ln 5 + +.18) x S
Korzystając z tabeli 4, można porównać metodę rozrzucania sekwensów z algorytmu D z optym alną m etodą z tabeli 3. Widać, że dla dużych S i T wyniki działania algorytmu D odbiegają sporo od wyników optymalnych. Nie jest jednak zbyt jasne, jak postąpić, żeby było lepiej niż w algorytmie D, bez znaczących w takim przypadku komplikacji, szczególnie jeśli S nie jest znane z góry. Na szczęście rzadko musimy martwić się o duże wartości S (zobacz punkt
SORTOWANIE
296
5.4.2
CŚ § CQ 1N
O
IbO
.8
■g hD
N O
Początkowe sekwensy, S
R y s . 72.
E f e k t y w n o ś ć s c a la n ia w ie lo fa z o w e g o d la o p t y m a ln e g o p o c z ą t k o w e g o r o z k ła
d u , p r z y t a k i c h s a m y c h z a ło ż e n i a c h j a k n a r y s u n k u 70.
Tabela 4 W STĘPNE SEKWENSY PRZETWARZANE PODCZAS STANDARDOWEGO SCALANIA WIELOFAZOWEGO
10 20
50 100
500 1000
5000
CO
s
36 90 294 714 4708 10730 64740
T = 4 24 62 194 459 3114 6920 43210
T = 5 19 49 167 393 2599 5774 36497
T —6 17 44 143 339 2416 5370 32781
T = 7 15 41 134 319 2191 4913 31442
T = 8
T = 9
14 37 131 312
13 34
2100
4716 29533
120
292 2047 4597 28817
T = 10 12
33 114 277 2025 4552 28080
5.4.6), a co za tym idzie, algorytm D nie jest w praktyce zły. W rzeczywistości jest zupełnie dobry. M atem atyczną analizę sortowania wielofazowego pierwszy przeprowadził W. C. C arter [Proc. IFIP Congress (1962), 62-66]. Wiele z omawianych powyżej wyników dotyczących rozmieszczania domyślnych sekwensów jest przypisywa
5.4.2
SCALANIE WIELOFAZOWE
297
nych oryginalnie B. Sackmanowi i T. Singerowi [„A vector model for merge sort analysis” , nieopublikowana praca przedstawiona podczas sympozjum ACM Sort Symposium (November 1962), 21 stron]. Później Sackman zaproponował m etodę rozrzucania poziomego zastosowaną w algorytmie D. Donald Shell [CACM 14 (1971), 713-719; 15 (1972), 28] był twórcą niezależnej teorii; zauważył zależność ( 10) i szczegółowo zbadał kilka algorytmów rozrzucania. Dalsze pouczające udoskonalenia i nowe pomysły pochodzą od Dereka A. Zave’a [SICOMP 6 (1977), 1-39]; pewne z wyników Zave’a są omawiane w ćwiczeniach od 15 do 17. Funkcja tworząca ( 16 ) została po raz pierwszy zbadana przez W. Burge’a [Proc. IFIP Congress (1971), 1, 454-459]. Co z czasem przew ijan ia taśm ? Jak dotąd jedyną m iarą porównywania różnych strategii scalania taśmowego była liczba przetwarzanych wstępnych sekwensów. Jednak po każdej z faz od 2 do 6 , w przykładzie z początku tego punktu, komputer musi czekać, aż dwie taśm y zostaną przewinięte. Zarówno poprzednia taśm a wyjściowa, jak i aktualna taśm a wyjściowa muszą zostać prze winięte na początek przed rozpoczęciem kolejnej fazy. To może spowodować znaczące opóźnienie, ponieważ poprzednia taśm a wyjściowa zawiera zazwyczaj wiele z właśnie sortowanych rekordów. (Przyjrzyj się kolumnie „Przebieg/faza” z tabeli 1 ). To nie powinno się zdarzać, żeby czas kom putera był marnowany podczas operacji przewijania. W tym czasie można by wykonać użyteczną pracę na innych taśmach, jeśli tylko zastosowalibyśmy inny schemat scalania. P rosta modyfikacja algorytmu wielofazowego rozwiąże ten problem, chociaż wymaga się w niej zastosowania 5 taśm [zobacz Y. Cesari, Thesis, U. of Paris (1968), 25-27, gdzie ten pomysł jest przypisywany J. Caronowi]. W schemacie Carona, w każdej fazie na jednej taśmie scala się sekwensy z T — 3 taśm , podczas gdy pozostałe dwie taśmy są przewijane. Dla przykładu rozważmy przypadek sześciu taśm i 49 wstępnych sekwensów. W poniższej tabeli przyjmujemy, że R oznacza przewijanie taśm y w danej fazie, natom iast o T5 zakłada się, że zawiera oryginalne dane wejściowe. Faza 1 2
3 4 5 6
7 8
9 10
Tl
T2
T3
T4
i 11 (R) l6 l2
l 17 l9 l4
l 13 l5
l8
-
R 151 R 151 (15°)
-
R ll2 R ll1 ll1 -
-
R 72 R 71 7° -
R
-
R 54 R 52 51 -
R 49 1
T5 -
R 35 R 33 31 -
R 33° (R)
T6 (R) 38 R 34 32 -
R 231 R (23°)
Czas zapisywania 49 8 x 3 = 24 5 x 3 = 15 4 x 5 = 20 2 x 7 = 14 2 x 11 = 22 1 x 15 = 15 1 x 23 = 23 0x33= 0 1 x 49 = 49
Czas przewijania 17 49 - 17 = 32 max( 8 , 24) m ax(13,15) max(17, 20) m a x (ll, 14) m ax(22,24) m ax(15,15) m ax(20,23) 14
W tym przykładzie czas przewijania w zasadzie pokrywa się z czasem wyko nywania innych operacji, z wyjątkiem fazy 9 („sztucznej fazy” , w której jest przygotowywane końcowe scalanie) i okresu zaraz po fazie rozrzucania (kie dy to wszystkie taśm y są przewijane). Jeśli przez t oznaczymy czas potrzebny
298
5.4.2
SORTOWANIE
do scalenia rekordów z jednego wstępnego sekwensu, a przez r czas potrzebny na przewinięcie jednego wstępnego sekwensu, to przedstawiony proces zabiera 182t+40r jednostek czasu plus czas potrzebny na wstępne rozrzucenie sekwensów i końcowe przewijanie. Dla standardowego algorytmu D liczony w ten sposób czas wynosi 140t + 104r, czyli trochę gorzej, gdy r = | t , i trochę lepiej, gdy r = \ t . Wszystko, co powiedzieliśmy o standardowym algorytmie wielofazowym, można zaadaptować dla algorytm u Carona. Na przykład w tym przypadku ciąg an zam iast (3) spełnia zależność dn — nn_ 2 ~b
—3 "h (^n—4-
(^o)
Dla Czytelnika powinno być pouczającym zanalizowanie opisanej m etody w ten sam sposób, w jaki zanalizowaliśmy standardowe sortowanie wielofazowe. Pozwoli to na lepsze zrozumienie obu m etod. (Zobacz, na przykład, ćwiczenia 19 i 20). W tabeli 5 zebrano charakterystyki algorytmu Carona, które są analogiczne do charakterystyk dla zwykłego sortowania wielofazowego z tabeli 1. Zauważmy, że m etoda Carona przewyższa zwykłą metodę w przypadku ośmiu lub więk szej liczby taśm , zarówno w liczbie przetwarzanych sekwensów, jak i czasem potrzebnym na przewijanie, mimo że zamiast scalania (T — l)-wejściowego jest wykonywane scalanie (T —3)-wejściowe! Tabela 5 PRZYBLIŻONE ZACHOWANIE SIĘ SORTOWANIA WIELOFAZOWEGO CARONA
Taśmy 5 6
7 8
9 10 20
Fazy 3.556 ln S 2.616 ln 5 2.337 ln S 2.216 ln S 2.156 ln 5 2.124 ln 5 2.078 ln S
+ 0.158 - 0.166 -0 .4 7 2 -0 .7 6 2 - 1.034 — 1.290 - 3.093
Przebiegi 1.463 ln 5 + 0.951 ln S1+ 0.781 ln 5 + 0.699 ln S + 0.654 ln S + 0.626 ln S + 0.575 ln S +
1.016 1.014 1.001 0.980 0.954 0.922 0.524
Przebieg /faza
Współczynnik wzrostu
41% 36% 33% 32% 30% 29% 28%
1.3247180 1.4655712 1.5341577 1.5701473 1.5900054 1.6013473 1.6179086
To może wydawać się paradoksalne, zanim nie uświadomimy sobie, że za stosowanie scalania wysokiego rzędu nie zawsze musi skutkować efektywnym sor towaniem. Jako ekstrem alny przykład rozważmy umieszczenie 1 sekwensu na T l i po n sekwensów na T2, T3, T4, T5; jeśli będziemy wykonywać scala nie pięciowejściowe na przem ian na T 6 i T l aż do wyczerpania T2, T3, T4, T5, czas przetwarzania wstępnych sekwensów, (2n 2 + 3n), jest proporcjonal ny do S 2 zamiast do S lo g S , chociaż cały czas stosowaliśmy scalanie pięcio wejściowe. D z ie le n ie ta śm . Problem efektywnego pokrywania czasu przewijania pojawia się w wielu zastosowaniach, nie tylko w sortowaniu. Do jego rozwiązania stosuje się często następujące, ogólne podejście. Rozważmy iteracyjny proces, w którym
5.4.2
SCALANIE WIELOFAZOWE
299
w następujący sposób korzysta się z dwóch taśm: Tl
T2
Wyjście 1 Przewiń
__
Faza 2
Wejście 1 Przewiń
Wyjście 2 Przewiń
Faza 3
Wyjście 3 Przewiń
Wejście 2 Przewiń
Faza 4
Wejście 3 Przewiń
Wyjście 4 Przewiń
Faza 1
-
i tak dalej, gdzie „wyjście k" oznacza zapisywanie na k-ty plik wyjściowy, na tomiast „wejście oznacza czytanie z tego pliku. Straty czasu na przewijanie można uniknąć, wykorzystując trzy taśm y w sposób zaproponowany przez C. W eiserta [CACM 5 (1962), 102]: Tl Faza 1
T2
T3
-
-
-
-
Wyjście 1.1 Wyjście 1.2 Przewiń
Wyjście 1.3
-
Wejście 1.1 Wejście 1.2 Przewiń
Wyjście 2.1 Przewiń Wejście 1.3
-
Wyjście 2.2 Wyjście 2.3
Faza 3
Wyjście 3.1 Wyjście 3.2 Przewiń
Wejście 2.1 Przewiń Wyjście 3.3
Przewiń Wejście 2.2 Wejście 2.3
Faza 4
Wejście 3.1 Wejście 3.2 Przewiń
Wyjście 4.1 Przewiń Wejście 3.3
Przewiń Wyjście 4.2 Wyjście 4.3
Faza 2
i tak dalej. Tutaj „wyjście fc.j” oznacza zapisanie j-te j trzeciej części k-tego pliku wyjściowego, a „wejście k . j ” oznacza jej odczytanie. Jeśli przewijanie będzie co najmniej dwukrotnie szybsze od czytania/zapisyw ania, to czas przewijania nie będzie odgrywał żadnej roli. M etoda, w której w każdej fazie dane wyjściowe są rozdzielane między taśmy, nazywamy „dzieleniem taśm ” . R. L. McAllester [CACM 7 (1964), 158-159] pokazał, że dzielenie taśm prowadzi do efektywnego sposobu pokrywania czasu przewijania w scalaniu wie lofazowym. W zaproponowanej przez niego metodzie korzysta się z czterech lub więcej taśm i stosuje scalanie (T —2)-wejściowe. Załóżmy raz jeszcze, że dysponujemy sześcioma taśm am i. Spróbujmy zapro jektować schemat scalania, w którym dane wyjściowe są na każdym poziomie. W poniższej propozycji „I” , „O” i „R” oznaczają odpowiednio czytanie, zapisy wanie i przewijanie.
300
SORTOWANIE
Poziom T l 7 I I I 6 I 5 I I 4 I I 3 R O 2 O R 1 I I I 0 I
5.4.2
T2 T3 T4 T5 T 6 Liczba wypisanych sekwensów I I I R O u7 I I I O R v7 I I R O I ue I I O R I VQ I I I u 5 R O I I I R O V5 I I I R O U4 I I O R I v4 I I I O I U3 I I R I I V3 I I I I R U2 I I I I O V2 I I I R O Ul I I I O R Vl I I R O I Uo I I O R I Vo
Żeby na koniec taśm a T4 zawierała tylko jeden sekwens, a wszystkie pozostałe były puste, musimy mieć
U0 + V 1
= 1, = 0,
ui + v 2 = u 0 + t>o5 U2 + t;3 =
Ul + Ul + U0 + V0 ,
^3 + V4 =
U 2 + ^2 + «1 + VI + W 0 + V0ł
^4 H~ ^5 = Us + ^3 + u 2 + v 2 + t/i -j-
+ tto + ^ 0:
^5 + Uq = U ą + V4 + «3 + V3 + ^2 + ^2 + Wl + ^1
itd.; w ogólności chcemy, żeby U n + Wi+1 = W n_ i +
Vn - i + Wn-2 + Wi-2 + ^n -3 + Wi-3 +
Un _
4+
f n-4
( 22)
dla wszystkich n > 0, jeśli przyjmiemy Uj = Vj = 0 dla wszystkich j < 0. Ten układ równań nie m a jednoznacznego rozwiązania. Rzeczywiście, jeśli za wszystkie u weźmiemy zero, to dostaniemy zwykłe sortowanie wielofazowe z niewykorzystaną jedną taśmą! Jednak dla un « vn+ i, czas przewijania zostanie pokryty w zadawalający nas sposób. McAllester zaproponował, żeby wziąć Un — Vn ~~i
Vn —2
H-
Wi+1 ~ Un —i + i/n_2 H~ Un —3
"h Vn _ 4,
T U-n_ 4,
tak że ciąg ( x 0 , x i , a ; 2 , ^ 3 . ^ 4 , a ; 5 , - - - ) = (^o, « o , V i . « 1 , v 2, u 2 , • • •)
5.4.2
SCALANIE WIELOFAZOWE
spełnia jednorodne równanie rekurencyjne x n = x ns Jednak okazuje się, że lepiej wziąć
301
+ x n_§ + £n-7 + # n - 9-
W i+ l ^ 'Un—l T ^ n —1 “t“ 'Uyi—2 4” ^ n —2?
,
_ — ^n —3 “t" ^n —3 H- ^ n —4 4" ^n—4;
x
( 23)
ten ciąg nie tylko daje trochę lepszy czas scalania, ale m a i tę przewagę, że umożliwia m atem atyczną analizę czasu scalania. Propozycja McAllestera jest wyjątkowo trudna do analizy, ponieważ w pojedynczej faziemogą pojawiać się sekwensy o różnych długościach. Pokażemy, że to nigdy nie zdarza się dla ( 23). Liczby sekwensów na taśm ach, na wszystkich poziomach, otrzymamy, sto sując schemat (2 1 ) wstecz. W ten sposób dostajem y następujący schemat sorto wania: Poziom
Tl ^23
T2
T3
T4
l 21
7
l 19 l 13 l 10 l6 l5 l2 l1
l 17 l 11 l8 l4 l3 R 131 13M91 R lS 1^ 1 191 191 191 191 (19°)
l 17 l 13 l7 l4
l 10 l6
6 5 4
-
3 2 1
0
R 191 i^
i0
R 19131° l^ l0 l^ l0 (31°)
_
R 73 7S131 R 7213x 7M3 1 7M3 1 131 131 131 131 _
T5
T6 Czas zapisywania Czas przewijania
l 11
l n 44 4 x 4 _ 6x 4 R 49 3 x 4 1844 R 44 4x 4 R 1444 48 1344 1x7 4471 45 R 3x7 44 44 4 3 7x 43 1 x 13 4 2 7x 4 3 42 1 x 13 4I 71 42 41 1 x 19 41 1 x 19 71 41 71 0x31 R 7° 311 1 x 31 31152° 0 x 52 7° R 52° 0 x 52 R R 52°82° 31152° 0 x 82 821 (52°) 1 x 82 (R) R 46
-
-
-
82 = 16 = 24 = 12 = 16 = 7 = 21 = 13 = 13 = 19 = 19 = 0 = 31 = 0] = 0 \ = 0J = 82
23 8 2 -2 3 27 10 36 17 23 21
34 23 32 27 19 m ax(36,31,23) 0
Niepokryte przewijanie występuje trzy razy: podczas przewijania taśm y wejścio wej T5 (82 jednostki), w pierwszej połowie fazy z poziomu 2 (27 jednostek) i w ostatnich fazach „sztucznego scalania” na poziomach 1 i 0 (36 jednostek). Zatem całkowity czas sortowania możemy oszacować na 273t + 145r; odpowia dający tem u czas działania algorytmu D wynosi 268t-j-208r i jest zawsze gorszy. W ćwiczeniu 23 dowodzimy, że długości kolejnych sekwensów produkowa nych w każdej fazie wynoszą 4 ,4 ,7 ,1 3 ,1 9 ,3 1 ,5 2 ,8 2 ,1 3 3 ,..., przy czym taki ciąg (¿i, ¿2?
( 24)
. . . ) spełnia warunek tn
~
^n —2
H"
3
T t n—4
(^ó)
jeśli przyjmiemy t n = 1 dla n < 0. Możemy także zanalizować optym alny sposób rozmieszczenia domyślnych sekwensów, rozpatrując słowa zbudowane z liczb
302
5.4.2
SORTOWANIE
scaleń, podobnie jak to zrobiliśmy dla zwykłego scalania wielofazowego w (8): Tl
T2
1
1 1
1 1
21 2221
21
2
2
1
222
222
22
2
23222 333323222
23222 33332322
2322 333323
23 3333
2322
T5 T4 T3 T2 Tl T6
A'n
T(fc) T(fc - 1 )
2
3 4 5 6
n n+l
-Pn (A " £ n + l)B n
(A "£ „ + 1)C„
T4
T6
1
1
—
1
—
1
Ostateczny wynik na
Poziom
T3
Dn (A " £ n + l ) D n A " E n + 1
222
Cn
(2 6 )
gdzie A n — A fn A f^ natom iast A" składa się z ostatnich un liczb scaleń z A n . Powyższa zasada przechodzenia z poziomu n na poziom n + l zachodzi dla każdego schem atu spełniającego (22). Dla ciągów u i v zdefiniowanych w (23) słowa A n , . . . , E n można przedstawić w następujący dość prosty sposób, analogicznie do (9 ): A n = ( W n ^ W n ^ W n ^ W n - i ) + 1, Bn
= ( W „ - l W n _ 2 W „ - 3) +
1,
Cn = (Wn- l W n- 2) + 1, D n — (Wn- 1) + I j E n = (Wn- 2Wn-3) + 1,
(27)
gdzie W n = (W n^ W n - 4 W n - 2 W n - 3 ) + 1 dla n > 0, W q = 0, oraz W n = e dla n < 0 .
(28)
Te zależności umożliwiają szczegółową analizę przypadku sześciu taśm. W ogólności dla T > 5 taśm bierzemy P = T — 2 i definiujemy ciągi {un), {vn) spełniające równania V
n -\-1 =
Un
“
U n —1 “t- l ^ n —1 H------------H U n — r T
H n -r-1
T
l ^ n —r ?
'On—r —1 ~h * ** “ h H 71 —P "h
1^n —P
dla
77
^ 0,
gdzie r = [ P / 2 \ ; v0 = 1 i un = i/n = 0 dla n < 0. Zatem, jeśli u>n — wn = Wfi—2 T" ***“b wn—r + 2ien_ r _ i T wn—r~ 2 -f- *• ■4- wn~p
dla u
(29) + vn , to 0; (3®)
u>o = 1 oraz wn = 0 dla n < 0. W wyniku wstępnego rozrzucania dla poziomu 77 + 1, na każdej taśm ie fe, dla 1 < k < P , zostaje umieszczonych ien + wn- i +
• - *+ sekwensów, a na taśm ie T, iun_ i + • • • + ieTl_ r sekwensów; taśm a T —1 jest taśm ą wejściową. Następnie un sekwensów jest scalanych na taśmie T, podczas gdy taśm a T — 1 jest przewijana; vn sekwensów jest scalanych na taśmę T — 1, podczas gdy taśm a T jest przewijana; u n- 1 sekwensów na taśm ę T — 1, podczas gdy taśm a T — 2 jest przewijana itd. W tabeli 6 pokazano asyniptotyczne zachowanie się tego algorytmu dla większych wartości S. Kolum na „Przebieg/faza” pokazuje w przybliżeniu, jaka
SCALANIE WIELOFAZOWE
5.4.2
303
Tabela 6 PRZYBLIŻONE ZACHOWANIE SIĘ SCALANIA WIELOFAZOWEGO Z DZIELENIEM TAŚM Współczynnik Przebieg Taśmy Fazy Przebiegi wzrostu /faza
4 5 6
7 8
9 10 20
2.885 ln 5 + 0.000 2.078 ln S + 0.232 2.078 I n S - 0.170 1.958 ln 5 - 0.408 2.008 ln 5 - 0.762 1.972 ln S -0 .9 8 7 2.013 ln 5 - 1.300 2.069 ln 5 - 3.164
1.443 ln 5 + 0.929 ln 5 + 0.752 ln 5 + 0.670 ln 5 + 0.624 ln 5 + 0.595 ln S + 0.580 ln 5 + 0.566 ln S +
1.000 1.022
1.024 1.007 0.994 0.967 0.941 0.536
50% 45% 36% 34% 31% 30% 29% 27%
1.4142136 1.6180340 1.6180340 1.6663019 1.6454116 1.6604077 1.6433803 1.6214947
część całego płiku jest przewijana w każdej połowie pojedynczej fazy oraz jaka część pliku jest zapisywana w całej, pełnej fazie. Dla sześciu lub większej liczby taśm, prawdopodobnie również dla pięciu, metoda podziału taśm jest lepsza od zwykłej metody wielofazowej, co najmniej dla dużych S. Dla T — 4 powyższy algorytm jest w zasadzie równoważny zrównoważonemu scalaniu dwuwejściowemu bez pokrywania czasu przewijania, ponieważ wówczas W2n+i = 0 dla wszystkich n. Zawartość tabeli 6 dla T = 4 otrzym ano przy zastosowaniu drobnej modyfikacji, biorąc v 2 = 0, u\ = 1 , v\ = 0, uq = 0, vo = 1 oraz vn+\ = un- \ + t + _ i, un = u n - 2 + v n - 2 dla n > 2. To daje bardzo interesujący schemat sortowania (zobacz ćwiczenia 25 i 26). ĆW ICZENIA 1. [16] Rysunek 69 przedstawia sposób, w jaki algorytm D scala sekwensy od 34 do 65 na pięciu taśmach. W jaki sposób zostaną rozmieszczone sekwensy od 1 do 33? 2. [21] Prawda czy fałsz: Po wykonaniu dwóch faz scalania z algorytmu D (czyli po drugim dojściu do kroku D 6 ), znikają wszystkie domyślne sekwensy. 3. [22] Udowodnij, że na koniec kroku D4 jest spełniony warunek D[ 1 ] ^ D[ 2 ] ^ • ** ^ D [T ]. Wyjaśnij, dlaczego ten warunek jest ważny w znaczeniu, że w przeciwnym razie kroki D2 i D3 nie działałyby właściwie. 4. [M20] Wyprowadź funkcje tworzące ( 7 ). 5. [HM26] (E. P. Miles, Jr., 1960) Udowodnij, iż dla każdego p ^ 2 wielomian f P(z) = zp-1 — . . . —z — \ ma p różnych pierwiastków i takich, że moduł dokładnie jednego z nich jest większy od jedynki. [ Wskazówka: Rozważ wielomian zp+1 — 2zp + 1].
zp _
6 . [HM2Ą] W tym ćwiczeniu rozważamy sposób, w jaki otrzymano tabele 1 , 5 i 6 .
Załóżmy, że mamy schemat scalania, którego własności w następujący sposób charak teryzują wielomiany p(z) i q(z): (i) Liczba wstępnych sekwensów w „doskonałym roz kładzie” , dla których jest wymaganych n faz scalania, wynosi [zn]p(z)/q( z). (ii) Liczba wstępnych sekwensów przetwarzanych podczas tych n faz scalania wynosi [zn] p ( z ) / q(z)2. (iii) Funkcja q{z~l ) ma „pierwiastek dominujący” a taki, że 0 taka, że jeśli S jest liczbą sekwensów w do skonałym rozkładzie wymagających n faz scalania i jeśli w tych fazach przetwarzanych
304
SORTOWANIE
5.4.2
jest p S wstępnych sekwensów, to n — alnć? + ó + 0 ( S e) i p = c ln S + d + 0 ( S €),
gdZie
/, \-i a — (Ina) ,
b, — —a }ln (I —p (a _1) \ — -1 , —^ ' ( a - 1 ) /
c —a
’
« —9/ (a _ 1 ) ł
(b + l ) a —p '(a - 1 )/p (a _1) + q"{a~ 1 )/q'(a~1) —q'(a ~1) 7. [HM2 2 ] Niech a p będzie dominującym pierwiastkiem wielomianu f P(z) z ćwicze nia 5. Jak asymptotycznie zachowuje się a p, gdy p —>oo? 8 . [M2 0] (E. Netto, 1901) Niech będzie liczbą sposobów przedstawienia m jako uporządkowanej sumy liczb z { 1 , 2 , . . . ,p}. Na przykład, dla p = 3 i m — 5, takich sposobów jest 13, mianowicie l + l + l + l + l = 1 + 1 + 1 + 2 = 1 + 1 + 2 + 1 =
1 + 1 + 3 = 1 + 2 + 1 + 1 = 1 + 2 + 2 = 1 + 34-1 = 2 + 1 + 1 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 2 + 3 = 3 + l + l = : 3 + 2. Pokaż, że jest pewną uogólnioną liczbą Fibonacciego. 9. [M20\ Niech K $ będzie liczbą ciągów zer i jedynek o długości m nie zawierają cych p kolejnych jedynek. Na przykład dla p = 3 i m — 5 takich ciągów jest 24: 00000, 00001, 00010, 00011, 00100, 00101, 00110, 01000, 0 1 0 0 1 ,..., 11011. Pokaż, że K {p) jest uogólnioną liczbą Fibonacciego. 10.
[M27] (Uogólniony system liczbowy Fibonacciego) Udowodnij, że każdą nieujemną
liczbę całkowitą n można jednoznacznie zapisać jako sumę różnych liczb Fibonacciego F j p^ rzędu p, dla j ^ p, w taki sposób, że w tej sumie nie występują żadne p kolejne liczby Fibonacciego. 1 1 . [M2Ą] Udowodnij, że n-tym elementem w słowie Qoo z ( 12) jest liczba różnych liczb Fibonacciego w zapisie liczby n — 1 w systemie liczbowym Fibonacciego rzędu pięć. [Zobacz ćwiczenie 10]. /0 1 0 0 0\ 0
►1 2 . [Ml8] Znajdź związek między potęgami macierzy
0 0 \1
0
1 0
0
0 0 10 0 0 01 1 1 1 1/
a doskona-
łymi rozkładami Fibonacciego z ( 1). ►13. [22] Udowodnij następującą, dość dziwną własność doskonałych rozkładów Fi bonacciego. Jeśli ostateczny wynik zostanie zapisany na taśmie o numerze T, liczba sekwensów na każdej z pozostałych taśm jest nieparzysta; jeśli ostateczny wynik zo stanie zapisany na taśmie innej niż T, liczba sekwensów na tej taśmie jest nieparzysta, natomiast liczby sekwensów na pozostałych taśmach są parzyste. [Zobacz ( 1)]. 14. [M35] k>0Tnkx k, r35} Niech Tn (x) {x) = = ^2 '£lk>oT^ k gdzie Tn (x) jest wielomianem zdefiniowanym w ( 16 ). a) Pokaż, że dla każdego k istnieje liczba n(k) taka, że Tik ^ ^ ^ ^n(k)k > T(n(k) +l)k ^ ***• b) Wiedząc, że Tn>k> < Tny i n! < n, udowodnij, iż Tn>k ^ Tnk dla każdego k ^ k c) Udowodnij, że istnieje niemalejący ciąg {Mn} taki, iż En(S) — m in ^ iE ^ S ), gdy Mn ^ S < M n+1, ale £ n(S) > m in ^ i £ j(S ), gdy S ^ M„+ i. [Zobacz ( 19 )]. 15. [MĄ3] Udowodnij lub pokaż, że to nieprawda: £ n_i(m ) < £ n(m) implikuje, że £n(m ) ^ £ n + i(m) ^ £ n+2 (m) ^ *••. [Ten wynik znakomicie upraszcza obliczanie wartości z tabeli 2 ]. 16. [HMĄ3] Określ asymptotyczne zachowanie się scalania wielofazowego dla opty malnego rozkładu domyślnych sekwensów.
5.4.2
SCALANIE WIELOFAZOWE
305
17. [32] Udowodnij lub pokaż, że to nieprawda: istnieje sposób optymalnego rozrzu cania sekwensów dla sortowania wielofazowego, w którym rozkład dla 5 + 1 wstępnych sekwensów otrzymuje się w wyniku dodania jednego sekwensu (do odpowiedniej taśmy) do istniejącego rozkładu dla S wstępnych sekwensów. 18. [30] Czy dla optymalnego rozkładu sekwensów otrzymujemy możliwie najlepszy schemat scalania w znaczeniu, że jest minimalizowana łączna liczba przetwarzanych wstępnych sekwensów, jeśli początkowe rozrzucanie sekwensów dokonuje się na co najwyżej T — 1 taśmach? (Ignorujemy czas przewijania taśm). 19. [21] Stwórz tabelę analogiczną do (i) dla sortowania wielofazowego Carona na sześciu taśmach. 20. [M2Ą] Jakie funkcje tworzące dla sortowania wielofazowego Carona na sześciu taśmach odpowiadają funkcjom z ( 7 ) i ( 16 )? Jakie zależności, analogiczne do (9 ) i (27 ), definiują słowa zbudowane z liczb scaleń? 2 1 . [11] Co powinno znajdować się na poziomie 7 w (26 )? 2 2 . [M21] Każdy element ciągu ( 24 ) jest w przybliżeniu równy sumie dwóch poprzed nich. Czy to zjawisko zachodzi również dla pozostałych liczb z tego ciągu? Sformułuj i udowodnij twierdzenie o t n —i n- i — t n- 2 -
►23. [29] Jakie zmiany zaszłyby w ( 25 ), (27 ) i (28 ), jeśli równanie ( 23 ) zostałoby zamie nione na równanie Un+ l ™ u n~\ + Un _ l + Un- 2 , Un = Vn- 2 + t in - 3 + V n - 3 +W n- 4 +Vn- 4? 24. [HMĄ1] Jak asymptotycznie zachowuje się algorytm wielofazowy z dzieleniem taśm, gdy vn+i zdefiniujemy jako sumę pierwszych q składników z u n - 1 + v n~i H h un- p + vn- p . Przeprowadź analizę dla P = T —2 i różnych 0 ^ q ^ 2P. (W głównym tekście rozważaliśmy tylko przypadek q = 2|F /2J; zobacz ćwiczenie 23). 25. [19] Zademonstruj, w jaki sposób 32 wstępne sekwensy zostaną scalone na czte rech taśmach za pomocą algorytmu scalania wielofazowego z podziałem taśm. (Prze prowadź analizę faza po fazie, podobną do tej z głównego tekstu dla sześciu taśm i 82 sekwensów). 26. [M21] Przeprowadź analizę asymptotycznego zachowania się scalania wielofazo wego z podziałem taśm zastosowanego do czterech taśm dla S — 2 n i dla S — 2 n + 2 n_1. (Zobacz ćwiczenie 25). 27. [23] Po doskonałym rozrzuceniu po taśmach wstępnych sekwensów strategia wie lofazowa to po prostu „scalaj aż wyczerpiesz”: Scalamy sekwensy ze wszystkich niepustych taśm wejściowych, aż jedna z nich zostanie przeczytana w całości; następnie ta taśma jest używana jako taśma wyjściowa, a poprzednia taśma wyjściowa służy za taśmę wejściową. Czy niezależnie od rozkładu wstępnych sekwensów, jeśli tylko zostaną one rozrzu cane na co najmniej dwie taśmy, strategia „scalaj aż wyczerpiesz” daje zawsze dobre rezultaty? (Po zakończeniu rozrzucania jedna taśma pozostanie oczywiście pusta, tak więc może ona służyć za pierwszą taśmę wyjściową). 28. [M26] W poprzednim ćwiczeniu zdefiniowaliśmy dość dużą rodzinę schematów scalania. Pokaż, że scalanie wielofazowe jest najlepszym z nich w następującym znacze niu. Jeśli dysponujemy sześcioma taśmami i jeśli rozważymy klasę wszystkich począt kowych rozkładów (a, 6 , c, d, e) takich, że strategia „scalaj aż wyczerpiesz” wymaga do scalenia wstępnych sekwensów co najwyżej n faz, to a + b + c + d + e ^ t n , gdzie t n jest taką sumą dla sortowania wielofazowego ( 1 ).
306
5.4.2
SORTOWANIE
29. [MĄ 7] W ćwiczeniu 28 pokazaliśmy, że rozkład wielofazowy jest optymalny wśród wszystkich schematów typu scalaj aż wyczerpiesz, jeśli interesuje nas minimalna liczba faz. Czy jest on także optymalny, jeśli idzie o minimalną liczbę przebiegów? Niech a będzie względnie pierwsze z b i załóżmy, że a + b jest n-tą liczbą Fibonacciego Fn . Czy następująca hipoteza postawiona przez R. M. Karpa jest prawdziwa? Liczba wstępnych sekwensów przetwarzanych w algorytmie typu scalaj aż wyczerpiesz, dla wyjściowego rozkładu (a, 6), jest nie mniejsza od ((n — 5)Fn+i + (2n + 2)Fn)/5. (Równość jest osiągana dla a = Fn- 1, b = Fn- 2 ). 30. [Ą2] Stwórz tabelę analogiczną do tabeli 2 dla scalania wielofazowego z dzieleniem taśm. 31. [M22 ] (R. Kemp) Niech Kd(n) będzie liczbą n- węzłowych drzew uporządkowa nych, w których odległość każdego liścia od korzenia wynosi d. Dla przykładu ^ 3 ( 8 ) = 7, jak pokazano na rysunku poniżej.
i!
f łi
i l
Pokaż, że Kd(n) jest uogólnioną liczbą Fibonacciego i znajdź wzajemnie jednoznaczną odpowiedniość między takimi drzewami a uporządkowanymi podziałami rozważanymi w ćwiczeniu 8 .
*5.4.3. Scalanie kaskadowe
Jeszcze jeden ważny schemat, zwany „scalaniem kaskadowym” , powstał w rze czywistości jeszcze przed scalaniem wielofazowym [B. K. Betz i W. C. Carter, A C M National Conf. 14 (1959), Paper 14], To nowe podejście, dla sześciu taśm i 190 początkowych sekwensów, zostało zilustrowane w poniższej tabeli, w której przyjęto oznaczenia z poprzedniego punktu: Przetworzone Tii T4 początkowe sekwensy Tl T2 T3 T5 ■^50 ■ ^55 l 41 l 29 l 15 190 Przebieg 1 __ 4 I4 Przebieg 2 * 15 29 3 12 5 15 190 144 123 *5 4 190 Przebieg 3 155 92 — Przebieg 4 411 501 55 1 190 *15* 291 190 Przebieg 5 1901 Scalanie kaskadowe, podobnie jak scalanie wielofazowe, rozpoczyna się od „do skonałego rozrzucenia” na taśm y początkowych sekwensów, chociaż zasada two rzenia doskonałych rozkładów jest trochę inna od tej z punktu 5.4.2. Każdy wiersz w tabeli odpowiada jednemu pełnemu przebiegowi przez całe dane. Na przykład w przebiegu 2 jest wykonywane pięciowejściowe scalanie z {T l, T2, T3, T4, T5} na T 6 , aż T5 zostanie opróżniona, (w ten sposób na T 6 znajdzie się 15 sekwensów o względnych długościach równych 5), następnie jest wykonywane czterowejściowe scalanie z { T l, T2, T3, T4} na T5, potem trzywejściowe na T4, dwuwejściowe na T3 i na koniec jest wykonywane jednowejściowe scalanie (ko piowanie) z T l na T2. Przebieg 3 jest wykonywany w ten sam sposób, najpierw następuje scalanie pięciowejściowe, aż zostanie opróżniona jedna z taśm , potem
SCALANIE KASKADOWE
5.4.3
307
Tabela 1 PRZYBLIŻONE ZACHOWANIE SIĘ SORTOWANIA PRZEZ SCALANIE KASKADOWE
rr, ,
Przebiegi (z kopiowaniem) 2.078 ln 5 1.235 ln 5 0.946 ln S 0.796 ln S 0.7031nS 0.639 ln S 0.592 ln S 0.555 ln S 0.397 ln S
3 4 5 6
7 8
9 10 20
Przebiegi (bez kopiowania)
+ 0.672
1.504 ln 5 + 1.102 ln S + 0.897 ln 5 + 0.773 ln S + 0.691 ln S + 0.632 ln 5 + 0.587 ln 5 + 0.552 ln S + 0.397 ln 5 +
+ 0.754 0.796 0.821 0.839 0.852 0.861 0.869 0.905
+ + + + + + +
0.992 0.820 0.800 0.808 0.822 0.834 0.845 0.854 0.901
Współczynnik wzrostu 1.6180340 2.2469796 2.8793852 3.5133371 4.1481149 4.7833861 5.4189757 6.0547828 12.4174426
czterowejściowe i tak dalej. (Być może ten punkt powinien mieć numer 5.4.3.2 . 1 , a nie 5.4.3!). Widzimy, że operacje kopiowania są niepotrzebne i mogłyby zostać pominię te. Jednak w rzeczywistości, w przypadku sześciu taśm , kopiowanie zabiera tylko niewielki procent z ogólnego czasu działania. Elementy w tabeli (bez numeru) oznaczone gwiazdką to te, które są po prostu kopiowane; tylko 25 sekwensów jest tygo typu, na ogólną liczbę 950 przetworzonych sekwensów. Większość czasu jest spędzana na scalaniu pięcio- i czterowejściowym. Na początku może się wydawać, że scalanie kaskadowe nie jest najlepszym wyborem w porównaniu z algorytmem wielofazowym, ponieważ w standardow ym algorytmie wielofazowym cały czas wykorzystuje się scalanie (T — l)-wejściowe, podczas gdy w algorytmie kaskadowym jest stosowane scalanie (T —l)-wejściowe, (T — 2)-wejściowe, (T — 3)-wejściowe itd. Jednak w rzeczywistości, dla sześciu lub większej liczby taśm , algorytm kaskadowy jest asym ptotycznie lepszy od algorytmu wielofazowego! Jak zauważyliśmy w punkcie 5.4.2, wyższy rząd sca lania nie jest gwarancją efektywności. Tabela 1 zawiera charakterystyki scalania kaskadowego, analogicznie do podobnych tabel z punktu 5.4.2. „Doskonałe rozkłady” sekwensów dla scalania kaskadowego można łatwo otrzymać wykonując algorytm kaskadowy od końca do początku, zaczynając od stanu ( 1 , 0 , . . . , 0). W przypadku sześciu taśm doskonałymi rozkładam i są Tl
T2
T3
T4
T5
1 1
0 1
0 1
4 14 50 175
3
0 1 1
3 4 5
5 15 55 190
0 1 2
41 146
9 29 105
5 15 55
n
& 71
bji ^ 7 i 4“bn + cn + dn
u 72+ bn + cn
Poziom 0 1 2
n+1
OjU4“
4“Cn 4~dri 4-en
12
C 7l
dn dn 4“bn
^71
0*71
308
SORTOWANIE
5.4.3
Interesujące jest spostrzeżenie, że liczby o takich samych względnych wielko ściach pojaw iają się, gdy rozważymy długości przekątnych w wielokącie regular nym o (2T — 1) bokach. Dla przykładu, względne długości pięciu przekątnych a, b, c, d, e w jedenastokącie z rysunku 73 są prawie równe 190, 175, 146, 105 i 55! Fakt ten udowodnimy później i dodatkowo pokażemy, że względny czas spędzany na scalanie (T —l)-wejściowe, scalanie (T —2)-wejściowe,. . . , scalanie 1 -wejściowe jest w przybliżeniu proporcjonalny do kwadratów długości tych przekątnych.
R ys. 73. Geometryczna interpretacja liczb kaskadowych. W s tę p n y p o d z ia ł sek w en só w . Gdy rzeczywista liczba sekwensów nie jest doskonała, możemy, jak zazwyczaj, posłużyć się domyślnymi sekwensami. Po bieżna analiza takiej sytuacji pokazuje, że sposób rozmieszczenia domyślnych se kwensów jest nieistotny, ponieważ sortowanie kaskadowe jest wykonywane w peł nych przebiegach. Jeśli na początku mamy 190 sekwensów, to każdy rekord jest przetwarzany pięć razy jak w przykładzie powyżej. Jeśli jednak początkowo mamy 191 sekwensów, to musimy rozpocząć z poziomu o jeden wyżej i wówczas każdy rekord będzie przetwarzany sześć razy. Szczęśliwie taki nagły skok nie jest w rzeczywistości konieczny. David E. Ferguson odkrył taki sposób rozmieszczenia początkowych sekwensów, że wiele z operacji wykonywanych w pierwszym prze biegu scalania, redukuje się do kopiowania zawartości jednej taśmy. Gdy takie kopiowania pominiemy (po prostu przez zmianę „logicznych” numerów jednostek taśmowych względem numerów „fizycznych” , podobnie jak w algorytmie 5.4.2D), wówczas, jak pokazano na rysunku 74, z poziomu na poziom przechodzimy stosunkowo gładko. Przypuśćmy, że (a, 6, c, d 1 e) jest rozkładem doskonałym, gdzie a > b > c > d > e. Przedefiniowując odpowiedniość między logicznymi a fizycznymi jednost kami taśmowymi, możemy przyjąć, że faktycznym rozkładem jest (e,d, c, 6, a), gdzie a jest liczbą sekwensów na T5, b na T4 itd. Kolejnym doskonałym roz kładem jest (a + 5 + c + d -Fe, a + 6+ c + d , a + 5 + c , a 4-6, a). Jeśli dane zostają wy czerpane przed osiągnięciem następnego poziomu, to przyjmijmy, że na taśmach
5.4.3
SCALANIE KASKADOWE
309
T= 3
T = 4
T = 5 T = 6 T= 7 T = 8
T — 10
10
20
50
100
200
500
1000 2000
5000
Początkowe sekwensy, S
Rys. 74. Efektywność scalania kaskadowego dla rozkładu z algorytmu D. znajduje się odpowiednio (£b, £>2, D\ ^ n-j-6 + c + d,
£>4, £>5) domyślnych sekwensów, gdzie
D 2 ^ ci + b + c,
D 3 ^ a + 6,
£^4 ^ a,
Di > D 2 ^ £>3 ^ £>4 > 1 ) 5 .
.D5 = 0; ‘
Bez żadnych przeszkód możemy przyjąć, że domyślne sekwensy znajdują się na taśmach w dowolnych, wygodnych dla nas miejscach. O pierwszym przebiegu zakłada się, że generuje a sekwensów za pomocą scalania pięciowejściowego, następnie b sekwensów za pomocą scalania czterowejściowego itd., a naszym celem jest takie rozmieszczenie domyślnych sekwensów, żeby scalania zastąpić kopiowaniem. Wygodnie jest pierwszy przebieg wykonywać w następujący spo sób: Jeśli D ą — a , odejmij a od każdego z D \, D 2, £>3 , D ą i załóż, że wynik scalania jest na T5. Jeśli £>4 < a, scal a sekwensów z taśm od T l do T5, używając możliwie najmniejszej liczby domyślnych sekwensów na taśm ach od T l do T5, tak żeby nowe wartości £>1 , D 2, £>3 , £>4 spełniały warunki 1.
D x ^ b + c + d,
D 2 ^ b + c,
£>1 >
D
2 ^
£>s >
JD3 ^ 5, £>4 .
ZI4 = 0; (3)
310
SORTOWANIE
5.4.3
Tak więc, jeśli na początku D1 , £>2, £*3 i przyjmij, że wynik scalania znajdzie się na T4. Jeśli £>3 < 6, scal 6 sekwensów z taśm od T l do T4, zmniejszając w razie potrzeby liczbę domyślnych sekwensów, tak żeby były spełnione warunki D i ^ b + c,
D 2 ^ 5,
-D3 — 0;
D i ^ D 2 ^ D 3.
3. I tak dalej. Tabela 2 PRZYKŁAD KOLEJNYCH KROKÓW WYKONYWANYCH PODCZAS ROZRZUCANIA KASKADOWEGO
Step Step Step Step Step Step Step Step Step Step
( 1 , 1) ( 2 ,2 ) (2,1) (3,3) (3,2) (3,1) (4,4) (4,3) (4,2) (4,1)
Dodaj do T l
Dodaj do T2
9 3 9
0 12 0 2 12 0 1 2 12 0
2
3 9 1 2
3 9
Dodaj do T3 0 0 0
14 0 0 1
14 0 0
Dodaj do T4 0 0 0 0 0 0
15 0 0 0
Dodaj do T5
„Zaoszczędzono”
0 0 0 0 0 0 0 0 0 0
15 + 14 + 12 + 5 15 + 1 4 + 9 + 5 15 + 14+5 15+12 + 5 15 + 9 + 5 15 + 5 1 4+ 5 12 + 5 9+ 5 5
M etodę Fergusona rozmieszczania początkowych sekwensów na taśmach można zilustrować, rozpatrując, co dzieje się przy przejściu z poziomu 3 na poziom 4 w ( 1 ). Załóżmy, że taśm y logiczne ( T l , . , . , T5) zawierają odpowiednio (5,9,1 2 ,14,15) sekwensów i że chcemy dostać rozkład (55,50,41,29,15). Sposób postępowania został przedstawiony w tabeli 2. Najpierw umieszczamy dziewięć sekwensów na T l, potem (3 , 12 ) na T l i T 2 itd. Jeśli dane zostają wyczerpane podczas kroku, powiedzmy (3,2), to „oszczędzamy wielkość” 15 + 9 + 5, co oznacza, że dzięki um iejętnem u rozmieszczeniu domyślnych sekwensów unikamy pięciowejściowego scalania 15 sekwensów, dwuwejściowego scalania 9 sekwensów oraz jednowejściowego scalania 5 sekwensów. Innymi słowy, 15 + 9 + 5 sekwensów z poziomu 3 nie jest przetwarzanych w pierwszej fazie scalania. Poniższy algorytm jest uszczegółowieniem tego sposobu postępowania. A lg o r y tm C (Sortowanie przez scalanie kaskadowe razem ze specjalnym roz rzucaniem wstępnym). W tym algorytmie początkowe sekwensy są rozrzucane na taśmy, po jednym w danej chwili, aż wszystkie takie sekwensy zostaną roz mieszczone na taśm ach. Następnie jest wyznaczany sposób scalania taśm przy założeniu, że mamy do dyspozycji T > 3 jednostek taśmowych i wykonujemy scalenia co najwyżej (T — l)-wejściowe, unikając przy tym zbędnych scaleń
5.4.3
SCALANIE KASKADOWE
311
jednowejściowych. Taśmę T można wykorzystać jako taśm ę wejściową, ponieważ nie umieszcza się na niej żadnych początkowych sekwensów. W tym algorytmie wykorzystuje się następujące tablice: A[j ] , 1 < j < T: O statnio otrzym any doskonały rozkład kaskadowy. AA t j] , 1 < j < T: Doskonały rozkład kaskadowy, który próbujem y otrzymać. D [ j ] , 1 < j < T: Liczba domyślnych sekwensów, o których przyjmujemy, że znajdują się na jednostce taśmowej o numerze j. M[ j ] , 1 < j < T: M aksymalna liczba domyślnych sekwensów umieszczanych na jednostce taśmowej j. TAPE [ j ] , 1 < j < T: Numer fizycznej jednostki taśmowej odpowiadającej logicz nej jednostce taśmowej o numerze j . C l . [Inicjowanie] W ykonaj A[A;] AA [A:] ^— D [Ar] <— 0 dla 2 < k < T oraz A[1] 0, AA[1] <— 1, D [1] <— 1. W ykonaj TAPE [A;] k dla 1 < k < T. Na koniec wykonaj T —2 , j < — 1 ,A;<— l , / < — 0, m<— l i przejdź do kroku C5. (Takie inicjowanie zmiennych to jeden ze sposobów przejścia od razu do pętli wewnętrznej z właściwymi wartościami zmiennych sterujących). C 2 . [Początek nowego poziomu] (W łaśnie dostaliśmy pewien doskonały rozkład, a ponieważ są jeszcze sekwensy wejściowe, musimy się przygotować do przej ścia na następny poziom). Zwiększ Z o l . W ykonaj A [A;] AA [A;] dla 1 < k < T; następnie wykonaj AA [T — k] <— AA[T —k + 1] + A[A;] dla k = 1, 2, . . . , T —1 (w tej kolejności). W ykonaj (TAPE [ 1 ] TAPE [ T —l ] ) <— ( T AP E [ T- l ] , . . . , T AP E [1]) oraz D[fc] <- AA[A; + 1] dla 1 < A: < T. Na koniec wykonaj i 1. C 3. [Początek 2-tego podpoziomu] j <— i. (Zmienne i, j reprezentują „krok (i, j ) ” w przykładzie z tabeli 2). C 4. [Początek kroku (z, j)] W ykonaj A: j i m ^ A [ T - j - l ] . Jeśli m = 0 oraz i = j , to wykonaj i <— T — 2 i wróć do C3; jeśli m = 0 oraz i ^ j , to wróć do C 2 . (W artością zmiennej m jest liczba sekwensów, które m ają zostać zapisane na TAPE [A;]; m = 0 tylko wtedy, kiedy 1 = 1). C 5. [Zapisywanie na TAPE [A;] ] Zapisz jeden sekwens na taśm ę o numerze TAPE [fc] i zmniejsz D[A:] o 1. Następnie, jeśli dane wejściowe zostały wyczerpane, przewiń wszystkie taśm y i przejdź do kroku C7. C 6 . [Kolejny sekwens] Zmniejsz m o l . Jeśli m > 0, to wróć do C5. W przeciw nym razie zmniejsz A; o 1; jeśli k > 0, wykonaj m A[T —j — 1] —A[T —j ] , i jeśli m > 0, wróć do C5. W przeciwnym razie zmniejsz j o l ; jeśli j > 0, przejdź do C4. W przeciwnym razie zwiększ i o 1; jeśli i < T — 1 , to wróć do C3. W przeciwnym razie przejdź do C2. C 7. [Przygotowanie do scalania] (W tym miejscu jest już zakończone wstępne rozrzucanie sekwensów, a tablice AA, D i TAPE opisują aktualny stan taśm ). Wykonaj M[A:] <— AA [A; + 1] dla 1 < k < T. FIRST 1. (Zmienna FIRST ma niezerową wartość tylko podczas pierwszej fazy scalania).
312
SORTOWANIE
5.4.3
R y s. 75. Scalanie kaskadowe razem ze specjalnym rozrzucaniem wstępnym.
C 8 . [Kaskada] Jeśli l = 0, przerwij; sortowanie jest zakończone, a posortowany plik znajduje się na TAPE [1]. W przeciwnym razie, dla p = T - l , T - 2 , 1 (w tej kolejności) wykonaj scalanie p-wejściowe z TAPE[1], . . . , TAPE[p] na TAPE[p + 1] w sposób opisany poniżej. Jeśli p = 1, zasymuluj scalanie jednowejściowe, przewijając po prostu TAPE [2], a następnie zam ieniając TAPE[1] TAPE [2]. W przeciwnym razie, jeśli FIRST = 1 i D t p —1] = M[p—1], zasymuluj scalanie p-wejściowe, wykonując po prostu zamianę TAPE [p] <-►TAPE [p + 1], przewijając TAPE[p] i odejmując M[p—1] od każdego D [1] , . . . , D [p —1] , M[1] , . . . , M[p—1] . W przeciwnym razie odejmij M[p — 1] od każdego M[1] , . . . , M[p — 1]. Na stępnie scal po jednym sekwensie z każdej taśmy TAPE [ j] takiej, że 1 < j < p i D [j] < M[ j ] ; odejmij jeden od każdego D[j ] takiego, że 1 < j < p i D[j ] > M[j]; wynikowy sekwens zapisz na TAP E [ p + l ] . Powtarzaj powyższe, aż wyczerpie się taśm a TAPEtp] . Następnie przewiń TAPE[p] i TAPEtp + 1] * C 9 . [Jeden poziom w dół] Zmniejsz l o 1, wykonaj FIRST 0 oraz (TAPEtl] , . . . , TAPE[T]) <— (TAPE[T], . . . , TAPEtl]). (W tym miejscu wszystkie wartości D i M są równe zero i takim i już pozostaną). Wróć do C 8. | W tym algorytmie, w krokach C l - C 6 jest wykonywane wstępne rozrzucanie sekwensów, a w krokach C 7 - C 9 jest wykonywane scalanie. Te dwie części są od siebie w pełni niezależne i jest możliwe przechowywanie M[k] i AA tfc + 1] w tych samych miejscach pamięci.
5.4.3
SCALANIE KASKADOWE
313
A n a liz a s c a la n ia k ask ad o w eg o . Scalanie kaskadowe jest trochę trudniejsze do analizy niż scalanie wielofazowe, jednak analiza w tym przypadku jest szczególnie interesująca, ponieważ pojawia się w niej wiele ciekawych tożsamości. Czytelni ków, których interesuje m atem atyka dyskretna, usilnie nakłaniamy, żeby przed dalszym czytaniem sami zbadali rozkład kaskadowy, ponieważ pojaw iające się w nim liczby m ają nadzwyczajne własności, których odkrywanie sprawia wiele przyjemności. Tutaj omówimy jeden z wielu sposobów przeprowadzenia takiej analizy, kładąc nacisk na sposób dochodzenia do końcowych wyników. Dla wygody rozważmy przypadek sześciu taśm i poszukajmy zależności, które uogólniają się na wszystkie T. Na podstawie zależności (i) otrzymujemy pierwszy, podstawowy układ równań: dn
Un
=
bn —an en_i = &7i
^ n —2
=
( o ) ^ n (2 )
—2 >
~
( o) ^n ( 2)
—
~
(q ) d n
bn dn 1 &n —2
bn —2
(4 )
(4) ^n —4?
dn ~ C-n Cn—1 Cn
Cji
& n —2 ^ n —2
dn
1
dn
^ n —2
^ n —2
—2^ n —2
d n —2
Niech A (z) =
—
dn
( 2 ) & n —2 “f ( 4 ) d n —4
(2) d n —
, E (z) =
( 4)
( g ) ^ n —6 )
4 ( g ) d n ^Q~\~ ( g )
8•
e^ n i zdefiniujmy wielomiany
- w - ( b -r J +1) ' , + r ; v - = £ ( “ I ' ) ( - » * * “ = E ( 2” “ k
(5)
k~ 0
Zależności ( 4 ) można wyrazić, mówiąc, że funkcje tworzące B {z) — q i( z ) A ( z ), C{z) — q2 {z)A(z), D(z) - q${z)A{z) i E (z) — q^{z)A{z) redukują się do sum skończonych, odpowiadających wartościom a_i, a _ 2, a _ 3 , . . . , które pojaw iają się w ( 4 ) dla małych n, ale nie występują w A (z). Żeby dostać warunki brzegowe, rozważmy powyższe równania wstecz do poziomów ujemnych, aż osiągniemy poziom —8: n d>n bn dn dn dn
-3 -4 -5
1 0 1 0 2 0
0 0 -1 0
-6
5
-7 -8
0 -1 -2
0 0 0 0 1 1
0 0 0 -1 0
0 1 0 2 0
-4
5
-9
5
-1
0
0
-1
-2 8
-1 4 -7
14
14
6 20
-3 0
1
314
5.4.3
SORTOWANIE
(Dla siedmiu taśm taka tabela wyglądałaby podobnie, tylko elementy dla niepa rzystych n byłyby przesunięte o jedną kolumnę w prawo). W informatyce ciąg ao, a _ 2, a _ 4, .. . — 1 , 1 , 2 , 5 , 1 4 , . . . często jest spotykany, ponieważ pojawia się w związku z wieloma algorytmam i rekurencyjnymi (zobacz dla przykładu ćwiczenie 2.2.1-4 i równanie 2 .3 .4 .4- ( i 4 )). Z tego powodu uprawniona jest hipoteza, że dla T taśm dla 0 < n < T - 2;
(6 )
dla 0 < n < T —3.
a - 2n - l = 0
Żeby sprawdzić, że nasza hipoteza jest prawdziwa, wystarczy pokazać, że (6) i ( 4 ) gw arantują poprawne wyniki dla poziomów 0 i 1. Dla poziomu 1 to jest oczywiste, natom iast dla poziomu 0 musimy sprawdzić, że
(7) dla 0 < m < T — 2 . Szczęśliwie taką sumę można obliczyć za pomocą standar dowych technik; to jest tak naprawdę przykład 2 z punktu 1 .2 .6 . Teraz możemy policzyć współczynniki wielomianu B (z) —q i(z)A (z) itd. Dla przykładu rozważmy współczynnik przy z 2m w D (z) — q^{z)A{z). Z przykładu 3 z punktu 1 .2.6 wiemy, że jest on równy
£( k^O
3+ m + k 2m -h 2 k
m+fc
y , / 3 + m + fc\ / 2 k \ ( - l ) m+ k k> 0
\ 2m + 2 k ) \ k )
k+1
Dlatego wnioskujemy, że A (z) = q0 (z ) A ( z ), B ( z ) = q1 (z)A (z) - q0 {z),
C (z) = q2 {z)A(z) - qx(z),
D (z ) = Q3 (z)a (z) -
E (z) = qA{z)A{z) - q3 {z).
(8)
Ponadto mamy, że en+i = a n ; stąd zA (z) ~ E (z) i M z ) =
(9)
W ten sposób rozważane funkcje tworzące zostały przedstawione w zależno ści od q i z tego powodu chcielibyśmy funkcje q lepiej poznać. Z tego względu ćwiczenie 1.2.9-15 jest użyteczne, ponieważ otrzymujemy w nim pewną zamknię tą postać ą, którą można zapisać następująco:
5.4.3
SCALANIE KASKADOWE
315
„ M _ ((V4 — z 2 + i z ) / 2 ) 2m+1 + ((V 4 — z 2 — i z ) / 2 ) 2m+1 ■
qm(Z)
-
.
( 1 0 )
Wszystko upraszcza się, jeśli teraz weźmiemy z = 2 sin 0: qm\* sm 0) =
(co s0 + i s i n 0)2m+1 + (cos 0 —¿ sin 0)2m+1 __ cos( 2m ± l )0
-
-
=
2 cos 0
-
.
( ^ (11)
cos 0 (Ten związek budzi podejrzenie, że wielomian qm (z) jest dobrze znany m atem a tykom. Faktycznie, jedno przejrzenie dobrych tablic m atem atycznych pozwala stwierdzić, że qm (z) jest w rzeczywistości wielomianem Czebyszewa drugiego rodzaju, czyli wielomianem (—l ) mE/2m( ^ / 2) w przyjmowanej zazwyczaj notacji). Możemy teraz wyznaczyć pierwiastki mianownika z (9). Równanie g4(2 s in 0) = 2 sin 6 redukuje się do cos 90 = 2 sin 0 cos 0 = sin 20. To równanie m a rozwiązanie, gdy ±90 = 20 + ( 2 n —| ) 7r. Każde takie 0 wyznacza pierwiastek mianownika w (9) pod warunkiem, że cos0 / 0. (Dla cos0 = 0, gm(±2) — (2m + 1 ) nigdy nie jest równe ± 2). W ten sposób dostajem y następu jących osiem różnych pierwiastków równania q^(z) —z = 0: 2 sin
2 sin
2 sin ^ 7r; 2 sin ^ 7r, 2 sin ^ 7r, 2 sin ¿ 7r, 2 sin 7^ 7r, 2 sin
r.
Ponieważ q^(z) jest wielomianem stopnia 8 , zatem są to wszystkie pierwiastki. Dla pierwszych trzech pierwiastków q$(z) = 0, tak więc w rozkładzie na czynniki #3 (z) i #4(2 ) —z m ają wspólny wielomian stopnia 3. Pozostałych pięć pierwiast ków wpływa na asymptotyczne zachowanie się współczynników w A (z), jeśli (9 ) rozłożymy na ułam ki proste. W ogólnym przypadku T taśm , niech Ok = (4k + l ) 7r / ( 4T - 2). Funkcja tworząca A (z) dla liczb w T-taśmowym rozkładzie kaskadowym przyjmuje postać A E 2T
- 1
cq s2
^
—T / 2 < k < [ T / 2J
/
0 fc) ,A 11 -- zW/ (i 92 ss in in0 K}
/V
(zobacz ćwiczenie 8); stąd
“»=25^1 E
-T /2 < fc< |T /2 j
«"’"‘Gdiii) ■ V
(13)
K/
Z (8) dostajemy teraz podobne wzory bn =
C-n. —
_ 2T-1
2T — 1
*. =2f^r
V —T / 2 < k < [ T / 2 \
cos 9k cos 30^ ( • ^ ■ * \2sin0fc x
COS
—T / 2 < k < [ T / 2J
E
-T/2
K
0k c o s 59k ( * ) \ 2 sin 0k x
cos«‘“sTO‘(drfc v
'
,
( 14 )
v
316
SORTOWANIE
5.4.3
i tak dalej. W ćwiczeniu 9 pokazujemy, że te równości zachodzą dla wszystkich n > 0, a nie tylko dla dużych n. W każdej sumie składnik dla k = 0 dominuje nad wszystkimi innymi, w szczególności dla dostatecznie dużych n. Dlatego „współczynnik wzrostu” wynosi 1 2^
2 = ^ T ^
1
7T
/ __9N
+ 48T + ° ( T ~
x (l5 )
Sortowanie kaskadowe zostało po raz pierwszy zanalizowane przez W. C. C artera [Proc. IFIP Congress (1962), 62 66], który przedstawił wyniki liczbowe dla małych T, oraz przez Davida E. Fergusona [zobacz C A C M 7 (1964), 297], który podał dwa pierwsze składniki we wzorze na współczynnik wzrostu ( 15 ). W lecie 1964 roku R. W. Floyd odkrył jaw ną postać współczynnika wzrostu 1/(2 sin 0o)» co pozwoliło na stosowanie dokładnych wzorów dla wszystkich T. Głęboką analizę liczb kaskadowych przeprowadził niezależnie G. N. Raney [Canadian J . Math. 18 (1966), 332-349], który napotkał na nie w sytuacji nie ma jącej nic wspólnego z sortowaniem. Raney zauważył związek liczb kaskadowych z przekątnym i (rysunek 73) i odkrył kilka innych własności tych liczb. W swoich dowodach Floyd i Raney wykorzystywali operacje na macierzach (zobacz ćwicze nie 6 ). M o d y fik a c je s o rto w a n ia k ask ad o w eg o . Jeśli dodamy jedną taśmę więcej, wszystkie przewijania można wykonywać podczas sortowania kaskadowego. Na przykład możemy scalać T 1 - T 5 na T7, potem T 1 - T 4 na T 6 , następnie T 1 - T 3 na T5 (która jest już przewinięta), potem T l - T 2 na T4. Następny przebieg moż na rozpocząć zaraz po przewinięciu stosunkowo niewielu danych na T4. Efektyw ność zachowania się tego procesu można ocenić na podstawie przeprowadzonej analizy sortowania kaskadowego. (Więcej informacji na ten tem at znajdziemy w punkcie 5.4.6). Schemat „scalania kompromisowego” , który łączy w sobie wielofazowość i kaskadowość jako szczególne przypadki, został zaproponowany przez D. E. K nutha w C A C M 6 (1963), 585-587. K ażda faza składa się ze scalania (T — l)-wejściowego, (T — 2)-wejściowego, . . . , P-wejściowego, gdzie P jest dowolną ustaloną liczbą z przedziału od 1 do T —1 . Dla P = T — 1 dostajemy sortowanie wielofazowe, a dla P — 1 mamy czyste sortowanie kaskadowe. Gdy P = 2, otrzym ujem y sortowanie kaskadowe bez faz kopiowania. Omawiany schemat prze analizowali C. E. Radke [IBM Systems J. 5 (1966), 226-247] i W. H. Burge [Proc. IFIP Congress (1971), 1 , 454-459]. Burge, uogólniając równanie 5.4.2-(i6), znalazł funkcję tworzącą Y ^ T n {x)zn dla każdego scalania kompromisowego z pa ram etram i (P ,T ). Pokazał też, że dla T = (3, 4, 5, 6, 7, 8, 9, 10, 11) najlepszymi wartościami P , z punktu widzenia najmniejszej liczby przetwarzanych począt kowych sekwensów jako funkcji S przy S —►do (przy prostym schemacie rozrzu cania i zaniedbaniu czasu przewijania), są odpowiednio (2,3,3, 4, 4, 4, 3, 3, 4). Te wartości P , przy rosnącym T, są bliższe sortowaniu kaskadowemu niż sortowaniu wielofazowemu. Okazuje się, że scalanie kompromisowe nigdy nie jest istotnie lepsze niż czyste scalanie kaskadowe. Z drugiej strony, przy optymalnym wyborze poziomów i przy optym alnym rozmieszczeniu domyślnych sekwensów, tak jak to
SCALANIE KASKADOWE
5.4.3
317
zostało opisane w punkcie 5.4.2, czysta wielofazowość wydaje się lepsza od każ dego scalania kompromisowego. Niestety optymalne rozmieszczanie domyślnych sekwensów jest stosunkowo trudne w implementacji. Th. L. Johnsen [B I T 6 (1966), 129-143] badał połączenie scalania zrówno ważonego i wielofazowego. Odm iana scalania zrównoważonego, uwzględniająca wykonywanie przewijania w czasie scalania, została zaproponowana przez M, A. Goetza [Digital Computer User’s Handbook, red. M. Klerer, G. A. Korn (New York: McGraw-Hill, 1967), 1.311-1.312]. Można sobie również wyobrazić wiele innych schematów hybrydowych. ĆW ICZENIA [10] Korzystając z tabeli 1 , porównaj scalanie kaskadowe ze scalaniem wielofa zowym w wersji z podziałem taśm opisanej w punkcie 5.4.2. Które z nich jest lepsze? (Zignoruj czas przewijania). 1.
► 2 . [22] Porównaj sortowanie kaskadowe na trzech taśmach za pomocą algorytmu C z sortowaniem wielofazowym na trzech taśmach za pomocą algorytmu 5.4.2 D. Jakie podobieństwa i różnice jesteś w stanie wskazać? 3. [23] Ułóż tabelę, która ukaże, co dzieje się, gdy zastosujemy algorytm C do posortowania 100 początkowych sekwensów za pomocą sześciu taśm. 4. [M20] (G. N. Raney) „Rozkładem kaskadowym na poziomie n” nazywamy multizbiór zdefiniowany (w przypadku sześciu taśm) jak następuje: { 1 , 0 , 0 , 0 , 0 } jest roz kładem kaskadowym na poziomie 0 ; jeśli {a, b1c, d, e} jest rozkładem kaskadowym na poziomie n, to rozkładem kaskadowym na poziomie n + 1 będzie (a-j-5 + c + d-l-e, a + b+ c + d, a + fc+ c, a + 6 , a}. (Multizbiór jest zbiorem nieuporządkowanym, dlatego z jednego rozkładu na poziomie n można dostać do 5! różnych rozkładów na poziomie n + 1 ). a) Udowodnij, że każdy multizbiór {a, 6 , c, d, e} liczb względnie pierwszych jest roz kładem kaskadowym na poziomie n dla pewnego n. b) Udowodnij, iż rozkład zdefiniowany dla sortowania kaskadowego jest optymalny w takim znaczeniu, że jeśli {a, b, c, d, e} jest rozkładem na poziomie n z a ^ b ^ c ^ d ^ e, to a ^ Un, b ^ bn, c ^ Cj%, d ^ d^, e iC e^, gdzie ((Xn, bn, Cn, d n , 6^) j®st rozkładem zdefiniowanym w (i). ► 5. [20] Udowodnij, że liczby kaskadowe zdefiniowane w (i) spełniają równanie Ok&n—k ± bkbn~~k
CfcCn—k
dkdn—k ± o-ke-n-k = an
dla 0 O
^ ri.
[Wskazówka: Dokonaj interpretacji tej zależności, rozważając, ile sekwensów o różnych długościach powstaje podczas k -tego przebiegu pełnego sortowania kaskadowego]. 6 . [M20] Znajdź macierz Q o wymiarach 5 x 5 i taką, że dla każdego n ^ 0, pierwszy wiersz macierzy Q n zawiera sześciotaśmowe numery kaskadowe an bn cn dn en .
7. [M20] Wiemy, że scalanie kaskadowe zastosowano do doskonałego rozmieszczenia an początkowych sekwensów. Podaj wzór określający, ile zaoszczędzimy na przetwarza niu początkowych sekwensów, gdy nie będziemy wykonywać scaleń jednowejściowych. 8 . [HM23] Wyprowadź ( 12). 9. [HM26] Wyprowadź ( 14 ). ►1 0 . [M28] Zamiast rozpoczynać badanie liczb kaskadowych od układu (4 ), rozpocz nijmy od następujących równań:
318
SORTOWANIE
5.4.3
€n — Cln —l dn — 2(ln^ i
C-n—2
Cn — 3(Xn—1
dn —2
=
2 C n ~2
=
— 1
(
1)
&n— l
(
3)
3 ?
(
3)
3
(
5)
—
5
itd. Przyjmując, że
wyraź A ( z ), B ( z ) itd. w zależności od tak zdefiniowanych wielomianów r. 1 1 . [M38\ Niech
Udowodnij, że dla T-taśmowych liczb kaskadowych funkcja tworząca A(z) jest równa f r - 3 ( z ) / f T ~ i { z ) , gdzie licznik i mianownik w tym wyrażeniu mają wspólny czynnik. 1 2 . [MĄ0\ Udowodnij, iż schemat rozrzucania Fergusona jest optymalny w takim znaczeniu, że żadna metoda rozmieszczania domyślnych sekwensów, spełniająca ( 2 ), nie spowoduje przetworzenia w czasie pierwszego przebiegu mniejszej liczby początkowych sekwensów, jeżeli tylko w tym przebiegu zastosujemy strategię z kroków C 7-C 9.
13. [Ą0\ W głównym tekście zaproponowano dodanie dodatkowej taśmy, żeby więk szość przewijania można było wykonywać podczas scalania. Rozwiń ten pomysł. (Na przykład schemat opisany w głównym tekście wymaga czekania na przewinięcie taśmy T4; czy nie byłoby lepiej ominąć T4 w pierwszej fazie scalania następnego przebiegu?),
*5.4.4, Odczytywanie taśmy wstecz
Dla wielu jednostek taśmowych istnieje możliwość odczytywania taśm w kierunku przeciwnym do tego, w którym były zapisywane. W dotychczasowych schematach scalania informacja na taśmie była zawsze zapisywana „w przód” , następnie taśm a była przewijana, odczytywana w przód i ponownie przewijana. W ten sposób pliki taśmowe zachowują się jak kolejki typu „pierwszy wchodzi, pierwszy wychodzi” . Czytanie wstecz umożliwia wyeliminowanie obu operacji przewijania. Taśma jest zapisywana w przód i odczytywana wstecz. W tym przypadku taśmy zachowują się jak stosy, ponieważ korzysta się z nich w sposób typu „ostatni wchodzi, pierwszy wychodzi” . Każdy ze schematów, zrównoważony, wielofazowy i kaskadowy można za adaptować do sytuacji, w której jest możliwy odczyt wstecz. Główna różnica polega na tym, że kiedy czytam y wstecz i zapisujemy w przód, scalanie powoduje odwrócenie kolejności elementów w sekwensach. Jeśli dwa sekwensy są uporząd kowane rosnąco, to możemy je scalić podczas czytania wstecz, ale w wyniku dostaniemy sekwens uporządkowany malejąco. Otrzym ane w ten sposób malejące sekwensy w kolejnym przebiegu staną się rosnącymi. Zatem algorytmy scalania powinny radzić sobie z sekwensami uporządkowanymi w każdym kierunku. Pro gramiści, którzy pierwszy raz napotykają na możliwość czytania wstecz, często czują się jak gdyby stanęli na głowach! Jako przykład wykorzystania odczytu wstecz rozważmy proces sortowania 8 początkowych sekwensów za pomocą scalania zrównoważonego na czterech taśm ach. Operacje wykonywane na taśm ach można przedstawić w następujący sposób:
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
Tl Przebieg Przebieg Przebieg Przebieg
T2
1 A \A iA \A i
2 3 4
T3
T4
A \A iA \A i D 2D 2 D 2D 2 Aą ~ D$ -
A*
319
Rozmieszczenie początkowe Scalanie na T3 i T4 Scalanie na T l i T2 Końcowe scalanie na T3
Tutaj A r oznacza jeden sekwens o względnej długości r, który na taśm ie jest za pisany rosnąco (przy czytaniu w przód); D r oznacza sekwens malejący o długości r. W przebiegu 2 sekwensy rosnące stają się malejącymi. Na wejściu pojaw iają się jako malejące, ponieważ taśm y T l i T2 są odczytywane wstecz. Następnie w przebiegu 3 orientacja sekwensów ponownie się zmienia. Zauważmy, że wynikiem powyższego procesu jest uporządkowany malejąco plik na taśmie T3. Jeśli to nie jest pożądane (zależnie od tego, czy taśm a z plikiem wynikowym ma być odczytywana wstecz, czy też zdemontowana i zachowana do dalszego użycia), można taką taśm ę skopiować na inną, odwracając jej zawartość. Szybszy sposób polegałby na przewinięciu T l i T2 po wykonaniu przebiegu 3, w wyniku czego w-przebiegu 4 dostalibyśmy A$. Jeszcze szybciej byłoby rozpocząć od ośmiu malejących sekwensów w przebiegu 1 , ponieważ w ten sposób zamienilibyśmy wszystkie A na D. Jednakże scalanie zrównoważone dla 16 po czątkowych sekwensów wymaga, żeby początkowe sekwensy były uporządkowane rosnąco, a zazwyczaj nie wiemy z góry, ile początkowych sekwensów zostanie utworzonych. Tak więc jest konieczne, żeby wybrać jeden ustalony kierunek. Dlatego pomysł z przewijaniem po przebiegu 3 jest prawdopodobnie najlepszy. Scalanie kaskadowe wykonuje się w ten sam sposób. Dla przykładu rozważmy sortowanie 14 początkowych sekwensów na czterech taśmach: Przebieg Przebieg Przebieg Przebieg
1
2 3 4
Tl
T2
A i A i A i A \ A \ A i
A \ A i A i A i A i
-
D i
Aq
A
—
-
5
T4
T3 A
-
1 A 1A 1 D
2D 2 A -
3
D
3D 3D 3 D
14
Znowu moglibyśmy dostać A \ ą zamiast £>14, jeśli przewinęlibyśmy T l, T2, T3 bezpośrednio przed ostatnim przebiegiem. W tej tabeli przedstawiono „czyste” scalanie kaskadowe, w takim znaczeniu, że wszystkie scalania jednowejściowe zostają jawnie wykonane. Jeśli jednak zabronilibyśmy wykonywania operacji ko piowania, jak w algorytmie 5.4.3C, to po wykonaniu przebiegu 2 napotkalibyśm y na sytuację A\ — D 2D 2 D%D$ D 3 w której kontynuowanie algorytmu z użyciem scalania trzywejściowego byłoby niemożliwe, ponieważ nie można scalać sekwensów uporządkowanych w prze ciwnych kierunkach! Operacji kopiowania T l na T2 można by uniknąć, jeśli przewinęlibyśmy T l tak, żeby w następnej fazie (podczas odczytywania T3 i T4 wstecz) czytać ją w przód. Jednak wówczas T l należałoby przewinąć ponownie po wykonaniu scalania, tak więc ta sztuczka kosztuje nas jedno kopiowanie na dwie operacje przewijania.
320
SORTOWANIE
5.4.4
W ynika stąd, że m etoda rozmieszczania sekwensów z algorytmu 5.4.3C nie jest tak samo efektywna dla odczytów wstecz jak dla odczytów w przód; czas działania gwałtownie skacze za każdym razem, gdy liczba początkowych sekwen sów przekracza liczbę sekwensów w „doskonałym” rozkładzie kaskadowym. W ce lu gładkiego przechodzenia między doskonałymi rozkładam i można zastosować inne techniki rozmieszczania sekwensów (zobacz ćwiczenie 17). W ielo fa zo w o ść z c z y ta n ie m w ste c z . Przy pierwszym podejściu (a także przy drugim i trzecim) wydaje się, że schemat scalania wielofazowego zupełnie nie pasuje do czytania wstecz. Załóżmy dla przykładu, że mamy 13 początkowych sekwensów i trzy taśmy: Tl Faza 1 Faza 2
A 1 A xA i A 1A i —
T2 A iA iA iA iA iA iA 1A 1 A \A \A \
T3 D 2D 2D 2D 2D 2
Teraz mamy kłopot. Moglibyśmy przewinąć albo T2, albo T3, a następnie czytać ją w przód, podczas gdy pozostałe taśm y czytalibyśmy wstecz. Ale to tylko naro biłoby zamieszania przy stosunkowo niewielkim zysku wynikającym z możliwości czytania wstecz. Pomysłem na uratowanie tej sytuacji jest rozmieszczenie na każdej taśmie na przemian sekwensów uporządkowanych w przeciwnych kierunkach. Wówczas scalanie można doskonale zsynchronizować: Tl Faza Faza Faza Faza Faza Faza
1 2 3 4 5 6
A \D \A \D \A \ —
A3 .D3 .A3 A3 A 13
T2 D \A \D \A \D \A \D \A \ D \A \D \
— D 5A 5 D5
T3 — D 2 A 2D 2 A 2D 2 D 2A 2 D8
Ta m etoda sortowania została zasygnalizowana przez R. L. Gilstada w jego artykule o scalaniu wielofazowym i w pełni opisana w C A C M 6 (1963), 220-223. Technika typu A D A . . . stosuje się do scalania wielofazowego dla dowolnej liczby taśm . Można pokazać, iż w każdej fazie scalanie sekwensów A i D będzie zsynchronizowane, pod warunkiem że w fazie wstępnego rozrzucania na każdej taśm ie pojaw ią się na przem ian sekwensy A i D, a na końcu każdej taśmy znajdzie się A (lub na końcu każdej taśm y znajdzie się D ): ponieważ w jednej fazie ostatni sekwens zapisywany do pliku wyjściowego jest uporządkowany odwrotnie do ostatnio używanych sekwensów z plików wejściowych, sekwensy wykorzystywane w kolejnej fazie są zawsze uporządkowane w dobrym kierunku. W dodatku przekonaliśmy się w ćwiczeniu 5.4.2-13, że w większości doskonałych rozkładów Fibonacciego wymaga się umieszczenia nieparzystej liczby sekwensów na jednej taśm ie (taśmie z końcowym wynikiem) i parzystej liczby sekwensów na każdej z pozostałych taśm . Z tego powodu, jeśli taśm ą wynikową m a być T l, możemy zagwarantować, żeby wszystkie taśm y kończyły się sekwensami A, gdy tylko na
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
321
początku T l umieścimy sekwens A, a na początku każdej innej taśm y sekwens D. Do tego celu można wykorzystać m etodę rozrzucania z algorytm u 5.4.2D zmodyfikowaną w taki sposób, żeby w rozkładzie na każdym poziomie T l była docelową taśm ą wynikową. (Pomijamy poziomy 1 , T + l , 2 T + 1 , , . . , ponieważ dla nich docelową taśm ą wynikową jest taśm a, która na początku jest pusta). Dla przykładu, w przypadku sześciu taśm , w miejsce 5.4.2-(i) można skorzystać z poniższych rozkładów: Końcowy wynik Poziom Tl T2 T4 Razem znajdzie T5 T3 0 2
1 1
0 2
0 2
0 2
3 4 5
3 7 15 31 61
4
4
4
8
8
4
16 30
14 28 116
6 12
24 108
16 92
6 8
120
0 2 2 8
1
9 17 33 65 129 497
Tl Tl Tl Tl Tl Tl Tl
Zatem liczba sekwensów na T l będzie zawsze nieparzysta, podczas gdy liczby sekwensów na taśm ach od T 2 do T5 będą parzyste i uporządkowane nierosnąco; umożliwia to wygodne rozmieszczenie domyślnych sekwensów. Takie rozmiesz czenie sekwensów m a tę przewagę, że taśm a wynikowa jest znana z góry, niezależ nie od liczby początkowych sekwensów. Okazuje się także, że przy zastosowaniu tego schematu plik wynikowy pojawi się na T l zawsze w porządku niemałejącym (zobacz ćwiczenie 3). Inny sposób rozmieszczania sekwensów w sortowaniu wielofazowym z czyta niem wstecz został zaproponowany przez D. T. Goodwina i J. L. Venna [CACM 7 (1964), 315]. Możemy rozmieścić sekwensy prawie tak samo jak w algorytmie 5.4.2D, rozpoczynając na każdej taśmie od sekwensu D. Jeśli po wyczerpaniu danych wejściowych nie na wszystkich taśm ach mamy nieparzyste liczby se kwensów, wyobrażamy sobie, że na początku tylko jednej „nieparzystej” taśm y znajduje się domyślny sekwens A . Inne domyślne sekwensy umieszczamy (w wy obraźni) na końcach taśm lub grupujemy param i w środku. Problem optymalnego rozmieszczenia domyślnych sekwensów analizujemy poniżej w ćwiczeniu 5 . O p ty m a ln e s c h e m a ty sc a la n ia . Jak dotąd omówiliśmy kilka m etod scalania na taśmach, nie pytając o m etody „najlepsze z możliwych” . Okazuje się, że znalezienie optymalnych schematów jest dość trudne, szczególnie dla przypadku z czytaniem w przód, gdzie interakcja czasu przewijania z czasem scalania jest trudna do analizy. Z drugiej strony, gdy scalanie wykonujemy, czytając wstecz i zapisując w przód, przewijanie jest wyeliminowane i można całkiem dobrze scharakteryzować scalanie optymalne. Richard M. K arp zastosował bardzo inte resujące podejście do rozwiązania tego problemu i resztę tego punktu poświęcimy na omówienie zaproponowanej przez niego teorii. Po pierwsze potrzebujem y lepszego opisu schematów scalania zam iast opisów za pomocą dość tajemniczych tabel z zawartością taśm , z których korzystaliśmy powyżej. Karp zaproponował, żeby do opisu schematów scalania stosować repre
322
5.4.4
SORTOWANIE
zentację wektorową lub reprezentację drzewiastą. Obie reprezentacje są użyteczne w praktyce i dlatego opiszemy je po kolei. Reprezentacja wektorowa schem atu scalania to ciąg „wektorów scalania” y(m) y{i) y{o)^ z których każdy zawiera T składowych. W ektor reprezentuje w następujący sposób i-ty od końca krok w scalaniu: {
0,
+ 1,
jeśli taśm a o jeśli taśm a o
—1 ,
jeśli
numerze j jest taśm ą wejściową w tym scalaniu; numerze j nie jest używana w tym scalaniu;(2)
taśm a o
numerze j jest wyjściową w tym scalaniu.
Tak więc dokładnie jedna składowa jest równa —1 , a pozostałymi składowymi są zera i jedynki. O statni wektor y ^ jest szczególny; jest to wektor jednostkowy z jedynką na pozycji j , jeśli posortowany plik wynikowy znajduje się na taśmie o numerze j , i zerami na pozostałych pozycjach. Z tych definicji wynika, że suma wektorów „W = y(i) + y ( i - 1) + . . . + „(0) (3) odpowiada rozkładowi sekwensów na taśm ach, tuż przed i-tym od końca krokiem scalania, gdzie jest liczbą sekwensów na taśmie j . W szczególności mówi, ile sekwensów znajdzie się na każdej taśm ie po wstępnym rozrzuceniu. Może wydawać się faktem zaskakującym, że wektory ustawiamy od końca z y(m^ jako pierwszym i y ^ jako ostatnim , jednak ten punkt widzenia okazuje się być wygodny dla rozwijanej przez nas teorii. Jeden z dobrych sposobów po szukiwania optymalnej m etody scalania polega na rozpoczęciu od posortowanego pliku wyjściowego i wyobrażeniu sobie „rozscalenia” go na szereg taśm, następnie rozscalaniu tych taśm itd. i rozważeniu kolejnych rozkładów v ^2\ .. . w porządku odwrotnym do tego z rzeczywistego procesu scalania. Tak na prawdę jest to dokładnie takie samo podejście, jakie zastosowaliśmy w analizie scalania wielofazowego i kaskadowego. Trzy schematy scalania opisane wcześniej za pomocą tabel m ają następujące reprezentacje wektorowe: Wielofazowy Kaskadowy Zrównoważony (T = 3, S = 13) (T = 4, S = 14) (T = 4, S = 8 ) «(10) = ( 6 , 5, 3, y<10) = ( + i , + i , + i , y(9> = ( + i , + i . + i , y(8) = ( + l , + l , + l , -
y<7> = ( + l , + l , - l , yW = ( + l , + l )- l , 3/(5) = ( + 1 , - 1 ,
0,
0) 1) 1) 1) 0) 0) 0)
O
O
O
y =(-i,+i,+i,+i) v<3> = ( 0 , —1 , + 1 , + 1 ) y W = ( 0 , 0 , - 1 , + 1) = ( + l , + l , + l , - 1) II
0) ( + 1 , + 1 , —1 , 0 ) ( + 1, + 1, 0 , - 1) ( + 1 , + 1 , —1 , 0 ) ( + 1 , + 1 , 0 , - 1) ( - 1 , 0 , + 1 , + 1) ( 0 , —1 , + 1 , + 1) ( + l , + l , - l , 0) ( 0 , 0 , 1, 0 )
O
y(1) = y(0) =
O
II
vm ym = y(6) = „(5) = yW = yO) = y(2) =
1)
„(«) = V(12) = y(u) = y( 1°) = y(9) = y(8) =
( 5 , 8, 0) ( + 1 , + 1 , —1) ( + 1 , + 1 , —1 ) ( + 1 , + 1 , —1 ) ( + 1 , + 1 , —1 ) ( + 1 , + 1 , —1) y(7) = ( - 1 , + 1, + 1) y(6) = (—1 , + 1 , + 1 )
y(5) y(4) y(3) y<2) y(1)
= (-l,+l,+l) = ( + 1 , —1 , + 1) = ( + 1 , —1 , + 1 ) = ( + 1 , + 1 , —1 )
= (-l,+l,+l)
y(0) = ( 1 ,
0,
0)
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
323
Oczywiście każdy schemat scalania m a reprezentację wektorową. Na odwrót, łatwo można zobaczyć, że ciąg wektorów y ... y ^ odpowiada pewnemu schematowi scalania wtedy i tylko wtedy, gdy są spełnione następujące trzy warunki: i) j/(°) jest wektorem jednostkowym. ii) Dokładnie jedna składowa 0 lub + 1 dla m > i > 1 . iii) Wszystkie składowe
jest równa —1, a pozostałe składowe są równe
+ ■• *+ y ^ + y ^ są nieujemne dla m > i > 1 .
Reprezentacja drzewiasta schem atu scalania to inny sposób przedstawie nia tej samej informacji. Tworzymy drzewo zawierające dokładnie jeden węzeł zewnętrzny dla każdego sekwensu początkowego i jeden węzeł wewnętrzny dla każdego sekwensu powstałego w wyniku scalania sekwensów znajdujących się w węzłach-potomkach. Każdy węzeł wewnętrzny ma etykietę będącą numerem kroku scalania, w którym sekwens odpowiadający tem u węzłowi zostaje sformo wany, przy założeniu numeracji wstecz, podobnie jak w reprezentacji wektorowej. Dodatkowo każdej krawędzi prowadzącej z danego węzła do góry przypisujemy identyfikator taśmy, z której pochodzi sekwens w tym węźle. Dla przykładu, na rysunku 76 przedstawiono reprezentacje drzewiaste trzech wspomnianych schematów scalania, przy założeniu, że identyfikatorami taśm są A, B , C, D zamiast T l, T 2 , T3, T4. Przy takiej reprezentacji można łatwo dostrzec wiele ważnych własności schematów scalania. Dla przykładu, jeśli sekwens z poziomu 0 jest uporządkowa ny niemalejąco, to sekwensy na poziomie 1 muszą być uporządkowane nierosnąco, a te na poziomie 2 niemalejąco itd. Początkowy sekwens jest uporządkowany niemalejąco wtedy i tylko wtedy, gdy odpowiadający mu węzeł zewnętrzny jest na poziomie parzystym. Ponadto, ogólna liczba początkowych sekwensów prze twarzanych w całym procesie scalania jest równa długości ścieżki zewnętrznej w drzewie, ponieważ każdy początkowy sekwens z poziomu k jest przetwarzany dokładnie k razy. Każdy schemat sortowania m a swoją reprezentację drzewiastą, ale nie każ de poetykietowane drzewo definiuje schemat scalania. Drzewo, którego węzły wewnętrzne są ponumerowane od 1 do m, a krawędzie są poetykietowane nazwa mi taśm, reprezentuje poprawny schemat sortowania z czytaniem wstecz wtedy i tylko wtedy, gdy: a) żadne dwie krawędzie incydentne z tym samy węzłem wewnętrznym nie m ają takiej samej etykiety (nazwy taśmy); b) jeśli i > j i jeśli A jest nazwą pewnej taśmy, to w drzewie nie istnieje konfiguracja
© 4
d)
;
324
SORTOWANIE
5.4.4
Zrównoważony (T = 4, S = 8)
B
A
Wielofazowy (T = 3, 5 = 13) a
\
R ys. 76. Reprezentacje drzewiaste trzech schematów scalania. c) jeśli i < j < k < l i jeśli A jest nazwą taśmy, w drzewie nie występują jednocześnie
0 zarowno
0
A
iA
©
®
lub
zarowno
© 0
A
iA
(4)
W arunek (a) tłum aczy się sam, ponieważ taśm y wejściowe i wyjściowe muszą być różne; podobnie (b) jest oczywisty. W arunek (c), „o braku przecięć” , odzwier ciedla ograniczenie, które charakteryzuje odczytywanie taśm y wstecz (ostatni wchodzi, pierwszy wychodzi): Sekwens sformowany w kroku k musi zostać usu nięty, zanim dowolny inny sekwens zostanie sformowany na tej samej taśmie, a zatem konfiguracje z (4 ) nie są możliwe. Nietrudno sprawdzić, że dowolne po etykietowane drzewo, które spełnia warunki (a), (b), (c), rzeczywiście odpowiada pewnemu schematowi scalania z czytaniem wstecz.
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
325
Jeśli mamy do dyspozycji T jednostek taśmowych, to z warunku (a) wynika, że stopień każdego węzła wewnętrznego jest nie większy niż T — 1. Nie każde drzewo o tej własności można poetykietować w wymagany przez nas sposób. Na przykład dla T = 3 nie istnieje schemat scalania, którego drzewo miałoby postać
(5)
Takie drzewo dawałoby optymalny schemat scalania, jeśli tylko potrafilibyśmy poetykietować je w żądany sposób, ponieważ jest to jedyne drzewo z czterema węzłami zewnętrznymi o najkrótszej ścieżce zewnętrznej. Właściwie istnieje tylko jeden sposób poetykietowania takiego drzewa (co wynika z jego sym etrii), żeby były spełnione warunki (a) i (b), a mianowicie:
(6)
co jednak narusza warunek (c). Drzewo, które można poetykietować zgodnie z wymienionymi warunkami, wykorzystując co najwyżej T taśm (nazw), nazy wamy T-drzewem typu Ufo. Inny sposób charakteryzacji wszystkich drzew poetykietowanych odpowiada jących schematom scalania polega na rozważeniu, w jaki sposób takie drzewa „się rozrastają” . Rozpoczynamy od jednej taśmy, powiedzmy A, i drzewa (sadzonki)
□
Krok o numerze i we wzroście drzewa polega na wybraniu różnych taśm B , B i , I?2, • • ■,B k i zamienieniu ostatnio utworzonego węzła zewnętrznego odpowiada jącego B
B
□
na
(7)
326
5.4.4
SORTOWANIE
Reguła „ostatnio utworzony, pierwszy w zrasta” wyjaśnia, w jaki sposób repre zentację drzewiastą można otrzym ać bezpośrednio z reprezentacji wektorowej. W yznaczenie rzeczywiście optymalnych schematów scalania T-taśmowego - czyli T-drzew typu Ufo o minimalnych długościach ścieżek zewnętrznych dla danej liczby węzłów zewnętrznych - wydaje się być dość trudne. Na przykład następujący schemat scalania okazuje się być optymalny dla czterech taśm od czytywanych wstecz:
Scalanie jednowejściowe jest rzeczywiście konieczne dla optymalności! (Zobacz ćwiczenie 8). Z drugiej strony, nietrudno podać konstrukcje, które są asympto tycznie optym alne dla dowolnego, ustalonego T. Niech K x {n ) będzie minim alną długością ścieżki zewnętrznej w drzewie typu Ufo, o n węzłach zewnętrznych. Korzystając z wyników podpunktu 2.3.4.5, nie jest trudno udowodnić, że KT( n ) > n q - [ ( ( T - iy - n ) /( T - 2 ) \,
q = \ l o g T _ 1 n],
(9 )
ponieważ taka jest minim alna długość ścieżki zewnętrznej w dowolnym drzewie o n węzłach zewnętrznych i stopniu każdego węzła < T. Na dzień dzisiejszy zna nych jest tylko stosunkowo niewiele dokładnych wartości K x (n ). T utaj podajemy górne ograniczenia, które są prawdopodobnie dokładne: n = 1
23
4
5
6
7
8
9 10
11 12
13 14
15
K 3 (n) < 0
25
9
12
16
21
25
30 34
39 45
50 56
61
K 4( n ) < 0
23
6
8
11
14
17
20 24
27 31
33 37
40
( 10 )
K arp odkrył, że każde drzewo, którego węzły wewnętrzne m ają stopnie < T, jest prawie T-drzewem typu Ufo w takim znaczeniu, iż można je uczynić takim T-drzewem typu Ufo, zam ieniając pewne z węzłów zewnętrznych na poddrzewa odpowiadające scalaniu jednowejściowemu. Znalezienie wówczas właściwego poetykietowania jest naprawdę proste. Niech A będzie wyróżnioną taśmą. Należy wykonać co następuje: K r o k 1 . Przypisz taśm y do krawędzi drzewa w dowolny sposób zgodny z wa runkiem (a), przy założeniu, że wyróżniona taśm a A jest przypisywana tylko do skrajnie lewych krawędzi prowadzących z węzłów w dół drzewa.
ODCZYTYWANIE TAŚMY WSTECZ
5.4.4
327
K ro k 2 . Zamień każdy węzeł zewnętrzny postaci B B
□
o
przez
jeśli tylko B ^ A. K ro k 3. Ponumeruj węzły wewnętrzne w drzewie w porządku prefiksowym. W wyniku otrzymujemy etykietowanie spełniające warunki (a), (b) i (c). Dla przykładu, dla drzewa
(n )
i trzech taśm w wyniku wykonania powyższej procedury możemy otrzym ać następujące poetykietowanie:
( 12 )
□
□
u
□
□
□
Nie trudno sprawdzić, że konstrukcja K arpa jest zgodna z regułą „ostatnio utworzony, pierwszy w zrasta” , co wynika z natury porządku prefiksowego (zobacz ćwiczenie 12 ). Wynikiem zastosowania powyższej konstrukcji jest schemat scalania, w któ rym wszystkie początkowe sekwensy znajdują się na taśm ie A. To sugeruje na stępujący schemat rozmieszczania sekwensów i sortowania, który można nazwać scalaniem prefiksowym:
328
SORTOWANIE
5.4.4
P I . Umieszczaj początkowe sekwensy na taśmie A aż do wyczerpania danych wejściowych. Niech 5 będzie ogólną liczbą początkowych sekwensów. P 2 . Przeprowadź powyższą konstrukcję, rozpoczynając od (T —l)-arnego drzewa z 5 węzłami zewnętrznymi i ścieżce zewnętrznej o minimalnej długości, otrzym ując T-drzewo typu Ufo, którego długość ścieżki zewnętrznej jest o co najwyżej 5 większa od dolnego ograniczenia wynikającego z (9). P 3 . Scal sekwensy zgodnie z otrzym anym schematem.
|
O trzym any schemat umożliwia generowanie pliku wynikowego na dowolnie wska zanej taśmie. Jednakże ma on jedną poważną wadę - czy Czytelnik dostrze ga, co jest w nim złego? Problem polega na tym, że otrzymywany schemat scalania wymaga, żeby pewne sekwensy znalazły się na taśmie A w porządku rosnącym, a pewne w porządku malejącym, zależnie od tego, czy odpowiedni węzeł zewnętrzny jest na poziomie nieparzystym, czy parzystym. Ten problem można rozwiązać, nie znając z góry 5, kopiując sekwensy, o których wiadomo, że powinny być malejące, na dodatkową taśm ę lub taśmy tuż przed ich użyciem. W tedy ogólny koszt przetwarzania wstępnego, zależny od długości początkowych sekwensów, wynosi S l o g ^ S + O iS). ( 13 ) Tak więc przy S —> oc scalanie prefiksowe jest zdecydowanie lepsze zarówno od scalania wielofazowego, jak i scalania kaskadowego. W rzeczywistości jest ono asym ptotycznie optymalne, ponieważ z (9) wynika, że dla T taśm czas 5 logT_! 5 + 0 ( 5 ) jest najlepszy, jaki kiedykolwiek moglibyśmy otrzymać. Z dru giej strony, dla stosunkowo małych wartości 5, które zazwyczaj pojaw iają się w praktyce, scalanie prefiksowe nie jest zbyt efektywne. Metody, wielofazowa lub kaskadowa, są prostsze i szybsze dla m ałych wartości 5. Być może jest możliwe znalezienie prostego schem atu wstępnego rozmieszczania sekwensów, a następnie ich sortowania, który jest konkurencyjny dla m etod wielofazowej i kaskadowej, dla małych wartości 5, a jednocześnie asymptotycznie optymalny dla dużych 5. W drugim z poniższych zestawów ćwiczeń przedstawiamy podejście Karpa do podobnego problemu optymalnego scalania, ale z czytaniem w przód. W tym przypadku problem okazał się bardziej skomplikowany, chociaż osiągnięto pewne, bardzo interesujące rezultaty. Ć W IC ZEN IA - zestaw pierwszy 1. [17] Często podczas scalania z czytaniem w przód jest wygodnie zaznaczać koniec każdego sekwensu przez dodanie sztucznego rekordu-wartownika z kluczem + 0 0 . Jakich zmian wymagałoby zastosowanie tej praktyki przy odczycie taśm wstecz?
2. [20] Czy kolumny w tabeli takiej jak ( 1 ) są zawsze uporządkowane niemalejąco, czy też może się zdarzyć, że przy przejściu z poziomu na poziom będziemy zmuszeni „usunąć” trochę sekwensów z pewnej taśmy? ► 3. [20] Udowodnij, że gdy zastosujemy scalanie wielofazowe z czytaniem wstecz do doskonałych rozkładów z ( 1 ), wówczas po zakończeniu sortowania na T l pojawi się zawsze sekwens A, jeśli tylko na samym początku zawartością T l było A D A . . . , a zawartością taśm od T2 do T5 było D A D ___
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
329
4. \M22] Czy jest dobrym pomysłem, żeby wykonywać scalanie wielofazowe z czy taniem wstecz, rozmieściwszy najpierw wszystkie sekwensy uporządkowane rosnąco i założywszy, że wszystkie pozycje typu D są wypełnione domyślnymi sekwensami? ► 5. [23] Podaj zależności dla słów zbudowanych z liczb scaleń, podobne do zależności (8 ), (g), ( 10 ) i ( n ) z punktu 5.4.2, ale tym razem dla scalania wielofazowego z czy taniem wstecz. Przedstaw liczby scaleń z piątego poziomu rozkładu dla sześciu taśm, sporządzając diagram podobny do tego z rysunku 71 (a). 6 . [07] Podaj reprezentację wektorową schematu scalania, którego reprezentacją drzewiastą jest ( 8 )?
7. [16] Narysuj drzewo reprezentujące schemat scalania z czytaniem wstecz zdefi niowany przez następujący ciąg wektorów:
„(33) — ( 20 y {33) — (+1 y {32) — (+1 y {31) — (+1 ym _ (+1 = (+1 y (28) = (” 1 y (27) = (+1 y (26) = (+1 y {25) (+1 y(24) = (+1 y {23) = (+1 y {22) (+1 y (21) = ( - 1 y ( 20 ) = (+1 _ y{19) ( - 1 ym = (+1 yi.17) = (+1
9 -1 +1 +1 +1 -1 +1 -1 -1 +1 -1 -1 -1 +1 +1 +1 +1 +1
5) + 1) - 1) - 1) - 1) + 1) + 1) + 1) + 1) - 1) + 1) + 1) + 1) + 1) - 1) + 1) - 1) “ 1)
= (+ 1 , + 1 , - 1 ) (+ 1 , + 1 , - 1 ) = (+l, —1 , + 1 ) ( + f ) —i; + 1 ) = (—i) + 1 ) + 1 ) (+ 1 , + 1 , - i ) — (+ 1 , + 1 , - 1 ) = ( + f ) —i; + 1 ) (+ 1 ) + 1 ) - 1 ) — (+ 1 , + 1 , - i ) = (+ 1 , + 1 , - i ) = (—i, + 1 ) + 1 ) = (+ 1 , —1 , + 1 ) = (—1 , + 1 , + 1 ) = (+ 1 ) —i) + 1 ) y {1) — (—1 , + 1 , + 1 ) y«>) = ( 1 , 0, 0) y(16) s/(15) ?/(14) y(13) */(12) y(11) s/(10) ?/(9) t/(8)
8 . [23] Udowodnij, że drzewo z (8 ) przedstawia optymalny sposób scalania z czy
taniem wstecz, gdy S = 7 i T = 4, oraz że wszystkie metody, w których nie jest wykonywana scalanie jednowejściowe, są gorsze. 9. [M22] Udowodnij dolną granicę ( 9 ). 10. [41] Sporządź za pomocą komputera tabelę dokładnych wartości K r { n ) . ►11. [20] Prawda czy fałsz: w każdym schemacie scalania z czytaniem wstecz, w którym wykorzystuje się tylko scalanie wielowejściowe, sekwensy na każdej taśmie muszą wystę pować w kolejności A D A D . . . . Takie sortowanie nie powiedzie się, gdy dwa sąsiednie sekwensy będą uporządkowane w tym samym kierunku. 12. [22] Udowodnij, że w wyniku zastosowania algorytmu Karpa, opisanego pod ko niec tego punktu, zawsze otrzymamy poetykietowane drzewo spełniające warunki (a), (b) i (c). 13. [16] Uczyń schemat ( 12 ) bardziej efektywnym, usuwając jak najwięcej scaleń jednowejściowych i tak, żeby numeracja prefiksowa nadal gwarantowała poprawne poetykietowanie węzłów wewnętrznych.
330
SORTOWANIE
5.4.4
14. [Ą0] Zaproponuj algorytm, który pozwala przeprowadzić scalanie prefiksowe bez drzewa budowanego w krokach P2 i P3 i wykorzystuje tylko O (logS) słów pamięci do sterowania procesem scalania. 15. [M39] W wyniku zastosowania algorytmu Karpa dostajemy drzewa, w których kilka węzłów zewnętrznych odpowiada scalaniom jednowejściowym. Udowodnij, że dla T — 3 można zbudować asymptotycznie optymalne drzewa typu Ufo, w których stoso wane jest tylko scalanie dwuwejściowe. Innymi słowy, niech K r ( n ) będzie długością najkrótszej ścieżki zewnętrznej w T-drzewie typu Ufo o n węzłach wewnętrznych i takim, że każdy węzeł wewnętrzny ma stopień T — 1. Udowodnij, że K s( n ) — n l g n + 0 ( n ) . 16. [MĄ6] Przyjmijmy takie same oznaczenia jak w 15. Czy dla każdego T ^ 3 i n = 1 (modulo T — 2), K r ( n ) = n log T_ 1 n + O(n)? ►17. [28] (Richard D. Pratt) Żeby w wyniku scalania kaskadowego z czytaniem wstecz otrzymać plik posortowany rosnąco, możemy zażądać parzystej liczby przebiegów sca lania. To sugeruje technikę wstępnego podziału sekwensów, która jest trochę inna od tej z algorytmu 5.4.3C. a) Zmień zależności 5 .4.3-(i) tak, żeby odpowiadały tylko rozkładom doskonałym, które wymagają parzystej liczby przebiegów scalania. b) Zaprojektuj schemat wstępnego rozmieszczania sekwensów, który interpoluje sche maty doskonałe. (To znaczy, jeśli liczba początkowych sekwensów wpada między rozkłady doskonałe, wówczas pożądane jest, żeby pewne sekwensy, ale nie wszyst kie, scalić dwa razy i w ten sposób otrzymać rozkład doskonały). ►18. [M38] Przypuśćmy, że mamy do dyspozycji T jednostek taśmowych, dla pewnego T ^ 3, i że T l zawiera N rekordów, natomiast pozostałe taśmy są puste. Czy można odwrócić kolejność rekordów na T l w mniej niż D(iVlogiV) krokach, bez możliwości czytania wstecz? (Taka operacja jest oczywiście trywialna, jeśli odczyt wstecz jest moż liwy). W ćwiczeniu 5.2.5-14 można zapoznać się z klasą algorytmów, które wykonują powyższe w liczbie kroków rzędu iVlogiV.
Ć W IC ZEN IA - zestaw drugi W poniższych ćwiczeniach rozwijamy teorię scalania taśmowego dla taśm z odczytem w przód. W tym przypadku każda taśma zachowuje się jak kolejka, a nie jak stos. Każdy schemat sortowania można reprezentować jako ciąg wektorów .. . y ^ y ^ ° \ dokładnie tak jak w tekście głównym. Jednak, gdy przechodzimy z reprezentacji wek torowej do reprezentacji drzewiastej, regułę „ostatnio utworzony, pierwszy wzrasta” zamieniamy na regułę „pierwszy utworzony, pierwszy wzrasta”. Tak więc zamiast (4 ) niedozwolonymi konfiguracjami są teraz
oba
©
A
©
© i
A
©
lub
oba
0
A
U
© i
A
( 4')
©
Drzewo poetykietowane w taki sposób, że reprezentuje ono scalanie z czytaniem w przód na T taśmach nazywamy T-drzewem typu fifo, analogicznie do 7 -drzewa typu Ufo w przypadku czytania wstecz. Taśmy z odczytem wstecz zachowują się bardzo dobrze jako stosy. Niestety nie jest to prawda, jeśli chodzi o kolejki. Jeśli czytanie i zapisywanie jest losowe, ale zgodne
5.4.4
ODCZYTYWANIE TAŚMY WSTECZ
331
z regułą pierwszy wchodzi, pierwszy wychodzi, tracimy dużo czasu, przesuwając się z jednej części taśmy do drugiej. Jeszcze gorzej, szybko wyjdziemy poza taśmę! Na ten sam problem napotkaliśmy w 2 . 2 .2 -(ą ) i ( 5 ) w przypadku, gdy po wstawieniu nowego elementu do kolejki wychodziliśmy poza pamięć. Jednakże rozwiązanie z 2.2.2-(6) i (7 ) nie ma tutaj zastosowania, ponieważ taśm nie można zawijać. Dlatego drzewo nazwiemy T-drzewem silnie typu fifo, jeśli można je poetykietować w taki sposób, żeby w odpowiadającym mu schemacie scalania operacje na każdej taśmie były wykonywane zgodnie z następującą zasadą „zapisz, przewiń, przeczytaj wszystko, przewiń; zapisz, przewiń, przeczytaj wszystko, przewiń itd.” . ►19. [22] (R. M. Karp) Znajdź drzewo binarne, które nie jest 3-drzewem typu fifo. ►2 0 . [22] Sformułuj warunek na „T-drzewo silnie typu fifo” za pomocą bardzo prostej zasady odnoszącej się do niedozwolonych konfiguracji etykiet taśm, analogicznej do (4'). 2 1 . [18] Narysuj drzewo reprezentujące schemat scalania z czytaniem w przód zdefi
niowany przez ciąg wektorów z ćwiczenia 7. Czy to drzewo jest 3-drzewem silnie typu fifo? 2 2 . [28] (R. M. Karp) Pokaż, że reprezentacje drzewiaste dla scalania wielofazowego
1 kaskadowego, z doskonałymi rozkładami, są dokładnie takie same dla przypadków z czytaniem w przód i z czytaniem wstecz (z wyjątkiem liczb, które są etykietami węzłów wewnętrznych). Znajdź większą klasę reprezentacji wektorowych schematów scalania, dla której jest to także prawda. Sformułujmy odpowiednie warunki w modelu wektorowym: Jeśli tylko 7^ y (fc) lub k = m ) lub y — —1 , to y H b + y f } = 0. 23. [24] (R- M. Karp) Segment y^q\ . . y ^ w schemacie scalania nazwiemy etapem, jeśli żadna taśma wyjściowa nie jest następnie używana jako taśma wejściowa - to znaczy nie istnieją takie i, j , k, że q ^ i > k ^ r, y ^ = —1 i = + 1 . Celem tego ćwiczenia jest pokazanie, że scalanie kaskadowe minimalizuje liczbę etapów wśród wszystkich schematów z takimi samymi liczbami taśm i sekwensów początkowych. Wygodnie jest przyjąć pewną notację. Piszemy v —» w, jeśli v i w są T-wektorami takimi, że w redukuje się do u w pierwszym etapie pewnego schematu scalania. (Tak więc istnieje schemat sortowania y ^ . . . y ^ taki, że y^mK .. y^l+1^ jest etapem, w = y(m) _)------ 1_y(°) j v — y (0 _|----- hyt0^). Piszemy v w , jeśli v i w są T-wektorami takimi, że suma największych k elementów z v jest ^ od sumy największych k elementów z w, dla 1 ^ k ^ T. Tak więc na przykład ( 2 , 1 , 2 , 2 , 2 ,1 ) (1, 2, 3 , 0 , 3 , 1), ponieważ 2 ^ 3, 2 + 2 3 + 3, . . . , 2 + 2 + 2 + 2 + 1 + 1 ^ 3 + 3 + 2 + 1 + 1 + 0. Na koniec, jeśli v = ( v i , . . . , v t ) , to niech C(v) — (sx, s t - 2 , s t - 3 , • • ■, Si, 0), gdzie S k jest sum ą największych k elementów z v. a) Udowodnij, że v —►C(v). b) Udowodnij, że v < w implikuje C(v) ■< C(w). c) Zakładając prawdziwość wyniku z ćwiczenia 24, udowodnij, że scalanie kaskadowe minimalizuje liczbę etapów. 24. [M35] Przy oznaczeniach z ćwiczenia 23 udowodnij, że v —►w implikuje w < C(v). 25. [M36] (R. M. Karp) Powiemy, że segment y^q\ .. y ^ w schemacie scalania jest fazą, jeśli żadna taśma nie jest zarówno taśmą wejściową, jak i taśmą wyjściową - to znaczy, jeśli nie istnieją i , j , k takie, że q ^ i ^ r, q ^ k ^ r, y ^ = + 1 i y ^ — — 1 . Celem tego ćwiczenia jest poszukanie schematów scalania, które minimalizują liczbę faz. Będziemy pisali v w, jeśli w może zostać zredukowane do v w jednej fazie (podobną
332
SORTOWANIE
5.4.4
notację wprowadziliśmy w ćwiczeniu 23). Niech — (Sfc “hife + 1;
0, . . . , 0),
gdzie tj oznacza j-ty największy element z v, a sjt = U + • ■• + tka) Udowodnij, żev => Dk(v) dla 1 ^ k < T. b) Udowodnij, że v implikuje Dk(y) < Dk{w) dla 1 ^ k < T. c) Udowodnij, żev => w implikuje w < D k (v) dla pewnego &, 1 ^ k < T. d) Wynika stąd, że schemat scalania, sortujący największą liczbę sekwensów na T taśmach i w q fazach, można reprezentować w postaci ciągu liczb całkowitych ki &2 **. kq i takim, że początkowym rozkładem jest Dkq (. . . (Dk2(Dk1(w))). . . ) , gdzie u = (1,0, . . . , 0 ) . Ta strategia o minimalnej liczbie faz ma T-drzewiastą reprezentację silnie typu fifo i należy również do klasy schematów z ćwiczenia 22. Dla T — 3 jest to scalanie wielofazowe, a dla T — 4, 5, 6, 7 jest to odmiana scalania zrównoważonego. 26. [MĄ6] (R. M. Karp) Czy dla każdego T ^ 4 i każdego dostatecznie dużego ą, optymalnym ciągiem ki . . . kq, o którym mowa w ćwiczeniu 25, jest 1 \T/2] |_T/2J |"T/2] [T/2J . . . ?
*5.4.5. Sortowanie oscylacyjne
Trochę inne podejście do sortowania przez scalanie zaproponował Sheldon Sobel w J A C M 9 (1962), 372-375. Jego propozycja polegała na tym, żeby za m iast wstępnego rozrzucania sekwensów na taśmy oscylować między rozrzu caniem a scalaniem. W ten sposób duża część sortowania ma miejsce przed odczytaniem w całości danych wejściowych. Załóżmy dla przykładu, że mamy do dyspozycji pięć taśm. Sortowanie 16 początkowych sekwensów m etodą Sobela dokonałoby się w następujący sposób:
Faza Faza Faza Faza Faza Faza Faza Faza Faza
1 2 3 4 5 6
7 8
9
Operacja
Tl
T2
T3
T4
T5
Koszt
Rozrzucanie Scalanie Rozrzucanie Scalanie Rozrzucanie Scalanie Rozrzucanie Scalanie Scalanie
Ai
Ai
Ai
Ai
—
-
_
Ai
Ai
-
—
-
Ai
Ai
d4 D 4A i d4
~
-
4 4 4 4 4 4 4 4 16
—
d4 D ąA i d4 D ąA i da -
-
-
-
d -
Ai -
Ai 4
-
A i6
d4 D 4A i d4 D 4A i d4 D 4A i d4 _
T utaj, podobnie jak w punkcie 5.4.4, A r i D r oznaczają odpowiednio sekwensy rosnące i malejące, o względnej długości r. W tym przypadku algorytm Sobela rozpoczyna się od zapisania po jednym sekwensie na każdej z czterech taśm i scaleniu ich (czytając wstecz) na piątej taśmie. Następnie znowu wykonujemy rozrzucanie, ale tym razem przesuwając się cyklicznie o jedną pozycję w prawo (ze względu na taśm y). W wyniku scalania dostajemy kolejny sekwens D±. Po sformowaniu w ten sposób czterech sekwensów £>4, w wyniku jeszcze jednego scalenia otrzym ujem y sekwens A iq. Moglibyśmy postępować tak dalej i sformo wać jeszcze trzy sekwensy Aig, a następnie scalić je w sekwens D q4. Cały proces
5.4.5
SORTOWANIE OSCYLACYJNE
333
kończyłby się po wyczerpaniu danych wejściowych. W tym algorytmie długość wejścia nie musi być z góry znana. Nietrudno zauważyć, że gdy liczba początkowych sekwensów S jest rów na 4m, to w tej metodzie każdy rekord jest przetwarzany dokładnie m + 1 razy: raz podczas rozrzucania i m razy podczas scalania. Dla 5 między 4 m~2 a 4m moglibyśmy przyjąć istnienie domyślnych sekwensów i „powiększyć” w ten sposób S do 4m. Zatem całkowity czas sortowania byłby równy w zasadzie czasowi potrzebnem u na |~log4 S] + 1 przebiegów przez dane. To jest właściwie to, co dostalibyśmy, wykonując sortowanie zrównoważone na ośmiu taśm ach. W ogólności, sortowanie oscylacyjne na T taśm ach jest równoważne scalaniu zrównoważonemu na 2 (T —1) taśm ach, ponieważ wykonuje się w nim ["log^-i 5] + 1 przebiegów przez dane. Dla 5 , które jest potęgą T — 1, to jest najlepsze, co można dostać za pomocą dowolnej m etody T-taśmowej, ponieważ w ten sposób jest osiągana dolna granica z 5.4.4-(g). Z drugiej strony, gdy S jest równe (T — l ) m_1 + i ?
tylko o jeden więcej niż potęga T — 1 , w tej metodzie m arnuje się prawie cały jeden przebieg. W ćwiczeniu 2 pokazujemy, w jaki sposób, dla S nie będących doskonałymi potęgami, można częściowo wyeliminować to m arnotrawstwo przez zastosowanie specjalnej procedury kończenia. Dalsze usprawnienia zostały odkryte w 1966 ro ku przez Dennisa L. Benchera, który nazwał swoją m etodę „scalaniem krzyżo wym” [zobacz H. Wedekind, Datenorganisation (Berlin: W. de G ruyter, 1970), 164-166; zobacz także U.S. Patent 3540000 (1970)]. Główny pomysł polega na opóźnianiu scalania tak długo, aż pozyskamy większą wiedzę o S. W dalszym ciągu omówimy trochę zmodyfikowaną postać oryginalnego schem atu Benchera. Tak ulepszone sortowanie oscylacyjne działa w następujący sposób: Operacja Faza Faza Faza Faza Faza Faza Faza Faza Faza
1
2 3 4 5 6
7 8
9
Rozrzucanie Rozrzucanie Scalanie Rozrzucanie Scalanie Rozrzucanie Scalanie Rozrzucanie Scalanie
Tl —
-
d4 D 4A i d4 D 4A i d4 D 4Ai d4
T2
T3
T4
T5
Ai A\
Ai A XAi Ai Ai
Ai Ai Ai Ai Ai Ai Ai Ai
Ai Ai Ai Ai Ai Ai Ai Ai Ai Ai Ai
-
_
d4 D 4A i d4 D aA i d4
-
-
d4 D 4A i d4
W tym miejscu nie scalamy sekwensów D 4 w sekwens zostaje wyczerpane), ale dopiero po uzyskaniu Faza 15
Scalanie
D 4D 4
D 4D 4
D 4D 4
-
—
d
4
A \q
D4
-
Kos 4 3 4 3 4 3 4 3 4
(chyba że wejście
4
334
SORTOWANIE
5.4.5
a następnie Faza 16
Scalanie
D4
Dą
D4
-
A\q
16
Następny sekwens A iq pojawi się po utworzeniu trzech kolejnych sekwensów D 4, Faza 22 Faza 23
Scalanie Scalanie .
D 4D 4 D4
D 4D 4 D4
D4 ~
A\q
A iqD 4 A i6
4 16
i tak dalej (porównaj z fazami 1 - 5 ) . O wyższości schem atu Benchera możemy się przekonać, jeśli rozważymy przykład z pięcioma początkowymi sekwensami: W sortowaniu oscylacyjnym z modyfikacją z ćwiczenia 2, najpierw zostałoby wykonane scalanie czterowejściowe (w fazie 2), a następnie scalanie dwuwejściowe, co dałoby łączny koszt 4 + 4 + 1 4 - 5 = 14. Algorytm Benchera wykonałby najpierw scalanie dwuwejściowe (w fazie 3), a następnie scalanie czterowejściowe, co dałoby łączny koszt 4 + l + 2 + 5 = 1 2 . W obu m etodach należy doliczyć niewielki dodatkowy koszt (jedną jednostkę) przewinięcia taśm przed końcowym scalaniem. Precyzyjny opis m etody Benchera znajduje się poniżej (algorytm B). Nie stety wydaje się, że algorytm Benchera łatwiej zakodować niż zrozumieć jego działanie. Częściowo jest tak dlatego, że w rzeczywistości jest to algorytm rekurencyjny, który został zapisany iteracyjnie, a następnie trochę zoptymalizowany. Być może trzeba będzie ten algorytm wielokrotnie prześledzić, zanim stanie się jasne, o co tak naprawdę w nim chodzi. A lg o r y tm B (Sortowanie oscylacyjne z rozrzucaniem „krzyżowym”). W tym algorytmie proces rozrzucania początkowych sekwensów jest przerywany od cza su do czasu w celu wykonania scalenia pewnych sekwensów znajdujących się już na taśm ach. Przy założeniu, że mamy do dyspozycji T ~ P + 1 > 3 taśm, nie licząc taśm y z danymi wejściowymi, w tym algorytmie jest wykonywane scalanie P - wejściowe. Jednostki taśmowe muszą umożliwiać odczytywanie taśm zarówno w przód, jak i wstecz. Zakładam y też, że taśm y są ponumerowane 0 , 1 , . . . , P. W algorytmie są wykorzystywane następujące tablice: D [ j ] , 0 < j < P: Liczba sekwensów domyślnych, o których zakłada się, że znaj dują się na końcu taśm y j. A [ / , j ] , 0 < l < £ , L jest takie, że liczba początkowych sekwensów, które znaj0 < j < P dują się na wejściu, jest nie większa od P L+1. A[/, J] = k > 0 oznacza, że na J -tym poziomie” na taśmie j znajduje się sekwens o nominalnej długości P k. Jeśli k jest parzyste, to sekwens ten jest rosnący, natom iast jest malejący, gdy k jest nieparzyste. Jeśli A[Z, j ] < 0, to na poziomie l taśm a j nie jest używana. Polecenie „Zapisz początkowy sekwens na taśmie j n oznacza wykonanie nastę pujących operacji: A[Z,j] 0. Jeśli wejście zostało wyczerpane, zwiększ wartość D[j] o 1; w przeciwnym razie zapisz początkowy sekwens (w porządku rosnącym) na taśm ie j .
5.4.5
SORTOWANIE OSCYLACYJNE
335
Polecenie „Scalaj na taśm ę j ” oznacza wykonanie następujących operacji: Jeśli dla każdego i ^ j , D[z] > 0, zmniejsz D[ż] o 1 dla każdego i ^ j , a następnie zwiększ D[j] o 1 . W przeciwnym razie wykonaj scalanie na taśmę j ze wszystkich taśm i ^ j , dla których D[z] = 0, i zmniejsz D[i] o 1 dla pozostałych i ^ j.
R ys. 77. Sortowanie oscylacyjne z rozrzucaniem „krzyżowym” . B I . [Inicjowanie] W ykonaj D[j] 0 dla każdego 0 < j < P oraz A[0,0] <------1, Z <— 0, g — 0. Następnie zapisz po jednym początkowym sekwensie na taśm y 0 numerach 1 < j < P. B 2 . [Czy są dane?] (W tym miejscu taśm a q jest pusta, a pozostałe taśm y zawierają co najwyżej po jednym sekwensie). Jeśli na wejściu znajdują się jeszcze jakieś sekwensy, to przejdź do kroku B3. Jeśli jednak wejście zostało wyczerpane, to przewiń wszystkie taśm y j ^ q takie, że A [0, j ] jest parzyste; następnie scalaj na taśm ę ą, czytając w przód z właśnie przewiniętych taśm , natom iast z pozostałych taśm wstecz. Sortowanie kończy się z uporządko wanym rosnąco plikiem wynikowym zapisanym na taśm ie q. B 3. [Początek nowego poziomu] Z*— Z+ l , r < — g , s < — 0, (ę + 1) mod T. Zapisz po jednym początkowym sekwensie na każdej taśm ie {q+j) m od T dla 1 < j < T —2. (W ten sposób jeden początkowy sekwens zostanie zapisany na każdej taśmie z wyjątkiem q i r). W ykonaj A[Z,g] <----- 1 i A[Z,r] <------ 2 . B 4. [Gotowe do scalania?] Jeśli A[/ —l , ę ] ^ s, wróć z powrotem do kroku B3. B 5. [Scalanie] (W tym miejscu A[Z—1, q~] = A [Z, j ] = s dla każdego j t r). Scalaj na taśm ę r, czytając wstecz. (Przypomnij sobie podaną wcześniej definicję tej operacji). Następnie wykonaj s + 1, Z— l,A[Z, r] s i A[Z,f/] —1. W ykonaj r *— (2q —r) m o d T . (W ogólności mamy r = (q — 1) mod T dla s parzystego i r = (q + 1) mod T dla s nieparzystego). B 6 . [Koniec poziomu?] Jeśli l = 0, przejdź do B2. W przeciwnym razie, jeśli dla każdego j ^ q i j ^ r, A[Z,j] = s, wróć do B4. W przeciwnym razie wróć do B3. |
336
SORTOWANIE
5.4.5
Żeby wykazać poprawność tego algorytmu, możemy zastosować dowód typu „indukcja rekurencyjna” dokładnie tak, jak to zrobiliśmy w dowodzie popraw ności algorytmu 2.3. 1 T. Załóżmy, że w kroku B3 rozpoczynamy z l = Iq, q ~ ę0; s+ = A[/o, (
SORTOWANIE OSCYLACYJNE
5.4.5
337
społeczni twórcy, którzy odkrywają najlepsze algorytmy, będą dzielili się swoimi pomysłami nadal bez ograniczeń. Oczywiście trzym anie przez pewnych ludzi nowych technik w pełnej tajem nicy jest dużo gorsze niż powszechna dostępność algorytmów, których używanie jest zastrzeżone przez pewien ograniczony czas]. Główny pomysł w metodzie Goetza polega na takiej organizacji zawartości taśm, żeby na początku każdej taśm y znajdował się sekwens o względnej długości 1, następnie jeden sekwens o względnej długości P , potem P 2 itd. Na przykład dla T — 5 sortowanie rozpoczyna się następująco („. ” oznacza aktualne położenie na taśmie głowicy czytająco-piszącej): Tl
T2
T3
T4
T5
„Koszt111
Faza 1 Rozrzucanie •Aa Faza 2 Scalanie Ar
•Ai
.Ai *r
.Ai Ai-
Ai. Ai A4.
5 4
Faza 3 Rozrzucanie .Ai Faza 4 Scalanie Ar
•Ai Ar
.Ai *r
Ai. .Ai A4 Ai A4. A i -Aa
4 4
Faza 5 Rozrzucanie •Ai Faza 6 Scalanie
•Ai Ar
•Ai .Ai A4 .Ai A4 Ai A4. ^i1.A4 )^i •A4
4 4
Ai. .Ai A4 .Ai A4 .Ai A4 A i A ą. A v a 4 •A4 Al'A4
4 4
Faza 9 Rozrzucanie Ai. .Ai A 4 .Ai A4 .Ai A4 .Ai A4 Faza 10 Scalanie A i A a,. 'Ai-Aa A v A ą A v A 4 Ai-Aa Faza 11 Scalanie A\ Aą A\q. *1 *4’ * 1 *4' * 1 *4- *1 ^4-
4 4 16
Operacja
Faza 7 Rozrzucanie ■Ai Faza 8 Scalanie Ar
Uwagi
[T5 nie przewinięta] [Teraz przewijane są wszystkie] [T4 nie przewinięta] [Teraz przewijane są wszystkie] [T3 nie przewinięta] [Teraz przewijane są wszystkie] [T2 nie przewinięta] [Teraz przewijane są wszystkie] [Tl nie przewinięta] [Nie przewijamy] [Teraz przewijane są ■ wszystkie]
I tak dalej. W fazie 1 taśm a T l jest przewijana podczas umieszczania na T 2 danych wejściowych, następnie podczas przewijania T2 dane wejściowe są umiesz czane na T3 itd. Na koniec, po wyczerpaniu wejścia, pojaw iają się domyślne sekwensy i czasami będziemy musieli sobie wyobrazić, że pojaw iają się one na prawdę w pełnej długości. Na przykład, jeśli S = 18, w fazie 9 sekwensy A \ na taśmach T4 i T5 będą domyślnymi sekwensami. Podczas scalania z T 2 i T3 na T l w fazie 10, żeby dostać się do sekwensów A4, które będą wykorzystywane w fazie 1 1 , będziemy musieli pominąć domyślne sekwensy na T4 i T5. Z drugiej strony, domyślny sekwens A j na T l nie musi występować w sposób jawny. Tak więc „końcówka” jest trochę zawiła. Inny przykład tej m etody znajdziemy w następnym punkcie.
ĆWICZENIA 1. [22] W głównym tekście przedstawiono oryginalne sortowanie oscylacyjne Sobela dla T — 5 i S = 16. Podaj dokładny opis algorytmu, który jest uogólnieniem metody Sobela dla S = P L początkowych sekwensów i T = P + l ^ 3 taśm. Staraj się zachować prostotę opisu. 2. [2Ą] Rozważmy oryginalny algorytm Sobela. Jeśli S = 6, to moglibyśmy przyjąć, że 5 = 16, i założyć istnienie 11 domyślnych sekwensów. Wówczas w fazie 3, w przy-
338
5.4.5
SORTOWANIE
r = 3
T = 4
T= 5 T=
6
T=8 T = 10
1
2
5
10
20
50
100
200
500
1000 2000
5000
Początkowe sekwensy, 5 R y s. 78. Efektywność sortowania oscylacyjnego. Wykorzystano technikę z algoryt mu B i ćwiczenia 3. kładzie z głównego tekstu, na T4 i T5 zostaną umieszczone domyślne sekwensy Aq. W fazie 4 zostaną scalone sekwensy A \ z T2 i T3 w sekwens D 2 na T l. W fazach 5 - 8 nie działoby się nic. W fazie 9 na T4 zostałby sformowany sekwens As na T4. Lepiej byłoby przewinąć T2 i T3 zaraz po fazie 3, a następnie natychmiast sformować Aq na T4 za pomocą scalania trzywejściowego. Pokaż, w jaki sposób dokonać modyfikacji algorytmu z ćwiczenia 1, żeby usprawnić końcówkę w sposób podobny do opisanego powyżej, dla 5, które nie jest doskonałą potęgą P. ► 3. [29] Przygotuj tabelę ilustrującą zachowanie się algorytmu B dla T = 3 i przy założeniu, że na wejściu mamy dziewięć początkowych sekwensów. Pokaż, że w jednym miejscu algorytm jest ewidentnie nieefektywny i opisz sposób naprawy tej sytuacji. 4. [21] W kroku B3 zmienne A[Z,ę] i A[Z,r] przyjmują wartości ujemne. Pokaż, że jedna z tych dwóch operacji jest zawsze zbyteczna, ponieważ odpowiadający jej element tablicy A nigdy nie jest używany. 5. [M25] Niech 5 będzie liczbą początkowych sekwensów na wejściu algorytmu B. Dla jakich wartości S nie trzeba przewijać taśm w kroku B2?
*5.4.6. Praktyczne aspekty scalania taśmowego
Teraz dochodzimy do sedna sprawy. Omówiliśmy wiele różnych rodzin schematów scalania, więc nadszedł czas, żeby przekonać się o ich przydatności w rzeczywis tych zastosowaniach i porównać je w sposób znaczący. Nasze badania nad sor
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
339
towaniem wewnętrznym pokazały, że nie można właściwie ocenić danej m etody sortowania, licząc tylko porównania. Podobnie nie można w pełni ocenić m etody sortowania zewnętrznego, licząc tylko przebiegi przez dane. W tym punkcie omówimy charakterystyki typowych jednostek taśmowych i sposób, w jaki one wpływają na wstępne rozrzucanie, a następnie scalanie. W szczególności zbadamy pewne schematy przydziału buforów i ich wpływ na czas sortowania. Omówimy także krótko konstrukcję generatorów programów sortujących. J a k p r a c u je ta ś m a . Różni producenci dostarczają jednostki taśmowe o bardzo różnorodnych charakterystykach. Dla wygody zdefiniujemy hipotetyczną jed nostkę taśmową dla maszyny MIX, którą nazwiemy MIXT. Jednostka taśmowa MIXT jest typową jednostką taśmową produkowaną w czasach, kiedy powstawała ta książka. MIXT czyta i zapisuje 800 znaków na jeden cal* taśmy, z szybkością 75 cali na sekundę. To oznacza, że gdy taśm a jest w ruchu, jeden znak jest od czytywany lub zapisywany co ms lub 1 6 | mikrosekund. Rzeczywiste jednostki taśmowe, które były dostępne w 1970 roku, charakteryzowały się gęstością zapisu od 200 do 1600 znaków na cal i szybkością od 37^ do 150 cali na sekundę, tak więc były od 1/8 do 4 razy szybsze od MIXT. Już na początku podrozdziału 5.4 zauważyliśmy, że taśm y magnetyczne są w zasadzie przestarzałe. Jednak nauczyliśmy się bardzo wiele w okresie, gdy były one głównym przedmiotem zainteresowania, a lekcje płynące z tam tego okresu są ciągle wartościowe. Tak więc naszym celem nie jest poszukiwanie szczególnych rozwiązań, ale nauczenia się, w jaki sposób rozsądnie łączyć teorię z praktyką. Metodologia jest dużo ważniejsza od fenomenologii, ponieważ m etody rozwiązywania problemów znajdują zastosowanie mimo zmian technologicznych. Czytelnicy wyniosą dużo więcej z prezentowanego m ateriału, jeśli przeniosą się w myślach w lata siedemdziesiąte. Załóżmy zatem, że ciągle znajdujemy się w minionej epoce. Jedną z istotnych rzeczy, które powinniśmy mieć na uwadze z perspektywy tam tych dni, jest fakt, że pojedyncze taśm y miały ściśle ograniczoną pojem ność. Długość taśmy na każdym krążku wynosiła 2400 stóp** lub mniej. Tak więc na jednym krążku taśm y typu MIXT jest miejsce na co najwyżej 23 000000 znaków i odczytanie ich wszystkich zabiera około 23 000000/3 600 000 ~ 6.4 minut. Jeśli istnieje potrzeba sortowania większych plików, to wówczas zazwyczaj najlepiej posortować każdy krążek oddzielnie, a następnie scalić posortowane krążki. W ten sposób unikamy stra t czasu przeznaczonego na obsługę taśm . To oznacza jednak, że liczba początkowych sekwensów S pojawiających się w omó wionych schematach nigdy nie jest zbyt duża. Nigdy nie zdarzy się, że S > 5000, nawet jeśli dysponujemy bardzo m ałą pamięcią wewnętrzną, która umożliwia sformowanie początkowych sekwensów składających się tylko z 5000 znaków. Wynika stąd, że wzory opisujące asym ptotyczną efektywność algorytmów przy S —>oo m ają głównie znaczenie teoretyczne. * 1 cal = 2.54cm (przyp. tłum.). ** 1 stopa = 0.3048m (przyp. tłum.).
340
SORTOWANIE
5.4.6
Dane na taśmie są grupowane w bloki (rysunek 79) i w czasie każdej operacji odczytu lub zapisu jest przesyłany cały blok. Bloki taśmowe są często nazywa ne „rekordami” , ale my będziemy unikać tej terminologii, ponieważ jest ona w sprzeczności z faktem, że sortujem y plik „rekordów” o innym znaczeniu. Takie rozróżnienie nie było konieczne w wielu programach sortujących napisanych w latach pięćdziesiątych, kiedy to jeden rekord odpowiadał jednemu blokowi. Przekonam y się jednak, że zazwyczaj jest pożyteczne umieszczanie kilku rekor dów w każdym bloku na taśmie. Między każdymi sąsiednimi blokami znajduje się przerwa międzyblohowa o długości 480 znaków, która umożliwia zatrzym anie i rozbieg taśm y między poszczególnymi operacjami odczytu i zapisu. Efektem utrzym ywania przerw międzyblokowych jest zmniejszenie się liczby znaków, które można zapisać na jednym krążku taśmy. Jest to zależne od liczby znaków w bloku (zobacz rysunek 80), W ten sam sposób zmniejsza się też średnia liczba znaków przesyłanych w ciągu jednej sekundy, ponieważ taśm a przesuwa się ze stałą prędkością.
Znaki na blok
R y s. 80. Liczba znaków na jednym krążku taśmy typu MIXT jako funkcja rozmiaru bloku.
We wczesnych kom puterach bloki m iały stały, raczej m ały rozmiar. To znala zło swoje odzwierciedlenie w projekcie kom putera MIX zdefiniowanego w rozdziale 1 , który czyta i zapisuje bloki o długości 100 słów. W przyjętym rozwiązaniu dla maszyny MIX w jednym bloku mieści się około 500 znaków, natom iast przerwa międzyblokowa m a 480 znaków. Oznacza to stratę prawie połowy taśmy! Dlatego
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO fa Oß
N Oi 0) *3 OJ 2 ö gor
s s | cö Ö S N*5?0
i "o S 0 -*
.S >»Ö
341
12 11 -
10
9 ~Minimalne opóźnienie potrzebne 8 " na zatrzymanie i rozbieg taśmy 7 6 5 : 4 Ciągły odczyt/zapis ,jest możliwy, jeśli rozpoczęcie 3 — wykonywania nowegc) rozkazu następuje odpowiednio 2 wcześnie na tej same j taśmie 1 l l l l i_. i 0 1 2 3 4 5 6 7 Czas od zakończenia poprzedniej operacji do rozpoczęcia wykonywania następnego rozkazu przez kontroler taśmy (ms)
8
R y s. 81. Sposób obliczania czasu potrzebnego na zatrzymanie i rozpędzenie taśmy. (Ten czas doliczamy do czasu potrzebnego do odczytu lub zapisu bloków i przerw).
większość maszyn z lat siedemdziesiątych dopuszczała bloki o zmiennych rozmia rach. Sposoby doboru właściwych rozmiarów dla bloków omawiamy poniżej. Na koniec operacji odczytu lub zapisu taśm a przesuwa się z pełną prędkością nad pierwszymi 66 znakami przerwy między blokowej. Jeśli w tym czasie dla tej samej taśmy zostanie zainicjowana następna operacja wejścia/wyjścia, to jej ruch odbywa się dalej bez zakłóceń. Jeśli jednak decyzja dotycząca następnej operacji nie pojawi się dostatecznie wcześnie, taśm a zatrzym a się i potrzeba będzie trochę czasu, żeby mogła osiągnąć pełną prędkość niezbędną w kolejnej operacji. Całkowity czas potrzebny na zatrzym anie i rozpędzenie taśm y wynosi 5 ms, 2 na zatrzym anie i 3 na rozpędzenie (zobacz rysunek 81). Tak więc, jeśli akurat stracimy możliwość ciągłego odczytu na pełnej prędkości, wówczas czas pokonania przerwy jest taki jak dla przerwy 780-znakowej, a nie 480-znakowej. Rozważmy teraz operację przewijania. Niestety nie jest łatwo scharaktery zować czas potrzebny do przewinięcia n znaków. Pewne maszyny umożliwia ją bardzo szybkie przewijanie, tylko gdy n jest większe od 5 milionów. Dla mniejszych wartości n przewijanie jest wykonywane z taką sam ą prędkością jak czytanie czy zapisywanie. Inne maszyny są wyposażone w specjalny silnik, który jest wykorzystywany do sterowania wszystkimi operacjami przewijania. Za jego pomocą obroty szpuli z taśm ą są stopniowo zwiększane, aż do osiągnięcia pewnej liczby, a następnie, gdy nadchodzi czas zatrzym ania taśmy, jest ona wyhamowywana. W takim przypadku rzeczywista prędkość zależy od zapełnienia taśmy. Dla uproszczenia przyjmiemy, że MIXT potrzebuje max(30, n/150) ms na przewinięcie n znaków (wliczając przerwy), w przybliżeniu dwie piąte czasu potrzebnego do ich zapisania. To jest całkiem dobre przybliżenie zachowania się wielu rzeczywistych jednostek taśmowych, gdzie stosunek czasu odczytu/zapisu do czasu przewijania wypada zazwyczaj między 2 a 3. Nie jest to jednak model odpowiadający sytuacji właściwej dla wielu maszyn, gdy mamy do czynienia zarówno z wolnym, jak i szybkim przewijaniem. (Zobacz rysunek 82).
342
SORTOWANIE
5.4.6
2 P rz e w ija ć Lie 2.5 raza szybsze od o d czyt ;u /z a p is u »
'ćT S
A / I
o
O
włączone sz y b k ie i 1,volne p rz e \ v ija n ie i --
5 OOO000 15 000 000 Liczba znaków od punktu ładowania
23 000 000
R y s. 82. Przybliżony czas działania dwóch popularnych technik przewijania.
Po początkowym zapełnieniu i/lu b przewinięciu taśm a znajduje się w „punk cie zapełnienia” . Dodatkowe 110 ms jest konieczne na wykonanie operacji odczy tu lub zapisu w punkcie zapełnienia. Gdy taśm a nie znajduje się w punkcie zapełnienia, to może być czytana wstecz. Do każdej operacji wstecz, z następu jącą po niej operacją w przód, jest dodawany ekstra czas 32 ms. Podobnie jest z operacją w przód i z następującą po niej operacją wstecz. S calan ie raz je szc ze . Powróćmy ponownie do procesu scalania P-wejściowego, ale zwracając uwagę na czynności związane z wejściem i wyjściem, przy założeniu, że mamy do dyspozycji P + l taśm. Naszym celem jest jednoczesne wykonywanie w możliwie największym stopniu operacji wejścia/wyjścia, jak i pozostałych obliczeń w programie. Jest pouczające, żeby rozważyć następujący szczególny przypadek, w którym wprowadzono poważne ograniczenia na możliwość jednoczesnego wykonywania takich operacji. Zakładamy, że: a) w jednej chwili można pisać na co najwyżej jedną taśmę; b) w jednej chwili można czytać z co najwyżej jednej taśmy; c) czytanie, zapisywanie i obliczenia mogą być wykonywane jednocześnie tylko wtedy, kiedy operacje czytania i zapisywania zostały zainicjowane w tym samym momencie. Okazuje się, że system z 2P buforami wejściowymi i z 2 buforami wyjściowymi jest wystarczający, żeby utrzymywać maksymalną prędkość taśmy, nawet przy trzech opisanych wyżej ograniczeniach, chyba że sam kom puter byłby niezwykle wolny. Zauważmy, że warunek (a) nie jest prawdziwym ograniczeniem, ponieważ tylko jedna taśm a jest taśm ą wyjściową. Ponadto ilość danych wejściowych jest taka sama jak ilość danych wyjściowych, a zatem średnio w każdej chwili jest odczytywana tylko jedna taśm a. Jeśli warunek (b) nie byłby spełniony, to musia łyby się pojawić okresy, w których nie byłoby nic na wejściu. Zatem czas scalania można zminimalizować, utrzym ując cały czas „w ruchu” taśm ę wyjściową. Żądany efekt uzyskamy, korzystając z techniki nazywanej przewidywaniem. Podczas wykonywania scalania P-wejściowego utrzymujemy zwykle P bieżących
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
5.4.6
343
buforów wejściowych, które są używane jako źródło danych. Jedne z nich są zapełnione bardziej od innych, zależnie od tego, ile z zawartych w nich danych zostało już przejrzanych. Jeśli wszystkie z nich zostaną opróżnione mniej więcej w tym samym czasie, będziemy zmuszeni przed kolejnym scalaniem do wykonania wielu odczytów, chyba że przewidzimy z góry taką sytuację. Szczęśliwie zawsze można powiedzieć, który bufor zostanie opróżniony jako pierwszy, przejrzawszy po prostu ostatnie rekordy w buforach. Bufor, w którym ostatni rekord ma najmniejszy klucz, zostanie opróżniony jako pierwszy, niezależnie od wartości pozostałych kluczy. Tak więc zawsze wiadomo, dla którego pliku należy wyko nać kolejną operację wejścia. Poniższy algorytm jest szczegółowym zapisem tej zasady. A lg o ry tm F (Przewidywanie z ruchomymi buforami). W tym algorytmie, podczas wykonywania scalania P-wejściowego, dla P > 2, kontrolowany jest przydział buforów. Zakładamy, że wejściowe taśmy i pliki są ponumerowane 1 , 2 , . . . , P. W algorytmie wykorzystuje się 2P buforów wejściowych I [ 1 ] , . . . , I [ 2 P ] , dwa bufory wyjściowe 0 [0] i 0 [1] oraz następujące tablice pomocnicze: < j < 2P: 0, jeśli do I [j] można wprowadzać dane, 1 w przeciwnym przypadku; B [ i ] , 1 < i < P:
Indeks bufora zawierającego ostatni blok wczytany dotychczas z pliku i ;
C [z], 1 < i < P:
Indeks bufora używanego aktualnie do wprowadzania danych z pliku i ;
L [ i ] , 1 < i < P:
O statni klucz wczytany dotychczas z pliku i ;
S [j ] , 1 < j < 2P: Indeks bufora, który należy użyć, gdy wyczerpie się I [/] . Przedstawiany algorytm nie kończy się. W łaściwy sposób jego zakończenia oma wiamy poniżej. F I . [Inicjowanie] W czytaj pierwszy blok z taśm y i do bufora I [z], wykonaj A[i] <— 1, A [P + z] ^— 0, B [i] z, C [z] i oraz przypisz do L[z] klucz ostatniego rekordu z bufora I [z] dla 1 < i < P. Następnie znajdź takie m, że L [m] = min{L [1] , . . . , L [P ] }; wykonaj £ «— 0, fc <— P + 1. Rozpocznij czytanie z taśmy m do bufora I [A:]. F 2 . [Scalanie] Scalaj rekordy z buforów I [C [1] ] , . . . , I [C [P ] ] do 0 [£] aż do zapełnienia 0 [£]. Jeśli podczas tego procesu zostaje wyczerpany bufor, po wiedzmy I [C [z] ], a 0 [£] nie jest zapełniony, wykonaj A[C [z] ] 0, C [ż] S[C[z]] i scalaj dalej. F 3 . [Zakończenie operacji wejścia/wyjścia] Poczekaj na zakończenie wykonywa nia poprzedniej operacji odczytu (lub odczytu/zapisu). Następnie wykonaj A[A] <— 1, S[B[m] ] 4— A, B[m] k i przypisz do zmiennej L[m ] klucz ostatniego rekordu w I [&]. F 4 . [Przewidywanie] Znajdź takie m, że L[m] = m i n { L [ l ] , . . . , L [P ] } oraz takie A, że A[&] = 0.
344
SORTOWANIE
5.4.6
R y s. 83. Przewidywanie z ruchomymi buforami.
F 5 . [Odczyt/zapis] Rozpocznij czytanie z taśm y m do bufora I [A;] i zapisywanie z bufora 0 Ul na taśm ę wyjściową. Następnie wykonaj t <— 1 — t i wróć do F2. | Na rysunku 84 pokazano przykład działania algorytmu z przewidywaniem dla P = 2 i przy założeniu, że każdy blok na taśmie zawiera tylko dwa re kordy. Zawartość buforów wejściowych jest prezentowana na początku kroku F2. Algorytm F tworzy w istocie P kolejek buforów, gdzie C [z] wskazuje na początek, a BU 1 na koniec i-tej kolejki, natom iast S [ j ] wskazuje na kolejny bufor w kolejce po buforze I [ j ] . Na rysunku 84 tym wskaźnikom odpowiadają strzałki. W iersz 1 przedstawia stan struktury danych zaraz po zainicjowaniu. Każdemu plikowi wejściowemu jest przypisany jeden bufor, a z pliku 1 jest wczytywany kolejny blok (ponieważ 03 < 05). Wiersz 2 ilustruje sytuację po sformowaniu pierwszego, otrzymanego w wyniku scalania bloku: Na wyjście jest wypisywany blok zawierający [01 02 [, natom iast jest wczytywany kolejny blok z pliku 1 (ponieważ 05 < 09). Zauważmy, że w wierszu 3, trzy z czterech buforów wejściowych przynależy w istocie do pliku 2 , ponieważ czytamy z tego pliku i w związanej z tym plikiem kolejce mamy już jeden pełny i jeden częściowo zapełniony bufor. Ruchome przypisywanie buforów jest ważną cechą algorytmu F, ponieważ nie bylibyśmy w stanie działać dalej w wierszu 4, jeśli wejściem w wierszu 3 byłby plik 1 zamiast 2. Żeby udowodnić poprawność algorytm u F, musimy pokazać dwie rzeczy. i) Zawsze jest dostępny jakiś bufor wejściowy (czyli, że w kroku F4 można zawsze znaleźć k). ii) Jeśli bufor wejściowy wyczerpuje się podczas scalania, jego następnik już znajduje się w pamięci (to znaczy, że S [C [ź] ] jest określone w kroku F2). Przypuśćmy, że (i) nie jest prawdziwe. Tak więc w pewnym momencie po doj ściu do kroku F4 żaden z buforów nie jest dostępny. Za każdym razem, gdy
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
5.4.6 Plik 1 zawiera 01 03
04 09
11 13
16 18
Plik 2 zawiera 02 05
06 07
08
12 14
10
Bufory dla pliku 1
Wiersz nr
1
—» 01 03 « -
2
->
Bufory dla pliku 2 —>
02
345
Następne dane będą czytane z
05 < -
pliku
1
03 -> 04 09 < -
->
05 < -
pliku
2
3
09
“H
05 |—>| 06 07
pliku
2
4
09 < -
->
07 -> 08
pliku
1
5
09 > 1 1
->
10
pliku
2
pliku
1
pliku
2
6
7
-> 1 1
13 < -
13 < -
->
13 -> 16 18
->
-> 1 2
10
14 < -
14 <—
R ys. 84. Kolejkowanie buforów zgodne z algorytmem F. dochodzimy do tego kroku, łączna ilość nieprzetworzonych danych we wszystkich buforach odpowiada dokładnie P pełnym buforom, ponieważ bufory są w takim samym tempie opróżniane, jak i zapełniane. Pewne bufory są zapełnione tylko częściowo, ale tylko co najwyżej jeden bufor jest częściowo zapełniony dla każdego pliku. Tak więc jest co najwyżej P częściowo zapełnionych buforów. Z założenia, żaden z 2P buforów nie jest dostępny. Dlatego co najmniej P z nich musi być pełnych. Tak może być tyłko wtedy, kiedy jest P pełnych oraz P pustych buforów, w przeciwnym razie mielibyśmy za dużo danych. Ale w każdej chwili co najwyżej jeden bufor może być niedostępny i pusty. Tak więc (i) musi zachodzić. Załóżmy, że (ii) nie jest prawdziwe. Oznacza to, że dla pewnego pliku w pa mięci nie ma już nieprzetworzonych rekordów, ale bieżący bufor wyjściowy nie jest jeszcze zapełniony. Z zasady przewidywania wynika, że dla każdego innego pliku mamy co najwyżej jeden blok danych, ponieważ nie wczytujemy kolejnego bloku z pliku aż do momentu, w którym taki blok będzie potrzebny, zanim bufory każdego innego bloku zostaną opróżnione. Dlatego całkowita liczba nieprzetwo rzonych rekordów odpowiada co najwyżej P — 1 blokom. Jeśli dodamy niepełny bufor wyjściowy, dostaniemy mniej danych w pamięci, niż można by zmieścić w P buforach - mamy sprzeczność. Powyższe rozumowanie dowodzi poprawności algorytmu F, ale wskazuje tak że na patologiczne okoliczności, w których rzadko w tym algorytmie unikniemy nieszczęścia. Ważny subtelny szczegół, o którym nie wspominaliśmy, to możliwość pojawienia się takich samych kluczy. Taką sytuację omawiamy w ćwiczeniu 5. Zobacz także ćwiczenie 4, w którym rozważamy przypadek P = 1 . Jeden ze sposobów ładnego zakończenia algorytmu F polega na przypisaniu do L[m] w kroku F3 wartości oo, jeśli właśnie wczytany blok jest ostatnim w sekwensie. (Zwyczajowo koniec sekwensu jest zaznaczany w jakiś szczególny sposób). Po wczytaniu wszystkich danych ze wszystkich plików okaże się, że
346
SORTOWANIE
5.4.6
w końcu wszystkie wartości L w kroku F4 są równe oo. Wówczas zazwyczaj jest możliwe rozpoczęcie czytania pierwszych bloków z kolejnych sekwensów ze wszystkich plików. Inicjowanie następnej fazy scalania rozpoczyna się po wypisaniu na wyjście ostatnich P + 1 bloków. W ten sposób możemy utrzymywać taśm ę wyjściową na pełnej prędkości, dokonując w każdej chwili odczytu co najwyżej jednej taśmy. W yjątkiem od tej zasady jest krok F I, w którym byłoby korzystne czytanie z wielu taśm jednocześnie, w celu gładkiego rozpoczęcia obliczeń. Jednak krok F I można zazwyczaj zorganizować w taki sposób, żeby był wykonywany jednocześnie ze wcześniejszymi obliczeniami. Na pomysł zaglądania do ostatnich rekordów w blokach, żeby przewidzieć, który bufor zostanie opróżniony jako pierwszy, wpadł F. E. Holberton w 1953 ro ku. Opis powyższej techniki pierwszy opublikował E. H. Friend [J A C M 3 (1956), 144-145, 165]. Jego dość skomplikowany algorytm używał 3P buforów wejścio wych, po trzy przypisane każdemu plikowi wejściowemu. To zostało naprawione w algorytmie F przez zastosowanie ruchomych buforów. Tutaj każdy plik może korzystać jednocześnie z P + 1 buforów wejściowych, przy czym nigdy nie potrze ba łącznie więcej niż 2P buforów. Scalanie z mniej niż 2P buforami wejściowymi omawiamy na końcu tego punktu. O pewnych interesujących usprawnieniach algorytm u F piszemy w punkcie 5.4.9. P o ró w n a n ie różn ych sch em atów sortow an ia. Zastosujmy teraz naszą wie dzę o taśm ach i scalaniu do porównania efektywności różnych schematów sca lania, które poznaliśmy w punktach od 5.4.2 do 5.4.5. Jest pouczające, żeby zapoznać się ze szczegółami każdej metody, wykorzystując ją w tym samym za daniu. Dlatego rozważymy problem sortowania pliku rekordów, z których każdy składa się ze 100 znaków, a w pamięci możemy zmieścić 100000 znaków, nie licząc miejsca na program i jego zmienne robocze oraz miejsca na dowiązania w drzewie wyboru. (Pam iętajm y, że przenieśliśmy się w czasy, gdy pamięci były m ałe). Dane na taśm ie są uporządkowane losowo i są podzielone na bloki po 5000 znaków. Form at danych wyjściowych jest taki sam. Oprócz taśmy wejściowej do dyspozycji mamy pięć (jednostek) taśm roboczych. Łączna liczba rekordów do posortowania wynosi 100 000, ale algorytmy sor tujące nie znają jej z góry. Diagramy przedstawione na załączonej wkładce A ilustrują, co dzieje się, gdy różne algorytmy scalania zastosujemy do tych danych. Najlepszy sposób patrzenia na tę ważną ilustrację polega na wyobrażeniu sobie, że obserwujemy rzeczywiste sortowanie. Należy wolno prześledzić każdy diagram, przesuwając się z lewa na prawo, i myśleć, że jesteśm y w stanie zobaczyć jak sześć taśm jest czytanych, zapisywanych i/lu b czytanych wstecz, tak jak to jest pokazane na rysunku. Podczas scalania P-wejściowego taśm y wejściowe będą przesuwać się P razy rzadziej niż taśm a wyjściowa. Zakładamy, że po tym, jak taśm a wejściowa zostanie przeczytana w całości (przewinięta i zabezpieczona), zdolny operator usuwa ją i zastępuje taśm ą roboczą w ciągu 30 sekund. W przykładach 2, 3 i 4 czas, w którym kom puter czeka bezczynnie na zakończenie akcji operatora,
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
347
jest nazywany „czasem ścieżki krytycznej” . W pozostałych przykładach operacje zmiany taśm są wykonywane jednocześnie z innymi operacjami. P rzy k ła d 1 . Scalanie zrów n ow ażone z czy ta n ie m w przód. Przypom nij my sobie specyfikację naszego problemu: Długość każdego rekordu wynosi 100 znaków. Mamy wystarczająco dużo miejsca w pamięci, żeby jednocześnie pomie ścić 1000 rekordów. Każdy blok na taśmie zawiera 5000 znaków (50 rekordów). Mamy łącznie 100000 rekordów (= 10 000 000 znaków = 2000 bloków). Rozmiar bloku w plikach pośrednich możemy ustalić sami. W sześciotaśmowym scalaniu zrównoważonym scalanie jest trzywejściowe, zatem zastosowanie techniki z algorytmu F wymaga 8 buforów. Dlatego możemy użyć bloków zawie rających po 1000/8 = 125 rekordów (= 12 500 znaków). Fazę wstępnego rozrzucania można wykonać za pomocą algorytmu wyboru z podm ianą (algorytm 5.4.IR ), a w celu utrzym ania płynnego ruchu taśm mo żemy użyć dwóch buforów wejściowych, każdy po 50 rekordów, i dwóch buforów wyjściowych, każdy po 125 rekordów. Na drzewo wyboru pozostaje 650 rekordów. Zatem większość początkowych sekwensów będzie składała się z około 1300 rekordów (10 lub 11 bloków). Na diagramie mamy 78 początkowych sekwensów, z których ostatni jest dość krótki. Jak pokazano na diagramie, w pierwszym przebiegu scalania, zam iast na przemiennie na taśm y 4, 5 i 6 , dziewięć sekwensów zostaje sformowanych na taśmie 4. Dzięki tem u możliwe jest jednoczesne scalanie i zmiana przez ope ratora taśmy wejściowej na taśm ę roboczą w jednostce taśmowej 6 . Ponieważ łączna liczba sekwensów 5 jest znana po zakończeniu wstępnego rozrzucania, wiemy, że [5/9] sekwensów powinno zostać sformowanych na taśm ie 4, następnie [(5 —3)/9] na taśmie 5, potem [(5 —6)/9] na taśmie 6 . Całą procedurę sortowania w tym przypadku można przedstawić w skrócie w następujący sposób (posługując się oznaczeniami wprowadzonymi w punk cie 5.4.2): l 26 -
93 -
781
l 26 -
93
l 26 -
926*
-
-
_
_
-
39 -
-
39 -
-
38 -
271
271
241
—
—
—
P rzy k ła d 2 . Scalanie w ielofazow e z c zy ta n iem w p rzód . Drugi diagram z wkładki A przedstawia scalanie wielofazowe wykonywane zgodnie z algoryt mem 5.4.2D. W tym przypadku jest wykonywane scalanie pięciowejściowe, tak więc pamięć została podzielona na 12 buforów, każdy po 83 rekordy. W czasie wstępnego wyboru z podm ianą mamy dwa 50-rekordowe bufory wejściowe i dwa 83-rekordowe bufory wyjściowe. Na drzewo pozostają 734 rekordy. Tym razem więc początkowe sekwensy m ają długość około 1468 rekordów (17 lub 18 bloków). W sytuacji przedstawionej na diagramie mamy 5 = 70 początkowych sekwensów, przy czym dwa ostatnie składają się w rzeczywistości, odpowiednio, z czterech
348
SORTOWANIE
5.4.6
i jednego bloku. Ten schemat sortowania można przedstawić jak następuje: 0131 17
0131 15
012i 12
r—1 00
-
115
114
l 12
I8
-
08142 x53
l7
l6
l4
-
48
142 x53
l3
l2
-
84
44
2X53
l1
-
l e 1^ 1
82
42
52
-
34 1
191
8]
41
51
—
—
O
701
oc
0131 18
__
—
—
Osobliwie, sortowanie wielofazowe działa około 25 sekund dłużej niż dużo mniej wyszukane scalanie zrównoważone! Są dwa główne tego powody. 1 ) Scalanie zrównoważone miało w tym przypadku wyjątkowe szczęście,
ponieważ S = 78 jest niewiele mniejsze od doskonałej potęgi 3. Jeśli mielibyśmy 82 początkowych sekwensów, to w scalaniu zrównoważonym byłby potrzebny jeszcze jeden przebieg. 2 ) W scalaniu wielofazowym tracim y 30 sekund na zmianę taśm y wejściowej, a łącznie ponad 5 m inut spędzamy, oczekując na zakończenie operacji przewi jania. Dla kontrastu, scalanie zrównoważone potrzebuje stosunkowo mało czasu na przewijanie. W drugiej fazie scalania wielofazowego zaoszczędzono 13 sekund, ponieważ mogliśmy założyć istnienie 8 domyślnych sekwensów na taśmie 6 , nawet podczas jej przewijania. Jednak w żadnym innym przypadku przewijanie nie pokrywało się z innymi operacjami. Dlatego w sortowaniu wielofazowym tracimy tak wiele, chociaż wymaga ono znacząco mniej czasu na czytanie i pisanie. P rz y k ła d 3. S calan ie kaskadow e z czy ta n ie m w przód. Ten przypadek jest analogiczny do poprzedniego, jednak wykorzystuje się w nim algorytm 5.4.3 C. Scalanie kaskadowe m a zatem postać: 115
I 12
I 14
115
-
l5
l9
-
l 14
l 15
132336
5463
53
5362
-
l1
22
-
121
61
— i OO
181
161
701
—
—
_
1
114
—
(Pam iętajm y, żeby prześledzić każdy z tych przykładów w akcji, posługując się diagram am i z wkładki). P rz y k ła d 4. S calan ie w ielofazow e z p o d zia łem ta śm . W tej procedurze, opisanej na końcu punktu 5.4.2, możliwe jest wykonywanie większości przewi jan ia jednocześnie z innymi operacjami. T utaj ma zastosowanie scalanie czterowejściowe. Tak więc dzielimy pamięć na bufory 100-rekordowe. W drzewie wyboru z podm ianą mamy 700 rekordów, co pozwoliło sformować 72 począt kowych sekwensów. Znowu ostatni sekwens jest bardzo krótki. Do wstępnego rozmieszczania sekwensów użyto algorytmu analogicznego do 5.4.2D, po którym
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
349
121
1
115
I8
-
Oto i—1 <£>
zastosowano prostą, ale wymyśloną ad hoc, metodę rozmieszczania domyślnych sekwensów:
0214
-
021944
0244
021944
021 17
021 15
02l n
l 13
l 11
l7
l 10
l8
l4
-
02443244
1844
l6
l4
-
44
02443241
1444
l5
l3
-
443x
0144324i
1344
l2
-
3 472
4 43*
4 23 24 1
44
l1
-
S1?2^ 1
4 33 i
4 13 24 1
43
-
131
4 23ł
3 24x
42
-
13941
72131
4 !3 4
3' A1
41
71131
31
41
-
141
131
-
-
271
—
-
181 181
— — 721 Okazuje się, że ten algorytm m a najlepszy czas działania wśród wszystkich algorytmów z wkładki A, które nie czytają wstecz. Ponieważ S nigdy nie będzie bardzo duże, istnieje możliwość wymyślenia bardziej skomplikowanego algoryt mu, który rozmieszczałby domyślne sekwensy jeszcze lepiej; zobacz 5.4.2-(26).
P rzy k ła d 5. Scalanie kaskadowe z jed n o c ze sn y m p rzew ijan iem . Ten algorytm działa prawie tak samo szybko jak algorytm z poprzedniego przykładu, chociaż jest prostszy. Do wstępnego rozmieszczenia sekwensów wykorzystujemy po prostu metodę sortowania kaskadowego, taką jak w algorytmie 5.4.3C, ale z T = 5 zamiast T = 6 . Następnie w każdej fazie każdej „kaskady” wykorzy stujemy taśmy w taki sposób, żeby nie pisać na taśmę, która nie m a szansy być przewiniętą. Sortowanie w tym przypadku można opisać krótko jak następuje: I 21
122
l4
l7
72 -
I 19 -
261
-
-
-
122235
410
7282
_
41
81
221
-
83
-
I 10
161
-— — — — 721 P rzy k ła d 6 . Scalanie zrów n ow ażone z czy ta n ie m w stec z. To jest to samo co w przykładzie 1 , ale z całkowicie wyeliminowanym przewijaniem:
Af
A1 ■'*78
A f
A j6
a3
A2 A 1
Dl -
~
~
&24
Dl -
Dl -
&27
^27
350
5.4.6
SORTOWANIE
Ponieważ w przykładzie 1 mieliśmy stosunkowo mało przewijania, zatem ten schemat nie jest znacząco lepszy od schem atu tylko z czytaniem w przód. W rze czywistości okazuje się, że jest on wolniejszy od algorytmu wielofazowego z dzie leniem taśm , mimo szczęśliwie uzyskanej wartości S = 78. P rz y k ła d 7. S calan ie w ielofazow e z c zy ta n iem w stecz. W tym przypadku używamy tylko pięciu (zamiast sześciu) taśm , żeby wyeliminować czas potrzebny na przewijanie i zmianę taśm y wejściowej. Tak więc scalanie jest czterowejściowe, a alokacja buforów jest podobna do tej z przykładów 4 i 5. Rozrzucanie sekwensów jest takie jak w algorytmie 5.4.2D, ale ze zmieniającymi się kierunkami uporządkowania sekwensów i przy założeniu, że taśm a 1 jest docelową taśm ą wyjściową. Najpierw rosnący sekwens jest zapisywany na taśmie 1; następnie malejące sekwensy są zapisywane na taśm ach 2, 3, 4; później sekwensy rosnące są zapisywane na taśm ach 2 , 3, 4; potem malejące na taśm ach 1, 2 , 3 itd. Za każdym razem, gdy zmieniamy kierunek, wybór z podm ianą daje krótszy sekwens, tak więc okazuje się, że zostaje sformowanych 77 początkowych sekwensów, a nie 72 jak w przykładach 4 i 5. Dzięki takiej procedurze dostajem y początkowy rozkład sekwensów (22, 21, 19, 15), następnym rozkładem doskonałym jest (29, 56, 52, 44). W ćwiczeniu 5 .4.4-5 pokazujemy, w jaki sposób wygenerować słowa złożone z liczb scaleń, które można wykorzystać do optymalnego rozmieszczenia domyślnych sekwen sów. Takie postępowanie jest możliwe do zastosowania w praktyce, ponieważ z ograniczeń na długość taśm y w jednym krążku wynika, że S nie jest zbyt duże. Dlatego w przykładzie z wkładki A, do rozmieszczenia domyślnych sekwensów (zobacz ćwiczenie 7) zastosowano właśnie taką metodę. Okazuje się, że to jest najszybsza m etoda z m etod przez nas prezentowanych. P rz y k ła d 8 . S calan ie kaskadow e z c zy ta n iem w stec z. Podobnie jak w przy kładzie 7 użytych zostaje tylko pięć taśm . Postępujemy zgodnie z algorytmem 5 .4 .3C, wykorzystując przewijanie i czytanie w przód, żeby uniknąć scalania jednowejściowego (ponieważ w jednostkach taśmowych typu MIXT przewijanie jest więcej niż dwukrotnie szybsze od czytania). Rozkład sekwensów jest taki sam jak w przykładzie 6 . Ten schemat sortowania można przedstawić w skrócie jak następuje (j oznacza przewijanie): -
A \°
Ml
A \l
-
D \D \D \
Al
Al
-
D \l
£>17
^9 i
T >25
&21
Ci
-
10 - 1^
A {9
00
Af (MN
A?
_ — Ä72 P rz y k ła d 9. S ortow an ie o scy la cy jn e z czy ta n iem w stecz. W sortowaniu oscylacyjnym z T = 5 (algorytm 5.4.5B) można zastosować alokację buforów taką jak w przykładach 4, 5, 7 i 8, ponieważ ma w nim miejsce scalanie cztero wejściowe. Jednakże w tym przypadku wybór z podm ianą nie zachowuje się tak samo, ponieważ tuż przed rozpoczęciem każdej fazy scalania jest wypisywany
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
351
sekwens o długości 700 (a nie na przykład 1400) po to, żeby oczyścić pamięć wewnętrzną. W wyniku tego, w tym przypadku dostajemy 85 sekwensów, a nie 72. Oto pewne kluczowe kroki w tym procesie sortowania: Ai
-
DA D
a
D
d
4
D
a
A
i
D
Da
a
D
D
a
D
qD a
D
a
A \
qD a
D
a
-
A
iq
D
a
-
A
iq
D
a
-
A i6
D s 7
A
s
a
D
D
a
A
iq
D
a
i
^ D
a
D
a
A \
-
i
Ai Ai
Ai Ai
Ai
Ai
Ai
-
a
A
A
A \
D
a
-
A
A
i
A\Q qA a
A le
ą
A
i
QD
a
A
ig
iq
qD a
A \
-
a
D
i
A i6 A i6 A i 6 A i3
A
iq
A
a
A ieA i3
A
iq
A
a
A ieA i3
Aml
A ie i
A i6 i
-
-
-
5
P rzykład 1 0 . Sortow an ie o scy la cy jn e z czy ta n ie m w p rzód . W ostatnim przykładzie nie używamy wyboru z podm ianą, ponieważ wszystkie początkowe sekwensy muszą być tej samej długości. Dlatego, kiedy tylko potrzebujem y sfor mować nowy sekwens, wykorzystujemy do tego celu całą pamięć wewnętrzną i sortujemy w niej 1000 rekordów. To daje S = 100. Oto pewne kluczowe momenty tego procesu sortowania: A i
A i
-
-
-
-
A i
A i
A i
A i
-
-
_
-
-
A 1A 4 Ą
A i A iA 4
i
A
A
ą
A
i
A
i
i
A i A 4
A
i
A
a
Ą
i
A 4
A 1A 4
A
i
A 4
A 1A 4
A
i
A 4
A 1A 4
Ą
^
xa
4
Ą xA 4
i
A
A i A
a
a
A i A ąA ig A
a
l4A i 6 l4 A l g
AlOO
A iA 4
A iA 4
A i A
ą
A iA 4^4i6A 64
^ iA 4
4 iA 4
Ąi A
a
Ą
-
a4 _
xA a
A
iq
A
qa
-
-
l ^ 4 A 1 6 A 64
-
-
^ 1 ^ 4 A l 6A 64
A 36
^-i ^4^16^64
_
_
_
352
SORTOWANIE
5.4.6
Ö J*0h3 U cN ö O IbO oj 3 N
S-i
a CÖ X ! N U
Początkowe sekwensy, S
R ys. 85. Trochę mylący sposób porównywania różnych schematów scalania. Ten algorytm okazuje się najwolniejszy, częściowo z powodu nieużywania wyboru z podm ianą, ale głównie z powodu niezbyt zręcznej końcówki (scalanie dwuwejściowe). O c e n a c z a su d z ia ła n ia . Zastanówmy się teraz, w jaki sposób wyznaczyć przybliżony czas sortowania z użyciem taśm typu M IX T. Czy bylibyśmy w stanie przewidzieć wyniki z wkładki A bez przeprowadzania szczegółowej symulacji? Jeden ze sposobów, który tradycyjnie jest używany do porównywania róż nych schematów sortowania, polega na nałożeniu na siebie i porównaniu wykre sów takich jak te z rysunków 70, 74 i 78. Te wykresy przedstawiają rzeczywistą liczbę przebiegów przez dane jako funkcję liczby początkowych sekwensów, przy założeniu, że długości początkowych sekwensów są w przybliżeniu takie same. (Zobacz rysunek 85). Jednak takie porównanie nie jest zbyt realistyczne, ponie waż w różnych m etodach mamy różne liczby początkowych sekwensów. Ponadto różny jest nadmiarowy czas powodowany przez względną częstość występowania przerw międzyblokowych. Równie istotny jest czas przewijania. Wszystkie te maszynowo zależne osobliwości powodują, że nie jest możliwe przygotowanie diagramów, które umożliwiają maszynowo niezależne porównanie różnych metod. Z drugiej strony, rysunek 85 pokazuje, że z wyjątkiem scalania zrównoważonego rzeczywistą liczbę przebiegów można całkiem dobrze przybliżyć za pomocą gład kich krzywych postaci a ln 5 + ß. Dlatego możemy porównywać różne metody zupełnie dobrze w każdej szczególnej sytuacji, korzystając ze wzorów na przy bliżony czas działania. Naszym celem jest oczywiście znalezienie wzorów, które są proste, ale ciągle wystarczająco realistyczne. Spróbujmy teraz wyprowadzić takie wzory w zależności od następujących param etrów: N — liczba sortowanych rekordów,
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
353
C — liczba znaków na rekord, M = liczba pozycji na znaki w pamięci wewnętrznej (zakładamy, że jest to wielokrotność C), r = czas w sekundach potrzebny do wczytania lub zapisania jednego znaku, pr — czas w sekundach potrzebny na przewinięcie jednego znaku, ctt = czas opóźnienia w sekundach związany z rozruchem i zatrzym aniem taśmy, 7 = liczba znaków w przerwie między blokowej,
ö — czas w sekundach, który jest potrzebny operatorowi na wymontowanie i zmianę taśm y wejściowej, Bi = liczba znaków w bloku w nieuporządkowanym pliku wejściowym, B 0 = liczba znaków w bloku w uporządkowanym pliku wyjściowym. Dla taśm typu M IX T mamy r = 1/60000, p = 2/5, a = 300, 7 = 480. W przy kładzie rozważanym wcześniej N = 100000, C = 100, M = 100000, S = 30, Bi = B 0 — 5000. Te param etry opisują zazwyczaj te cechy kom putera i danych, które wpływają najbardziej na czas sortowania (chociaż czas przewijania jest często zadany przez dużo bardziej skomplikowane wyrażenie niż to ze współ czynnikiem p). Dla powyższych param etrów i schem atu scalania wyznaczymy kolejne wielkości takie jak: P = maksymalny stopień scalania w tym schemacie, P f = liczba rekordów w drzewie wyboru z podm ianą, S = liczba początkowych sekwensów, 7T = a ln 5 + ß — przybliżona, średnia liczba odczytów i zapisów każdego zna
ku, nie wliczając wstępnego rozrzucania i końcowego scalania, 7r7 = ot ln 5 + ß f = przybliżona, średnia liczba przewinięć każdego znaku podczas
pośrednich faz scalania, B = liczba znaków w bloku w pośrednich fazach scalania, . uji^uj^ujo = „współczynnik nadmiarowości” , rzeczywisty czas potrzebny do odczytania lub zapisu jednego znaku (uwzględniający przerwy oraz rozruch/zatrzym anie) podzielony przez czas sprzętowy r. W przykładach z wkładki A rozmiary bloków i buforów zostały dobrane zgodnie ze wzorem S = [ ć ( 2F f 2) j C '
W
tak więc bloki mogą być tak duże, jak to jest tylko możliwe, ale w zgodzie z wyma ganiami algorytmu F. (Żeby uniknąć problemów podczas ostatniego przebiegu, P powinno być na tyle małe, żeby ( 1 ) dawało B > B 0).Wówczas rozmiar drzewa wyboru z podm ianą wynosi P f
= (M-2Bi-2B)/C.
(2 )
354
SORTOWANIE
5.4.6
Dla danych losowych liczbę początkowych sekwensów 5 można oszacować nastę pująco o r N 7i S ~ ------(**) 2 P t ^1—6 . w W tym celu korzystamy z wyników z punktu 5.4.1. Jeśli przyjmiemy Bi < B i że taśm a wejściowa może obracać się z pełną prędkością w fazie rozrzucania (zobacz niżej), to czas potrzebny do rozrzucenia początkowych sekwensów wynosi około NCuJiT, gdzie Ui = (Bi + 1 ) / Bi. (4) Używany schemat buforowania umożliwia podczas scalania jednoczesne czytanie, pisanie i obliczanie, ale częste przełączanie taśm wejściowych oznacza, że musimy uwzględnić czas rozruchu i zatrzymywania. Dlatego przyjmujemy, że w = (B + 7 + <*)/B,
(5 )
i że czas scalania wynosi w przybliżeniu (7T + p7Tł)NCuJT.
(6)
W tym wzorze trochę doliczamy do czasu przewijania, ponieważ co zawiera w so bie czas zatrzym ania i rozruchu, ale inne elementy, które powinny być brane pod uwagę, jak przewijanie przerw i czas na odczyt z punktu ładowania, zazwyczaj to wyrównują. Końcowy przebieg scalania, przy założeniu, że B 0 < B , zależy od współczynnika nadmiarowości Wo = (Bo + ' y) / B 0.
(7 )
Czas końcowego scalania i przewijania możemy oszacować jako nC (l +
p ) ujqt ;
w praktyce może on być trochę większy ze względu na nierówne długości bloków (wejście i wyjście nie są zsynchronizowane tak jak w algorytmie F), ale czas działania będzie prawie taki sam dla wszystkich schematów scalania. Zanim przejdziemy do bardziej szczegółowych wzorów dla poszczególnych schematów, spróbujm y uzasadnić przyjęcie dwóch z powyższych założeń. a) Czy wybór z podmianą może nadążyć za taśmą wejściową? W przykła dach z wkładki prawdopodobnie tak, ponieważ potrzeba około dziesięciu itera cji wewnętrznej pętli algorytm u 5.4.IR , żeby wybrać kolejny rekord, a mamy CuJiT > 1667 mikrosekund, żeby to zrobić. Przy uważnym zaprogramowaniu wyboru z podm ianą można to zrobić na większości komputerów (nawet z lat siedemdziesiątych). Zauważmy, że sytuacja jest mniej groźna podczas scalania. Ponieważ P nie jest zbyt duże, to czas obliczeń mierzony na jeden rekord jest prawie zawsze mniejszy od czasu obsługi taśm y podczas scalania P-wejściowego, mierzonego na jeden rekord. b) Czy zawsze powinniśmy wybierać maksymalny rozmiar bufora B spełnia jący ( 1 )? Duży rozmiar bufora zmniejsza współczynnik uj z (5 ); ale zwiększa
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
355
także liczbę początkowych sekwensów S, ponieważ zmniejsza się P f. Nie jest na tychmiast jasne, który czynnik jest ważniejszy. Jeśli potraktujem y czas scalania jako funkcję x = C P \ to możemy wyrazić ją w przybliżeniu w postaci
dla pewnych stałych #i, 6 2 , #3, 04, przy #3 > 8 4 . Po zróżniczkowaniu tej funkcji po x widzimy, że istnieje takie iVo, że dla żadnego N > No nie opłaca się zwiększać x kosztem rozmiaru bufora. Dla przykładu, w sortowaniu z wkładki A, Nq okazuje się być w przybliżeniu równe 10000; przy sortowaniu więcej niż 10000 rekordów lepiej wziąć bufory o większych rozmiarach. Zauważmy, że w scalaniu zrównoważonym liczba przebiegów zmienia się zawsze, gdy S przekracza potęgę P. Jeśli przybliżona wartość N jest z góry znana, to rozmiar bufora należy wybrać w taki sposób, żeby z największą dozą prawdopodobieństwa S było trochę mniejsze od potęgi P. Dla przykładu, roz miarem bufora w pierwszym przykładzie z wkładki A było 12500; dla S = 78, ten wybór był bardzo dobry, jeśli jednak okazałoby się, że S jest równe 82, to dużo lepiej byłoby zmniejszyć trochę rozmiar bufora. W zory dla d ziesięciu p rzyk ład ow ych sch em atów . Powróćmy do wkładki A i spróbujmy podać wzory, które przybliżają czas działania każdej z dziesięciu zaprezentowanych metod. W większości przypadków podstawowy wzór N C w + (7r + pn f)NCujT + (1 +
p ) N C lu0t
(9 )
będzie wystarczająco dobrym przybliżeniem ogólnego czasu sortowania, jeśli tylko określimy liczbę pośrednich przebiegów scalania 7r — a ln S + f3 i liczbę pośrednich przebiegów przewijania n f — a f ln S - b/3'. Czasami musimy uwzględnić w (9) dodatkowe poprawki. Oto szczegółowe opracowania dla każdej metody: P rzy k ła d 1 . S calanie zrów n ow ażone z c z y ta n ie m w p rzód . Dla scalania P-wejściowego na 2P taśm ach można skorzystać ze wzorów: 7r = [ I n S /ln P ] — 1,
7r' = |" ln 5 /ln P " |/P
P rzy k ła d 2 . Scalanie w ielofazow e z czy ta n ie m w p rzód . Możemy przy jąć, że 7r' « 7r, ponieważ po każdej fazie następuje zazwyczaj przewijanie o mniej więcej tej samej długości co długość wyniku poprzedniego scalania. Z tabeli 5 .4.2-1 dostajemy wartości a w 0.795, ¡3 w 0.864 —2 dla przypadku sześciu taśm . (Odejmujemy 2 , ponieważ w tabeli uwzględniono zarówno przebiegi pośrednie, jak i przebiegi początkowy i końcowy). Do (9) należy dodać czas przewinięcia taśmy wejściowej po zakończeniu wstępnego rozrzucania, to jest pNCuJiT + 5. P rzy k ła d 3. Scalanie kaskadow e z c z y ta n ie m w przód . Z tabeli 5.4.3-1 otrzymujemy wartości a « 0.773, (3 « 0.808—2. Czas przewijania jest stosunkowo trudny do oszacowania. Być może wystarczająco dobre jest wzięcie 7r' « 7r. Podobnie jak w przykładzie 2, do (9) musimy dodać czas wstępnego przewijania.
356
5.4.6
SORTOWANIE
P rz y k ła d 4. Scalan ie w ielofazow e z d zielen iem taśm . Tabela 5.4.2-6 mó wi nam, że a ~ 0.752, ¡3 ~ 1.024 — 2 . Podczas przewijania prawie zawsze są wykonywane inne czynności, z wyjątkiem (pNCoJiT + S) sekund po inicjowniu i dwóch faz pod koniec (2 pN C ior razy 36 procent). Możemy także odjąć 0.18 od /3, ponieważ pierwsze pół fazy pokrywa się z początkowym przewijaniem. P rz y k ła d 5. Scalan ie kaskadowe z jed n o c ze sn y n p rzew ijaniem . W tym przypadku korzystamy z tabeli 5.4.3-1 dla T = 5 i dostajemy a « 0.897, f3 « 0.800 — 2. Prawie całe przewijanie, które nie pokrywa się z innymi ope racjami, występuje zaraz po wstępnym rozrzucaniu i zaraz po scalaniu dwuwejściowym. Po wykonaniu doskonałego rozrzucenia najdłuższa taśm a zawiera około l / g danych, gdzie g jest „współczynnikiem wzrostu” . Po każdym scalaniu dwuwejściowym, w przypadku sześciu taśm , przewijanych jest dkdn_k znaków (zobacz ćwiczenie 5.4.3-5). W przypadku T taśm można pokazać, że ta wielkość jest równa w przybliżeniu (2/(2T — 1)) (l —c o s(4 7 t/(2 T — 1))) długości całego pliku. W naszym przypadku T = 5, jest to równe §(1 —cos 80°) ~ 0.184 długości pliku, a takie przewijanie wykonujemy 0.946 ln S + 0.796 —2 razy. P rz y k ła d 6 . Scalan ie zrów n ow ażone z c zy ta n iem w stecz. T utaj jest tak samo jak w przykładzie 1 , z wyjątkiem tego, że większość przewijania zosta ła wyeliminowana. Zmiana w kierunku z w przód na wstecz powoduje pewne opóźnienia, ale nie są one istotne. Istnieje szansa 50-50, że przewijanie będzie potrzebne przed ostatnim przebiegiem, a zatem możemy wziąć = 1/(2P ). P rz y k ła d 7. Scalan ie w ielofazow e z c zy ta n iem w stecz. Ponieważ w tym przypadku wybór z podm ianą produkuje sekwensy, których kierunek uporząd kowania zmienia się w przybliżeniu co P razy, musimy (3 ) zastąpić nowym wzorem dla S . W ystarczająco dobrym przybliżeniem, zaproponowanym w ćwi czeniu 5.4.1-24, jest S = \N (3 4- 1/P )/(6 P ')~ | + 1. Cały czas przewijania jest wyeliminowany, a z tabeli 5.4.2-1 dostajemy, że a ^ 0.863, [3 w 0.921 —2. P rz y k ła d 8 . Scalan ie kaskadow e z c zy ta n iem w stecz. Z tabeli 5.4.3-1 dostajem y a « 0.897, (3 « 0.800 — 2 . Czas przewijania można oszacować ja ko równy podwojonej różnicy, „przebiegów z kopiowaniem” i „przebiegów bez kopiowania” z tej tabeli, plus 1 /(2 P ) w przypadku, gdy ostatnie scalenie musi zostać poprzedzone przewijaniem (żeby dostać porządek rosnący). P rz y k ła d 9. S ortow an ie o scy la cy jn e z c zy ta n iem w stec z. W tym przy padku musimy wiele razy uruchamiać i zatrzymywać wybór z podmianą; za jed nym razem rozrzucanych jest od P —1 do 2P —1 sekwensów (średnio P). Dlatego średnia liczba sekwensów okazuje się być równa w przybliżeniu P f{2P —4 /3 ) /P i możemy oszacować, że S == \ N /((2 —4 /(3 P ))P ')" | + 1 . Niewiele czasu potrzeba na przełączenie się ze scalania na rozrzucanie i odwrotnie. Jest to w przybliżeniu czas odczytu P ' rekordów z taśm y wejściowej, czyli P ^ C ^ t , i zdarza się to około S / P razy. Czasy przewijania i scalania można oszacować tak jak w przykładzie 6 .
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
357
P rzy k ła d 10. Sortow an ie o scy la cy jn e z czy ta n ie m w przód. Ta m etoda nie jest łatwa do analizy, ponieważ końcowe fazy „czyszczące” , wykonywane po wyczerpaniu wejścia, nie są tak efektywne jak fazy wcześniejsze. Jeśli pominiemy ten powodujący kłopoty aspekt, to czas scalania można oszacować, przyjmując a = 1 / l n P , {3 = 0 oraz = w/ P. W tym przypadku rozrzucanie sekwensów jest trochę inne, ponieważ nie stosujemy wyboru z podm ianą. Bierzemy P f = M / C i S = \ N / P Przy pewnej uwadze możemy podczas rozrzucania zapewnić jednoczesne czytanie, pisanie i obliczanie, z dodatkowym czynnikiem w czasie nadmiarowym o wartości około (M + 2B) / M , Czas na przełączanie trybu pracy, o którym mowa w przykładzie 9, nie m a tu ta j zastosowania, ponieważ taka zmia na jest dokonywana podczas przewijania. Tak więc oszacowanie czasu sortowania w tym przypadku wynosi (g) plus 2 B N C u j i r / M . Tabela 1 ZBIORCZA TABELA OSZACOWAŃ CZASÓW SORTOWANIA Przy. P 1 2
3 4 5 6
7 8
9 10
3 5 5 4 4 3 4 4 4 4
B
P'
12500 650 8300 734 8300 734 10000 700 10000 700 12500 650 10000 700 10000 700 10000 700 10000 -
S
u
79 1.062 70 1.094 70 1.094 73 1.078 73 1.078 79 1.062 79 1.078 73 1.078 87 1.078 100 1.078
a
(3
0.910-1.000 0.795-1.136 0.773-1.192 0.752-0.994 0.897-1.200 0.910-1.000 0.863-1.079 0.897-1.200 0.721-1.000 0.721 0.000
a'
P'
0.303 0.000 0.795--1.136 0.773--1.192 0.000 0.720 0.173 0.129 0.000 0.167 0.000 0.000 0.098 0.117 0.000 0.125 0.180 0.000
(9 )
Dodatkowo Szac. Rzecz, całkowity całkowity do (9 )
1064 1010 p N C u ^ + ó 972 pNCuJir + S 844 pNCuiiT + S 972 981 922 952 846 P fSCuJir/P 1095 2BNCooiT/M
1064 1113 1075 947 972 981 922 952 874 1131
1076 1103 1127 966 992 980 907 949 928 1158
W tabeli 1 przedstawiono oszacowania, które dla naszych przykładów nie są najgorsze, chociaż w kilku przypadkach rozbieżność wynosi około 50 sekund. Wzory z przykładów 2 i 3 wskazują, że dla sześciu taśm powinniśmy wybrać scala nie kaskadowe zamiast scalania wielofazowego, jednak w praktyce wielofazowość okazuje się lepsza. Dzieje się tak dlatego, że wykresy podobne do tych z rysunku 85 (które odpowiadają przypadkowi z pięcioma taśmami) dla algorytm u sortowa nia wielofazowego są prawie liniami prostymi. Dla sześciu taśm kaskadowość jest lepsza od wielofazowości, dla 14 < 5 < 15 i 43 < S < 55, czyli wartości bliskich „doskonałych” liczb kaskadowych 15 i 55. Jednak dla wszystkich innych wartości S < 100 rozrzucanie wielofazowe z algorytmu 5.4.2D jest tak samo dobre lub lepsze. Kaskadowość wygra z wielofazowością, gdy S —►oo, ale w rzeczywistości S nie dąży do oo. Niedoszacowanie w przykładzie 9 jest spowodowane podobnymi okolicznościami. Wielofazowość jest lepsza od oscylacji, nawet jeśli teoria mówi, że przy dużych S algorytm oscylacyjny będzie lepszy. R óżn e inne uw agi. Nadszedł czas, żeby poczynić kilka obserwacji, mniej lub bardziej związanych ze sobą, na tem at scalania taśmowego. • Z powyższych wzorów widać, że koszt sortowania taśmowego jest w zasa dzie funkcją N razy C, a nie niezależnie od N i C. Pominąwszy kilka stosunkowo
358
SORTOWANIE
5.4.6
drobnych założeń (jak to, że B jest wielokrotnością C ), nasze wzory mówią, że posortowanie miliona rekordów, każdy o długości 10 znaków, zabiera tyle samo czasu co posortowanie 100 000 rekordów, z których każdy zawiera 100 znaków. Rzeczywistość może być jednak inna, czego nasze wzory nie pokazują. Jest to spowodowane rozmiarem pamięci przeznaczonym na dowiązania podczas wyboru z podm ianą. W żadnym przypadku na koszt algorytmów nie wpływa rozmiar klucza, chyba że klucze są już tak długie i złożone, że obliczenia wewnętrzne nie nadążają za operacjami taśmowymi. W przypadku długich rekordów i krótkich kluczy, istnieje pokusa, żeby „oddzielić” klucze od rekordów, najpierw je posortować, a następnie odpowiednio przemieścić całe rekordy. Jednak w rzeczywistości ten pomysł nie daje pożąda nych efektów, a tylko odsuwa problem, ponieważ czas potrzebny do ostatecznego przemieszczenia rekordów jest taki sam jak w przypadku zwykłego sortowania przez scalanie. • Jeśli programujemy algorytm sortowania, który będzie wielokrotnie uży wany, należy ocenić bardzo uważnie jego czas działania i porównać wyniki teo retyczne z wynikami rzeczywistymi. Ponieważ teoria sortowania jest dość dobrze rozwinięta, taka m etoda okazuje się być przydatna w wykrywaniu błędów w opro gramowaniu i sprzęcie, związanych z wejściem/wyjściem. Serwis odpowiedzialny za wykrywanie błędów pracuje istotnie wolniej niż powinien, tak więc nikt nie zauważał takich błędów aż do momentu, w którym odkrywano, że sortowanie jest zbyt wolne! • Nasza analiza wyboru z podm ianą została przeprowadzona przy założeniu losowości danych wejściowych, jednak w rzeczywistości pliki pojawiające się w praktyce są już w jakim ś stopniu uporządkowane. (Zdarza się czasami, że sortowane są pliki już uporządkowane - tak dla pewności). Dlatego eksperymenty wykazały, że wybór z podm ianą jest jeszcze lepszy od innych m etod sortowania wewnętrznego, niż na to wskazują nasze wzory. Ta przewaga jest trochę mniejsza w przypadku sortowania wielofazowego z czytaniem wstecz, ponieważ w tym przypadku musi zostać sformowana pewna liczba sekwensów uporządkowanych malejąco. W rzeczywistości R. L. Gilstad (który pierwszy opublikował metodę scalania wielofazowego) odrzucił z tego powodu technikę czytania wstecz. Jednak później zauważył, że naprzemienne kierunki uporządkowania nadal umożliwiają formowanie długich rosnących sekwensów. Ponadto wielofazowość z czytaniem wstecz jest jedyną standardow ą techniką, która działa tak samo dobrze dla plików malejących, jak i rosnących. • Inną cechą świadczącą na korzyść wyboru z podm ianą jest to, że umoż liwia on jednoczesne czytanie, zapisywanie i obliczanie. Jeśli wykonywalibyśmy sortowanie wewnętrzne tylko w zwykły sposób - wczytując rekordy do pamięci, sortując ją i wypisując na wyjście, gdy w pamięci m ają zostać umieszczone następne rekordy - to wówczas rozrzucanie trwałoby dwa razy dłużej. Jedynym innym sposobem sortowania wewnętrznego, o którym mówiliśmy i które nadaje się do jednoczesnego czytania, pisywania i obliczania, jest sor towanie przez kopcowanie. Dla wygody przyjmijmy, że w pamięci wewnętrznej
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
359
mieści się 1000 rekordów i że każdy blok na taśmie składa się ze 100 rekordów. W przykładzie 10 z wkładki A zastosowano następującą strategię (B i B 2 .. . B 10 reprezentują zawartość pamięci podzielonej na dziesięć 100-rekordowych bloków): Krok 0 . Zapełnij pamięć i uczyń tak, żeby elementy z bloków B 2 -.. £10 spełniały warunek kopca (z najmniejszym elementem w korzeniu). Krok L Sformuj z B \ , ., £10 kopiec, następnie wybierz 100 najmniejszych rekor dów i przesuń je do £ 10Krok 2. Wypisuj Rio, jednocześnie dokonuj wyboru 100 najmniejszych rekordów Z R 1 . . . R 9, przesuwając je do £ 9. Krok 3. W czytuj do Rio, wypisuj Rg i wybieraj jednocześnie 100 najmniejszych rekordów z Bi . . . Rg, przesuwając je do Rg. Krok 9. W czytuj do £ 4, wypisuj £3 i wybieraj jednocześnie 100 najmniejszych rekordów z B i £ 2, przesuwając je do B 2. Jednocześnie wykonuj stosowne czyn ności, żeby przywrócić warunek kopca dla £5 . . . RioKrok 10. W czytuj do £ 3, wypisuj £ 2, jednocześnie sortuj £1 i przywracaj wa runek kopca dla £4 . . . £ 10Krok 11. W czytuj do £ 2, wypisuj £ 1 , jednocześnie przywracaj warunek kopca dla £3 . . . £10 Krok 12. W czytuj do £ 1 , jednocześnie przywracaj warunek kopca dla B 2 . . . £ iq . Wróć do kroku 1. | • Zakładaliśmy, że liczba rekordów N nie jest znana z góry. W rzeczywi stości, w większości zastosowań istnieje możliwość pam iętania z każdym pli kiem liczby rekordów, które on zawiera, i moglibyśmy zakładać, że nasz system komputerowy jest w stanie powiedzieć nam, jaka jest wartość N. Jak bardzo taka informacja może być pomocna? Niestety nie bardzo. Przekonaliśmy się już o wielu zaletach wyboru z podm ianą, ale liczby formowanych w ten sposób sekwensów nie możemy przewidzieć. W scalaniu zrównoważonym informację o N można wykorzystać do ustalenia rozm iaru bufora £ w taki sposób, żeby z dużym prawdopodobieństwem S było niewiele mniejsze od pewnej potęgi P . N atom iast w rozrzucaniu wielofazowym z optymalnym rozmieszczaniem domyślnych se kwensów, informacja o N może zostać wykorzystana w podjęciu decyzji, jaki wybrać poziom (zobacz tabelę 5.4.2-2). • Napędy taśmowe często okazują się najbardziej zawodną składową sys temów komputerowych. Dlatego nigdy nie powinno niszczyć się (zawartości) oryginalnej taśmy wejściowej, zanim nie będzie wiadomo, że sortowanie zakoń czyło się pomyślnie. Czas, który w pewnych przykładach z wkładki A musimy przeznaczyć na pracę operatora, irytuje, ale ryzyko zniszczenia zawartości taśm y wejściowej, przy dość dużym prawdopodobieństwie zajścia czegoś niedobrego podczas długiego sortowania, jest zbyt wielkie. • Podczas zmiany z zapisywania w przód na odczytywanie wstecz mogliby śmy zaoszczędzić trochę czasu, nigdy nie wypisując na taśm ę ostatniej zawartości
360
SORTOWANIE
5.4.6
bufora. Można po prostu taki bufor odczytać wstecz. Z diagramów z wkładki A wynika, że dzięki tej sztuczce oszczędzamy na czasie stosunkowo niewiele. W yjątkiem jest sortowanie oscylacyjne, gdzie kierunki często się zmieniają. • Chociaż duży system komputerowy może zawierać wiele jednostek ta śmowych, to być może lepiej nie używać ich wszystkich. Dla dużych P różnica w procentach między logP S i log P+1 S jest niewielka, natom iast przy większym stopniu scalania rozm iary bloków są zazwyczaj mniejsze. (Trzeba wziąć też pod uwagę operatora, który musi zamontować te wszystkie taśm y robocze). Z drugiej strony, w ćwiczeniu 12 opisujemy interesujący sposób wykorzystania dodatko wych jednostek taśmowych, grupując je w taki sposób, żeby można nakładać na siebie operacje wejścia/wyjścia i nie zwiększać stopnia scalania. • Na maszynach podobnych do MIX, dla których rozmiary bloków są z góry ustalone i raczej małe, do scalania potrzeba jak najwięcej pamięci wewnętrz nej. W takich sytuacjach sortowanie oscylacyjne staje się bardziej atrakcyjne, ponieważ umożliwia pam iętanie drzewa wyboru z podm ianą podczas scalania. W rzeczywistości w tym przypadku sortowanie oscylacyjne można poprawić (zgodnie z propozycją Colina J. Bella z 1962 roku), formując nowy początkowy sekwens bezpośrednio na wyjściu, za każdym razem, gdy scalanie odbywa się z taśm roboczych. • Mówiliśmy już, że w przypadku plików zapisanych na wielu taśm ach należy każdą z taśm posortować oddzielnie, unikając w ten sposób nadm iaru pracy związanej z obsługą tych taśm . W rzeczywistości, w scalaniu zrównoważonym, przy uważnym zaprogramowaniu można sortować trzy taśm y aż do momentu ostatecznego scalania. Najszybszego scalenia rzeczywiście dużej liczby posortowanych taśm doko nuje się za pom ocą drzewa o minimalnej długości ścieżki zewnętrznej (zobacz punkt 5.4.4). Ta konstrukcja została po raz pierwszy zaproponowana przez E. H. Frienda [JA C M 3 (1956), 166-167]; następnie W. H. Bürge [Information and C ontrol 1 (1958), 181-197] zauważył, że optymalny sposób scalania sekwen sów o danych (niekoniecznie takich samych) długościach, jeśli pominiemy czas związany z obsługą taśm , otrzym uje się przez konstrukcję drzewa z najkrótszą w ażoną ścieżką zewnętrzną, gdzie wagami są długości sekwensów (zobacz pod punkt 2.3.4.5 i punkt 5.4.9). • W naszych rozważaniach radośnie przyjęliśmy, że możemy bezpośrednio sterować operacjam i wejścia/wyjścia na taśm ach i że żaden złożony systemowy interfejs nie stoi na przeszkodzie w wykorzystywaniu taśm tak efektywnie, jak to zostało zaprojektowane. Te idealistyczne założenia pozwoliły wniknąć głębiej w problem scalania i mogą być przydatne w konstruowaniu odpowiednich syste mów operacyjnych. Musimy sobie jednak zdawać sprawę, że wieloprogramowanie i wieloprzetwarzanie mogą uczynić sytuację dużo bardziej skomplikowaną. • Tem aty omawiane w tym podpunkcie po raz pierwszy zostały poruszone w druku przez E. H. Frienda w [JA C M 3 (1956), 134-168], W. Zoberbiera w [E lektronische D a ten vera rb eitu n g 5 (1960), 28-44] i M. A. Goetza w [Digital C o m p u te r U ser’s H an dbook (New York: McGraw-Hill, 1967), 1.292-1.320].
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
361
P od su m ow an ie. To, czego nauczyliśmy się o względnej efektywności różnych m etod sortowania taśmowego, możemy podsumować w następujący sposób. T w ierd zen ie A . Trudno je s t zdecydow ać, k tó r y ze sch em a tó w sortow an ia je s t w danej sytu a cji n ajlepszy. | Przykłady, które znajdują się we wkładce A, pokazują, w jaki sposób moż na posortować 100 000 losowo uporządkowanych 100-znakowych rekordów (lub 1 milion 10-znakowych rekordów) za pomocą sześciu taśm i przy realistycz nych założeniach. Taka ilość danych zajmuje blisko połowę taśm y i może zostać posortowana w czasie od 15 do 19 m inut na taśm ach typu MIXT. Jednakże w latach siedemdziesiątych na rynku były dostępne różnorodne urządzenia ta śmowe i, w zależności od systemu komputerowego, czas sortowania mógł zmieniać się od około czterech m inut do około dwóch godzin. W naszych przykładach około 3 minut z ogólnego czasu sortowania zajmowało początkowe rozrzucanie sekwensów i sortowanie wewnętrzne; około 4 - m inuty zajmowało końcowe sca lanie i przewijanie taśm y wyjściowej; natom iast od 7 \ do 1 1 ^ m inut zabierały pośrednie etapy scalania. Dla sześciu taśm, które nie można odczytywać wstecz, najlepszą m etodą sortowania przy przyjętych przez nas założeniach jest „sortowanie wielofazowe z dzieleniem taśm ” (przykład 4); w przypadku czterech taśm z możliwością czytania wstecz, najlepszą m etodą okazuje się sortowanie wielofazowe z czyta niem wstecz z pewnym, dość złożonym rozmieszczaniem sekwensów domyślnych (przykład 7). Sortowanie oscylacyjne (przykład 9) plasuje się zaraz na drugim miejscu. W obu przypadkach scalanie kaskadowe jest prostszą, alternatyw ną metodą, która jest tylko nieznacznie gorsza (przykłady 5 i 8). W przypadku z czytaniem w przód, naturalne scalanie zrównoważone (przykład 1 ) jest zaska kująco efektywne, częściowo w wyniku szczęśliwie dobranego przykładu, jednak częściowo dlatego, że stosunkowo m ało czasu zajmuje przewijanie. Sytuacja uległaby trochę zmianie, jeśli liczba dostępnych taśm byłaby inna. G en eratory program ów sortu jących . Z powodu różnorodnych charaktery styk danych i sprzętu jest prawie niemożliwe, żeby napisać jeden program dla sortowania zewnętrznego, który byłby zadowalający w wielu różnych zastoso waniach. Równie trudno jest napisać program , który sterowałby taśm am i na prawdę efektywnie. Dlatego przygotowanie oprogramowania dla sortowania jest szczególnie wyzywającym przedsięwzięciem. Generator programów sortujących to program, którego wynikiem jest kod maszynowy przygotowywany pod kątem konkretnego zastosowania, oparty na param etrach charakteryzujących format danych i na konfiguracji sprzętowej. Taki program jest często składową języków programowania wysokiego poziomu, takich jak COBOL lub PL/I. Jedną z cech generatora programów sortujących jest możliwość dodania przez użytkownika „własnych komend” - ciągu specjalnych instrukcji, które nale ży włączyć do pierwszej i ostatniej fazy procedury sortującej. Komendy z pierw szej fazy są zazwyczaj używane do redagowania rekordów wejściowych, polega jącego na ich ścieśnianiu lub niewielkim rozszerzaniu do postaci wygodniejszej dla sortowania. Przypuśćmy dla przykładu, że chcemy posortować rekordy wejś
362
SORTOWANIE
5.4.6
ciowe względem dziewięcioznakowego klucza, który jest zapisem daty w formacie miesiąc-dzień-rok: JU L 0 4 1776
0 C T 311517
N 0 V 0 5160 5
JU L 14 178 9
N 0 V 0 719 17
W pierwszy przebiegu trzyliterowy kod miesiąca jest zastępowany przez odpo wiadający mu dwucyfrowy numer, a cała d ata jest zapisywana w postaci liczby z najbardziej znaczącymi polami z lewej strony: 177 6 0 7 0 4
151710 3 1
160 5110 5
178 9 0 714
19 17110 7
W ten sposób długość rekordu zmniejsza się, a porównania stają się łatwiejsze. (Możliwy jest kod jeszcze bardziej zwięzły). Komendy z ostatniego przebiegu mo gą posłużyć do przywrócenia oryginalnego form atu danych i/lu b do poczynienia innych pożądanych zmian w pliku wyjściowym, i/lu b do obliczenia pewnych funk cji na rekordach wyjściowych. Algorytmy scalania, o których mówiliśmy dotych czas, są zorganizowane w taki sposób, że można odróżnić ostatni przebieg od in nych przebiegów scalania. Zauważmy, że jeśli komendy użytkownika są dołączane do programu, to potrzebujem y co najmniej dwóch dodatkowych przebiegów przez plik, nawet jeśli jest on od początku uporządkowany. Komendy użytkownika, które zm ieniają długości rekordów, mogą stanowić pewną trudność w sortowaniu oscylacyjnym dla jednoczesnego wykonywania pewnych operacji wejścia/wyjścia. G eneratory programów sortujących umożliwiają także zadbanie o szczegóły systemowe, jak na przykład konwencje etykietowania taśm; umożliwiają także liczenie sumy kontrolnej lub inną kontrolę poprawności danych. Czasami m ają one mechanizmy do zatrzym ywania sortowania w wygodnych miejscach i później szego jego wznowienia. Najbardziej zaawansowane generatory umożliwiają sorto wanie rekordów o dynamicznie zmieniających się długościach [zobacz D. J. Waks, C A C M 6 (1963), 267-272], *S calan ie z m n iejszą liczb ą buforów . Przekonaliśmy się, że 2 P 4- 2 buforów wystarcza, żeby podczas scalania P-wejściowego utrzymywać taśmy na dużej prędkości. Ten punkt zakończymy analizą czasu scalania, gdy mamy do dyspo zycji m niej niż 2P + 2 buforów. Pożądane są oczywiście dwa bufory wyjściowe, ponieważ możemy wówczas jednocześnie wypisywać jeden z nich i formować następny wyjściowy blok da nych w drugim. Dlatego możemy pominąć pytanie o liczbę buforów wyjściowych i skoncentrować się tylko na wejściu. Załóżmy, że danych jest P + Q buforów wejściowych, gdzie 1 < Q < P . Zgodnie z propozycją L. J. W oodrum a [IBM System s J. 9 (1970), 118-144] posłużymy się następującym modelem sytuacyjnym: przeczytanie jednego bloku z taśm y zabiera jednostkę czasu. Przyjmujemy, że w tym czasie z prawdopo dobieństwem po żaden z buforów wejściowych nie zostanie opróżniony, z praw dopodobieństwem p i zostanie opróżniony jeden bufor, z prawdopodobieństwem 2 dwa lub więcej buforów itd. Po zakończeniu odczytu taśm y znajdujemy się w jednym z Q 4-1 stanów. Stan 0. Q buforów jest pustych; rozpoczynamy wczytywanie bloku z właściwego pliku, wykorzystując technikę przewidywania omówioną wcześniej w tym punk
5.4.6
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
363
cie. Po jednostce czasu przechodzimy do stanu 1 z prawdopodobieństwem pcb w przeciwnym razie pozostajemy w stanie 0. Stan 1 . Q —1 buforów jest pustych; rozpoczynamy wczytywanie do jednego z nich, przewidując odpowiedni plik. Po jednej jednostce czasu przechodzimy do stanu 2 z prawdopodobieństwem po> do stanu 1 z prawdopodobieństwem p± i do stanu 0 z prawdopodobieństwem p ^ 2-
Stan Q — 1 . Jeden bufor jest pusty; rozpoczynamy wczytywanie do tego bufo ra, przewidując odpowiedni plik. Po jednostce czasu przechodzimy do stanu Q z prawdopodobieństwem po> stanu Q — I z prawdopodobieństwem p i, . . . , stanu 1 z prawdopodobieństwem P q - i , i do stanu 0 z prawdopodobieństwem p ^ q . Stan Q. W szystkie bufory są zapełnione. Odczyt z taśm y zostaje wstrzym any na średnio p jednostek czasu, a następnie przechodzimy do stanu Q — 1 . Rozpoczynamy od stanu 0. Taki model sytuacyjny odpowiada procesowi Markowa (zobacz ćwiczenie 2.3.4.2-26), który można zanalizować za pom ocą funkcji tworzących w następujący, interesujący sposób: Niech z będzie dowol nym param etrem i załóżmy, że za każdym razem, kiedy decydujemy się na odczyt z taśmy, robimy to z prawdopodobieństwem z, natom iast z prawdo podobieństwem 1 — z kończymy wykonywanie algorytmu. Niech teraz gę (z) = E „>0 a(nQ) zn (l —z) będzie średnią liczbą pojawienia się w tym procesie stanu Q. Wynika stąd, że a ^ jest średnią liczbą pojawienia się stanu Q, gdy dokładnie n bloków zostało już odczytanych. Wówczas n + a ^ p jest łącznym średnim czasem wczytywania danych i obliczeń. Jeśli operacje w pełni nakładałyby się na siebie, jak w algorytmie z (2P + 2 ) buforami, to łączny czas wynosiłby tylko n jednostek, a zatem a ^ p odpowiada czasowi, w którym obliczenia zostają zawieszone z powodu wczytywania. Niech A ij będzie prawdopodobieństwem przejścia w tym procesie ze stanu i do stanu j dla 0 < ż , j < Q + l, gdzie Q 4- 1 jest dodatkowym stanem , w którym cały proces się zatrzymuje. Na przykład dla małych Q macierze A m ają postać: f P ^ l Z
1
Q = 1: ^
0
P o Z
0 0
10 0
( p > l z
P o Z
0
P ^ 2 Z
P \ Z
P o z
Q = 2:
J 1. — 1. — z 5
0
1
0
0
0
0
0
o
i P ^ l Z
P o Z
0
0
1. — Z
P ^ 2 *
P i z
P o z
0
P ^ 3 Z
P 2Z
P i z
P oZ
1. — 1. —
^
<2 = 3:
0 k
0
0 0
1 0
0 0
)
0 0
z
Z
364
SORTOWANIE
5.4.6
Ćwiczenie 2.3.4.2-26(b) mówi, że gę(z) = kofaktorg0(-^ — A ) / d e t ( I - A). Tak więc na przykład dla Q = 1 mamy 0
gi(z) = det I 1 0
-poz
z - l \
0 0
0 1
/
/ l-p ^ iz
/ det I II \
-1 0
P qZ
1 0
z — 1
0 1
p 0Z
p 0Z poz 71/1 \ = = 2 s nPo 2 (i - z), i - p l Z - p 0z _ _ n>o
a zatem a i,1; = ;//a;,. To z góry było oczywiste, ponieważ dla <5 = 1 problem jest bardzo prosty. Za pom ocą podobnych wyliczeń dla Q = 2 (zobacz ćwiczenie 14) otrzym ujem y mniej oczywisty wzór (2) = PO» _ P o O ~ P l ) ° " 1 - Pl ( 1 - P l )2 '
(lo] (10)
W ogólności możemy pokazać, że przy n oo, jest postaci + 0 ( 1 ), gdzie sta ła nie jest bardzo tru d n a do wyliczenia. (Zobacz ćwiczenie 15). Okazuje się, że /( ( 1 - P i ) 2 - P 0 P 2 ) ■ Z natury scalania wynika, że całkiem rozsądne jest założenie, że p = 1 /P i że mamy rozkład dwumianowy Pk
' P \ f 1 \ k ( P — 1 \ p ~ fc \kJ\P
Na przykład, dla P = 5 mamy p 0 ~ 0.32768, p i = 0.4096, P 2 = 0.2048, p 3 = 0.0512, p 4 = 0.0064 i p 5 - 0.00032; stąd « 0.328, a^2) w 0.182 i w 0.125. Innymi słowy, jeśli zam iast 5 + 5 buforów wejściowych weźmiemy 5 + 3 buforów, to wówczas możemy spodziewać się, że dodatkowy czas na odczyt z taśmy będzie wynosił około 0.125/5 ~ 2.5 procenta ogólnego czasu. Oczywiście ten model nie jest bardzo ścisły. Wiemy, że dla Q — P nie tracim y w ogóle czasu na przestój podczas odczytu, jednak nasz model mówi inaczej. Dodatkowy czas przestoju dla małych Q prawie całkowicie pożera zyski z posiadania większych bloków, tak więc prosty schemat z Q = P znajduje uzasadnienie. Ć W IC ZEN IA 1 . [13] P o d a j w z ó r n a d o k ł a d n ą lic z b ę z n a k ó w , k t ó r e m o ż n a z a p is a ć n a ta ś m ie , je ś l i k a ż d y b lo k n a t a ś m ie z a w ie r a n z n a k ó w . P r z y jm ijm y , ż e t a ś m a m o ż e p o m ie ś c ić d o k ł a d n ie 23 0 0 0 0 0 0 z n a k ó w , g d y b y n ie lic z y ć p r z e r w m ię d z y b lo k o w y c h .
2 . [15] W y j a ś n i j , d la c z e g o p i e r w s z y b u fo r d la p lik u 2, w w ie r s z u 6 z r y s u n k u 84, je s t c a łk o w ic ie p u s ty .
3. [20]
C z y a lg o r y t m F z a c h o w y w a ł b y się p o p r a w n ie , g d y b y ś m y z a m ia s t 2 P b u fo r ó w
m ie li t y l k o 2P — 1 b u fo r ó w w e jś c io w y c h ? J e ś li t a k , u d o w o d n ij to . J e ś li n ie , p o d a j k o n tr p r z y k ła d . 4.
[20] W j a k i s p o s ó b z m ie n ić a lg o r y t m F , ż e b y p r a c o w a ł t a k ż e d la P = 1 ?
PRAKTYCZNE ASPEKTY SCALANIA TAŚMOWEGO
5.4.6
5. [21]
365
W p r z y p a d k u g d y t a k i e s a m e k lu c z e m o g ą się p o ja w i ć w r ó ż n y c h p lik a c h , n a
le ż y w p r o c e s ie p r z e w id y w a n ia b y ć b a r d z o u w a ż n y m . W y ja ś n i j d la c z e g o i p o k a ż , w j a k i s p o s ó b u n ik n ą ć t r u d n o ś c i, d e fin iu ją c p r e c y z y j n i e j w a lg o r y t m i e F o p e r a c je s c a la n i a i p r z e w id y w a n ia . 6
.
[22]
J a k ic h z m ia n p o w in n o s ię d o k o n a ć w a lg o r y t m i e 5 .4 .3 C , ż e b y p r z e k s z t a łc ić
g o w a lg o r y t m s c a la n ia k a s k a d o w e g o n a T + 1 t a ś m a c h , u m o ż li w i a j ą c y przewijanie
jednocześnie z innymi operacjami ?
7. [26]
W p r z y k ła d z ie
7z
w k ł a d k i A , w w y n i k u w s t ę p n e g o r o z r z u c a n ia , n a t a ś m a c h
1 - 4 d o s t a je m y
( A i D i ) 11
D \(A iD i)w
D 1( A 1D 1)9
D i^ Z J i) 7
g d z ie ( A i D i ) 7 o z n a c z a A \ D \ A \ D \ A \ D \ A i D i A i D \ A \ D \ A i D i . P o k a ż , j a k i j e s t „ n a j le p s z y m o ż li w y ” s p o s ó b u s t a w ie n ia d o d a t k o w y c h s e k w e n s ó w A q i .Do ( t a k , ż e b y z m i n im a liz o w a ć o g ó ln ą lic z b ę p o c z ą t k o w y c h s e k w e n s ó w p r z e t w a r z a n y c h p o d c z a s s c a la n ia ) d o p r o w a d z a ją c y d o r o z k ła d u
A ( D A ) 14l
( D A ) 28
( D A ) 26
( D A ) 22.
Wskazówka: D l a z a c h o w a n ia p a r z y s t o ś c i w ie le z s e k w e n s ó w A 0 i D o m u s i b y ć u s t a w i a n y c h w s ą s ie d n ic h p a r a c h . L ic z b ę s c a le ń d la k a ż d e g o p o c z ą t k o w e g o s e k w e n s u m o ż n a o b lic z y ć p o d o b n ie j a k w ć w ic z e n iu 5 .4 .4 - 5 . M o ż liw e s ą p e w n e u p r o s z c z e n ia , p o n ie w a ż s ą s ie d n ie s e k w e n s y m a j ą z a w s z e s ą s ie d n ie l ic z b y s c a le ń .
8 . [20]
Z w k ł a d k i A w y n ik a , ż e w w ię k s z o ś c i s c h e m a t ó w w s t ę p n e g o r o z r z u c a n ia s e
k w e n s ó w (z w y j ą t k i e m w s t ę p n e g o r o z r z u c a n ia d la s c a la n ia k a s k a d o w e g o ) c z ę s t o u m ie s z c z a się k o le jn e s e k w e n s y n a r ó ż n y c h t a ś m a c h . J e ś li k o le jn e s e k w e n s y b y ł y b y u m ie s z c z a n e n a t e j s a m e j t a ś m ie , w ó w c z a s m o g lib y ś m y z a o s z c z ę d z ić n a c z a s ie r o z r u c h u / z a t r z y m y w a n ia . C z y d la t e g o d o b r y m p o m y s łe m b y ł a b y m o d y f ik a c ja a lg o r y t m ó w r o z r z u c a n ia w t a k i s p o s ó b , ż e b y p r z e łą c z a n ie m ię d z y t a ś m a m i b y ł o j a k n a jr z a d s z e ? 9.
[22]
O c e ń c z a s d z i a ła n i a a lg o r y t m u w ie lo fa z o w e g o z c z y t a n i e m w s t e c z z w k ł a d k i
A , je ś li w p r z y k ł a d z i e 7 z a m ia s t T = 5 t a ś m w z ię lib y ś m y T — 6 . C z y b y ł o b y r o z u m n ie n ie k o r z y s t a ć z t a ś m y w e jś c io w e j?
10 .
[M23]
Z a s t o s u j a n a liz ę z p u n k t ó w 5 .4 .2 i 5 .4 .3 d o p o k a z a n ia , ż e d łu g o ś ć k a ż d e g o
p r z e w ija n ia p o d c z a s s z e ś c io t a ś m o w y c h s c a la ń , w ie lo fa z o w e g o i k a s k a d o w e g o , r z a d k o w y n o s i w ię c e j n iż 54 p r o c e n t d łu g o ś c i c a ł e g o p lik u ( w y ją t k i e m j e s t p r z e w ija n ie c a ł e g o p lik u n a p o c z ą t k u i n a k o ń c u ) . 1 1
.
[23]
M o d y fik u ją c o d p o w ie d n ie s k ła d o w e t a b e li 1 , o c e ń , ile c z a s u z a j ę ł o b y w y
k o n a n ie p ie r w s z y c h d z ie w ię c iu a lg o r y t m ó w z w k ł a d k i A , j e ś l i p o łą c z y l i b y ś m y w o ln e i s z y b k ie p r z e w ija n ie . P r z y jm ijm y , ż e p = 1 d la t a ś m y z a p e łn io n e j n ie w ię c e j n iż w o k o ło je d n e j c z w a r t e j i ż e c z a s p r z e w ija n ia b a r d z ie j z a p e łn io n y c h t a ś m w y n o s i w p r z y b li ż e n iu p ię ć s e k u n d p lu s c z a s , k t ó r y o t r z y m a li b y ś m y d la p ~
W
p r z y k ła d z ie 8 z a s to s u j
s c a la n ie k a s k a d o w e z k o p io w a n ie m , p o n ie w a ż p r z e w ija n ie i c z y t a n i e w p r z ó d j e s t w t y m p r z y p a d k u w o ln ie js z e o d k o p io w a n ia . [ Wskazówka: S k o r z y s t a j w w y n ik ó w ć w ic z e n ia 10].
12. [Ą0]
R o z w a ż m y p o d z i a ł s z e ś c iu t a ś m n a t r z y p a r y t a ś m , g r a j ą c y c h r o lę p o j e d y n
c z y c h t a ś m w s c a la n iu w ie lo fa z o w y m z T
=
3. W
k a ż d e j p a r z e j e d n a t a ś m a b ę d z ie
z a w ie r a ła b lo k i 1, 3, 5 , . . . , n a t o m ia s t d r u g a b ę d z ie z a w i e r a ła b lo k i 2 , 4 , 6 , . . .
. W
te n
s p o s ó b w k a ż d e j c h w ili m o ż e m y m ie ć a k t y w n e d w ie t a ś m y w e jś c io w e i d w ie t a ś m y w y jś c io w e , p o d w a j a j ą c w r z e c z y w is t o ś c i s z y b k o ś ć s c a la n ia . a) Z n a j d ź w ł a ś c i w y s p o s ó b d o s t o s o w a n ia a lg o r y t m u F d o te j s y t u a c j i . I le p o w in n iś m y m ie ć b u fo r ó w ?
366
SORTOWANIE
5.4.6
b ) D o k o n a j o c e n y łą c z n e g o c z a s u d z i a ła n i a , g d y u ż y lib y ś m y te j m e t o d y d o p o s o r to w a n ia 10 0 0 0 0 s t u z n a k o w y c h r e k o r d ó w . R o z w a ż o b a p r z y p a d k i , z c z y t a n i e m w p r z ó d i z c z y ta n ie m w s te c z . 13.
[20] C z y m o ż n a z a s t o s o w a ć p ię c io ta ś m o w e s o r to w a n ie o s c y la c y jn e , w p o s t a c i z d e
fin io w a n e j w a lg o r y t m i e 5 .4 .5 B , w s o r t o w a n iu c z t e r e c h p e łn y c h t a ś m d a n y c h w e jś c io w y c h , a ż d o m o m e n t u k o ń c o w e g o s c a la n ia ? 14 .
[M19] W y p r o w a d ź ( 10 ).
15.
[HM29]
U d o w o d n ij, ż e Qq{z) —
Hq(z)/( 1 — z),
g d z ie h q ( z ) j e s t fu n k c ją w y m ie r
—
n ą z m ie n n e j z b e z p u n k t ó w o s o b liw y c h w e w n ą t r z k o ła je d n o s t k o w e g o ; s t ą d
ł i Q ( l ) n + 0 ( 1 ) , p r z y n —» o o. W s z c z e g ó ln o ś c i p o k a ż , ż e
(0 ń 3( l ) = d e t
16 .
0 0 \1
1
-p o -pi ~P 2 0
0 “ PO -P i 0
0 \ 0 -P o
, / det /
0 )
/I
1 1 \o
-P o 1 - pi -P 2 0
0 -P o 1 - pi -1
0 \ 0 -P o 1
/
[Ąl] Z b a d a j s z c z e g ó ło w o p r o b le m s o r t o w a n ia 10 0 0 0 0 s t u z n a k o w y c h r e k o r d ó w
i p r z y g o t u j d ia g r a m y p o d o b n e d o t y c h z w k ł a d k i A , p r z y z a ło ż e n iu , ż e m a m y d o d y s p o z y c ji 3, 4 lu b 5 t a ś m .
*5.4.7. Zewnętrzne sortowanie pozycyjne
Poprzednie punkty poświęciliśmy sortowaniu i scalaniu taśmowemu. Istnieje jed nak jeszcze inny sposób sortowania taśmowego wykorzystujący zasady sortowa nia pozycyjnego, używane w mechanicznych sorterach kart (zobacz punkt 5.2.5). Ta m etoda jest czasami nazywana sortowaniem dystrybucyjnym, sortowaniem kolumnowym, sortowaniem kieszeniowym, sortowanem cyfrowym, sortowaniem rozdzielającym itd. Okazuje się, że m etoda, o której mowa, jest odwrotnością scalania! Przypuśćm y dla przykładu, że mamy cztery taśm y i jedynymi możliwymi kluczami są: 0, 1, 2, 3, 4, 5, 6 , 7. Jeśli dane wejściowe znajdują się na taśmie T l, to możemy rozpocząć od przemieszczenia wszystkich kluczy parzystych na T3, a wszystkich kluczy nieparzystych na T4:
Dane P rz e b ie g i
Tl
T2
T3
T4
{0, 1 , 2 ,3 ,4 ,5 ,6 ,7 } -
-
{ 0 ,2 ,4 , 6 }
{1,3,5,7}
Teraz przewijamy i czytam y z T3, potem z T4, umieszczając {0, 1, 4, 5} na T l i {2, 3, 6 , 7} na T2: Przebieg 2
{0,4}{1,5}
{2,6}{3,7}
(Zapis „{0,4}{1,5}” oznacza plik zawierający najpierw pewną liczbę rekordów z kluczami 0 lub 4, a potem pewną liczbę rekordów z kluczami 1 lub 5. Zauważmy, że T l zawiera teraz klucze, których środkową cyfrą w zapisie binarnym jest 0). Po ponownym przewinięciu i umieszczeniu 0, 1, 2, 3 na T3 i 4, 5, 6 , 7 na T4 mamy
5.4.7
ZEWNĘTRZNE SORTOWANIE POZYCYJNE
Przebieg 3
{0}{1}{2}{3}
367
{4}{5}{6}{7}
Teraz możemy zakończyć proces sortowania, kopiując T4 na koniec taśm y T3. W ogólności, jeśli klucze są z zakresu od 0 do 2^ —1, to możemy posortować dany plik analogicznie, w k przebiegach zakończonych fazą łączenia, w której około połowa danych jest kopiowana z jednej taśm y na drugą. Jeśli mielibyśmy sześć taśm, moglibyśmy w podobny sposób wykorzystać reprezentację przy podstawie 3 do posortowania kluczy z zakresu od 0 do 3k — 1 w k przebiegach. Istnieją także m etody z częściowymi przebiegami. Załóżmy dla przykładu, że możliwymi kluczami są {0, 1, . . . ,9}, i rozważmy następującą procedurę po chodzącą od R. L. A shenhursta [Theory o f Switching, Progress Report BL-7 (Harvard Univ. Comp. Laboratory: May 1954), 1.1 -1.76]: Tl
Faza
T2
T4
T3
przebiegi
{0, 1 , . . . , 9 } 1 {0,2,4,7} {1,5,6} {3,8,9} 2 {0} { 1 ,5 ,6}{2,7} {3 , 8, 9}{4} 3 {0}{1}{2} {6}{7} {3, 8 , 9}{4}{5} 4 {0}{1}{2}{3} {6}{7}{8} {9} {4}{5} C {0}{1}{2}{3}{4}...{9}
1.0 0.4 0.5 0.3 0.6 2.8
Tutaj C oznacza fazę łączenia. Jeśli wśród wszystkich kluczy każdy pojaw ia się około jednej dziesiątej raza, to powyższa procedura potrzebuje tylko 2.8 przebiegów do posortowania 10 kluczy, podczas gdy w pierwszym przykładzie potrzebowaliśmy 3.5 przebiegów na posortowanie tylko ośmiu kluczy. Tak więc widać, że sposób rozrzucania rekordów jest niezwykle istotny, zarówno dla sor towania pozycyjnego, jak i scalania. Schematy rozrzucania rekordów z powyższych przykładów można w n atu ralny sposób przedstawić za pomocą drzew: Przykład 1
Przykład 2
A
A
f i
C
\
4
2
Jf C 6
i
]
c
r
5
3
2
j c 7
A 7
A
A 6
r
5
3
A
A 8
9
368
5.4.7
SORTOWANIE
Numery 1, 2, 3, .. . w węzłach wewnętrznych (kółkach) odpowiadają krokom 1, 2 , 3, . . . algorytmu. Na krawędziach drzewa umieszczono nazwy taśm A, B , C, D (zamiast T l, T2, T3, T4), na które są przesyłane rekordy. Węzły zewnętrzne (kwadraty) reprezentują porcje pliku odpowiadające dokładnie jednemu kluczo wi, a sam klucz (pogrubiony) znajduje się poniżej odpowiadającego mu węzła. Na wszystkich krawędziach prowadzących do węzłów zewnętrznych umieszczono nazwę taśm y wyjściowej (<7 w pierwszym przypadku, A w drugim). Tak więc w przykładzie 1, w kroku 3, wykonywane jest czytanie z taśmy D i zapisywanie kluczy 1 i 5 na taśm ę A, natom iast klucze 3 i 7 są zapisywane na taśm ę B . N ietrudno zauważyć, że liczba wykonywanych przebiegów jest równa długości ścieżki zewnętrznej podzielonej przez liczbę węzłów zewnętrznych, przy założeniu, że każdy klucz pojaw ia się tak samo często. Ponieważ taśm y są z natury sekwencyjne, a czytanie w przód odbywa się zgodnie z zasadą „pierwszy zapisany, pierwszy odczytany” , nie każde etykieto wane drzewo odpowiada jakiemuś schematowi rozrzucania rekordów. W drzewie z przykładu 1 dane są zapisywane na taśm ę A w kroku 2 i w kroku 3. Dane za pisane w kroku 2 muszą zostać spożytkowane przed danymi zapisanymi w kroku 3. W ogólności, jeśli taśm a jest zapisywana w krokach i oraz J, gdzie i < j , dane zapisane w kroku i muszą zostać spożytkowane jako pierwsze. Jeśli w drzewie w ystępują krawędzie postaci
A
A
i
to wówczas musi zachodzić k < L Ponadto na taśmie A nie możemy zapisać niczego między krokami fc a i, ponieważ taśm a musi zostać przewinięta między operacjam i czytania i zapisywania. Czytelnik, który przerobił ćwiczenia z punktu 5.4.4, natychmiast dostrzeże, że drzewami odpowiadającymi sortowaniu pozycyjnemu z czytaniem w przód na T taśm ach są dokładnie T-drzewa silnie typu fifo, które charakteryzują sor towanie przez scalanie z czytaniem w przód na T taśmach! (Zobacz ćwiczenie 5.4.4-20). Jedyną różnicą jest to, że do wszystkich węzłów zewnętrznych, w roz ważanych tu ta j przez nas drzewach, jest przypisana ta sama etykieta taśmy wyjściowej. To ograniczenie moglibyśmy usunąć, przyjmując, że w ostatniej fazie łączenia wszystkie rekordy są przesyłane na taśmę wyjściową. Moglibyśmy rów nież dodać nowe ograniczenie dla drzew typu fifo, żądając, żeby wstępny przebieg rozmieszczania sekwensów w sortowaniu przez scalanie był jawnie uwzględniony w związanym z tym sortowaniem drzewem scalania. Innymi słowy, każdy schemat scalania odpowiada pewnemu schematowi rozrzucania, a każdy schemat rozrzucania odpowiada pewnemu schematowi scala nia. Chwila refleksji wystarcza, żeby zrozumieć, dlaczego tak jest. Rozważmy od tyłu przebieg sortowania przez scalanie, kiedy to wynikowy plik jest dzielony z powrotem na podpliki, następnie te podpliki są z powrotem dzielone na mniej sze podpliki itd. Na koniec dostajem y wynikowy plik podzielony na S sekwensów.
ZEWNĘTRZNE SORTOWANIE POZYCYJNE
5.4.7
369
Taki schemat jest dobry dla taśm wtedy i tylko wtedy, gdy odpowiadający mu schemat sortowania pozycyjnego przez rozrzucanie jest dobry dla 5 kluczy. Ta dualność scalania i rozrzucania jest prawie doskonała. Ona łamie się tylko z jedne go powodu. Taśma wejściowa musi być zachowywana w różnych m om entu czasu. Przykład z ośmioma kluczami, rozważany na początku tego punktu, jest w oczywisty sposób dualny do scalania zrównoważonego na czterech taśm ach. Przykład z dziesięcioma kluczami i z częściowymi przebiegami odpowiada nastę pującemu schematowi scalania dla dziesięciu sekwensów (jeśli pominiemy fazy kopiowanie, kroki 6 - 1 1 w drzewie): Tl
T2
T3
T4
l4 l3 l1 l2 Początkowy rozkład l3 Krok 5 l2 1234 l2 l1 21 Krok 4 123 ł l 1 Krok 3 2131 l^ 1 41 31 31 Krok 2 Krok 1 101 imy to z sortowaniem pozycyjnym, zobaczymy, że struktury działania obu m etod są w istocie takie same, jednak odwrócone w czasie. Odwrócone są również zawartości taśm: 123: (dwa sekwensy o długości 1 , a następnie jeden sekwens o długości 3) odpowiada {3, 8 , 9}{4}{5} (dwa podpliki zawierające po jednym kluczu, poprzedzone jednym podplikiem zawierającym trzy klucze). Postępując inaczej, moglibyśmy w zasadzie skonstruować sortowanie pozy cyjne, dualne do scalania wielofazowego, scalania kaskadowego itd. Dla przykła du, scalanie wielofazowe na trzech taśm ach zastosowane do 21 sekwensów, zilu strowane na początku punktu 5.4,2, odpowiada następującemu, interesującemu sortowaniu pozycyjnemu: -
-
-
-
Tl
Faza
-
-
T2
T3
{0, 1 ,--, 20} 1
-
{0,2,4,5,7,9,10,12,13,15,17,18,20}
{1,3,6,8,11,14,16,19}
2 2
10 5 10 13 181 {0,5,10,13,18}
-
{1,3,6,8,11,14,16,19} {2,4,7,9,12,15,17,20}
3
{0’5’10S ? S S } ’14’19}
4
’ ’ -
{3,8,16}{4,9,17} {3,8,16}{4,9,17}{5,10,18} {6,11,19}{7,12,20}
. . {U,idHi,1 4 ^ ,1 5 } {0{3fl6}.’.1.{7f2Ó}6}
5
{8}{9}{10}{li}{12}
-
6
{8}{9}{10}{11}{12}{13}...{20}
{0}{1}...{7}
Reguła rozrzucania, użyta tu ta j do decydowania o tym, na które taśm y w danym kroku wędrują klucze, wydaje się być magiczna, ale w rzeczywistości m a ona prosty związek z systemem liczbowym Fibonacciego. (Zobacz ćwiczenie 2). Dualność między sortowaniem pozycyjnym a scalaniem ma zastosowanie również do algorytmów, w których taśm y są czytane wstecz. W punkcie 5.4.4 zdefiniowaliśmy „T-drzewa typu Ufo” i łatwo dostrzec, że odpo wiadają one zarówno sortowaniu pozycyjnemu, jak i sortowaniu przez scalanie. C zytan ie
w stecz.
370
5.4.7
SORTOWANIE
Sortowanie pozycyjne z czytaniem wstecz było w zasadzie rozważane już w 1946 roku przez Johna M auchly’ego w jednej z pierwszych prac, jakie kie dykolwiek zostały opublikowane na tem at sortowania (zobacz podrozdział 5.5); Mauchly był w rzeczywistości autorem następującej konstrukcji: Faza
Tl -
T2 { 0 ,1 ,2 ,...,9 }
1 2 3 4
{4,5} (4 ,5}{2,7} {4, 5}{2,7}{0,9} (4 ,5}{2,7}
{3,6} {3, 6}{1 , 8} {3,6}{1,8}
8 C
-
-
-
T3
T4
-
{2,3, 6, 7} -
-
{9}
{0.1.8.9} {0, 1 , 8,9} -
{0}
{9}{8}{7}{6}{5} {0}{1}{2}{3}{4} {0}{1}{2}{3}{4}{5}... {9}
Jego schemat nie jest najlepszym z możliwych, ale mimo to jest interesujący, ponieważ pokazuje, że m etody z częściowymi przebiegami w sortowaniu pozy cyjnym były już rozważane w 1946 roku, chociaż w literaturze na tem at scalania pojawiły się dopiero około 1960 roku. Efektywny schemat sortowania pozycyjnego z czytaniem wstecz został za proponowany przez A. Bayesa [CACM 11 (1968), 491-493]. Mając dane P + 1 taśm i S kluczy, dzielimy klucze na P podplików, po [ S / P \ lub \ S/ P] kluczy w każdym, a następnie stosujemy tę procedurę rekurencyjnie do każdego podpliku. Gdy S < 2P , jeden podplik powinien zawierać tylko najmniejszy klucz i taki podplik powinien zostać zapisany w pliku wyjściowym. (Ta m etoda jest szczególnym przypadkiem ogólnej prefiksowej konstrukcji R. M. Karpa, która jest opisana na końcu punktu 5.4.4). Czytanie wstecz czyni scalanie trochę bardziej skomplikowanym, ponieważ odwraca ono uporządkowanie sekwensów. W sortowaniu pozycyjnym odpowiada tem u następujący efekt. W ynik jest stabilny lub „antystabilny” zależnie od po ziomu osiąganego w drzewie. Po wykonaniu sortowania pozycyjnego z czytaniem wstecz, w którym część węzłów zewnętrznych znajduje się na poziomach parzy stych, a część na poziomach nieparzystych, względny porządek różnych rekordów z takim i samymi kluczami będzie dla pewnych kluczy taki sam jak porządek oryginalny, natom iast dla innych kluczy końcowy porządek będzie odwrotny do oryginalnego. (Zobacz ćwiczenie 6 ). Sortowaniu oscylacyjnemu przez scalanie także odpowiada dualne sorto wanie pozycyjne. W pozycyjnym sortowaniu oscylacyjnym dzielenia kluczy do konujemy aż do m om entu otrzym ania podplików z tylko jednym kluczem lub w ystarczająco małych, żeby je można było posortować w pamięci wewnętrznej; takie pliki są sortowane i zapisywane na taśmie wyjściowej, a proces podziału zostaje urucham iany ponownie. Dla przykładu, jeśli dysponujemy trzem a ta śmami roboczymi i jedną taśm ą wyjściową i jeśli klucze są liczbami binarnymi, możemy rozpocząć od umieszczenia na taśm ie T l kluczy w postaci 0x, natom iast na taśm ie T2 kluczy w postaci lx . Jeśli liczba rekordów zapisanych na T l przekracza pojemność pamięci wewnętrznej, to przeglądamy tę taśm ę ponownie
5.4.7
ZEWNĘTRZNE SORTOWANIE POZYCYJNE
371
i umieszczamy 00x na T2 i Ola; na T3. Jeśli teraz podplik z kluczami 00x jest na tyle krótki, żeby zmieścić się w pamięci, sortujem y go wewnętrznie i zapi sujemy na taśmie wynikowej. Następnie kontynuujemy przetwarzanie podpliku z kluczami Ola;. Ta m etoda została nazwana przez E. H. Frienda [JACM 3 (1956), 157-159] „kaskadowym sortowaniem pozycyjnym” . Swój dalszy rozwój zawdzięcza H. Naglerowi [JACM 6 (1959), 459-468], który nadał jej pełną kolorytu nazwę „metody dwugłowej żmii” , oraz C. H. G audette [IBM Tech. Disclosure B u li 12 (April 1970), 1849-1853]. C zy sortow an ie p o zy cy jn e je s t lep sze od scalania? Z zasady dualności wynika, że sortowanie pozycyjne jest zwykle gorsze od sortowania ze scalaniem. Jest tak dlatego, że technika wyboru z podm ianą daje sortowaniu przez scala nie zdecydowaną przewagę. Nie jest łatwo zaprojektować sortowanie pozycyjne w taki sposób, żeby można wykorzystać sortowanie wewnętrzne do sortowania większej liczby rekordów, niż można pomieścić jednorazowo w pamięci. Rzeczywi ście, podpliki tworzone w oscylacyjnym sortowaniu pozycyjnym są często trochę krótsze, niż wynikałoby to z pojemności pamięci wewnętrznej. Tak więc schemat rozrzucania będzie odpowiadał drzewu z dużo większą liczbą węzłów zewnętrz nych niż w przypadku stosowania scalania i wyboru z podm ianą. W ynika stąd, że długość ścieżki zewnętrznej w takim drzewie - czas sortowania - będzie większa. (Zobacz ćwiczenie 5.3.1-33). Z drugiej strony, zewnętrzne sortowanie pozycyjne znajduje swoje zastoso wania. Załóżmy dla przykładu, że dysponujemy plikiem zawierającym uporząd kowane alfabetycznie nazwiska wszystkich pracowników dużego przedsiębiorstwa. Przedsiębiorstwo ma dziesięć oddziałów i chcemy posortować pliki po oddziałach, zachowując porządek alfabetyczny pracowników w każdym oddziale. To jest właśnie sytuacja, w której stabilne sortowanie pozycyjne znajduje doskonałe zastosowanie. Jeśli tylko plik jest duży, liczba rekordów które przynależą do każdego z 10 oddziałów jest z dużym prawdopodobieństwem większa od licz by rekordów, które zawierałyby początkowe sekwensy otrzymywane za pomocą wyboru z podmianą. W ogólności, jeśli zakres kluczy jest tak mały, że rekordy o danym kluczu zapełniłyby pamięć wewnętrzną więcej niż dwukrotnie, mądrze jest korzystać z techniki sortowania pozycyjnego. W punkcie 5.2.5 przekonaliśmy się, że dla pewnych, szybkich kom pute rów wewnętrzne sortowanie pozycyjne m a przewagę nad scalaniem, ponieważ w wewnętrznej pętli algorytmu sortowania nie m a skomplikowanych instrukcji warunkowych. Jeśli pamięć zewnętrzna jest wyjątkowo szybka, może okazać się, że na takich maszynach scalanie nie jest wystarczająco szybkie dla urządzeń wejścia/wyjścia. Dlatego w takiej sytuacji sortowanie pozycyjne może się okazać lepsze od scalania, szczególnie gdy wiadomo, że rozkład kluczy jest jednostajny. ĆW ICZENIA 1.
[2 0 ]
O g ó ln e T - t a ś m o w e s c a la n ie z r ó w n o w a ż o n e z p a r a m e t r e m
P, 1
^ P <
T,
z o s t a ło z d e fin io w a n e n a p o c z ą t k u r o z d z i a ł u 5 .4 . P o k a ż , że t a m e t o d a o d p o w i a d a s o r t o w a n iu p o z y c y jn e m u o p a r t e m u n a m ie s z a n y m l ic z b o w y m s y s t e m ie p o z y c y jn y m .
372
SORTOWANIE
5.4.7
2 . [M 2 8 ] W g łó w n y m t e k ś c ie z ilu s t r o w a n o t r z y t a ś m o w e w ie lo fa z o w e s o r to w a n ie p o z y c y j n e z a s t o s o w a n e d o 2 1 k lu c z y . U o g ó ln ij t e n p r z y k ł a d n a F n k lu c z y . W y ja ś n i j, j a k i e k lu c z e p o j a w i ą się n a p o s z c z e g ó ln y c h t a ś m a c h n a k o n ie c k a ż d e j fa z y . [ Wskazówka: R o z w a ż s y s t e m l ic z b o w y F ib o n a c c ie g o , ć w ic z e n ie 1 .2 .8 - 3 4 ] . 3.
[M 3 5 } R o z s z e r z w y n i k i z ć w ic z e n ia 2 n a w ie lo fa z o w e s o r to w a n ie p o z y c y jn e n a
c z t e r e c h lu b w ię c e j t a ś m a c h . ( Z o b a c z ć w ic z e n ie 5 .4 .2 - 1 0 ) .
4. [M23]
U d o w o d n ij, ż e s c h e m a t r o z r z u c a n ia A s h e n h u r s t a j e s t n a jle p s z y m s p o s o b e m
d o p o s o r t o w a n ia 10 k l u c z y n a c z t e r e c h t a ś m a c h b e z o d c z y t u w s t e c z , w t a k i m z n a c z e n iu , ż e d łu g o ś ć ś c ie ż k i z e w n ę t r z n e j w d r z e w ie z w i ą z a n y m z t y m s c h e m a t e m j e s t n a jm n ie js z a w ś ró d w s z y s tk ic h 4 -d rze w t y p u
Ufo.
( T a k w ię c j e s t t o i s t o t n ie n a jle p s z a m e t o d a , je ś li
p o m in ie m y c z a s p r z e w ija n ia ) . 5.
[15]
N a r y s u j 4 - d r z e w o t y p u Ufo o d p o w i a d a j ą c e s o r to w a n iu p o z y c y jn e m u M a u -
c h l y ’e g o z a s t o s o w a n e m u d o 10 k lu c z y . ►
6 . [20] P e w ie n p lik z a w ie r a d w u c y fr o w e k lu c z e 00, 0 1, . . . , 99. P o w y k o n a n iu s o r to w a n ia p o z y c y jn e g o a lg o r y t m e m M a u c h l y ’e g o z a s to s o w a n e g o d o c y f r y n a jm n ie j z n a c z ą c e j, m o ż e m y p o w t ó r z y ć t o s a m o d la c y f r y b a r d z ie j z n a c z ą c e j, z a m i e n i a ją c r o la m i t a ś m y T 2 i T 4 . J a k i b ę d z ie k o ń c o w y p o r z ą d e k k l u c z y n a t a ś m ie T 2 ?
7. [21]
C z y z a s a d a d u a ln o ś c i m a z a s to s o w a n ie t a k ż e d la p lik ó w w ie lo ta ś m o w y c h ?
*5.4.8. Sortowanie na dwóch taśmach
Ze względu na to, że do przeprowadzenia sortowania nie wymagającego nad miarowych ruchów taśm potrzebujem y trzech taśm, interesującym jest pytanie o możliwość wykonania rozsądnego sortowania zewnętrznego przy użyciu tylko dwóch taśm . Jeden ze sposobów takiego sortowania, zaproponowany przez H. B. Dem utha w 1956 roku, polega na połączeniu wyboru z podm ianą i sortowania bąbelkowe go. Załóżmy, że dane wejściowe znajdują się na taśmie T l, i rozpocznijmy od wczytania P -h l rekordów do pamięci. Teraz na taśmie T2 zapisujemy rekord z najm niejszym kluczem i zastępujemy go przez następny rekord wejściowy. Kontynuujem y zapisywanie na taśmie T2 rekordów z aktualnie najmniejszym kluczem, wykorzystując do tego celu drzewo wyboru lub kolejkę priorytetową dla P + 1 elementów. Po wczytaniu wszystkich rekordów wejściowych w pamięci pozostanie P największych kluczy; zapisujemy je na T2 w porządku rosnącym. Teraz przewijamy obie taśm y i powtarzam y to samo, ale czytając z T2 i zapisując na T l; w każdym przebiegu co najmniej P nowych rekordów zostaje umieszczo nych na swoich właściwych pozycjach. Za pomocą prostego podprogram u łatwo można sprawdzić, czy cały plik jest już posortowany. Całe sortowanie wymaga co najm niej \(N — 1) / P] przebiegów. Kilka chwil zastanowienia pozwala zauważyć, że każdy przebieg w opisanej powyżej procedurze jest rzeczywiście równoważny P kolejnym przebiegom sor towania bąbelkowego (algorytm 5.2.2B). Jeśli liczba inwersji pewnego elemen tu wynosi P lub więcej, to po wczytaniu go do pamięci okaże się on mniej szy od wszystkich innych elementów w drzewie i zostanie natychmiast zapi sany na taśm ie wyjściowej - traci się w ten sposób P inwersji. Jeśli liczba
SORTOWANIE NA DWÓCH TAŚMACH
5.4.8
373
inwersji wczytanego elementu jest mniejsza od P , to zostanie on umieszczo ny w drzewie wyboru i zapisany na taśm ie wyjściowej przed wszystkimi klu czami, które są od niego większe - traci się w ten sposób wszystkie inwersje. Z twierdzenia 5.2.21 wynika, że dla P = 1 odpowiada to dokładnie sortowaniu bąbelkowemu. Dlatego liczba wszystkich przebiegów będzie równa |~//P~|, gdzie I jest n aj większą liczbą inwersji dla sortowanych elementów. Z punktu 5.2.2 wiemy, że I wynosi N — \ J k N / 2 + 2/3 4- 0 ( 1 / \ / N ) . Jeśli rozmiar danego pliku nie jest dużo większy od rozm iaru dostępnej pamięci lub jeśli od samego początku plik jest prawie posortowany, to wówczas takie sortowanie bąbelkowe rzędu P jest dość szybkie; w rzeczywistości taka m etoda może okazać się przydatna nawet wtedy, kiedy są dostępne dodatkowe jednostki taśmowe, ponieważ taśm y pomocnicze muszą być instalowane przez operatora. Jednak dwutaśmowe sortowanie bąbelkowe będzie działało raczej wol no na długich, losowo uporządkowanych plikach, ponieważ średni czas działania jest w przybliżeniu proporcjonalny do N 2. Rozważmy implementację tej m etody dla przykładu ze 100000 rekordami z punktu 5.4.6. Musimy mądrze wybrać P , żeby zrekompensować wpływ przerw międzyblokowych na jednoczesne czytanie, zapisywanie i obliczenia. Ponieważ długość każdego rekordu wynosi 100 znaków, a w pamięci mieści się 100 000 zna ków, możemy utworzyć dwa bufory wejściowe i dwa bufory wyjściowe o rozmiarze B takim, że 100(P + 1 ) + 4B = 100000. (i) Przy oznaczeniach z punktu 5.4.6 czas działania każdego przebiegu wynosi około NCwr(l
+ p) ,
w =
(B + 7)/B .
(2 )
Ponieważ liczba przebiegów jest odwrotnie proporcjonalna do P , chcemy wybrać B tak, żeby była to wielokrotność 100, która minimalizuje wielkość oj/ P . Na pod stawie elementarnych rachunków widać, że najlepiej, gdy B jest w przybliżeniu równe v/249757 + 7 2 —7 . Zatem bierzemy B = 3000, P = 879. Jeśli w powyższych wzorach weźmiemy N — 100000, to zobaczymy, że liczba przebiegów \ I / P ] wynosi około 114, co daje łączny czas działania równy w przybliżeniu 8.57 godzin (przy wygodnym założeniu, że dla początkowego wejścia i końcowego wyjścia mamy także B = 3000). Takie dane stanowią w przybliżeniu 0.44 pojemności całej taśmy. Sortowanie w całości zapełnionej taśmy byłoby około pięć razy dłuższe. Można uzyskać pewną poprawę, zapisując od czasu do czasu rekordy z największymi kluczami na dodatkowej taśmie, ponieważ takie rekordy po zna lezieniu się już na swoich pozycjach są jedynie kopiowane. W y k o rzystan ie sortow an ia szyb k iego. Inną m etodą sortowania wewnętrzne go, w której dane są przetwarzane prawie sekwencyjnie, jest sortowanie szybkie, algorytm 5.2.2Q. Czy można ją zaadoptować do sortowania na dwóch taśm ach? [N. B. Yoash, C ACM 8 (1965), 649]. Nietrudno zauważyć, że można to rzeczywiście zrobić, korzystając z czytania wstecz. Przyjmijmy, że nasze dwie taśm y są ponumerowane 0 i 1 i wyobraźmy
374
SORTOWANIE
5.4.8
sobie, że plik jest rozmieszczony następująco: Taśma 0
Taśma 1
._____________i
Początek taśmy ( „dno” )
Bieżąca Bieżąca pozycja pozycja ( „wierzchołek”) ( „wierzchołek” )
Początek taśmy ( „dno” )
K ażda taśm a z osobna jest wykorzystywana jako stos. Biorąc je razem, na plik można patrzeć jak na listę liniową, na której przesunięcie bieżącej pozycji w lewo lub w prawo odbywa się za pomocą kopiowania z jednego stosu na drugi. Poniższa procedura rekurencyjna definiuje stosowne sortowanie: • S0RT00 [Posortuj podplik z wierzchołka taśm y 0 i umieść go z powrotem na taśmie 0]. Jeśli podplik mieści się w pamięci wewnętrznej, sortujemy go wewnętrznie i po sortowany zapisujemy z powrotem na taśmie. W przeciwnym razie z pliku wybie ram y jeden rekord R . Niech K będzie kluczem z tego rekordu. Następnie czytamy taśm ę 0 wstecz, kopiując na taśm ę 1 wszystkie rekordy z kluczami > K i tworząc w ten sposób nowy podplik. Ponownie odczytujemy taśm ę 0, ale tym razem w przód, kopiując wszystkie rekordy z kluczami — K na taśm ę 1. Następnie znowu czytam y wstecz, kopiując na taśm ę 1 wszystkie rekordy z kluczami < K . Sortowanie kończymy, wykonując S0RT10 dla kluczy < K , następnie kopiując na taśm ę 0 klucze = K i na koniec wykonując S0RT10 dla kluczy > K . • S0RT01 [Posortuj plik z wierzchołka taśm y 0 i zapisz go na taśmie 1]. Postępujem y ta k samo jak w S0RT00, ale zam iast ostatniego sortowania „S0RT10” wykonujemy „SORTU” , a następnie na taśm ę 1 kopiujemy klucze < K . • S0RT10 [Posortuj plik z wierzchołka taśm y 1 i zapisz go na taśmie 0]. Postępujem y podobnie jak w S0RT01, ale zamieniając 0 z 1 i < z >. • SORTU [Posortuj podplik z wierzchołka taśm y 1 i zapisz go na taśmie 1]. Postępujem y podobnie jak w S0RT00, ale zamieniając 0 z 1 i < z >. Mimo swojej rekurencyjnej natury, powyższe podprogramy można wykonać bez żadnych trudności. W ystarczy tylko zapamiętywać na taśm ach stosowne infor macje sterujące obliczeniami. Czas działania tego algorytm u można oszacować w następujący sposób, przy założeniu, że dane są uporządkowane losowo, a prawdopodobieństwo równych kluczy jest zaniedbywalne. Niech M będzie liczbą rekordów mieszczących się w pamięci wewnętrznej. Niech X jy będzie średnią liczbą czytanych rekordów podczas wykonywania S0RT00 lub SORTU z podpliku złożonego z N rekordów, gdy N > M, i niech Y n będzie odpowiednią wartością dla S0RT01 lub S0RT10. Wówczas mamy _ ( 0, - i 3N + 1 +
Yn
_ J 0, ~ i 3N + 2 +
i E o
jeśli N < M; jeśli N > M ;
^ E o < fe
jeśli N < M; Jeśli N > M -
(3)
5.4.8
SORTOWANIE NA DWÓCH TAŚMACH
375
Rozwiązanie tych równań rekurencyjnych (zobacz ćwiczenie 2) pokazuje, że łącz na liczba odczytów z taśmy podczas faz zewnętrznego podziału będzie wynosiła średnio 6 ^ N \ n N 4- 0 ( N ) , przy N —> oo. Ze wzorów 5 .2 .2- ( 25 ) wiemy także, że średnia liczba faz w sortowaniu wewnętrznym będzie wynosiła 2 ( N 4 - 1 ) / (M + 2) - 1. Jeśli zastosujemy tę analizę do naszego przykładu ze 100000 rekordami z punktu 5.4.6, przy wykorzystaniu buforów o pojemności 25 000 znaków i przy założeniu, że czas sortowania podpliku złożonego z n < M = 1000 wynosi 2u C ujt, otrzymamy, że średni czas sortowania wynosi w przybliżeniu 103 mi nuty (włączając w to końcowe przewijanie, podobnie jak na wkładce A). Tak więc w średnim przypadku m etoda z użyciem sortowania szybkiego nie jest zła. Jednak w przypadku pesym istycznym ta m etoda okazuje się być jeszcze gorsza od sortowania bąbelkowego, o którym była mowa powyżej. Random izacja czyni przypadek pesymistyczny bardzo mało prawdopodobnym. S o rto w a n ie p o z y c y jn e . W podobny sposób dla sortowania dwutaśmowego można zaadoptować sortowanie pozycyjne przez zamienianie (algorytm 5.2.2R), ponieważ jest ono bardzo podobne do sortowania szybkiego. Pomysł, który umoż liwia wykorzystanie obu m etod, polega na odczytywaniu taśm y z tą sam ą za wartością więcej niż raz. Jest to coś, co nigdy nie zdarzało się w poprzednich algorytmach taśmowych. Ten sam pomysł można zastosować do sortowania pozycyjnego typu „naj mniej znacząca cyfra jako pierwsza” na dwóch taśmach. M ając dane wejściowe na T l, na T2 kopiujemy wszystkie rekordy, których klucze w zapisie binarnym kończą się na 0. Następnie przewijamy T l i czytamy ją ponownie, kopiując na T2 rekordy, których klucze kończą się na 1. Teraz obie taśm y zostają przewinięte i jest wykonywany podobny przebieg, z zamienionymi rolami T l i T2 i przy wykorzystaniu drugiej najmniej znaczącej cyfry binarnej. W tym momencie na T l znajdują się najpierw wszystkie rekordy, których kluczami są ( . . . 00) 2, następnie te z kluczami (.. . 01 ) 2, potem z kluczami ( . . . 10) 2, potem (. .. 1 1 ) 2. Jeśli długość kluczy wynosi b bitów, wystarczy tylko 2b przebiegów przez plik, żeby go w całości posortować. Takie sortowanie pozycyjne można by zastosować tylko do b najbardziej znaczących bitów, dla pewnej, odpowiednio dobranej liczby b. Dla kluczy o roz kładzie jednostajnym liczba inwersji zredukowałaby się o około 2b razy. Wówczas sortowanie można by zakończyć za pomocą kilku przebiegów P -wejściowego sortowania bąbelkowego. W tym rozwiązaniu taśm a jest czytana tylko w przód. Oryginalne, choć trochę skomplikowane podejście do dwutaśmowego sorto wania z rozrzucaniem zostało zaproponowane przez A. I. N ikitina i L. I. Szołmowa [Kibiernietika 2,6 (1966), 79-84]. Dla każdej możliwej konfiguracji czołowych bitów liczymy, ile jest kluczy o tej konfiguracji. Na podstawie tak otrzym anych liczb konstruujemy sztuczne klucze « 1 , « 2, . . •, km takie, że dla każdego i liczba rzeczywistych kluczy leżących między Ki a «¿+1 znajduje się między wcześniej wy znaczonymi ograniczeniami P i i P 2. Taki więc M leży między [7V/P2] a \N/P{]. Jeśli obliczone na podstawie czołowych bitów liczby nie są w ystarczające do
376
SORTOWANIE
5.4.8
wyznaczenia ciągu /ci, « 2, . . . , «m? to dla pewnych konfiguracji czołowych bitów wykonujemy dodatkowe (jeden lub więcej) przebiegi, w których zliczamy często ści w ystąpień konfiguracji z mniej znaczącymi bitami. Po zbudowaniu tablicy sztucznych kluczy k i, « 2?■•■j do zakończenia sortowania wystarczy 2 |"lgM] dodatkowych przebiegów. (Ta m etoda wymaga pamięci wewnętrznej o rozmiarze proporcjonalnym do N, tak więc nie można jej używać do sortowania zewnętrz nego, gdy N —* oc. W praktyce ta technika nie jest używana do sortowania plików wielotaśmowych, więc M jest stosunkowo małe i tablica sztucznych kluczy swobodnie mieści się w pamięci). S y m u la c ja w ię k sze j lic zb y ta ś m . F. C. Hennie i R. E. Stearns wymyślili ogólną technikę symulacji k taśm na tylko dwóch taśm ach w taki sposób, że niezbędny ruch taśm w zrasta tylko o czynnik O (logL), gdzie L jest maksymalną odległością do pokonania na jednej taśmie [JACM 13 (1966), 533-546]. Ich algorytm można trochę uprościć w przypadku sortowania, co pokazuje poniższa m etoda zaproponowana przez R. M. Karpa. Będziemy symulowali zwykłe scalania czterotaśmowe na dwóch taśm ach T l i T2. Pierwsza z tych taśm zawiera zawartości symulowanych taśm, rozmiesz czone w sposób przedstawiony na diagramie z rysunku 86. W yobraźmy sobie, że dane są zapisane na czterech „ścieżkach” , po jednej dla każdej z symulowanych taśm . (W rzeczywistości takich ścieżek na taśm ie nie ma; bloki 1, 5, 9, 13, ... traktujem y jako ścieżkę 1, bloki 2, 6 , 10, 14, . . . jako ścieżkę 2 itd.). Taśma T2 jest używana jako pamięć pomocnicza, umożliwiająca wykonywanie operacji na T l. Strefa 0 Strefa 1 Ścieżka 1
1
5
Ścieżka 2
111
6
Ścieżka 3 Ścieżka 4
R ys.
4
WM
Strefa 2 13
17
14
21
Strefa 3 29
33
37
41
45
22
30
34
38
42
46
31
35
39
43
47
32
36
40
44
48
7
11
15
19
23
8
m i
16
20
24
25
28
50)
51
52L
8 6 . O b r a z t a ś m y T l w s y m u la c ji H e n n ie g o - S t e a r n s a . N ie p u s t e o b s z a r y z o s t a ł y
z a c ie n io w a n e .
Na każdej ścieżce bloki są podzielone na strefy zawierające odpowiednio po 1, 2, 4, 8, . . . , 2fc, . . . bloków. Na każdej ścieżce strefa k jest albo całkowicie pusta, albo zapełniona dokładnie 2 k blokami danych. Dla przykładu, na rysunku 86 ścieżka 1 zawiera dane w strefach 1 i 3; ścieżka 2 w strefach 0, 1, 2; ścieżka 3 w strefach 0 i 2; ścieżka 4 w strefie 1; pozostałe strefy są puste. Przypuśćmy, że scalamy dane ze ścieżek 1 i 2 na ścieżkę 3. W pamięci wewnętrznej kom putera mamy dwa bufory na dane wejściowe do scalania dwuwejściowego i jeden bufor na dane wyjściowe. Gdy bufor wejściowy dla ścieżki 1 zostaje opróżniony, możemy go wypełnić ponownie w następujący sposób. Na ścieżce 1 znajdujem y pierwszą niepustą strefę, powiedzmy fc, i kopiujemy jej pierwszy blok do bufora wejściowego. Pozostałe 2k — 1 bloków z danymi
5.4.8
SORTOWANIE NA DWÓCH TAŚMACH
377
kopiujemy na T2 i przesuwamy je do stref 0, 1, . . . , k —1 na ścieżce 1. (Strefy 0, 1, . . . , k —1 są teraz zapełnione, natom iast strefa k staje się pustą). Podobnie jest wypełniany opróżniony bufor wejściowy dla ścieżki 2 . Gdy bufor wyjściowy jest gotowy do zapisania na ścieżce 3, odwracamy powyższy proces i przeglądamy T l w poszukiwaniu pierwszej pustej strefy na ścieżce 3, powiedzmy strefy fc, kopiując jednocześnie na T 2 dane ze stref 0, 1 , . . . , fc—1. Dane zapisane na T2, rozszerzone o zawartość bufora wyjściowego, są następnie używane do zapełnienia strefy k na ścieżce 3. W tej procedurze musimy mieć możliwość pisania w środku taśm y T l, bez niszczenia zawartości kolejnych informacji zapisanych już na taśmie. Można to zrobić, podobnie jak w przypadku sortowania oscylacyjnego z czytaniem w przód (punkt 5.4.5), jeśli tylko zastosujemy odpowiednie środki ostrożności. Liczba ruchów taśm y (przejść przez bloki) potrzebna do ściągnięcia do pa mięci 2 l —1 bloków ze ścieżki wynosi ^2 0ą k
378
SORTOWANIE
5.4.8
Rozważmy n-piętrowy budynek, w którym na każdym piętrze jest miejsce dla dokładnie b osób. W budynku nie m a drzwi, okien i schodów, ale jest winda, która może zatrzym ać się na każdym piętrze. W budynku znajduje się bn osób. Na każde z poszczególnych pięter chce dostać się dokładnie b z nich. W windzie może zmieścić się jednorazowo co najwyżej m osób. Przejazd z piętra i na piętro i + 1 zajm uje jedną jednostkę czasu. Chcemy znaleźć najszybszy sposób przewiezienia wszystkich osób na właściwe piętra, przy założeniu, że winda startuje z piętra o numerze 1 i na końcu znajdzie się znowu na tym piętrze. N ietrudno dostrzec związek między problemem z windą a problemem sorto wania z jedną taśm ą. Osoby odpow iadają rekordom, a budynek taśmie. P iętra to bloki na taśmie, a winda to pamięć wewnętrzna komputera. Kom puter jest bardziej elastyczny od windy (może na przykład powielać rekordy lub chwilowo dzielić je i umieszczać w różnych blokach). Jednak rozwiązanie podane poniżej jest najszybszym z możliwych do wyobrażenia, jeśli zabronimy wykonywania takich operacji.
> 1 , Ufc-i > 0
\uk > 0 K I. W górę
K2. NadalV f c = 0 v w górę? J ^ K3. W dół
'K4. N ad al\ w dół?
fc = 1, ui = 0 k >
1,
u k-1
=
0
lu b k = 1, u \ > 0
4 ''
R y s . 8 7 . A l g o r y t m d la p r o b le m u z w in d ą .
Algorytm K arpa używa dwóch pomocniczych tablic. u*;, 1 < k < n: Liczba osób na piętrach < &, których docelowe piętro ma nr > fc; dfc, 1 < k < n: Liczba osób na piętrach > /c, których docelowe piętro m a nr < k. (4 )
Gdy winda jest pusta, to zawsze u k = dfc+i, dla 1 < k < n, ponieważ na każdym piętrze znajduje się b osób; liczba osób, które chcą opuścić piętra musi być równa liczbie osób, które chcą opuścić piętra {fc+1, . . . ,n}. Z definicji Xln ~ = 0. Jest jasne, że winda musi przejechać z piętra k na piętro k + 1 co najmniej [wfc/m] razy dla 1 < k < n, ponieważ jednorazowo winda może zabrać m pasa żerów. Podobnie, winda musi przejechać co najmniej \dk/ m] razy z piętra k na piętro k —1. Dlatego czas pracy windy, dla każdego poprawnie skonstruowanego planu jazdy, wynosi co najmniej n Y ^ ( \u k / m ] + \dk/ m \ )
(5 )
fc= l
jednostek czasu. K arp pokazał, że dolne ograniczenie jest rzeczywiście osiągalne, gdy u i , . . . , u n_ i są niezerowe.
SORTOWANIE NA DWÓCH TAŚMACH
5.4.8
379
T w ie rd z e n ie K . Jeśli Uk > 0, dla 1 < k < n, to istnieje plan ja zd y windy, zgod nie z którym wszystkie osoby znajdą się na właściwych piętrach w najkrótszym możliwym czasie. (5 ). Dowód. Załóżmy, że w budynku znajduje się jeszcze dodatkowo m osób, które na początku są w windzie i docelowo chcą znaleźć się na parterze (piętro o nu merze 0). W inda może działać zgodnie z następującym algorytmem, w którym początkową wartością k (aktualne piętro) jest 1 : K I . [Ruch w górę] Spośród b 4- m osób znajdujących się w windzie i na piętrze k, m osób, które chce dostać się na najwyższe piętra, wchodzi do windy, a pozostałe osoby zostają na piętrze k . Przyjmijmy, że teraz w windzie znajduje się u osób, których docelowe piętra m ają numer > k, i d osób, dla których numery docelowych pięter < k. (Okaże się, że zawsze u — m in(m , Uk); jeśli Uk < m , to część osób może się oddalić od docelowego piętra. Poświęcamy ich dla wspólnego dobra). Zmniejszamy Uk i u, zwiększamy d^+i o d, a następnie zwiększamy k o l . K 2 . [Nadal w górę?] Jeśli u^ > 0, wracamy do kroku K I. K 3. [Ruch w dół]. Spośród b + m osób aktualnie znajdujących się w windzie i na piętrze k, m osób, które chce dostać się na najniższe piętra, wchodzi do windy, a pozostałe zostają na piętrze k. Przyjmijmy, że teraz w windzie znajduje się u osób, których docelowe piętra m ają numer > k, i d osób, których numery docelowych pięter < k. (Okaże się, że zawsze u = 0 i d — m, ale sam algorytm opisujemy ogólnie w odniesieniu do u i d w celu uczynienia dowodu bardziej przejrzystym ). Zmniejszamy du o d, zwiększamy Uk+1 o u, a następnie zmniejszamy k o l . K 4. [Nadal w dół?] Jeśli k > l i Uk-i > 0, wracamy do kroku K3. Jeśli k = 1 i uj = 0, kończymy wykonywanie algorytm u (każdy dostał się na właściwe piętro, a m dodatkowych osób jest z powrotem w windzie). W przeciwnym razie wracamy do kroku K2. Na rysunku 88 zaprezentowano działanie tego algorytm u dla dziewięciopiętrowego budynku i b = 2, m = 3. Zauważmy, że jedna z osób o docelowym piętrze 6 zostaje przewieziona na piętro 7 mimo tego, iż winda wykonuje mini malną liczbę ruchów. Pomysł porównywania Uk- 1 z 0 w kroku K4 jest kluczowy dla tego algorytmu, o czym się wkrótce przekonamy. Żeby wykazać poprawność tego algorytmu, zauważmy, że podczas wykony wania algorytmu, w krokach K I i K3 wartości w tablicach u i d zawsze spełniają (4), jeśli przyjmiemy, że osoby w windzie znajdują się „aktualnie” na piętrze k. Teraz można udowodnić przez indukcję, że na początku każdego z kroków są spełnione następujące zależności: ui = di + 1 ui = di+i u/+i = 0,
—m
dla k < l < n;
(6)
dla 1 < l < fc;
(7)
jeśli ui = 0 i k < l < n.
(8)
380
SORTOWANIE
P ię tr o 9 P ię tr o 8
-4 8 25
5.4.8
^ 9 9 ---899 458 — ^ 25 — 58 ■ 899 245
^ 8 8 ---778 577
^ 5 6 ^ -7 7 -
P ię tr o 7 P ię tr o 6
122
677 556 -^ -4 4 ------- ^ 5 6 —^ 6 6 677 445 456 455
V 2 4 ^ -5 5 -
P ię tr o 5
122 266 V l 2 --
P ię tr o 4
244
Jf-44122
-A 23^3 3 —
P ię tr o 3
112 123 122
V o i ^ - 22-
P ię tr o 2
011 P ię tr o 1
Jrii000 \
K o n ie c
R ys. 88 .
P e w ie n o p t y m a ln y s p o s ó b p r z e w o z u o s ó b w o ln ą w in d ą o m a łe j p o je m n o ś c i.
( O s o b y s ą r e p r e z e n t o w a n e p r z e z n u m e r y p ię t e r , n a k t ó r e c h c ą się d o s ta ć ) .
Ponadto, na początku kroku K I, min (ujt, m) osób z największymi numerami do celowych pięter, spośród wszystkich osób na piętrach < k, z docelowymi piętram i o numerach > k, znajduje się w windzie lub na piętrze k. Na początku kroku K3, min (dfc, m ) osób z najmniejszymi numerami docelowych pięter, spośród osób na piętrach > k z docelowymi piętram i o nr < fc, znajduje się w windzie lub na piętrze k. Z tych własności wynika, że uwagi ujęte w nawiasach w krokach K I i K2 mó wią zawsze prawdę. Dlatego w każdym kroku K I, \uk/ m] zmniejsza się o 1 , na tom iast [dfc+i/m ] pozostaje bez zmian; każde wykonanie K3 zmniejsza \dk/m] o 1 i pozostawia ¡Uk-i / m] bez zmian. Z (6 ) i (8) wynika, że algorytm kończy działanie po skończonej liczbie kroków i każda osoba znajdzie się na właściwym piętrze. | Dla Uk = 0 i Uk+\ > 0 sytuacja jest „nieciągła” . W inda musi dojechać do piętra fc + 1 , żeby przewieźć ludzi na wyższe piętra, chociaż nikt nie chce dostać się z pięter < k na piętra > k 4- 1. Bez straty ogólności możemy założyć, że u n^ i > 0. Wówczas każdy poprawny plan jazdy musi przewidywać co najmniej 2
^2
m a x ( l, pMfc/m])
(9 )
1^k
ruchów windy, ponieważ żądamy, żeby winda wróciła na piętro 1. Plan, w którym ta dolna granica jest osiągalna, jest łatwo zaprojektować (ćwiczenie 4). Ć W IC ZEN IA 1.
[20] W s o r t o w a n iu b ą b e lk o w y m r z ę d u P , o m a w ia n y m w t y m p u n k c ie , k o r z y s t a się
t y l k o z c z y t a n i a w p r z ó d i p r z e w ija n ia . C z y t e n a lg o r y t m m o ż n a z m o d y fik o w a ć w t a k i s p o s ó b , ż e b y m o ż n a b y ł o w y k o r z y s t a ć c z y t a n i e wstecz ?
DYSKI I BĘBNY
5.4.9
381
2 . [M26] P o d a j j a w n e , z a m k n ię t e w z o r y n a lic z b y X n , Y n z d e fin io w a n e w ( 3 ). [ Wska zówka: Z b a d a j r o z w ią z a n ie 5 . 2 .2 - ( i g ) ] . 3.
[38] C z y is t n ie je m e t o d a s o r t o w a n ia d w u t a ś m o w e g o , o p a r t a t y l k o n a p o r ó w n y w a
n iu k l u c z y ( b e z w y k o r z y s t y w a n i a ic h n u m e r y c z n y c h w ła s n o ś c i) , k t ó r e j c z a s d z i a ła n i a ( m ie r z o n y c z a s e m r u c h u t a ś m ) w y n o s i w p e s y m i s t y c z n y m p r z y p a d k u 0 ( N lo g N ) t g d z ie
N j e s t l ic z b ą s o r t o w a n y c h r e k o r d ó w ? [S o r to w a n ie s z y b k ie o s ią g a t ę w a r t o ś ć w p r z y p a d k u ś r e d n im , n a t o m ia s t a lg o r y t m H e n n ie g o - S t e a r n s a d z i a ł a w c z a s ie ( r y s u n e k 86 )
0 ( N ( l o g N ) 2)]. [M23] R o z w a ż m y p r o b le m w i n d y i z a łó ż m y , ż e is t n ie ją in d e k s y p i q t a k ie , ż e q ^ p-\- 2, u p > 0, u q > 0 i u p+ 1 = ■■■= u q~i = 0. W y ja ś n i j, w j a k i s p o s ó b z a p la n o w a ć r u c h w in d y , ż e b y r o z w i o z ł a w s z y s t k i e o s o b y w c o n a j w y ż e j ( 9 ) je d n o s t k a c h c z a s u . 4.
► 5.
[M23]
P r a w d a c z y fa łs z : P o w y k o n a n iu k r o k u K I w a lg o r y t m i e z t w i e r d z e n i a K ,
n ik t w w in d z ie n ie c h c e z n a le ź ć się n a n iż s z y m p ię t r z e n iż p ię t r o , n a k t ó r y m c h c e się z n a le ź ć d o w o ln a o s o b a z p ię t e r < k.
6 . [M 3 0 ] (R . M . K a r p ) U o g ó ln ij p r o b le m w i n d y ( r y s u n e k 8 7) n a p r z y p a d e k , w k t ó r y m p o c z ą t k o w o n a p ię t r z e j z n a jd u je się bj o s ó b i d o k ła d n ie bj o s ó b c h c e d o c e lo w o z n a le ź ć s ię n a p ię t r z e j d la 1 ^ j ^ n . P o k a ż , ż e is t n ie je p la n ja z d y , w k t ó r y m w i n d a d z i a ła 2 ^ £ ~ 11 m a x ( l , \uk/rn \, \dk+i/rri \) je d n o s t e k c z a s u i z g o d n ie z k t ó r y m n a p ię t r z e
j n ig d y n ie z n a jd z i e się w ię c e j o s ó b n iż m a x (5 ,p 5 ' ) . [Wskazówka: D o d a j fik c y jn e o s o b y , je ś li j e s t t o k o n ie c z n e , ż e b y d la k a ż d e g o j z a c h o d z i ło bj = bj].
7.
[MĄO]
(R . M . K a r p ) U o g ó ln ij z a d a n ie z ć w ic z e n ia 6 , z a m i e n i a ją c j e d n ą ś c ie ż k ę ,
p o k t ó r e j p o r u s z a się w in d a , n a s ie ć d r ó g , p o k t ó r y c h je ź d z i a u t o b u s , p r z y z a ło ż e n iu , ż e s ie ć d r ó g t w o r z y drzewo wolne. P o je m n o ś ć a u t o b u s u je s t o g r a n ic z o n a , a n a s z y m c e le m je s t p r z e w ie z ie n ie p a s a ż e r ó w d o ic h m ie js c p r z e z n a c z e n ia w t a k i s p o s ó b , ż e b y a u t o b u s p r z e b y ł, j a k n a j k r ó t s z ą d ro g ę .
8 . [M32] N ie c h w z a d a n iu o w in d z ie z g łó w n e g o t e k s t u 5 = 1 . D l a ilu r o z m ie s z c z e ń n o s ó b n a n p ię t r a c h z a c h o d z i w ( 4 ), Uk ^ 1 d la 1 ^ k ^ n? [N a p r z y k ł a d j e s t t o p r a w d a d la p e r m u t a c ji 3 1 4 5 9 2 6 8 ► 9.
[M25]
7].
Z n a j d ź z n a c z ą c y z w ią z e k m ię d z y
„ s o r t o w a n ie m k o k t a j l o w y m ” o p is a n y m
w p u n k c ie 5 . 2 . 2 , r y s u n e k 16 , a lic z b a m i u i , U2 , . . . , u n z ( 4 ) d la p r z y p a d k u 5 = 1 . 10 .
[20] W j a k i s p o s ó b p o s o r t o w a ć p lik w ie lo ta ś m o w y , u ż y w a j ą c t y lk o d w ó c h je d n o
ste k ta śm o w y ch ?
*5.4.9. Dyski i bębny
Jak dotąd do sortowania zewnętrznego używaliśmy taśm. Istnieją jednak do tego celu dużo wygodniejsze urządzenia. Chociaż pamięci masowe pojaw iają się w różnych postaciach, można je scharakteryzować w przybliżeniu w następujący sposób. i) Dostęp do każdego, poszczególnego fragm entu zapamiętanej informacji jest szybki. ii) Bloki kolejnych słów mogą być szybko przesyłane między pamięcią we wnętrzną a zewnętrzną. Taśma magnetyczna m a własność (ii), ale nie (i), ponieważ przejście od jednego końca taśmy do drugiego zajmuje dużo czasu.
382
SORTOWANIE
5.4.9
K ażda jednostka pamięci zewnętrznej m a swoje szczególne własności, z któ rymi należy się dokładnie zapoznać przed rozpoczęciem prac nad programami do obsługi takiej pamięci. Jednak technologia zmienia się tak szybko, że nie jest możliwe tu ta j omówienie różnorodnego dostępnego sprzętu. Z tego powodu rozważymy tylko typowe pamięci masowe, które ilustrują ich użyteczność do sortowania. Jednym i z najpowszechniejszych urządzeń pamięci zewnętrznych są dyski (zobacz rysunek 89). Urządzenie dyskowe składa się z kilku, szybko obracających się koncentrycznych dysków magnetycznych. Do odczytywania i zapisywania danych na dyskach służy ramię wyposażone w jedną lub więcej „głowic odczytująco/zapisujących” dla każdej powierzchni (strony) dyskowej. Każda pojedyncza strona jest podzielona na koncentryczne pierścienie nazywane ścieżkami. Pod czas jednego obrotu cała ścieżka przesuwa się pod głowicą. Ramię jest ruchome i umożliwia przesuwanie głowic między ścieżkami, ale ruch ramienia zajmuje tro chę czasu. Zbiór ścieżek, który można odczytywać bez ruchu ramienia, nazywamy cylindrem. Dla przykładu, na rysunku 89 przedstawiono urządzenie dyskowe wyposażone w jedną głowicę zapisująco/odczytującą dla każdej powierzchni dys kowej. Szare pierścienie ukazują jeden z cylindrów, składający się ze wszystkich ścieżek znajdujących się aktualnie pod głowicami odczytująco/zapisującym i.
Dla ustalenia uwagi rozważmy hipotetyczne jednostki dyskowe typu MIXTEC, dla których
1 ścieżka — 5000 znaków 1 cylinder = 1 jednostka dyskowa =
20 ścieżek 200 cylindrów
Taka jednostka dyskowa mieści 20 milionów znaków, trochę mniej od ilości da nych, które można zapam iętać na jednej taśmie typu MIXT. Na pewnych urzą dzeniach ścieżki leżące bliżej środka zawierają mniej znaków niż ścieżki leżące dalej od środka. To czyni oprogramowanie takich urządzeń jeszcze trudniej szym. Szczęśliwie na urządzeniach typu MIXTEC nie mamy takich problemów. (Zobacz punkt 5 .4 .6 ,w którym omawiamy taśm y typu MIXT. Podobnie jak w tam tym punkcie, zajmiemy się klasycznymi technikami, przyjmując charakterystyki
5.4.9
DYSKI I BĘBNY
383
sprzętowe typowych urządzeń z początku lat siedemdziesiątych. W spółczesne dyski są większe i szybsze). Czas potrzebny do odczytu lub zapisu informacji na dysku jest w zasadzie sumą trzech wielkości: • czasu przeszukiwania (czasu potrzebnego na ustawienie głowic nad odpowied nim cylindrem); • czasu oczekiwania (opóźnienia obrotowego potrzebnego do osiągnięcia prawego początku sektora z zapisaną informacją); • czasu transm isji (opóźnienia obrotowego, podczas którego dane znajdują się pod głowicą odczytująco/zapisującą). Na urządzeniach typu MIXTEC czas przeszukiwania potrzebny do przejścia z cy lindra i do cylindra j wynosi 25 + \ \i —j\ milisekund. Jeśli i oraz j są losowymi liczbami z zakresu od 1 do 200, średnią wartością |i —j\ jest /200 2 66.7. Zatem średni czas przeszukiwania wynosi około 60 ms. Dyski typu MIXTEC wy konują jeden pełny obrót na każde 25 ms. Tak więc czas oczekiwania wynosi średnio 12.5 ms. Czas transm isji dla n znaków wynosi (n/5000) x 25 ms = 5n ¿¿s, (To jest około 3^ razy szybciej od czasu transm isji dla taśm typu MIXT, które wykorzystywaliśmy w przykładach z punktu 5.4.6). Tak więc głównymi różnicami między dyskami MIXTEC a taśm am i MIXT są: a) dostęp do informacji na taśm ach jest tylko sekwencyjny; b) pojedyncze operacje dyskowe pochłaniają zazwyczaj znacząco więcej czasu na czynności organizacyjne (porównaj czas przeszukiwania + czas oczeki wania z czasem rozruchu/zatrzym ania); c) transm isja na dysk i z dysku jest szybsza. Stosując mądre schematy scalania dla taśm , jesteśmy w stanie zrekompensować trochę straty wynikające z (a). Teraz naszym celem będzie poszukanie mądrych algorytmów sortowania dyskowego, które zrekompensują straty wynikające z (b). P okon yw anie tru d n ości zw iązan ych z czasem oczek iw an ia. Rozważmy najpierw problem minimalizacji opóźnienia powodowanego faktem, że dysk nie zawsze znajduje się w pozycji gotowej do odczytu/zapisu. Nie możemy spowo dować szybszych obrotów dysku, ale możemy zastosować pewne sztuczki w celu redukcji lub nawet wyeliminowania czasu oczekiwania. Z pewnością pomogłoby dodanie dodatkowych ramion z głowicami, ale byłaby to kosztowna modyfikacja sprzętowa. Oto kilka pomysłów programistycznych. • Jeśli będziemy odczytywać (lub zapisywać) z kilku ścieżek tego samego cylindra jednocześnie, to unikniemy czasu oczekiwania (i czasu przeszukiwania) na wszystkich ścieżkach z wyjątkiem pierwszej. Ogólnie, często jest możliwa synchronizacja czasu obliczeń z obrotam i dysku w taki sposób, że ciąg instruk cji wejścia/wyjścia można wykonać bez opóźnień związanych z oczekiwaniem obrotowym. • Rozważmy problem odczytania połowy ścieżki z danymi (rysunek 90). Jeśli wykonywanie polecenia odczytu zaczyna się od punktu A, to opóźnienie
384
SORTOWANIE
R ys. 90.
5.4.9
A n a l i z a c z a s u o c z e k iw a n ia p o d c z a s o d c z y t u p o ło w y ś c ie ż k i.
obrotowe nie występuje i całkowity czas odczytu jest równy czasowi transmisji danych, \ x 25 ms. Jeśli wykonywanie rozkazu odczytu zaczyna się w punkcie B , opóźnienie wyniesie \ obrotu na oczekiwanie plus | na transmisję, razem | x 25 ms. Najciekawszy przypadek jest wtedy, kiedy głowice początkowo znaj dują się w punkcie C . Przy odpowiednim sprzęcie i oprogramowaniu nie musimy tracić | obrotu na oczekiwanie. Odczyt można rozpocząć natychm iast, zapełnia jąc drugą połowę bufora wejściowego. Następnie, po przerwie trwającej \ x 25 ms, można wznowić odczyt i zapełnić pierwszą połowę bufora. Wykonywanie po lecenia odczytu kończy się po ponownym osiągnięciu punktu C. W podobny sposób możemy zapewnić, żeby czas oczekiwania plus czas transm isji nigdy nie przekroczyły jednego obrotu, niezależnie od początkowego położenia głowic. W ten sposób średni czas oczekiwania redukuje się z czasu połowy obrotu do czasu | ( 1 —x 2) obrotu, jeśli odczytywany lub zapisywany jest ułamek x całej ścieżki, dla 0 < x < 1. Gdy odczytywana lub zapisywana jest cała ścieżka (x = 1 ), wówczas ta technika eliminuje całkowicie czas oczekiwania. B ę b n y : p r z y p a d e k b e z p rz e s z u k iw a n ia . Dla pamięci zewnętrznych, na zywanych tradycyjnie pamięciami bębnowymi, czas przeszukiwania jest wyeli minowany przez utrzymywanie dla każdej ścieżki oddzielnej głowicy odczytująco/zapisującej. Jeśli do takich urządzeń zastosujemy technikę z rysunku 90, wyeliminujemy zarówno czas przeszukiwania, jak i czas oczekiwania, pod wa runkiem, że w każdej chwili czytamy (lub zapisujemy) z jakiejś ścieżki. To jest idealna sytuacja, w której tylko czas transm isji jest czynnikiem ograniczającym. Rozważmy jeszcze raz przykład z punktu 5.4.6, w którym trzeba posortować 100 000 rekordów stuznakowych, przy założeniu, że w pamięci wewnętrznej mieści się 100000 znaków. Taka ilość danych wypełnia dysk typu MIXTEC w połowie. Zazwyczaj nie jest możliwy jednoczesny odczyt i zapis na tym samym dysku. Załóżmy, że mamy do dyspozycji dwa dyski. Tak więc będzie można jednocześnie czytać i pisać. Przyjm ijm y przez chwilę, że dyski są w rzeczywistości bębnami, zawierającymi 4000 ścieżek po 5000 znaków każda. Co za tym idzie, czas prze szukiwania wynosi 0. Jaki algorytm sortowania powinniśmy zastosować w tym przypadku? W peł ni naturalnym wyborem jest scalanie. Inne m etody sortowania wewnętrznego nie n ad ają się tak dobrze do implementacji dyskowych. W yjątkiem są techniki pozycyjne z punktu 5.2.5. Z rozważań z punktu 5.4.7 wynika, że w ogólnych
5.4.9
DYSKI I BĘBNY
385
zastosowaniach sortowanie pozycyjne jest zazwyczaj gorsze od scalania, ponieważ twierdzenie o dualności stosuje się zarówno do taśm, jak i do dysków. Jednakże sortowanie pozycyjne ma w jednym punkcie silną przewagę. Jeśli rozkład kluczy jest jednostajny i istnieje możliwość równoległego wykorzystania wielu dysków, to po wstępnym rozrzuceniu rekordów względem najbardziej znaczących cyfr całe zadanie zostanie podzielone na niezależne podzadania, które nie wym agają już żadnej komunikacji. (Zobacz na przykład R. C. Agarwal, SIGM OD Record 25,2 (June 1996), 240-246). W dalszym ciągu skoncentrujemy się na sortowaniu przez scalanie. Sortowa nie możemy rozpocząć od wykorzystania wyboru z podm ianą, z dwoma buforami wejściowymi po 5000 znaków i z dwoma buforami wyjściowymi, też po 5000 zna ków. W rzeczywistości liczbę buforów można zredukować do trzech o pojemności 5000 znaków, jeśli rekordy z aktualnego bufora wejściowego będziemy zamieniali na rekordy usuwane z drzewa wyboru. W ten sposób na drzewo wyboru pozo staje 85 000 znaków (850 rekordów). Tak więc po jednym przebiegu przez nasze przykładowe dane zostanie utworzonych 60 początkowych sekwensów. (Zobacz 5.4.6-(3)). Ten przebieg zajmuje tylko około 50 sekund, jeśli przyjmiemy, że obliczenia w pamięci wewnętrznej nadążają za operacjami wejścia/wyjścia, gdy do bufora wyjściowego co 500 mikrosekund wędruje jeden rekord. Ten przebieg byłby wolniejszy, jeśli dane, zamiast na bębnie, znajdowałyby się na taśmie MIXT. Wówczas czas zależałby od szybkości taśmy. Nietrudno zauważyć, że w przypadku dwóch bębnów i przy odczytywa niu/zapisywaniu ścieżek w całości łączny czas transm isji w scalaniu P-wejściowym będzie najmniejszy, jeśli P będzie jak największe. Niestety nie możemy wykonać po prostu scalania P-wejściowego, ponieważ w pamięci nie mamy miej sca na 60 buforów. (Bufor o mniejszej pojemności niż 5000 znaków doprowadziłby do niechcianego czasu oczekiwania. Pam iętajmy, że przenieśliśmy się w lata siedemdziesiąte, kiedy to rozmiary pamięci wewnętrznych były znacząco ograni czone). Jeśli scalenia P-wejściowe wykonujemy, przemieszczając w całości dane między bębnami, wówczas odczyt i zapis mogą być wykonywane jednocześnie i liczba faz scalania wynosi [~logP 60~|. Tak więc, jeśli 8 < P < 59, to całe sortowanie wykonuje się w dwóch przebiegach. Najmniejsze takie P redukuje ilość obliczeń wewnętrznych, a zatem należy wziąć P = 8 . Dla 65 początko wych sekwensów wzięlibyśmy P = 9. Dla 82 lub większej liczby początkowych sekwensów moglibyśmy wziąć P = 10, ale ponieważ mamy miejsce tylko na 18 buforów wejściowych i 2 bufory wyjściowe, to nasze obliczenia (wewnętrzne) mogłyby zostać zawieszone (zobacz algorytm 5.4.6F). W takim przypadku lepiej być może wykonać dwa częściowe przebiegi na małej porcji danych, redukując liczbę początkowych sekwensów do 81 lub mniej. Przy naszych założeniach oba przebiegi scalania zajm ą około 50 sekund, a zatem sortowanie w tej idealnej sytuacji będzie trw ało tylko 2.5 minuty (plus kilka sekund na organizację obliczeń). To jest sześć razy szybciej od czasu działa nia najlepszego sortowania sześciotaśmowego z punktu 5.4.6. Powodem takiego przyśpieszenia są szybszy czas transm isji danych między pamięcią wewnętrzną a zewnętrzną (3.5-krotnie), wyższy stopień scalania (nie możemy wykonać scala
386
SORTOWANIE
5.4.9
nia 8-wejściowego, chyba że mamy dziewięć lub więcej taśm ) oraz fakt, że wynik pozostaje na dysku (żadne końcowe przewijania itd. nie są potrzebne). Jeśli chcielibyśmy, żeby początkowe dane i posortowany plik wynikowy znajdowały się na taśm ach MIXT, a bębny były używane tylko do scalania, to czas sortowania wynosiłby około 8.2 m inut. Jeśli zam iast dwóch bębnów mamy do dyspozycji tylko jeden bęben, czas poświęcany na operacje wejścia/wyjścia będzie dwukrotnie dłuższy, ponieważ odczyt i zapis muszą być wykonywane oddzielnie. (W rzeczywistości operacje wejścia/wyjścia zajęłyby trzykrotnie więcej czasu, ponieważ zapisywanie odby wałoby się w miejscu, w którym znajdują się dane wejściowe. W takim przy padku, żeby nie stracić bezpowrotnie danych, rozwaga nakazuje wykonywać po każdym zapisie operację „ponownego odczytu ze sprawdzaniem” . Czasami takie sprawdzanie zapisanej informacji jest wykonywane sprzętowo). Jednak trochę z takiego dodatkowego czasu można odzyskać, ponieważ możemy zastosować m etody częściowych przebiegów, w których pewne rekordy danych są przetwa rzane częściej od innych. W przypadku dwóch bębnów wszystkie dane muszą być przetwarzane parzystą lub nieparzystą liczbę razy. W przypadku jednego bębna możemy wykorzystać ogólniejsze schematy scalania. W punkcie 5.4.4 zauważyliśmy, że schematy scalania można reprezentować za pomocą drzew i że czas transm isji odpowiadający takiem u schematowi jest proporcjonalny do długości ścieżki zewnętrznej w drzewie tego schematu. Tylko niektóre drzewa (T-drzewa typu Ufo lub T-drzewa silnie typu fifo) m ają za stosowanie jako efektywne schematy scalania, ponieważ podczas scalania pewne sekwensy zostają „zagrzebane” w środku taśmy. Jednak w przypadku dysków lub bębnów, każde drzewo definiuje pewien schemat scalania, jeśli tylko stopnie węzłów wewnętrznych nie są zbyt duże dla dostępnej pamięci wewnętrznej. Dlatego możemy zminimalizować czas transmisji, wybierając drzewo z naj krótszą ścieżką zewnętrzną, jak na przykład zupełne drzewo stopnia P , gdzie P jest tak duże, jak tylko to jest możliwe. Z 5.4.4-(g) mamy, że długość ścieżki zewnętrznej w takim drzewie wynosi q S - L ( P « - S ) / ( P - 1 )J,
9 = [logp S~\ >
W
gdzie S jest liczbą węzłów zewnętrznych (liści). Zaprojektowanie algorytmu, który scala zgodnie ze schematem zadanym przez zupełne drzewo stopnia P , jest wyjątkowo łatwe. Spójrzmy dla przykładu na rysunek 91, który odpowiada przypadkowi P = 3, 5 = 6 . Najpierw, jeśli trzeba, dodajem y domyślne sekwensy tak, żeby 5 = 1 (modulo P — 1). Następnie łączymy sekwensy zgodnie z regułą „pierwszy na wejściu, pierwszy na wyjściu” , scalając na każdym etapie w jeden sekwens P najstarszych sekwensów z początku kolejki i umieszczając go na końcu kolejki. Drzewo zupełne stopnia P daje schemat optymalny, jeśli wszystkie początko we sekwensy są tej samej długości. Jeśli jednak pewne sekwensy są dłuższe, to czę sto możemy postąpić lepiej. Optym alny schemat w takiej ogólnej sytuacji można otrzym ać bez trudności za pomocą m etody Huffmana (ćwiczenie 2.3.4.5-10), któ rą w języku odnoszącym się do scalania można wyrazić jak następuje: „Najpierw
5.4.9
DYSKI I BĘBNY
387
R y s . ¿9 1. D r z e w o z u p e łn e s t o p n ia 3 z s z e ś c io m a liś ć m i i o d p o w i a d a j ą c y m u s c h e m a t s c a la n ia .
dodaj (1 —5) mod (P — 1) domyślnych sekwensów o długości 0. Następnie łącz razem po P najkrótszych z istniejących sekwensów, aż pozostanie tylko jeden sekwens” . Jeśli wszystkie początkowe sekwensy m ają taką sam ą długość, to ta m etoda redukuje się do algorytmu opisanego wcześniej. W przypadku naszego przykładu ze 100000 rekordami, możemy wykonać scalanie dziewięciowejściowe, ponieważ w pamięci mieści się maksymalnie 18 bu forów wejściowych i dwa bufory wyjściowe, a algorytm 5.4.6F umożliwia peł ne nakładanie się na siebie wykonywanych operacji. Drzewo zupełne stopnia 9 o 60 liściach odpowiada schematowi scalania z l | | przebiegami, jeśli wszystkie początkowe sekwensy są tej samej długości. Łączny czas sortowania na jednym bębnie, z ponownym odczytem ze sprawdzeniem po każdym zapisie, dochodzi w tym przypadku do około 7.4 minut. Użycie większych wartości P może nieco ten czas zmniejszyć. Jednak sytuacja komplikuje się, ponieważ mogą pojawić się przestoje, gdy bufory zapełniają się lub opróżniają. W p ły w c z a su p rz e sz u k iw a n ia . Z naszych rozważań wynika, że jest stosunko wo łatwo skonstruować schematy scalania dla bębnów, ponieważ czasy przeszu kiwania i oczekiwania są w zasadzie zerowe. Jednak w przypadku dysków używa nych razem z małymi buforami często więcej czasu spędzamy na poszukiwaniu informacji, niż na jej odczytaniu. W takim przypadku czas przeszukiwania m a znaczący wpływ na wybór strategii sortowania. Zmniejszenie stopnia scalania, P , umożliwia zastosowanie większych buforów, przez co zmniejsza się liczba przeszukiwań. To często rekompensuje dodatkowy czas na transm isję danych, wymagany przy mniejszych wartościach P . Czas przeszukiwania zależy od odległości, którą pokonuje ramię z głowica mi, i można tak planować obliczenia, żeby taką odległość minimalizować. Dla przykładu, może być zasadnym posortować najpierw rekordy wewnątrz cylin drów. Jednakże scalanie w dużej skali wymaga radzenia sobie z przeskakiwaniem między cylindrami (zobacz ćwiczenie 2). Ponadto wieloprogramowanie we współ czesnych systemach operacyjnych oznacza, że użytkownik zazwyczaj nie jest w stanie kontrolować położenia ram ienia z głowicami. Dlatego usprawiedliwione jest założenie, że każdy rozkaz dyskowy wymaga „losowego” przeszukiwania. Naszym celem jest znalezienie takiego schem atu scalania, który najlepiej równoważy czas przeszukiwania i czas transmisji. Dlatego potrzebujem y pewnego sposobu oceny jakości dowolnego drzewa scalania pod kątem zadanej konfiguracji
388
SORTOWANIE
5.4.9
R y s . 9 2 . D r z e w o , d la k t ó r e g o d łu g o ś ć ś c ie ż k i z e w n ę tr z n e j w y n o s i 1 6 , a d łu g o ś ć ś c ie ż k i s t o p n io w e j 52.
sprzętowej. Rozważmy dla przykładu drzewo z rysunku 92. Chcemy ocenić, ile czasu zajmie odpowiadające mu scalanie tak, żeby można było porównać to drzewo z innymi drzewami. Żeby zilustrować pewne ogólne idee, w poniższych rozważaniach przyjmu jem y proste założenia dotyczące scalania dyskowego. Zakładamy, że (i) czas odczytu lub zapisu n znaków wynosi 72.5 + 0.005n milisekund; (ii) robocza pamięć wewnętrzna m a pojemność 100000 znaków; (iii) średni czas obliczeń wymagany do transm isji każdego znaku z wejścia na wyjście wynosi 0.004 mili sekund; (iv) czytanie, zapisywanie i obliczenia nie są wykonywane jednocześnie; (v) rozmiar bufora wyjściowego nie musi być taki sam jak rozmiar bufora wejścio wego w następnym przebiegu. Analiza sortowania przy tych prostych założeniach pozwoli lepiej zrozumieć rozważane później sytuacje trudniejsze. Jeśli wykonujemy scalanie P-wejściowe, możemy podzielić wewnętrzną pa mięć roboczą n a P + 1 buforów - P buforów wejściowych i jeden bufor wyjściowy. Każdy taki bufor m a pojemność B = 100000/( P + 1) znaków. Załóżmy, że scalane pliki zawierają łącznie L znaków. W takim przypadku wykonamy w przybliżeniu L / B operacji wyjściowych i około tyle samo operacji wejściowych. Tak więc całkowity czas scalania będzie wynosił w przybliżeniu 2 ( 7 2 .5 ^ + 0 .0 0 5 l) + 0.004L = (0.00145P + 0.01545)L
(2 )
milisekund. Innymi słowy, scalanie P-wejściowe L znaków zabiera około (a P + fi)L jednostek czasu dla pewnych stałych a i /?, zależnych od czasu przeszukiwania, czasu oczekiwania, czasu obliczeń i rozm iaru pamięci. Ten wzór prowadzi do pewnego, interesującego sposobu konstrukcji dobrych schematów scalania dla dysków. Rozważmy dla przykładu rysunek 92 i załóżmy, że wszystkie początko we sekwensy (reprezentowane przez kwadratowe węzły-liście) m ają długość L q. Wówczas każde scalenie w węzłach 9 i 10 zabiera (2a + /?)(2Lq) jednostek czasu, scalenie w węźle 11 zabiera czas (3a + /?)(4Lo)j a końcowe scalenie w węźle 12 zabiera czas (4a + /3)(8Lo)- Całkowity czas scalania wynosi zatem ( 5 2 a + 16/?)L 0
5.4.9
DYSKI I BĘBNY
389
jednostek. W spółczynnik „16” tu ta j jest dobrze nam znamy. To jest po prostu długość ścieżki zewnętrznej w tym drzewie. W spółczynnik „52” przy a m a jed nakże nowe znaczenie. Jest to suma stopni wszystkich węzłów wewnętrznych po wszystkich ścieżkach prowadzących od korzenia do liści. Będziemy ją nazywali długością ścieżki stopniowej drzewa. Dla przykładu, długość ścieżki stopniowej na rysunku 92 wynosi (2 + 4) + (2 + 4) + (3 + 4) + (2 + 3 + 4) + (2 + 3 + 4) + (3 + 4) + (4) + (4) = 52. Dla dowolnego drzewa T niech D ( T ) i E ( T ) oznaczają odpowiednio długość ścieżki stopniowej i długość ścieżki zewnętrznej. Naszą analizę można podsum o wać w następujący sposób: T w ie rd z e n ie H . Jeśli czas potrzebny do wykonania scalania P-wejściowego dla L znaków ma postać (a P + (3)L i jeśli scalanych jest S sekwensów o takiej samej długości, to najlepszy schem at scalania odpowiada drzewu T , dla którego a D ( T ) + (3E{T) jest najmniejsze wśród wszystkich drzew o S liściach. | (To twierdzenie w sposób niejawny pojawiło się w pracy George’a U. H ubbarda przedstawionej na konferencji „The ACM National Conference” w 1963 roku). Niech a i (3 będą stałym i. Powiemy, że drzewo jest optymalne, jeśli od powiadająca mu wartość a D ( T ) + f3E(T) jest najm niejsza wśród wszystkich drzew T o takiej samej liczbie liści. N ietrudno zauważyć, że w szystkie poddrzewa drzewa optymalnego są optym alne i dlatego optymalne drzewo o n liściach można uzyskać, łącząc ze sobą optymalne drzewa o mniej niż n liściach. T w ie rd z e n ie K . Niech A m (n) będzie ciągiem zdeńniowanym dla 1 < rri < n ja k następuje:
Ai(l) = 0; A m (n) = A \(n ) =
min (Ai(k) + Am_ i ( n —k)) liC/c
(3) dla 2 < m < n; dla n > 2 .
(4 ) (5)
Wówczas Ai ( n) jest najmniejsze wśród wartości a D ( T ) 4- ¡3E { T ) dla wszystkich drzew T o n liściach. Dowód. Równanie (4 ) implikuje, że Am(n) jest najmniejsze spośród wartości A \{ n \) + • • • + A i ( n m) wziętych po wszystkich dodatnich liczbach całkowitych n i , . . . j n m takich, że n \ + **• + n m = n. Tezę twierdzenia otrzymujemy teraz przez indukcję względem n. | Zależności rekurencyjne (3 ), (4 ), ( 5 ) można również wykorzystać do budowych samych drzew: Niech km (ń) będzie wartością, dla której dostajem y mini mum w definicji A m (n). Wówczas optymalne drzewo o n liściach można otrzy mać, łącząc w korzeniu m = ki(n) poddrzew. Te poddrzewa są optymalnymi drzewami z odpowiednio fem(n), &m- i ( n —km (n)), &m_ 2 (n —km (n) — km^ i ( n — fcm(n))), .. . liśćmi.
390
SORTOWANIE
5.4.9
Tabela 1 CHARAKTERYSTYKI DRZEW OPTYMALNYCH Am (n), km (n) DLA a = ¡3 = 1
m n
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
1 0.0 6.2 12.3 20.4 30.5 42.2 52.3 62.3 72.3 84.3 96.3 108.3 121.4 134.4 147.4 160.4 175.4 190.4 205.4 220.4 236.5 252.3 266.3 282.3 296.3
2
3
"4
5
6
7
8
9
10
11
12
Drzewo
n
1 1:1 2 1:1:1 3 4 1:1:1:1 1:1:1:1:1 5 3:3 6 7 1:3:3 2:3:3 8 3:3:3 9 3:3:4 10 11 3:4:4 12 4:4:4 0.1 3:3:3:4 6.1 13 12,1 3:3:4:4 14 18.1 3:4:4:4 15 24.1 4:4:4:4 16 30.1 4:4:4:5 17 36.1 4:4:5:5 18 42.1 4:5:5:5 19 48.1 5:5:5:5 20 54.1 4:4:4:4:5 21 22 60.1 4:9:9 66.1 5:9:9 23 72.1 5:9:10 24 78.1 7:9:9 25 —
0.1 6.1 12.1 18.2 24.3 32.3 40.4 50.4 60.5 72.4 82.4 92.4 102.5 114.5 124.7 134.8 144.9 156.9 168.9 180.9 192.10 204.11 216.12 229.12
0.1 6.1 12.1 18,1 24.1 30.2 36.3 44.3 52.3 60.4 70.4 80.4 90.4 102.4 112.4 122.4 132.5 144.4 154.4 164.4 174.5 186.5 196.7
0.1 6.1 12.1 18.1 24.1 30.1 36.1 42.2 48.3 56.3 64.3 72.3 80.4 90.4 100.4 110.4 120.5 132.4 142.4 152.4 162.5 174.4
0.1 6.1 12.1 18.1 24.1 30.1 36.1 42.1 48.1 54.2 60.3 68.3 76.3 84.3 92.3 100.4 110.4 120.4 130.4 140.4 150.5
0.1 0.1 6.1 12.1 0.1 6.1 18.1 12.1 6.1 24.1 18.1 12.1 30.1 24.1 18.1 36.1 30.1 24.1 42.1 36.1 30.1 48.1 42.1 36.1 54.1 48.1 42.1 60.1 54.1 48.1 66.2 60.1 54.1 72.3 66.1 60.1 80.3 72.1 66.1 88.3 78.2 72.1 96.3 84.3 78.1 104.3 92.3 84.1 112.3 100.3 90.2 120.4 108.3 96.3 130.4 116.3 104.3
0.1 6.1 12.1 18.1 24.1 30.1 36.1 42.1 48.1 54.1 60.1 66.1 72.1 78.1 84.1 90.1 96.1
0.1 6.1 12.1 18.1 24.1 30.1 36.1 42.1 48.1 54.1 60.1 66.1 72.1 78.1 84.1 90.1
0.1 6.1 12.1 18.1 24.1 30.1 36.1 42.1 48.1 54.1 60.1 66.1 72.1 78.1 84.1
Dla przykładu, w tabeli 1 przedstawiono powyższą konstrukcję, gdy a = (3 = 1. Po prawej stronie mamy podaną zwięzłą specyfikację odpowiednich drzew optymalnych. Dla przykładu, zapis „4:9:9” z n = 22 oznacza, że drzewo optymalne T22 o 22 liściach można otrzym ać, łącząc drzewa 7^, Tg i Tg (zobacz rysunek 93). Drzewa optymalne nie są jednoznaczne. Drzewo 5:8:9 jest tak samo dobre jak drzewo 4:9:9.
R y s . 9 3 . O p t y m a l n y s p o s ó b s c a l a n i a 22 p o c z ą t k o w y c h s e k w e n s ó w o r ó w n y c h d łu g o ś c ia c h , g d y w t w ie r d z e n iu H
a — f3.
T e n s c h e m a t m in im a liz u je c z a s p r z e s z u k iw a n ia
p r z y z a ło ż e n i a c h p r o w a d z ą c y c h d o r ó w n o ś c i ( 2 ).
DYSKI I BĘBNY
5.4.9
391
Ze sposobu, w jaki dostaliśmy (2 ), wynika, że zależność a < ¡3 będzie zachodzić, jeśli tylko P + 1 równa się liczbie używanych buforów. Przypadek graniczny a = /?, zilustrowany w tabeli 1 i na rysunku 93, występuje, gdy chcemy minimalizować czas przeszukiwania, bez względu na czas transm isji. Wróćmy do naszego pierwotnego zastosowania. Jak dotąd nie rozważaliśmy jeszcze sposobu formowania początkowych sekwensów i wstępnego ich rozmiesz czenia. Bez możliwości jednoczesnego czytania, zapisywania i obliczania wybór z podm ianą dużo traci na wartości. Być może powinniśmy zapełniać całkowicie pamięć wewnętrzną, sortować ją i zapisywać wyniki. Związane z tym operacje wejścia/wyjścia można wykonać za pomocą jednego przeszukania. Być może jednak lepiej zrezygnować, powiedzmy, z 20 procent pamięci, przeznaczyć ją na łączony bufor wejścia/wyjścia i wykonać wybór z podm ianą. W tym przypadku liczba przeszukiwań rośnie pięciokrotnie (dodatkowe około 60 sekund!), ale liczba początkowych sekwensów zmaleje ze 100 do 64. Dostaniemy jeszcze lepszy wynik, gdy plik wejściowy będzie już w dużym stopniu uporządkowany. Jeśli nie zdecydujemy się na zastosowanie wyboru z podm ianą, drzewo opty malne dla S = 100, a = 0.00145, (3 = 0.01545 [zobacz ( 2)] jest raczej prozaiczne: to jest po prostu scalanie 10-wejściowe, wykonywane w dwóch przebiegach przez dane. Jeśli założymy, że czas sortowania wewnętrznego wynosi 20 sekund (po wiedzmy 100 razy szybkie sortowanie), wówczas przebieg wstępnego rozrzucania zabiera około 2.5 minuty, a każdy z przebiegów scalania zabiera prawie 5 m inut, co daje łącznie 12.4 minuty. Jeśli zdecydujemy się na wybór z podm ianą, to optymalne drzewo dla S = 64 okazuje się równie mało ciekawe (dwa przebiegi scalania 8-wejściowego). W stępne rozrzucanie zajmuje około 3.5 minuty, nato miast każdy przebieg scalania jest wykonywany w ciągu 4.5 minuty, a całkowity czas sortowania dochodzi do 12.6 minuty. Pam iętajmy, że w obu tych m etodach zrezygnowaliśmy z jednoczesnego odczytu, zapisu i obliczania, żeby mieć większe bufory w celu zmniejszenia czasu przeszukiwania. Do żadnego z podanych czasów nie wliczyliśmy czasu na, być może konieczne, operacje ponownego odczytu ze sprawdzeniem. W praktyce ostatni przebieg scalania jest zazwyczaj zupełnie odmienny od innych przebiegów. Dla przykładu, plik wyjściowy jest często rozszerzany i/lu b zapisywany na taśmie. W takich przypadkach drzewo specyfikujące schemat scalania należy wybrać, stosując w korzeniu inne kryterium optymalności. * B liższe sp o jrzen ie na d rzew a o p ty m a ln e. Jest interesującym sprawdzenie granicznego przypadku, gdy w twierdzeniach H i K ¡3 = 0, nawet jeśli w praktyce param etry spełniają nierówności 0 < a < /?. Dla jakiego drzewa z n liśćmi długość ścieżki stopniowej jest najm niejsza? Osobliwie okazuje się, że najlepsze jest scalanie trzywejściowe. T w ierd zen ie L. Długość ścieżki stopniowej w drzewie z n liśćmi nigdy nie jest mniejsza niż jr/ \
f 3
jeśli 2 • 3q 1 < n < 39; jeśli 3q < n < 2 ■3*.
(6)
392
SORTOWANIE
5.4.9
Drzewa Tn o stopniu 3, deńniowane ja k następuje Ti = ' □ ,
T2 =
O
,
Tn
(7)
T n+l . 3_ L 3
T 71+2
T n
J
. 3 .
m ają najmniejszą długość ścieżki stopniowej. Dowód. Ważne jest, żeby zauważyć, że f ( ń ) jest funkcją wypukłą, to znaczy / ( n + 1 ) —/ ( n ) > f ( ń ) — f ( n — 1 )
dla wszystkich n > 2.
(8)
Związek tej własności z naszym twierdzeniem wynika z następującego lematu, który jest dualny do wyniku z ćwiczenia 2.3.4.5-17. L e m a t C. Funkcja g(n), zdefiniowana dla dodatnich liczb całkowitych, spełnia następującą zależność m in ( g ( k ) + g ( n - k ) ) = g ( [ n / 2 \ ) + g ( \ n / 2 \),
l^k< n
n >
2
,
(9 )
w tedy i tylko wtedy, gdy jest wypukła. Dowód. Jeśli g(n + l) —g(n) < g{n) —g ( n — 1), dla pewnego n > 2, to g(n + 1) + g ( n —1) < g(n)+g(n), co przeczy (9 ). Na odwrót, jeśli g spełnia (8) i jeśli 1 < k < n — k , wówczas z wypukłości mamy g(k + 1 ) + g(n — k — 1 ) < g(k) +g{ n — k). | Drugą część dowodu lem atu C można rozszerzyć na dowolne m > 2 i poka zać, że min nH
(fl(ni)H
b g(nm))
\-nrn= n
1 , . . . j TL m ^
1
= 9 ( [ n / m \ ) + g ( [ ( n + l ) / m \ ) + ----- \-g([(n + m - l ) / m j )
(10)
jeśli tylko g jest wypukła. Niech f m ( n ) = f ( [ n / m \ ) + f ( [ ( n + l ) / m \ ) + ■■■+ f ( [ { n + m -
l)/mj);
(11)
Do zakończenia dowodu twierdzenia L wystarczy pokazać, że /a(n ) + 3n = f ( n ) oraz / m (n) + m n > / ( n ) dla m > 2. (Zobacz ćwiczenie 11). | Byłoby bardzo miło, gdyby drzewa optymalne można zawsze scharakteryzo wać tak ładnie jak w twierdzeniu L. Jednak z wyników przedstawionych w tabeli 1 dla a — ¡3 wynika, że funkcja A \{n ) nie zawsze jest wypukła. W rzeczywistości tabela 1 mówi, że jeszcze prostsze hipotezy dotyczące drzew optymalnych są nieprawdziwe! Jednakże część twierdzenia L daje się uratować w ogólnym przy padku. M. Schlumberger i J. Vuillemin pokazali, że można zawsze uniknąć scaleń o dużych stopniach. T w ie rd z e n ie M . Dla danych a i (3 takich ja k w twierdzeniu H, istnieje drzewo optymalne, w którym stopień każdego węzła wynosi co najwyżej
d(oi,¡3)
mm k> 1
k+
(12)
5.4.9
DYSKI I BĘBNY
393
Dowód. Niech n i , . . . , n m będą dodatnim i liczbami całkowitymi takim i, że n i + • • • + n m — n, i4(ni) + • ■■+ A( nm) = A m (n) i ni < • • • < n m. Załóżmy, że m > d(a,j3) + 1. Niech k będzie wartością minimalizującą ( 12 ). Pokażemy, że a n ( m —k) + (3n + Am_*;(n) < a n m + f3n + Am(n).
( 13 )
Stąd mamy, że minimalna wartość w (4 ) jest zawsze osiągana dla pewnego m < d(a,f3). Z definicji, ponieważ m > k + 2, musimy mieć A
m
- &
( n
)
^
A
i (
n
i
+
* * * +
n
&
+
i )
+
A
i
( n f c + 2 )
+
* ■' +
ć
l i ( n
m
)
< a ( n i + - ■*+ nfc_|_i)(fe + l)H-^(ni + **•+ Wfc+i) + A i( n i) + *■*+ A i ( n m) — ( a ( A :H - l) + / 3 ) ( n i + * • * + n f c + i ) + A m ( n )
< (a(A: + l) + /3)(A: + l ) n / m + i4m(n), a stąd już łatwo wynika ( 13 ). (Uważne prześledzenie tego dowodu pozwala stwier dzić, że ( 12 ) jest możliwie najlepsze, w takim znaczeniu, że pewne drzewa opty malne muszą zawierać węzły o stopniach d(a,/3); zobacz ćwiczenie 13). | Konstrukcja z twierdzenia K wymaga 0 ( N 2) komórek pamięci i 0 ( N 2 log N ) kroków do policzenia ^4m(n) dla 1 < m < n < N. Twierdzenie M pokazuje, że potrzeba tylko O( N) komórek i 0 ( N 2) kroków. Schlumberger i Vuillemin odkryli jeszcze kilka bardzo interesujących własności drzew optymalnych [Acta Informatica 3 (1973), 25-36]. Asym ptotyczną wartość Ai ( n) można poza tym uzyskać w sposób pokazany w ćwiczeniu 9. * In n y sp o só b alo k a cji b u fo ró w . David E. Ferguson [CACM 14 (1971), 4 7 6 -478] zauważył, że czas przeszukiwania można zmniejszyć, jeśli bufory będą różnych rozmiarów. Na ten sam pomysł wpadło w tym samym czasie jeszcze kilka innych osób [S. J. W aters, Comp. J. 14 (1971), 109-112; Ewing S. Walker, Software Age 4 (August - September, 1970), 16-17]. Przypuśćmy, że wykonujemy scalanie czterowejściowe na sekwensach o tej samej długości równej L 0 i w pamięci o pojemności M znaków. Jeśli podzie limy pamięć na takie same bufory o rozmiarach B = M /5 , to będziemy po trzebowali około L q / B przeszukiwań na każdym pliku wejściowym, natom iast wypisanie danych wyjściowych będzie wymagało 4L q / B przeszukiwań, co daje razem S L q / B = A0Lq/M przeszukiwań. Jeśli jednak użyjemy czterech buforów wejściowych o rozmiarach M /6 i jednego bufora wyjściowego o rozmiarze M / 3 , będziemy potrzebowali tylko około 4 x (6L 0/M ) + 4 x (3L q / M ) = 3 6L o /M przeszukiwań! Czas transm isji jest w obu przypadkach taki sam, tak więc na takiej zmianie nic nie tracimy. Uogólniając załóżmy, że chcemy scalić posortowane pliki o długościach L i, ..., L p w jeden posortowany plik o długości
Tp+i = L i + •*•+ Lp i że dla fc-tego pliku używamy bufora o rozmiarze Bk* Zatem B1
+ ***+ B p + B p p 1 = M,
394
SORTOWANIE
5.4.9
gdzie M jest rozmiarem dostępnej pamięci wewnętrznej. Liczba przeszukiwań będzie wynosiła w przybliżeniu L i
L p
~D p>i I
L p + i
l~ RUp _ + rip+ R l‘
(15^
Spróbujmy tę wielkość zminimalizować przy założeniu, że jest spełniony warunek ( 14 ) i że (dla wygody) wartości B &nie muszą być całkowite. Jeśli zwiększymy B j o S i zmniejszymy B % o taką sam ą wartość, wówczas liczba przeszukiwań zmieni się o B j
Bj + 6
L j
L k
L k
B j + Bk - 6
Bk
_
/
L
Lfc
\ B k( Bk - 5)
Bj ( Bj + S ) ) 5,
tak więc alokację buforów można poprawić, jeśli L j / B j ^ L kj B \ . Dlatego najm niejsza liczba przeszukiwań będzie m iała miejsce tylko wtedy, kiedy L \
L p
B2
n p
B2
D \
L p + i
( 16)
B2
n p + 1
Ponieważ minimum istnieje, występuje ono tylko wtedy, kiedy B k = ^ r k M / ( ^ r 1 + --- + y/ L p + i),
l < f e < P + l.
( 17 )
To są jedyne wartości £?i,. . . , P p + i, które spełniają zarówno ( 14), jak i ( 16). Podstaw iając ( 17 ) do ( 15 ), otrzymujemy całkiem prosty wzór na całkowitą liczbę przeszukiwań, +
h a / Lp+i Y / m
,
( 18)
którą możemy porównać z liczbą przeszukiwań ( P + l )(Li H h L p + i ) / M dla przypadku, gdy wszystkie bufory m ają taką sam ą długość. Z ćwiczenia 1.2.3-31 otrzymujemy, że poprawa wynosi £ (sfLj-yfLkf/M . K j < ^ P +1 Niestety ze wzoru ( 18) nie wynika łatw y sposób wyznaczania optymalnych sche m atów scalania, tak jak to było w twierdzeniu K (zobacz ćwiczenie 14). Ł ą c z e n ie w ła ń c u c h y . M. A. Goetz [ C A C M 6 (1963), 245-248] zaproponował interesujący sposób unikania czasu przeszukiwania podczas zapisywania. Polega on na powiązaniu ze sobą pojedynczych ścieżek. Pomysł ten wymaga zestawu dużej liczby różnorodnych procedur zarządzania pamięcią dyskową, ale znajduje zastosowanie w rozwiązaniu wielu innych problemów, a nie tylko sortowania, i dlatego jest w art większej uwagi jako przykład pewnej ogólnej techniki. Idea jest bardzo prosta. Zamiast alokować ścieżki wewnątrz cylindrów se kwencyjnie, wiążemy je ze sobą i trzym am y listy dostępnej przestrzeni dyskowej, jedną listę dla każdego cylindra. Gdy chcemy zapisać ścieżkę informacji, zapisu jem y ją w bieżącym cylindrze (tam gdzie znajduje się ramię z głowicami), chyba że cylinder jest pełny. W ten sposób czas przeszukiwania praktycznie znika.
5.4.9
DYSKI I BĘBNY
395
Trudność polega jednak na tym, że nie można pam iętać dowiązania do następnej ścieżki na ścieżce ją poprzedzającej, ponieważ odpowiednia informacja nie jest z góry dostępna. (Moglibyśmy, jeśli to byłoby zadowalające, pam iętać dowiązanie do poprzedniej ścieżki i w następnym przebiegu odczytywać plik wstecz). Dla każdego pliku można utrzymywać tablicę dowiązań (adresów) do ścieżek, ponieważ wymaga to stosunkowo niewielkiej pamięci. Listy dostępnej pamięci można reprezentować zwięźle za pom ocą tablic bitowych zawierających 1000 bitów służących do zaznaczania, czy dana ścieżka z 1000 ścieżek jest osią galna lub nie. P rz e w id y w a n ie ra z je sz c z e . W algorytmie 5.4.6F pokazujemy, że możemy przewidzieć, który bufor wejściowy w scalaniu P -wejściowym zostanie opróżniony jako pierwszy. W tym celu wystarczy porównać ostatnie klucze w buforach. Przewidywanie umożliwia czytanie i jednoczesne wykonywanie obliczeń. W al gorytmie wykorzystuje się ruchome bufory wejściowe, które nie są przypisane z góry do poszczególnych plików. Powoduje to, że wszystkie bufory muszą mieć taki sam rozmiar, a co za tym idzie, technika alokacji buforów opisana powyżej nie ma zastosowania. Ograniczenie na jednolitość buforów nie jest wielką stratą, ponieważ współczesne kom putery m ają dużo większą pamięć wewnętrzną niż to bywało poprzednio. Obecnie narzuca się stosowanie buforów o rozmiarach równych pojemności pełnej ścieżki dyskowej. Dlatego wyobraźmy sobie, że mamy scalić P sekwensów, z których każdy składa się z ciągu bloków danych, a każdy blok (z wyjątkiem być może ostat niego) zawiera dokładnie B rekordów. D. L. W hitlow i A. Sasson zaproponowali interesujący algorytm, nazywany SyncSort [U.S. Patent 4210961 (1980)], który przewyższa algorytm 5.4.6F w tym, że potrzebuje tylko trzech buforów o roz miarze B oraz puli pamięci na przechowanie P B rekordów i P B wskaźników. Dla kontrastu algorytm 5.4.6F wymaga 2P buforów wejściowych i 2 buforów wyjściowych, ale za to nie używa wskaźników. Trzy bufory z algorytmu SyncSort są rozmieszczone na okręgu. Podczas scalania są przetwarzane dane z bieżącego bufora, natom iast kolejne dane wejś ciowe są wczytywane do następnego bufora, a wyniki są zapisywane do trzeciego. Wiele urządzeń dyskowych umożliwia jednoczesny odczyt i zapis na tym samym cylindrze - w istocie scalanie na dysku umożliwia nam zapisywanie nowych sekwensów w miejsce sekwensów aktualnie wczytywanych. W przeciwnym razie moglibyśmy użyć dwóch dysków, jednego do czytania i jednego do pisania. Jeśli pełna synchronizacja odczytu i zapisu nie jest możliwa (powodem może być na przykład czas przeszukiwania), moglibyśmy także zwiększyć liczbę buforów na okręgu jak na rysunku 26 z punktu 1.4.4. SyncSort rozpoczyna się od wczytania z każdego sekwensu pierwszego bloku i umieszczeniu P B rekordów z tych bloków we wspólnym obszarze pamięci. Każdy rekord z tego obszaru dowiązujemy do następnika z sekwensu, do którego sam należy. W yjątek stanowią ostatnie rekordy w blokach, które nie m ają we wspólnym obszarze swoich następników. Najmniejszy z kluczy z takich ostatnich rekordów wyznacza sekwens, który trzeba będzie uzupełnić jako pierwszy, a więc rozpoczynamy wczytywanie drugiego bloku z tego sekwensu. Scalanie rozpoczy
396
5.4.9
SORTOWANIE
namy natychm iast po wczytaniu drugiego bloku. Patrząc na ostatni klucz w tym bloku, możemy dokładnie przewidzieć następny potrzebny blok. Postępujemy dalej tak samo, pobierając zawczasu właściwe bloki tuż przed tym, jak są one potrzebne. W algorytmie scalania SyncSort każdy rekord w bieżącym buforze jest zamie niany z następnym rekordem do wypisania, czyli rekordem we wspólnym obsza rze, który m a najm niejszy klucz. W ykonując zamianę, dokonujemy odpowiednich aktualizacji w drzewie wyboru oraz dowiązań do następników. Po osiągnięciu końca bieżącego bufora jesteśm y gotowi do obrotu okręgu z buforami: bufor, do którego wczytywaliśmy, staje się bieżącym, bufor, do którego zapisywaliśmy, staje się buforem do czytania, a pisanie odbywać się będzie do poprzedniego bieżącego bufora. W y k o rz y s ta n ie w ie lu d y sk ó w . Urządzenia dyskowe, które początkowo by ły dużych rozmiarów i sporo ważyły, w późnych latach osiemdziesiątych stały się znacznie mniejsze, lżejsze i tańsze, a przy tym znacznie pojemniejsze niż kiedykolwiek wcześniej. Dlatego rozpoczęto poszukiwanie algorytmów dla nie wyobrażalnych wcześniej klastrów 5, 10, 50 lub nawet większej liczby urządzeń dyskowych. Jednym z prostszych sposobów wykorzystania dodatkowych dysków do przy śpieszenia obliczeń jest zastosowanie do dużych plików techniki podziału danych na pasma. Załóżmy, że dysponujemy D jednostkami dyskowymi ponumerowany mi 0, 1, . . . , D — 1 i rozważmy plik, który składa się z L bloków a o a i . . . a i - \ . Podział takiego pliku na D-dyskowe pasm a oznacza umieszczenie bloku aj na dysku o numerze j mod D. Tak więc dysk 0 zawiera bloki a oa o a 2D ■• • ? dysk 1 bloki ai a Dpi a 2Dpi **- itd. Wówczas można jednocześnie wykonać D odczytów i zapisów na grupach złożonych z D bloków a g a i ... a o ~ i, a o a o p i ■■*&2D-:b • ■•, które nazywamy superblokami Pojedyncze bloki w każdym superbloku powinny znajdować się na różnych dyskach na odpowiadających sobie cylindrach, tak żeby czas przeszukiwania był taki sam na każdej jednostce dyskowej. W istocie postępujem y tak, jak byśmy działali na pojedynczej jednostce dyskowej z blokami i buforami o rozm iarach D B : ale wykonując operacje wejścia/wyjścia D razy szybciej. Podział superbloków na pasm a znajduje ładne zastosowanie w scalaniu dwuwejściowym lub ogólnie w znajdowaniu rekordów o takich samych kluczach w dwóch plikach uporządkowanych względem kluczy. Załóżmy, że bloki aoai a 2 ... z pierwszego pliku zostały rozdzielone na D dysków w sposób opisany powyżej, natom iast bloki ■&0&1&2 •• • z drugiego pliku zostały rozdzielone w przeciwnym kierunku, z blokiem bj na dysku ( D —l —j ) mod D. Na przykład dla D = 5 bloki aj w ystępują odpowiednio na dyskach 0, 1, 2, 3, 4, 0, 1, . . . , podczas gdy bloki bj, dla j > 0, w ystępują na dyskach 4, 3, 2, 1, 0, 4, 3, . . . Niech aj będzie ostatnim kluczem w bloku aj i niech f3j będzie ostatnim kluczem w bloku bj. Porównując klucze a i /?, możemy przewidzieć kolejność, w której będziemy wczytywali bloki danych. Taką kolejnością może być na przykład a o b o a ia 2bi
a 3 a 4 &2 a 5a 6 <27^8^3&4 ¿>5 ^6 ^7&8 ^9^10
5.4.9
DYSKI I BĘBNY
397
Te bloki występują odpowiednio na dyskach 0 4 1 2 3
3 4 2 0 1
2 3 1 0 4
3 2 1 0 4
...
gdy D — 5. Jeśli jednocześnie czytam y pięć bloków, dane wprowadzane są z dysków {0,4 ,1 ,2 ,3 }, {3 ,4 ,2 ,0 ,1 } , { 2 ,3 ,1 ,0 ,4 } , { 3 , 2, 1 , 0, 4} , . . . . Nigdy nie zdarzy się, że będziemy musieli wczytywać dwa bloki z tego samego dysku w tym samym czasie! W ogólności, m ając do dyspozycji D dysków, możemy czytać D bloków jednocześnie i bez konfliktów, ponieważ w pierwszej grupie mamy k bloków ao . ■• dk - i na dyskach o d O d o A ; — l i D — fc bloków . . . b o - k - i na dyskach od D — 1 do A;, dla pewnego k. Następnie postępujem y tak samo, ale z numerami dysków przesuniętymi cyklicznie o k. Ta sztuczka jest dobrze znana prestidigitatorom , którzy nazywają ją zasadą Gilbreatha. Została odkryta w latach sześćdziesiątych przez N orm ana G ilbreatha [zobacz M artin Gardner, M athem atical Magie Show (New York: Knopf, 1977), Chapter 7; N. Gilbreath, Genii 52 (1989), 743-744]. Żeby zdecydować, które bloki powinny być wczytywane jako następne, musimy znać klucze a i /3, ale taka informacja zajmuje tylko niewielki ułam ek pamięci zajętej przez bloki a i 6, i może być pam iętana w oddzielnych plikach. Dzięki tem u potrzebujem y mniejszej liczby buforów i możemy wczytywać dane na pełnej szybkości (zobacz ćwiczenie 23). L osow y p o d z ia ł d a n y c h n a p a s m a . Jeśli chcemy wykonywać scalanie P-wejściowe na D dyskach, gdy P i D są duże, nie jesteśmy w stanie bezkonfliktowo czytać z D dysków, jeśli nie mamy dużej liczby buforów. Jest tak, ponieważ nie istnieje analog zasady G ilbreatha dla P > 2. Niezależnie od sposobu rozmieszcze nia bloków z danego pliku na dyskach, może zdarzyć się, że będziemy zmuszeni do wczytania do pamięci wielu bloków na długo przed ich użyciem, ponieważ bloki, których rzeczywiście potrzebujemy, mogą znajdować się na tym samym dysku. Załóżmy dla przykładu, że chcemy wykonać scalanie 8-wejściowe na 5 dys kach i że bloki a o a ia 2 . . . , b o b ^ . . . , . . . , • • • należące do 8 sekwensów zostały podzielone na pasm a z aj na dysku j mod D, bj na dysku (j + 1) mod D, . . . , hj na dysku (j + 7) mod D. Może się zdarzyć, że bloki muszą być dostępne w kolejności aoboCodoeo fo g o h o d ie i d ^ e ^ d s a i f i b i g i «2/263 d ^ C1P1&2£2 «3/364^5^6 . . . ; (19)
te bloki znajdują się odpowiednio na dyskach 0 1 2 3 4 0 1 2 4 0 0 1 1 1 1
2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 . . . .
(20)
Tak więc najlepszy sposób wprowadzania danych jest następujący: Krok 1 aoboCodoeo
Krok 2 /o £0^061 di
Krok 6 ? fihaz ?
Krok 3 e ie 2 bihide
Krok 7 ? ? e3/ 3 ?
Krok 4 d^dzgib 2 ?
Krok 8 ? ? d4e4 ?
Krok 5 ? «i«2#2 ?
Krok 9 ? ? ? d5 ?
, , (2l)
398
SORTOWANIE
5.4.9
Przed dotarciem do bloku d§ musimy wczytać dg, jak i 15 bloków z dalszymi danymi, oznaczonych przez Powodem jest przeciążenie dysku 3. Na dodatek nadal jeszcze siedem buforów będzie zawierało pozostałości bloków 03, ¿>2, cą, 64, / 3 , Q2 i 61 . Tak więc w tym szczególnym przypadku będziemy potrzebowali przestrzeni buforowej na co najmniej (16 + 8 + 5 )P rekordów. Zamiast tego moglibyśmy zastosować proste rozwiązanie z superblokami polegające na wczytaniu w kroku 1 bloków ao aia 2a 3a 4, w kroku 2 bloków ••■5 w kroku 8 bloków h o h ih 2 hshĄ, potem w kroku 9 bloków (ponieważ następnym potrzebnym superblokiem jest d ^ d ^ d g d g ) i tak dalej. Przy zastosowaniu strategii SyncSort takie rozwiązanie wymaga buforów dla (P -f 3 ) DB rekordów i pamięci dla P D B wskaźników. Dla bardziej uniwersalnego podejścia przedstawionego powyżej można pokazać, że wymaga tylko około połowy mniejszej przestrzeni buforowej. Jednak wymagania pamię ciowe są nadal proporcjonalne do P D B , gdy P i D są duże (zobacz ćwiczenie 24). R. D. Barve, E. F. Grove i J. S. V itter [Parallel Computing 23 (1997), 601-631] pokazali, że nieznaczna modyfikacja rozwiązania z niezależnymi bloka mi prowadzi do algorytmu, w którym operacje wejścia/wyjścia są wykonywane prawie na pełnej szybkości i który używa przestrzeni buforowej na 0 ( P + D log D) bloków, zam iast Q,(PD). Zaproponowana przez nich technika losowego podziału na pasma polega na umieszczeniu bloku j z sekwensu k na dysku (xk + j) mod D, gdzie Xk jest losową liczbą całkowitą wybieraną tuż przed pierwszym zapisaniem sekwensu k . Zamiast domagać się, żeby za każdym razem wczytywać D blo ków, po jednym z każdego dysku, wprowadzono prosty mechanizm wstrzymy wania wczytywania, gdy brakuje miejsca w pamięci na wprowadzanie danych z pewnych dysków. Autorzy udowodnili, że ich m etoda jest asymptotycznie optymalna. Do wykonania scalania P-wejściowego na D dyskach za pomocą losowego podziału na pasm a możemy wykorzystać 2D + P + Q — 1 ruchomych buforów wejściowych, z których każdy zawiera blok B rekordów. Dane wejściowe są zwykle wczytywane d o D z tych buforów, nazywanych aktywnymi buforami czytającymi, podczas gdy pozostałe P buforów zawiera czołowe bloki, z których rekordy są właśnie scalane. Bufory biorące właśnie udział w procesie scalania nazywamy aktywnymi buforami scalającymi Pozostałe D + Q — 1 „bufory robocze” są puste lub zawierają wcześniej pobrane dane, które będą potrzebne później; Q jest nieujemnym param etrem , który można zwiększyć, żeby zmniejszyć prawdopo dobieństwo wstrzym ania czytania z któregokolwiek dysku. Bloki ze wszystkich sekwensów można rozmieścić w porządku chronologicz nym tak jak w ( 19 ). Najpierw ustawiamy bloki 0 ze wszystkich sekwensów, następnie pozostałe bloki, biorąc pod uwagę porządek, w którym aktywne bu fory scalające są opróżniane. Jak wyjaśniliśmy wcześniej, taką kolejność można wyznaczyć, porównując ostatnie klucze w blokach. Tak więc łatwo można prze widzieć, które bloki powinny zostać wczytane jako pierwsze. Rozważmy ponownie przykład ( 19 ) z P = 8 , D = 5 i Q = 4. Teraz w bufo rach wejściowych będziemy mieli miejsce na tylko 2 D + P + Q — 1 = 21 bloków zam iast 29, które były potrzebne do opisanego wcześniej czytania z maksymalną
DYSKI I BĘBNY
5.4.9
399
szybkością. Zastosujemy przesunięcia Xi
3,
X‘2 =
1,
X3 = 4 , Xą—1, X5 = 0 , Xq=
(równe kolejnym cyfrom rozwinięcia liczby 7r) odpowiednio dla sekwensów a, 5, . . . , h. Zatem zawartości odpowiednich dysków są następujące: Dysk
Bloki eo i do
fi h 0 ei go di
a2
co
cl3
f2 e2
bi
d2
ao
d^Ci hi
gi d3ai
/o
63
do
f3
do
( 23)
b2 g2
eĄ
jeśli bloki wypiszemy w porządku chronologicznym. „Losowe” przesunięcia z ( 22), razem z sekwencyjnym podziałem na pasm a wewnątrz każdego sekwensu, często minimalizują zator w każdym poszczególnym chronologicznym ciągu. Rzeczywi ste przetwarzanie w tym przypadku wygląda następująco: Aktywne czytanie Krok Krok Krok Krok Krok Krok Krok
1 2 3 4 5 6
7
Obszar roboczy
Aktywne scalanie
Co £>020 «0 Co
f i dodi d2fo ¿2^221^3 a 2 ei bi g\ ai ^ 4/ 2 ^ 3 2 2 ci a3f 3b2 eĄ ? dodo ? ?
o to ---------------------------
a 0 bo codo----------ao
cq do e Q f o
go ho
ao bo codieifogoho a 2 biCod3 e 2 f 2giho a 2 biCidĄe 3 f 2giho
Oczekiwanie na ao (■ do ¿>0 c 0 ( e 0 2 o - - - - - - - - - - - - - - ho eo/o 2o(did2/ i ----(24) di(d 2 e2 d 3 f i g \ a 2 — Cl d 2 e 2 d 3 a\ f i bi gi a 2 ( /2 Cl ć3 ¿ 4(^122----------hib 2 g2 a 3 f 3 eĄ(----d5
W każdym kroku czekamy na chronologicznie pierwszy blok, który nie jest jeszcze scalony i nie znajduje się jeszcze w buforze roboczym. To jest jeden z bloków, który jest właśnie wprowadzany do aktywnego bufora czytającego. Zakładamy, że komputer jest dużo szybszy od dysków. Tak więc wszystkie bloki poprzedzające ten, na który czekamy, znajdą się w procesie scalania przed zakończeniem wczy tywania. Zakładamy także, że mamy wystarczającą liczbę buforów wyjściowych, tak żeby scalanie nie zostało opóźnione z powodu braku miejsca na zapisanie danych wyjściowych (zobacz ćwiczenie 26). Po zakończeniu rundy czytania blok, na który czekaliśmy, jest natychm iast klasyfikowany jako aktywny bufor scala jący, natom iast dotychczasowy bufor scalający staje się następnym aktywnym buforem czytającym. Pozostałe D —1 buforów czytających wym ieniają się miej scami z D — 1 najmniej znaczącymi buforami roboczymi (znaczenie buforów jest ustalane zgodnie z porządkiem chronologicznym ich zawartości). W kolejnej rundzie będziemy czekali na pierwszy niescalony blok, którego nie m a w buforach roboczych. Każdy bufor roboczy poprzedzający ten blok w porządku chronolo gicznym staje się składową aktywnego scalania przed rozpoczęciem następnego cyklu pobierania danych wejściowych, a inne - znajdujące się w powyższej tabeli w nawiasach - pozostaną w następnej rundzie buforami roboczymi z tą samą zawartością. Jednakże co najwyżej Q z buforów w nawiasach może pozostać
400
SORTOWANIE
5.4.9
z tą sam ą zawartością, ponieważ będziemy musieli zmienić status D — 1 buforów roboczych na status buforów aktywnych, zaraz po zakończeniu wprowadzania danych wejściowych. Każdy dodatkowy bufor roboczy jest w całości czyszczony tak, jak gdyby nigdy nie były do niego wprowadzane dane. Takie czyszczenie wy stępuje w kroku 4 z (24). Nie możemy przenieść wszystkich sześciu bloków ponad krokiem 5, ponieważ Q = 4, tak więc wczytujemy raz jeszcze gi i a 2. Gdyby nie to, operacje czytania z tego przykładu odbywałyby się na pełnej szybkości. W ćwiczeniu 29 dowodzimy, że dla danego chronologicznego ciągu sekwensów, które należy scalić, m etoda losowego podziału na pasm a daje w śred nim przypadku m inim alną liczbę odczytów z dysku z dokładnością do czynnika r ( D , Q + 2). Stablicowana funkcja r jest przedstawiona w tabeli 2. Na przykład, jeśli D = 4 i Q = 18, średni czas wykonania scalania P-wejściowego na L blokach, za pom ocą 4 dysków i P + 25 buforów wejściowych, jest równy co najwyżej czasowi przeczytania r(4,20)L/£> w 1.785L/4 bloków z pojedynczego dysku. To teoretyczne górne ograniczenie jest bardzo zachowawcze. W praktyce zachowanie tego algorytm u jest dużo lepsze, a czas jego działania jest bliski optymalnemu czasowi L / Ł Tabela 2 GWARANCJE JAKOŚCI LOSOWEGO PODZIAŁU NA PASMA r(d, d) r(d, 2d) r(d, 3d) r(d, 4d) r(d, 5d) r{d, 6d) r(d , 7d) r(d, 8d) r(d, 9 d) r(d , 10d) d == 2 d == 4 d == 8 d == 16 d == 32 d == 64 d == 128 d == 256 d =- 512 d == 1024
1.500 2.460 3.328 4.087 4.503 5.175 5.431 5.909 6.278 6.567
1.500 2.190 2.698 3.103 3.392 3.718 3.972 4.222 4.455 4.689
1.499 1.986 2.365 2.662 2.917 3.165 3.356 3.536 3.747 3.879
1.467 1.888 2.183 2.434 2.654 2.847 2.992 3.155 3.316 3.434
1.444 1.785 2.056 2.277 2.458 2.613 2.759 2.910 3.024 3.142
1.422 1.724 1.969 2.156 2.319 2.465 2.603 2.714 2.820 2.937
1.370 1.633 1.836 1.997 2,130 2.249 2.358 2.464 2.556 2.639
1.393 1.683 1.889 2.067 2.218 2.346 2.459 2.567 2.675 2.780
1.353 1.597 1.787 1.933 2.062 2.174 2.273 2.363 2.450 2.536
1.339 1.570 1.743 1.890 2.005 2.107 2.201 2.289 2.375 2.452
C z y s o rto w a n ie k lu c z y p o m a g a ? Gdy rekordy są długie, a klucze krótkie, kusi, żeby stworzyć nowy plik składający się tylko z kluczy i numerów porządko wych wyznaczających pozycje odpowiadających im rekordów. Po posortowaniu pliku z kluczami możemy klucze zastąpić kolejnymi numerami 1, 2, . . . . Następnie tak otrzym any plik możemy posortować względem oryginalnych pozycji w pliku. W ten sposób dostaniemy wygodny opis rozmieszczenia rekordów w docelowym, posortowanym pliku. Oto schemat takiego postępowania: i)
Oryginalny plik
ii)
Plik z kluczami
iii) iv)
Posortowany (ii) Zredagowany (iii)
( l , Pi ) ( 2 , p2)- •( N
)
krótki
V)
Posortowany (iv)
(9 1 ,1 )0 2 ,2 ). ■(qN , N )
krótki
vi)
Zredagowany (i)
( i f i , / 1 ) ( /f 2, J 2). • (K { K u l ) { K 2 , 2 ). • (K
n
,In )
długi
)
krótki
n ,N
( K Pl, Pl ) ( K P2 , p2). • ( K p n i Pn ) , Pn
( g i , / i ) 0 2, / 2) • • ( q n , I n
)
krótki
długi
5.4.9
DYSKI I BĘBNY
401
Tutaj pj ~ k wtedy i tylko wtedy, gdy = j . Dwa sortowania w (iii) i (v) są sto sunkowo szybkie (być może są to nawet sortowania wewnętrzne), ponieważ sor towane rekordy nie są zbyt długie. W fazie (vi) nasz wyjściowy problem redukuje się do posortowania pliku, w którym kluczami są po prostu liczby { 1 , 2 , . . . , N } - o każdym rekordzie wiadomo, na której pozycji ma zostać umieszczony. Na pierwszy rzut oka problem zewnętrznego przemieszczenia rekordów, któ ry powstaje po fazie (vi), wydaje się trywialny. Jednak w rzeczywistości jest on dość trudny i żadne rzeczywiście dobre algorytmy (znacząco lepsze od sortowa nia) nie zostały jak dotąd znalezione. Moglibyśmy oczywiście dokonać takiego przemieszczenia w N krokach, prze suwając po jednym rekordzie w każdym kroku. Dla wystarczająco dużych N to jest lepsze niż N l o g N w przypadku sortowania. Jednak N nigdy nie jest tak duże. Z drugiej strony N jest na tyle duże, żeby N przeszukiwań było nieakceptowalne. Dla zredagowanych rekordów z (vi) można efektywnie wykorzystać m etody pozycyjne, ponieważ rozkład kluczy w tym przypadku jest doskonale jednostajny. Na współczesnych komputerach czas potrzebny na rozrzucanie rzędu 8 jest dużo mniejszy niż czas wykonania scalania ośmiowejściowego. Tak więc najlepszą metodą sortowania w tym przypadku jest prawdopodobnie sortowanie przez rozrzucanie. (Zobacz punkt 5.4.7, a także ćwiczenie 19). Z drugiej strony wydaje się m arnotrawstwem wykonywanie pełnego sorto wania po tym, jak klucze zostały już posortowane. Jeden z powodów, dla których problem zewnętrznej perm utacji jest nieoczekiwanie trudny, został odkryty przez R. W. Floy da, który znalazł nie tryw ialną dolną granicę na liczbę przeszukiwań dysku potrzebną do przemieszczenia rekordów [C om plexity o f C om puter Com putations (New York: Plenum, 1972), 105-109]. Wygodnie jest przedstawić wynik Floyda, odnosząc się do problemu windy z punktu 5.4.8. Jednak tym razem chcemy znaleźć plan ruchów windy, który zamiast przebytej drogi minimalizuje liczbę postojów windy. Minimalizowanie liczby postojów nie jest dokładnie równoważne przemieszczaniu rekordów za pomocą minimalnej liczby przeszukiwań dysku, ponieważ postój łączy w sobie wejście do windy i wyjście z niej. Jednak kryterium minimalnej liczby postojów jest wystarczająco bliskie, żeby zrozumieć podstawowe idee. Posłużymy się funkcją „dyskretnej entropii” F(n) =
^2 Kkś^n
+ l) = B(n) + n - 1 = n\ l gn] - 2 ^lgn‘ + n,
( 25)
gdzie B{n) jest funkcją binarnego wstawiania zdefiniowaną w 5 .3 . 1 - ( 3 ). Z 5.3.1(34) wiemy, że F(n) jest minim alną długością ścieżki zewnętrznej w drzewie binarnym o n liściach i n l g n < F(ń) < n l g n + 0.0861n.
( 26)
Ponieważ F(n) jest wypukła i spełnia F(ń) = n + F(|_n/2_|) + F (|~ n / 2]), zatem z podanego wcześniej lem atu C wynika, że F(n) < F(k) + F ( n — k) + n
dla 0 < k < n.
(27 )
402
SORTOWANIE
5.4.9
Ta zależność wynika także z charakteryzacji F przez długości ścieżek zewnętrz nych. Ten fakt jest kluczowy w następującym rozumowaniu. Podobnie jak w punkcie 5.4.8 założymy, że na każdym piętrze jest miejsce dla b osób, w windzie mieści się m osób, a w budynku jest n pięter. Niech Sij będzie liczbą osób aktualnie znajdujących się na piętrze i , które chcą się dostać na piętro j . Zgodność dowolnej konfiguracji osób w budynku definiujemy jako sumę Dla przykładu załóżmy, że b = m = n = 6 i że początkowo konfiguracja 36 osób na piętrach jest następująca: U U U U U L I
123456
/
123456 123456
123456
123456
123456
^
W inda jest pusta i znajduje się na pierwszym piętrze; symbol „u” oznacza wolne miejsce. Na każdym piętrze znajduje się jedna osoba, która chce się dostać na każde inne piętro. Zatem wszystkie są równe 1 i zgodność wynosi 0. Jeśli teraz winda zabierze sześć osób na piętro 2 , to otrzymamy konfigurację uLiuuuu
123456 123456
123456
123456
123456
123456
( Ci\
(2
a zgodność wynosi teraz 6F(0) + 24F(1) + 6F(2) = 12. Załóżmy obecnie, że winda przewozi 1, 1, 2, 3, 3 i 4 na piętro 3: uuuuuu
112334 245566 123456
123456
123456
123456
, , ^3° '
Zgodność w zrasta zatem do 4F(2) + 2F(3) = 18. Gdy wszystkie osoby znajdą się na swoich docelowych piętrach, zgodność wyniesie 6F ( 6) = 96. Floyd zauważył, że zgodność w jednym kroku nigdy nie w zrasta więcej niż 0 5 + m, ponieważ jeśli do s osób z tym i samymi piętram i docelowymi dołączymy s* podobnych osób, to zgodność zwiększa się co najwyżej o F (s + sf) —F(s) — F ^ ) < s + s'. Dlatego zachodzi następujące twierdzenie: T w ie rd z e n ie F . Niech t będzie zgodnością początkowej konfiguracji bn osób (przy przyjętych wcześniej definicjach). Wówczas przewiezienie wszystkich osób na docelowe piętra wymaga co najm niej [(F ( 6) n - i )/(6 + m)] postojów windy.
|
Przetłum aczm y teraz ten wynik na terminologię dyskową. Niech bn będzie liczbą rekordów z b rekordami w bloku i załóżmy, że w pamięci wewnętrznej mieści się jednorazowo m rekordów. Po każdym odczycie z dysku w pamięci zostaje umieszczony jeden blok; po każdym zapisie na dysku znajdzie się jeden blok, a Sij jest liczbą rekordów w bloku i, które należą do bloku j. Dla n > b istnieje początkowa konfiguracja, w której wszystkie są < 1. Tak więc t = 0 1 potrzeba co najmniej f ( b ) n / ( b + m) ~ ( bnl gb) / m operacji odczytu bloku, żeby odpowiednio rozmieścić wszystkie rekordy. (Czynnik lg 6 czyni tę dolną granicę
DYSKI I BĘBNY
5.4.9
403
nietrywialną dla dużych b). W ćwiczeniu 17 otrzymujemy istotnie lepszą dolną granicę dla częstego przypadku, w którym m jest znacząco większe od b. ĆW ICZENIA 1.
[M22]
W
g łó w n y m t e k ś c ie o m a w ia m y m e t o d ę , d z ię k i k t ó r e j ś r e d n i c z a s o c z e k i
w a n ia p o t r z e b n y d o w c z y t a n i a u ła m k a x c a łe j ś c ie ż k i z o s t a j e z r e d u k o w a n y z \ d o | ( 1 — x 2) o b r o t u . J e s t t o n a j m n i e j s z a m o ż liw a w a r t o ś ć , g d y m a m y d o d y s p o z y c j i t y l k o je d n o r a m ię . J a k i j e s t o d p o w ie d n i m in im a ln y ś r e d n i c z a s o c z e k iw a n ia , je ś l i d y s p o n u je m y d w o m a ramionami w o d le g ło ś c i 18 0 ° o d s ie b ie , p r z y z a ło ż e n iu , ż e w t e j s a m e j c h w ili t y lk o je d n o r a m ię m o ż e p r z e s y ła ć d a n e ?
2.
[M30]
( A . G . K o n h e im ) C e le m t e g o z a d a n i a j e s t z b a d a n ie , n a j a k ą o d le g ło ś ć m u s i
p r z e m ie ś c ić się r a m ię d y s k o w e p o d c z a s s c a la n ia p lik ó w , k t ó r e s ą r o z m ie s z c z o n e „ p r o s t o p a d le ” d o c y lin d r ó w . Z a łó ż m y , ż e m a m y P p lik ó w , z k t ó r y c h k a ż d y z a w ie r a L b lo k ó w , i ż e p ie r w s z y b lo k z k a ż d e g o p lik u n a le ż y d o c y l in d r a 1, d r u g i d o c y l in d r a 2 it d . R u c h r a m ie n ia p o d c z a s s c a la n ia z a l e ż y o d w z g lę d n e g o p o r z ą d k u o s t a t n ic h k l u c z y w b lo k a c h . T a k ą s y t u a c j ę m o ż n a o p is a ć w n a s t ę p u j ą c y s p o s ó b , w y g o d n y d o m a t e m a t y c z n e j a n a liz y : R o z w a ż m y z b ió r P L p a r u p o r z ą d k o w a n y c h (an , 1)
( a 21 , 1 )
••*
( a i 2, 2 )
( a 22 , 2 )
...
( a p i, 1 ) ( a p 2, 2 )
...
(apL,L)
(aiz^L) (a 2L, L)
g d z ie z b ió r {aij | 1 ^ i ^ P , 1 ^ j ^ L } s k ł a d a się z u p o r z ą d k o w a n y c h w p e w ie n s p o s ó b lic z b { 1 , 2 , . . . , P L } i g d z ie aij < a i (J + 1 ) d la 1 ^
j
< L. ( W ie r s z e r e p r e z e n t u j ą c y lin d r y ,
k o lu m n y r e p r e z e n t u ją p lik i w e jś c io w e ) . P a r y s o r t u je m y w e d łu g p ie r w s z e j s k ła d o w e j i n ie c h w y n ik o w y m
c ią g ie m
z (PL)\/L\p w y b o ró w
b ę d z ie ( l , j i ) ( 2 , j 2) . . . ( P L , J p l )* P o k a ż , ż e j e ś l i k a ż d y
j e s t je d n a k o w o p r a w d o p o d o b n y , t o ś r e d n ia w a r t o ś ć s u m y |j*2 ~ j l \ +
\jz — j 2 | +
***+
| j P L ~ j P L —1 1
w ynosi
( l —i) ( i + ( p - i ) 22L- y ( 2^ ) ) . [ Wskazówka: Z o b a c z ć w ic z e n ie 5 . 2 .1 - 1 4 ] . Z a u w a ż m y , że d la L —► o o t a w a r t o ś ć j e s t a s y m p t o t y c z n ie r ó w n a \ { P — 1 ) L \ / ttL + O ( P L ) . 3.
[M 1 5 ] Z a łó ż m y , ż e p a m ię ć w e w n ę t r z n a j e s t n a t y le o g r a n ic z o n a , ż e w y k o n a n ie
s c a la n ia 10 - w e jś c io w e g o j e s t n ie m o ż liw e . W k u r e n c y jn e ( 3 ), ( 4 ), ( 5 ), ż e b y
Ai(n)
j a k i s p o s ó b z m o d y fik o w a ć z a le ż n o ś c i re-
b y ł o r ó w n e m in im a ln e j w a r t o ś c i a D ( T ) + ¡ 3 E ( T )
w ś r ó d w s z y s t k i c h t a k i c h w a r t o ś c i d la n - liś c io w y c h d r z e w T , w k t ó r y c h w ę z ł y w e w n ę t r z n e m a j ą s t o p n ie n ie w ię k s z e o d 9? ► 4.
[M21]
R o z w a ż m y z m o d y fik o w a n ą p o s t a ć p ie r w ia s t k o w e g o s c h e m a t u a lo k a c ji b u
fo r ó w , w k t ó r e j w s z y s t k i e P b u f o r y w e jś c io w e s ą t e j s a m e j d łu g o ś c i, a le r o z m ia r b u fo r u w y jś c io w e g o p o w in ie n b y ć t a k d o b r a n y , ż e b y z m in im a liz o w a ć c z a s p r z e s z u k iw a n ia . a ) W y p r o w a d ź w z ó r o d p o w i a d a j ą c y ( 2 ) n a c z a s s c a la n ia P - w e jś c i o w e g o d la L z n a k ó w . b ) P o k a ż , ż e k o n s t r u k c ję z t w ie r d z e n ia K m o ż n a z m o d y fik o w a ć w t a k i s p o s ó b , ż e b y o t r z y m a ć s c h e m a t s c a la n ia , k t ó r y b ę d z ie o p t y m a ln y z e w z g lę d u n a w z ó r z c z ę ś c i ( a ) .
404 5.
SORTOWANIE
5.4.9
[M 2 0 } G d y u ż y w a m y d w ó c h d y s k ó w w t a k i s p o s ó b , ż e c z y t a n i e z je d n e g o d y s k u
m o ż n a w y k o n y w a ć j e d n o c z e ś n ie z p is a n ie m n a d r u g i, n ie m a j ą z a s t o s o w a n ia s c h e m a t y s c a la n i a t a k i e j a k t e z r y s u n k u 93 , p o n ie w a ż p e w n e liś c ie z n a j d u j ą się n a p o z io m a c h p a r z y s t y c h , p o d c z a s g d y in n e s ą n a p o z io m a c h n ie p a r z y s t y c h . P o k a ż , w j a k i s p o s ó b z m o d y fik o w a ć k o n s t r u k c ję z t w ie r d z e n ia K , ż e b y o t r z y m a ć d r z e w a , k t ó r e s ą o p t y m a ln e i w k t ó r y c h liś c ie w y s t ę p u j ą a lb o n a p o z io m a c h p a r z y s t y c h , a lb o n a p o z io m a c h n ie p a rzy sty ch . ►
6 . [22] Z n a j d ź d r z e w o , k t ó r e j e s t o p t y m a ln e w z n a c z e n iu z ć w ic z e n ia
5
d la n = 23
i a = ¡3 — 1 . ( M o ż e z e c h c e s z s k o r z y s t a ć z p o m o c y k o m p u t e r a ) . ►
7.
[M2Ą]
G d y p o c z ą t k o w e s e k w e n s y n ie s ą t e j s a m e j d łu g o ś c i, n a j le p s z y s c h e m a t
s c a la n ia (w z n a c z e n iu z t w ie r d z e n ia H ) m in im a liz u je a D ( T ) + f 3 E( T ) , g d z ie D ( T ) i E ( T ) r e p r e z e n t u ją t e r a z d łu g o ś c i ś c ie ż e k ważonych : W a g i w i , . . . , wn ( o d p o w ia d a ją c e d łu g o ś c io m p o c z ą t k o w y c h s e k w e n s ó w ) s ą p r z y p is a n e d o liś c i d r z e w a , a s u m y s t o p n i i d łu g o ś c i ś c ie ż e k s ą p o m n o ż o n e p r z e z w ła ś c iw e w a g i. N a p r z y k ł a d
d la d r z e w a T
z r y s u n k u 92 m ie lib y ś m y D ( T ) = 6w± + 6w2 + 7w^ + 9 wą + 9^5 + 7w3 + 4w7 + 4 ^ 8 ,
E ( T ) — 2w\ + 2 w2 + 2w 3 + 3 wą 4- 3 u j 5 + 2w$ + W 7 + w 8U d o w o d n ij, ż e z a w s z e is t n ie je o p t y m a ln y s c h e m a t , w k t ó r y m d la p e w n e g o k n a j p ie r w s c a la n y c h j e s t k najkrótszych s e k w e n s ó w .
8 . [49] C z y is t n ie je a lg o r y t m , k t ó r y d la d a n y c h a , ¡3 i w a g w i , . . . , u j n z n a jd u je w c z a s ie 0 ( n c ), d la p e w n e g o c, d r z e w o o p t y m a ln e w z n a c z e n iu z ć w ic z e n ia 7 ? 9.
[HM39]
(L . H y a fil, F . P r u s k e r , J. V u ille m in ) U d o w o d n ij, ż e d la u s t a lo n y c h a i f3,
A \ (n ) = ( m in ^ ^ n lo g n + 0 ( n ) 2 lo g 7 7 1 / p r z y n —» 00, g d z ie s k ła d n i k 0 ( n ) j e s t ^ 0 .
1 0 . [HMĄĄ] zach o d zi
(L . H y a fil, F . P r u s k e r , J . V u ille m in ) U d o w o d n ij, ż e d ła u s t a lo n y c h
Ai(n)
a
i
¡3
= a m n -j- /3n + A m (n) d la w s z y s t k i c h w y s t a r c z a j ą c o d u ż y c h n , je ś li m
m in im a liz u je w s p ó łc z y n n i k z ć w ic z e n ia 9. 11.
[M29]
P r z y o z n a c z e n ia c h z ( 6 ) i ( 11 ) u d o w o d n ij, ż e f m {n) + m n
^
f ( n ) d la
w s z y s t k i c h m ^ 2 o r a z n ^ 2 , i w y z n a c z w s z y s t k i e m i n , d la k t ó r y c h z a c h o d z i r ó w n o ś ć .
1 2 . [25] U d o w o d n ij, ż e d la k a ż d e g o n >
0 is t n ie je d r z e w o o n liś c ia c h i ś c ie ż c e
s t o p n io w e j o m in im a ln e j d łu g o ś c i ( 6 ) z e w s z y s t k i m i liś ć m i n a t y m s a m y m p o z io m ie . 13 .
[M24]
P o k a ż , ż e d la 2 ^
n ^
d ( a yf3), g d z ie d ( a 1f3) s ą z d e fin io w a n e w ( 12),
j e d y n y m n a j le p s z y m s c h e m a t e m s c a la n ia w z n a c z e n iu t w ie r d z e n ia H j e s t s c a la n ie n - w e jś c io w e . 14 .
[40] P r z y z a s t o s o w a n iu m e t o d y p ie r w ia s t k o w e j a lo k a c ji b u fo r ó w c z a s p r z e s z u k iw a
n ia d la s c h e m a t u z r y s u n k u 92 b y ł b y p r o p o r c jo n a ln y d o ( v ^ + ( \ / i ~t" y/l + y/2)
T {y/l + y/2 ~b y/l
v^4)
\ /l + \/T + y ^ ) 2+
T {y/l -I- y/l T y/2} . J e s t t o s u m a , p o
w s z y s t k i c h w ę z ł a c h w e w n ę t r z n y c h , s k ła d n ik ó w ( y W H—
• + y/rim + y/ni + * ■• + n m ) 2,
g d z ie o d p o w i a d a j ą c e t y m w ę z ło m p o d d r z e w a m a j ą ( n i , . . . , n m) liś c i. K o r z y s t a j ą c z p o w y ż s z e g o w z o r u , n a p is z p r o g r a m , k t ó r y w y g e n e r u je d r z e w a o n a jm n ie js z y m p r z e s z u k iw a n ia , z a w i e r a ją c e 1 , 2, 3, . . . 15.
[M22]
c z a s ie
liś c ie .
P o k a ż , ż e t w ie r d z e n ie F m o ż n a n ie z n a c z n ie p o p r a w ić , je ś li n a p o c z ą t k u
w i n d a j e s t p u s t a i je ś l i F ( b ) n
t. W t a k i m p r z y p a d k u w in d a m u s i się z a t r z y m a ć co
n a jm n ie j \ ( F ( b ) n + m — t)/(b + m ) ] r a z y .
DYSKI I BĘBNY
5.4.9 16.
[23]
405
( R . W . F lo y d ) Z a p r o j e k t u j p la n r u c h ó w w in d y , k t ó r y p o s ł u ż y d o p r z e w ie
z ie n ia w s z y s t k i c h o s ó b z ( 28 ) n a ic h d o c e lo w e p i ę t r a p r z y c o n a j w y ż e j 12 p o s t o ja c h . ( K o n f ig u r a c ja ( 29 ) o d p o w ia d a s y t u a c j i p o p ie r w s z y m p o s t o ju , a n ie p o d r u g im ) . ►17.
[HM25]
( R . W . F lo y d , 198 0 ) P o k a ż , ż e m o ż n a p o p r a w ić d o ln ą g r a n ic ę z t w ie r d z e
n ia F d o
n ( b l n n — ln b — 1 ) I n n + 6(1 + l n ( l + m/b)) w t a k i m z n a c z e n iu , że p e w n e k o n fig u r a c je p o c z ą t k o w e w y m a g a j ą c o n a jm n ie j t a k ie j lic z b y p o s t o jó w . [Wskazówka: P o l i c z k o n fig u r a c je , k t ó r e m o ż n a o t r z y m a ć p o s p o s t o ja c h ]. 18 .
[HM26]
N ie c h
L
b ę d z ie d o ln ą g r a n ic ą z ć w ic z e n ia 1 7 . P o k a ż , ż e ś r e d n ia l ic z b a
p o s t o jó w w in d y p o t r z e b n a d o p r z e w ie z ie n ia w s z y s t k i c h o s ó b n a w y b r a n e p r z e z n ie p ię t r a w y n o s i c o n a jm n ie j
L
— 1 , p r z y z a ło ż e n iu , ż e k a ż d a z (im )! m o ż liw y c h p e r m u -
t a c ji, p r z y p i s u j ą c a o s o b y d o ł ą c z n ie bn b iu r e k n a w s z y s t k i c h p ię t r a c h , j e s t je d n a k o w o p raw d o p o d o b n a. ►19 .
[25]
(B . T . B e n n e tt i
A. C.
M c K e l la r ) R o z w a ż m y n a s t ę p u j ą c y s p o s ó b s o r t o w a n ia
k lu c z y , z ilu s t r o w a n y n a p r z y k ł a d o w y m p lik u z a w i e r a ją c y m 10 k lu c z y : i) P l i k o r y g in a ln y : (50,/o)(08,/i)(51,/2)(06,/3)(90,/4)(17,J5)(89,/6)(27,/7)(65,/8)(42,/9)
ii) P li k k lu c z y : ( 5 0 ,0 ) ( 0 8 ,1 ) ( 5 1 , 2 ) ( 0 6 , 3 ) ( 9 0 , 4 ) ( 1 7 , 5 ) ( 8 9 , 6 ) ( 2 7 , 7 ) ( 6 5 , 8 ) ( 4 2 , 9) iii) P o s o r t o w a n y (ii): (06, 3 ) ( 0 8 , 1 ) ( 1 7 , 5 ) ( 2 7 , 7 ) ( 4 2 , 9 ) ( 5 0 ,0 ) ( 5 1 , 2 ) ( 6 5 , 8 ) ( 8 9 ,6 ) ( 9 0 , 4) iv ) P r z y p o r z ą d k o w a n ie k o s z y k ó w ( z o b a c z n iż e j): ( 2 , 1 ) ( 2 , 3 ) ( 2 , 5 ) ( 2 , 7 ) ( 2 , 8) ( 2 , 9 ) ( 1 , 0 ) ( 1 , 2 ) ( 1 , 4 ) ( 1 , 6) v ) P o s o r t o w a n y (iv ): ( 1 , 0 ) ( 2 , 1 ) ( 1 , 2 ) ( 2 , 3 ) ( 1 , 4 ) ( 2 , 5 ) ( 1 , 6 ) ( 2 , 7 ) ( 2 , 8 ) ( 2 , 9) v i)
(i) r o z r z u c a n ie d o k o s z y k ó w z w y k o r z y s t a n i e m (v ): K o s z y k 1: ( 5 0 ,70) ( 5 1 , 7 2) ( 9 0 ,7 4 ) ( 8 9 ,7 6) K o s z y k 2: ( 0 8 , 7 0 ( 0 6 , 7 3 ) ( 1 7 , 7 5 ) ( 2 7 , 7 7 ) ( 6 5 , 7 8) ( 4 2 ,7 9)
v ii) W y n i k w y b o r u z p o d m ia n ą p o w c z y t a n i u n a jp ie r w k o s z y k a 2, a n a s t ę p n ie k o s z y k a 1 : ( 0 6 ,7 3) ( 0 8 , 7 i ) ( 1 7 , 7 5 ) ( 2 7 , 7 7) ( 4 2 ,7 9) ( 5 0 , 7 o ) ( 5 1 , 7 2) ( 6 5 , 7 8) ( 8 9 , 7 6 ) ( 9 0 ,7 4 ) P r z y p o r z ą d k o w a n ie n u m e r ó w k o s z y k ó w w k r o k u (iv ) o d b y w a s ię z a p o m o c ą wyboru
z podmianą z a s to s o w a n e g o d o ( iii) , w k ie r u n k u od strony prawej do lewej , w p o r z ą d k u malejącym z e w z g lę d u n a d r u g ą s k ła d o w ą . N u m e r k o s z y k a j e s t n u m e r e m s e k w e n s u . W p o w y ż s z y m p r z y k ł a d z i e z a s t o s o w a n o w y b ó r z p o d m ia n ą z t y l k o d w o m a e le m e n t a m i w d r z e w ie w y b o r u . D r z e w o t a k i m s a m y m r o z m ia r z e n a le ż y u ż y ć w w y b o r z e z p o d m ia n ą z a r ó w n o w ( iv ) , j a k i w ( v ii) . Z a u w a ż m y , ż e z a w a r t o ś c i k o s z y k ó w n ie m u s z ą b y ć u p o rząd k o w a n e! U d o w o d n ij, ż e t a m e t o d a r z e c z y w iś c ie s o r t u je , t o z n a c z y , ż e w w y n i k u z a s t o s o w a n ia w y b o r u z p o d m ia n ą w (v ii) d o s t a n ie m y d o k ła d n ie je d e n s e k w e n s . ( T a t e c h n ik a r e d u k u je lic z b ę k o s z y k ó w p o t r z e b n y c h w t r a d y c y j n y m s o r to w a n iu k l u c z y p r z e z r o z r z u c a n ie , w s z c z e g ó ln o ś c i g d y p lik w e jś c io w y j e s t j u ż w d u ż y m s t o p n iu u p o r z ą d k o w a n y ) . ►20.
[25] W s p ó łc z e s n e s y s t e m y k o m p u t e r o w e ( s p r z ę t i o p r o g r a m o w a n ie ) u m o ż li w i a j ą
p r o g r a m is t o m k o r z y s t a n ie z pamięci wirtualnej . P r o g r a m y s ą p is a n e t a k , j a k b y d o s t ę p n a b y ł a b a r d z o d u ż a p a m ię ć w e w n ę t r z n a , z d o ln a p o m ie ś c ić d a n e w c a ło ś c i. T a k a p a m ię ć je s t p o d z ie lo n a n a strony , z k t ó r y c h t y l k o k ilk a m o ż e z n a jd o w a ć s ię w t y m s a m y m c z a s ie w r z e c z y w is t e j p a m ię c i w e w n ę t r z n e j. P o z o s t a ł e s t r o n y z n a j d u j ą się n a d y s k a c h lu b b ę b n a c h . P r o g r a m iś c i n ie m u s z ą się p r z e jm o w a ć t y m i s z c z e g ó ła m i, p o n ie w a ż w s z y s t k i m
406
SORTOWANIE
5.4.9
zajm uje się system operacyjny - potrzebne strony są autom atycznie sprowadzane do p a m ię c i. W y d a w a ł o b y się , ż e p o ja w ie n ie się p a m ię c i w i r t u a ln y c h c z y n i m e t o d y s o r to w a n ia z e w n ę t r z n e g o p r z e s t a r z a ł y m i , p o n ie w a ż m o ż n a p o p r o s t u u ż y w a ć t e c h n ik s o r to w a n ia w e w n ę t r z n e g o . P r z e p r o w a d ź d y s k u s ję n a t e m a t t e j s y t u a c j i . K i e d y „ r ę c z n ie ” d o s to s o w a n e m e t o d y s o r t o w a n ia z e w n ę t r z n e g o s ą le p s z e o d o g ó ln y c h t e c h n ik s t r o n ic o w a n ia z a s t o s o w a n y c h d o s o r t o w a n ia w e w n ę t r z n e g o ? ►2 1.
[Ml 5]
I le b lo k ó w z p lik u z ło ż o n e g o z
L
b lo k ó w z n a jd z i e się n a d y s k u j , g d y t e n
p li k p o d z i e li m y n a p a s m a D - d y s k o w e ?
22.
[22]
J e ś li s c a la m y d w a p lik i z g o d n ie z z a s a d ą G i l b r e a t h a i c h c e m y z a p a m ię t a ć
k lu c z e a j z b lo k a m i a i k lu c z e f3j z b lo k a m i b, t o w k t ó r y m b lo k u n a le ż y u m ie ś c ić a j , ż e b y d o s t a ć p o t r z e b n ą in f o r m a c ję w t e d y , k i e d y j e j b ę d z ie m y p o t r z e b o w a ć ? ►23.
[20]
J a k d u ż e j p r z e s t r z e n i p o t r z e b u je m y d o z o r g a n iz o w a n ia b u fo r ó w w e jś c io w y c h ,
ż e b y c z y t a n i e o d b y w a ł o s ię w s p o s ó b c i ą g ł y , g d y s c a la n ie d w u w e jś c io w e w y k o n u je m y (a ) z a p o m o c ą p o d z i a ł u n a s u p e r b lo k i? (b ) k o r z y s t a j ą c z z a s a d y G i l b r e a t h a ? 24.
[M36]
Z a łó ż m y , ż e
s p o s ó b , ż e b lo k j
P
s e k w e n s ó w z o s t a ł o p o d z ie lo n y c h n a p a s m a D - d y s k o w e w t a k i
z se k w e n su k w y s tę p u je n a d y s k u
(Xk + j ) m o d D . W
s c a la n iu
P - w e jś c i o w y m t e b lo k i b ę d ą o d c z y t y w a n e w p e w n y m p o r z ą d k u c h r o n o lo g ic z n y m t a k im j a k ( 19 ). J e ś li g r u p y D b lo k ó w b ę d ą w c z y t y w a n e w s p o s ó b c ią g ły , w k r o k u t z k a ż d e g o d y s k u z o s t a n ie w c z y t a n y b lo k o n u m e r z e t w p o r z ą d k u c h r o n o lo g ic z n y m j a k w ( 2 1 ). J a k a j e s t m in im a ln a ilo ś ć m ie js c a w p a m ię c i, m ie r z o n e g o lic z b ą m ie s z c z ą c y c h się t a m r e k o r d ó w z d a n y m i p r z e z n a c z o n y c h n a b u fo r y , ż e b y z a p a m ię t a ć d a n e w e jś c io w e , k tó r e n ie z o s t a ł y je s z c z e s c a lo n e , n ie z a le ż n ie o d d a n e g o p o r z ą d k u c h r o n o lo g ic z n e g o ? W y ja ś n i j, w j a k i s p o s ó b w y b r a ć p r z e s u n ię c ia
x 2 > • • • > x p > ż e b y w p e s y m is t y c z n y m p r z y p a d k u
t r z e b a b y ł o u ż y ć j a k n a jm n ie js z e j l ic z b y b u fo r ó w . 25.
[23]
P r z e r ó b r a z je s z c z e p r z y k ł a d z g łó w n e g o t e k s t u i l u s t r u ją c y w y k o r z y s t a n ie
Q = 3
lo s o w e g o p o d z i a ł u n a p a s m a , a le t y m r a z e m d la p r z y p a d k u
z a m ia s t
Q — 4.
P r z e d s t a w z a w a r t o ś c i b u fo r ó w a n a lo g ic z n ie d o ( 24 ). 26.
[26]
Ile b u fo r ó w w y j ś c i o w y c h g w a r a n t u je , ż e p o d c z a s s c a la n ia
P- w e jś c io w e g o
z lo
s o w y m p o d z i a ł e m n a p a s m a , n ig d y n ie b ę d z ie p r z e s t o j u s p o w o d o w a n e g o b r a k ie m m ie j s c a w p a m ię c i w e w n ę t r z n e j n a u m ie s z c z e n ie n o w o s c a lo n y c h d a n y c h ? Z a łó ż m y , ż e c z a s o d c z y t u b lo k u j e s t t a k i s a m j a k c z a s j e g o z a p is u . 27.
[HM27]
( Problem cyklicznej zajętości) Z a łó ż m y , ż e n a o k r ę g u r o z m ie s z c z o n o n
p u s t y c h u r n i p o n u m e r o w a n o j e c y k l ic z n i e 0, 1 , . . . , n — 1. D l a rrifc k u l d o u r n
(Xk + j ) m o d n , p r z y j
k
= 1, 2, . . . ,
p w rzu cam y
= 0 , 1 , . . . , mu — 1 , g d z ie X k s ą lo s o w o
w y b r a n y m i lic z b a m i c a łk o w it y m i . N ie c h S n ( m i , . . . , m p) b ę d z ie lic z b ą k u l w u rn ie 0 i n ie c h E n ( m \ , . . . , m p ) b ę d z ie o c z e k iw a n ą l ic z b ą k u l w n a j b a r d z i e j z a p e łn io n e j u rn ie . a ) U d o w o d n ij, ż e E n { m i , . . . t m p) ^ S i l i m i n ( l , n P r ( 5 n ( m i , . . . , m p ) ^ t ) ) , g d z ie
m = m i + • • * + m p. b ) Z a s t o s u j n ie r ó w n o ś ć o g o n o w ą , 1 . 2 . 10 - ( 25 ) d o d o w o d u , ż e
d la d o w o ln y c h l ic z b r z e c z y w i s t y c h a i , a 2y . . . , a m - D l a j a k i c h w a r t o ś c i a i , . . . , a m d o s t a n ie m y n a j le p s z e o g r a n ic z e n ie g ó r n e ?
5.4.9 28.
DYSKI I BĘBNY
407
[HMĄ7] K o n t y n u u je m y ć w ic z e n ie 2 7 . C z y E n ( m i , . . . , m p) ^ E n ( m i + m 2 , r a 3 j . . . , m p)?
►29.
[M30\ C e le m t e g o ć w ic z e n ia j e s t o t r z y m a n i e g ó r n e g o o g r a n ic z e n ia n a ś r e d n i c z a s
p o t r z e b n y d o w p r o w a d z e n ia d o w o ln e g o c i ą g u b lo k ó w w p o r z ą d k u c h r o n o lo g ic z n y m z a p o m o c ą p r o c e d u r y w y k o r z y s t u j ą c e j lo s o w y p o d z i a ł n a p a s m a , g d y b lo k i r e p r e z e n t u ją
P s e k w e n s ó w i D d y s k ó w . B lo k i o c z e k u ją c e w k a ż d y m k r o k u d z i a ła n i a a lg o r y t m u ( z o b a c z ( 24 )) n a z y w a m y „ z a m a r k o w a n y m i” . Z a t e m o g ó ln y c z a s d z i a ł a n i a b a d a n e g o a lg o r y t m u j e s t p r o p o r c jo n a ln y d o l ic z b y z a m a r k o w a n y c h b lo k ó w . M a r k o w a n ie z a l e ż y t y lk o o d c h r o n o lo g ic z n e g o c i ą g u d o s t ę p ó w d o d y s k u ( z o b a c z ( 20 ) ) . a ) U d o w o d n ij, ż e je ś li w ś r ó d Q + 1 k o le jn y c h b lo k ó w w p o r z ą d k u c h r o n o lo g ic z n y m j e s t N j b lo k ó w n a d y s k u j , t o c o n a j w y ż e j m a x (iV o , N i , . . . , N d - i ) z n ic h z o s t a n ie za m a rk o w a n ych . b ) W z m o c n ij w y n i k z ( a ) , p o k a z u ją c , ż e z a c h o d z i o n d la Q + 2 k o le jn y c h b lo k ó w . c) T e r a z s k o r z y s t a j z p r o b le m u c y k lic z n e j z a j ę t o ś c i z ć w ic z e n ia 2 7 , ż e b y d la d o w o ln e g o p o r z ą d k u c h r o n o lo g ic z n e g o o t r z y m a ć g ó r n ą g r a n ic ę n a ś r e d n i c z a s d z i a ła n i a o m a w ia n e g o a lg o r y t m u , w y r a ż o n ą w z a le ż n o ś c i o d fu n k c ji r ( D , Q + 2 ), j a k t a z t a b e li 2. 30.
[HM30] U d o w o d n ij, ż e f u n k c j a r ( d , m) z ć w ic z e n ia 29 s p e łn i a z a le ż n o ś ć r ( d , s d l o g d)
= 1 + 0 ( l A / 5 ) , d la u s t a lo n e g o d , p r z y s —» 00. 3 1.
[HMĄ8]
Z a n a liz u j p r o c e d u r ę z lo s o w y m p o d z i a ł e m n a p a s m a w c e lu o k r e ś le n ia je j
p r a w d z iw e g o ś r e d n ie g o z a c h o w a n ia ( a n ie t y l k o g ó r n e g o o g r a n ic z e n ia ) j a k o fu n k c ji P ,
Q i D . ( N a w e t p r z y p a d e k Q = 0, k t ó r y w y m a g a ś r e d n io Q(L/y/~D) c y k ló w c z y t a n i a , je s t in t e r e s u ją c y ) .
408
SORTOWANIE
5.5
5.5. PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA Teraz, gdy już dobrnęliśmy prawie do końca tego wyjątkowo długiego rozdziału, dobrze jest „posortować” większość najważniejszych faktów, które były przed miotem naszych rozważań. Algorytm sortowania to m etoda przestawiania rekordów w pliku w taki sposób, żeby ich klucze były uporządkowane rosnąco. Takie uporządkowane roz mieszczenie rekordów jest użyteczne z kilku powodów: takie same klucze znajdują się obok siebie, możliwe jest efektywne przetwarzanie wielu plików uporząd kowanych według tego samego klucza, możemy stosować efektywne algorytmy wyszukiwania informacji i wyniki obliczeń mogą być prezentowane w sposób bardziej czytelny. Sortowanie wewnętrzne ma zastosowanie wtedy, kiedy wszystkie rekor dy mieszczą się w szybkiej, wewnętrznej pamięci kom putera. Mniej lub bar dziej szczegółowo zbadaliśmy kilkanaście algorytmów sortowania wewnętrznego i prawdopodobnie bylibyśmy szczęśliwsi, gdybyśmy nie poznali tak wielu różnych m etod sortowania! Poznanie wszystkich tych m etod dało nam wiele satysfakcji, ale teraz musimy stawać przed niewesołą perspektywą wyboru w danej sytuacji odpowiedniej metody. Byłoby pięknie, gdyby tylko jedna lub dwie m etody sortowania miały zdecy dowaną przewagę nad innymi, niezależnie od zastosowań i używanego komputera. Jednak w praktyce każda m etoda m a swoje zalety. W ydaje się na przykład, że sortowanie bąbelkowe (algorytm 5.2.2B) nie ma żadnych pozytywnych własności, ponieważ w każdym przypadku istnieje lepszy sposób postępowania. Okazuje się jednak, że nawet ta m etoda, odpowiednio uogólniona, znalazła swoje zastoso wanie w sortowaniu na dwóch taśm ach (zobacz punkt 5.4.8). Tak więc prawie wszystkie algorytmy zasługują na to, żeby o nich pamiętać, ponieważ w pewnych zastosowaniach okazują się najlepsze. Poniżej przedstawiam y krótki przegląd własności najważniejszych algo rytmów sortowania wewnętrznego. Jak zazwyczaj N oznacza liczbę rekordów w pliku. 1 . Zliczanie przez rozrzucanie, algorytm 5.2D, jest bardzo użyteczną m etodą w przypadku, gdy klucze pochodzą z bardzo małego zakresu. Jest ona stabilna (względny porządek rekordów o takich samych kluczach nie zmienia się), ale wymaga dodatkowej pamięci na liczniki i na zapamiętanie 2 N rekordów. Można zaoszczędzić miejsca na ^ z tych rekordów, ale kosztem stabilności (zobacz modyfikację opisaną w ćwiczeniu 5.2-13).
2. Proste wstawianie, algorytm 5.2.1S, jest łatwe do zaprogramowania, nie wymaga dodatkowej pamięci i zachowuje się dość dobrze dla małych N (po wiedzmy dla N < 25). Dla dużych N m etoda ta jest nieakceptowalnie wolna, z wyjątkiem przypadków, gdy sortowany plik jest już prawie uporządkowany. 3. Sortowanie Shella, algorytm 5 .2 .ID, jest także dość proste do zaprogra mowania i potrzebuje niewielkiej dodatkowej pamięci. Ta m etoda jest całkiem niezła dla niezbyt dużych wartości N (powiedzmy N < 1000).
5.5
PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA
409
4. Wstawianie do listy, algorytm 5.2.1L, jest podobne do prostego wstawia nia, ale nadaje się tylko dla małych wartości N. Podobnie jak inne m etody sor towania listowego omówione poniżej, w tej metodzie oszczędza się na przemiesz czaniu długich rekordów przez operowanie dowiązaniami. Takie postępowanie jest szczególnie przydatne, gdy rekordy są zmiennej długości lub są składowymi innych struktur danych. 5. Metody adresowe są efektywne, gdy znany jest rozkład kluczy (zazwyczaj jednostajny). Dwie główne takie m etody to wstawianie do wielu list (program 5.2.IM) i m etoda MacLarena, łącząca sortowanie przez wstawianie z sortowa niem pozycyjnym (omawiana pod koniec punktu 5.2.5). Tę ostatnią m etodę można zaimplementować, używając tylko 0 ( \ / N ) komórek dodatkowej pamięci. W twierdzeniu 5.2.5T omówiliśmy m etodę dwuprzebiegową, która m a zastoso wanie w przypadku nieznanych z góry rozkładów niejednostajnych. 6 . Scalanie z zam ianam i, algorytm 5 .2 . 2M (m etoda Batchera) i jego kuzyn sortowanie bitoniczne (ćwiczenie 5.3.4-10) znajdują szczególne zastosowanie, gdy wiele porównań można wykonywać jednocześnie.
7. Sortowanie szybkie, algorytm 5 .2 .2Q (m etoda H oare’a), jest prawdopo dobnie najbardziej użytecznym algorytmem sortowania wewnętrznego o ogólnym przeznaczeniu. W ymaga bardzo małej dodatkowej pamięci, a jego średni czas działania, przy dobrej implementacji, jest lepszy od średnich czasów działania innych algorytmów. Jednak w pesymistycznym przypadku może działać bardzo wolno. Tak więc, gdy dane nie są losowe, należy uważnie wybierać elementy dzielące. W ybór mediany z trzech elementów, jak zaproponowano w ćwiczeniu 5.2.2-55, czyni takie złe zachowanie bardzo mało prawdopodobne, jak również nieznacznie poprawia średni czas działania. 8. Proste wybieranie, algorytm 5.2.3S, jest bardzo prostą m etodą sortowa
nia, szczególnie wygodną w zastosowaniach, gdy dostępne jest szybkie, sprzętowo wspomagane, znajdowanie najmniejszego elementu na liście. 9. Sortowanie przez kopcowanie, algorytm 5.2.3H, nie wymaga dodatkowej pamięci i gwarantuje dość szybkie działanie. Średni i pesymistyczny czas działa nia są dwukrotnie gorsze od średniego czasu działania sortowania szybkiego. 10. Scalanie listowe, algorytm 5.2.4L, to rodzaj sortowania listowego, które, podobnie jak sortowanie kopcowe, gwarantuje dość szybkie działanie, nawet w pesymistycznym przypadku. Ponadto jest stabilne. 1 1 . Sortowanie pozycyjne, za pomocą algorytmu 5.2.5R, jest sortowaniem
listowym szczególnie przydatnym dla krótkich kluczy lub gdy można je wygodnie porównywać leksykograficznie. Alternatywnie do dowiązań można zastosować metodę zliczania przez rozrzucanie (punkt 1 powyżej). Taka procedura wymaga pamięci na 2N rekordów i dodatkowej tablicy na liczniki, ale prosta postać pętli wewnętrznej czyni ją szczególnie dobrą dla komputerów z superszybkimi ary t mometrami z antycypowanym sterowaniem. Ostrzeżenie: Sortowanie pozycyjne nie powinno być stosowane dla małych wartości AM
410
SORTOWANIE
5.5
12. Scalanie ze wstawianiem, zobacz punkt 5.3.1, jest szczególnie przydatne przy bardzo m ałych N w podprogram ach nie zawierających pętli. Jest to odpo wiednia m etoda dla zastosowań, które wym agają sortowania wielu grup po pięć lub sześć rekordów. 13. Możliwe są także m etody hybrydowe, łączące w sobie jedną lub więcej z m etod opisanych powyżej. Dla przykładu, scalanie ze wstawianiem może być wykorzystywane do sortowania krótkich podplików pojawiających się w sorto waniu szybkim. 14. O statnia, nie nazwana m etoda, opisana w odpowiedzi do ćwiczenia 5.2.1-3, wydaje się mieć najkrótszą możliwą implementację. Jednakże jej średni czas działania, proporcjonalny do 7V3, czyni ją najwolniejszą z m etod przedsta wionych w tej książce! W tabeli 1 zaprezentowano charakterystyki czasowe i pamięciowe implemen tacji wielu z tych m etod na maszynie MIX. Ważne jest, żeby zdawać sobie sprawę, że elementy tej tabeli ukazują tylko w przybliżeniu względne czasy sortowań odnoszą się one tylko do jednego kom putera, a założenia o danych wejściowych nie odpow iadają w pełni wszystkim programom. Takie tabele porównawcze two rzyło wielu autorów, ale żadni dwaj nie doszli do tych samych wniosków. Z drugiej strony, ponieważ m aszyna MIX jest bardzo typową maszyną, czasy przedstawione w naszej tabeli dają z pewnością wyobrażenie o tym, czego należy oczekiwać od poszczególnych algorytmów, gdy zastosujemy je do posortowania stosunkowo małej tablicy jednosłowowych rekordów. Kolum na „Pamięć” w tabeli 1 zawiera informacje o wielkości dodatkowej pamięci wykorzystywanej przez każdy z programów, gdzie m iarą jest jednostkowa długość rekordu. T utaj e jest równe stosunkowi długości pola na dowiązanie do długości rekordu. Tak więc na przykład N ( 1 + e) oznacza, że dana m etoda wymaga przestrzeni dla N rekordów i dodatkowo dla N pól na dowiązania. Tabela 1 zawiera tylko dominujące składniki (dla dużych N ) z asympto tycznych, średnich i pesymistycznych czasów działania, przy założeniu losowych danych; c oznacza niesprecyzowaną stałą. Te wzory są często mylące, dlate go podano także rzeczywiste czasy działania każdego z programów, dla dwóch szczególnych ciągów danych wejściowych. Przypadek N = 16 odnosi się do szesnastu kluczy, które pojaw iały się tak wiele razy w punkcie 5.2, natom iast przypadek N = 1000 odpowiada ciągowi K i, K 2 , . . . , i^iooo zdefiniowanemu jak następuje: #1001 = 0;
# „ _ ! = (3141592621#n + 2113148651) mod 1010.
Każdemu z algorytmów z tabeli odpowiada dobrze napisany program w języku MIX, często zawierający usprawnienia, które zaproponowano w ćwiczeniach. Za rozmiar b a jtu w naszych implementacjach przyjęto 100. M etody sortowania zewnętrznego różnią się od m etod sortowania wewnętrz nego, ponieważ musimy stosować w nich stosunkowo proste struktury danych i kładzie się w nich duży nacisk na minimalizowanie czasów wejścia/wyjścia.
Metoda
PORÓWNANIE METOD SORTOWANIA W EW NĘTRZNEGO NA MASZYNIE MIX
01
Odnośnik
Ccc3 '$ v *£* 72 o 2 xl ci CO
Czas działania
S Ü
Pamięć
Średni
Pesymistyczny N = 16 N = 1000
Uwagi
Ćw. 5.2-5
TAK
22
N(l+e)
4 N 2+ 1 0 N
5.5N 2
1065
3992432
c
Ćw. 5.2-9 Ćw. 5.2.1-33 Prog. 5.2.ID Ćw. 5.2.1-33 Prog. 5.2.IM Ćw. 5.2.2-12 Prog. 5.2.2Q
TAK TAK NIE TAK NIE NIE NIE
26 10 21 19 18 35 63
277+lOOOe
22A+10010 1.57V2+9.57V 3.9N 7/ 6+10/V lg 7V+1667V i.2 5 Y 2+13.25Y .0175iV2+187V 2.875AT(lg N ) 2 11.67N In IV—1.74 AT
22 N 3N 2 c N 4/ 3 2.5N 2 3.5N 2 4Y(lg N ) 2 ^ 2N 2
10362 412 567 433 645 939 470
32010 1491928 128758 1248615 35246 284366 81486
a d, h b, c b, c, f, i
Ćw. 5.2.2-55 Prog. 5.2.2R Prog. 5.2.3S
NIE NIE NIE
100 45 15
7V+2e lg N 7V+6 8e
> N2 272N
N
10.63N In 7V+2.127V 14.437V In A +23.9N 2.5AT2+3AGn N
3.2&N2
487 1135 853
74574 137614 2525287
e g> b i j
Prog. 5.2.3H Prog. 5.2.4L
NIE TAK
30 44
N N( 1+e)
23.08N lnTV+O.OlA 14.437V ln N+4.92A^
24.5N In N l4.4N\nN
1068 761
159714 104716
h, j b, c, j
Prog. 5.2.5R
TAK
36
N + e ( N + 200)
32A+4838
32 N
4250
36838
b, c
N+l N + e lg N N( 1+e) N + e { N + 100) N jV+2e lg N
411
Tylko klucze trzycyfrowe. Tylko klucze sześciocyfrowe (tzn. trzybajtowe). Plik wejściowy pozostaje bez zmian; końcowe uporządkowanie jest zadane w ukryty sposób za pomocą dowiązań lub liczników. Skoki takie, jak w 5 .2 .1 -(n ); trochę lepszy ciąg skoków opisano wćwiczeniu 5.2.1-29. M = 9, wykorzystano SRB; dla wersji z DIV, do średniego czasu działania należy dodać 1.60A. M ~ 100 (rozmiar bajtu). M = 34, ponieważ 234 > 1010 > 233. Średni czas oszacowano doświadczalnie, ponieważ tu taj teoria jest niepełna, Średni czas wyznaczono przy założeniu jednostajnego rozkładu kluczy. Dalsze usprawnienia, o których mowa w tekście i w ćwiczeniach odnoszących się do tego programu, mogą zmniejszyć jego czas działania.
I BIBLIOGRAFIA
a: b: c: d: e: f: g: h: i: j:
ę*
PODSUMOWANIE, HISTORIA
Zliczanie przez porównywanie Zliczanie przez rozrzucanie Proste wstawianie Sortowanie Shella Wstawianie do listy Wstawianie do wielu list Scalanie z zamianami Sortowanie szybkie Sortowanie szybkie z wyborem z 3 Sortowanie pozycyjne Proste wybieranie Sortowanie przez kopcowanie Scalanie listowe Listowe sortowanie pozycyjne
Tabela 1
412
SORTOWANIE
5.5
P u n k t 5.4.6 zawiera omówienie interesujących m etod sortowania taśmowego. P u n k t 5.4.9 poświęcono dyskom i bębnom. Oczywiście, sortowanie to nie wszystko. Badając różne metody sortowania, nauczyliśmy się wiele o strukturach danych, o tym, jak radzić sobie z pamięciami zewnętrznymi i w jaki sposób analizować algorytmy. Być może nauczyliśmy się również nieco o tym, w jaki sposób układać nowe algorytmy. W c z e s n e b a d a n ia . W poszukiwaniu zawiązków współczesnych m etod sor towania przenieśmy się do dziewiętnastego wieku, kiedy to powstały pierwsze maszyny sortujące. W Stanach Zjednoczonych, na początku każdej dekady prze prowadzano spis ludności. Już w 1880 roku okazało się, że problem przetworzenia tak obszernej ilości danych jest bardzo uciążliwy. Stało się tak, że w tabelach statystycznych nie uwzględniono liczby osób żyjących w stanie kawalerskim lub panieńskim (w przeciwieństwie do osób żyjących w związku małżeńskim), mi mo że niezbędne informacje zostały zebrane. Herman Hollerith, dwudziestoletni pracownik Biura Spisów, opracował genialny, elektryczny tabulator, którego za daniem było sprostanie coraz większym wymaganiom na dostarczanie różnego rodzaju statystyk. Około 100 takich maszyn zostało z sukcesem wykorzystanych w 1890 roku. Na rysunku 94 pokazano oryginalne urządzenie Holleritha zasilane bate rią. Na naszą szczególną uwagę zasługuje „skrzynia sortująca” po prawej stro nie, która jest otw arta, żeby można było zobaczyć połowę z 26 wewnętrznych przedziałów. O perator wkładał pod „prasę” kartę dziurkowaną o wymiarach
R ys. 94.
O r y g i n a l n a m a s z y n a H o lle r it h a . ( F o t o g r a fię z a m ie s z c z o n o d z ię k i u p r z e jm o ś c i
a r c h iw ó w I B M ) .
5.5
PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA
413
6 ! " x 3 |" i pociągał za rączkę. W efekcie sprężynowe szpilki znajdujące się na
górnej płycie stykały się z rtęcią ze zbiorniczków na płycie dolnej, w miejscach odpowiadających dziurkom na karcie. Zamknięte w ten sposób obwody powo dowały przesunięcie o jednostkę odpowiednich tarcz. Dodatkowo otw ierała się jedna z 26 pokryw na skrzyni sortującej. W tym momencie operator otwierał prasę, wkładał kartę do odpowiedniego przedziału i zamykał pokrywę. Podobno znalazła się osoba, która za pomocą tej maszyny przetworzyła w ciągu jednego 6 ^-godzinnego dnia pracy 19071 kart, co daje średnio około 49 kart na minutę! (Przeciętny operator robił to trzy razy wolniej). Liczba ludności szybko rosła i pierwsze maszyny do tabulowania i sortowania okazały się za wolne do obsługi spisu z 1900 roku. Żeby zażegnać kolejny kry zys związany z przetwarzaniem tak wielkiej ilości danych, Hollerith opracował kolejne urządzenie. Jego nowa maszyna (opatentowana w latach 1901 i 1904) automatycznie pobierała karty i w zasadzie wyglądała podobnie do dzisiejszych sorterów kart. Historię wczesnych maszyn Holleritha interesująco i ze szczegółami opisał Leon E. Truesdell, The Development o f Punch Card Tabulation (Washing ton: U.S. Bureau of the Census, 1965); zobacz także prace z tam tego okresu w Columbia College School o f Mines Quarterly 10 (1889), 238-255; J. Franklin Inst. 129 (1890), 300-306; The Electrical Engineer 12 (November 1 1 , 1891), 521-530; J. A m er. Statistical Assn. 2 (1891), 330-341, 4 (1895), 365; J. Royal Statistical Soc. 55 (1892), 326-327; Allgemeines statistisches A rchiv 2 (1892), 78-126; J. Soc. Statistique de Paris 33 (1892), 87 -9 6 ; U.S. Patents 395781 (1889), 685608 (1901), 777209 (1904). Hollerith i jeszcze jeden pracownik Biura Spisów, James Powers, stworzyli konkurujące ze sobą firmy, które ostatecznie stały się, odpowiednio, częścią IBM i korporacji Remington Rand. Pomysły wykorzystane w maszynie sortującej Holleritha są w rzeczywistości podstawą m etod sortowania pozycyjnego stosowanych w dzisiejszych kom pute rach cyfrowych. W jego patencie mówi się, że dwukolumnowe liczby m ają być sortowane „oddzielnie dla każdej kolumny” , ale nigdzie nie jest powiedziane, która z kolumn powinna być rozważana jako pierwsza. P atent o numerze 518240 z 1894 roku, przynależny do Johna K. G ore’a, opisuje inną wczesną maszynę sortującą dla kart, gdzie proponuje się zacząć od sortowania kolumny dziesiątek. Całkiem nieoczywista sztuczka, polegająca na zaczynaniu od kolumny jedności, została prawdopodobnie wymyślona przez anonimowego operatora i przekaza na innym (zobacz punkt 5.2.5). Jej opis można znaleźć w jeszcze istniejących instrukcjach obsługi sorterów IBM-owskich (1936). Pierwsza znana wzmianka o tej metodzie „z prawa na lewo” znajduje się w książce R oberta Feindlera, Das Hollerith-Lochkarten-Verfahren (Berlin: Reimar Hobbing, 1929), 126-130. W mniej więcej tym samym czasie wspomniano o niej także w artykule L. J. Comriego w Transactions o f the Office Machinery Users’ Association (London: 1930), 2 5 -3 7 . Nawiasem mówiąc, Comrie był pierwszą osobą, która zauważyła, że tabulatory można owocnie zastosować do obliczeń naukowych, chociaż ich pierwotnym przeznaczeniem było przygotowywanie danych statystycznych i księ gowych. Jego artykuł jest szczególnie interesujący, ponieważ podaje szczegółowy opis przyrządów do tabulowania dostępnych w Anglii w 1930 roku. Maszyny
414
SORTOWANIE
5.5
sortujące w tam tym czasie przetwarzały od 360 do 400 kart na minutę i można je było wypożyczyć za 9 funtów miesięcznie. Pomysł scalania związany jest z inną maszyną do przetwarzania kart, scalaczem, który był o wiele późniejszym wynalazkiem (1938 rok). Z pomocą dwóch stacji podających scalacz był w stanie połączyć dwie posortowane talie kart w jedną w jednym przebiegu; m etoda scalania została jasno opisana w pierwszym IBM-owskim podręczniku użytkowania scalacza (kwiecień 1939 roku). [Zobacz Jam es W. Bryce, U.S. Patent 2189024 (1940)]. Wreszcie na scenę wkroczyły komputery, a sortowanie stało się częścią ich rozwoju; w rzeczywistości, istnieją na to dowody, program sortujący był pierw szym program em napisanym na kom puter z programami umieszczanymi w jego pamięci. Projektanci kom putera EDVAC byli szczególnie zainteresowani sorto waniem, gdyż uwypuklało ono potencjalne, nienumeryczne zastosowania kom puterów. Zdawali sobie sprawę, że zadowalający kod rozkazu powinien pozwolić na zapisywanie programów nie tylko do rozwiązywania równań różniczkowych, ale musi być też na tyle elastyczny, żeby można było uwzględnić kombinatoryczne aspekty „podejmowania decyzji” pojawiające się w algorytmach. Dlatego w 1945 roku, John von Neumann, żeby sprawdzić przydatność pewnych kodów instrukcji, które zaproponował dla kom putera EDVAC, napisał kilka programów dla sortowania wewnętrznego przez scalanie. Istniejące wydajne maszyny sortu jące były naturalnym standardem , według którego zaproponowana przez niego stru k tu ra kom putera mogła być oceniana. Szczegóły tego ciekawego wydarzenia zostały opisane w artykule D. E. Knutha, Computing Surveys 2 (1970), 247-260; zobacz również von Neum ann Collected Works 5 (New York: Macmillan, 1963), 196-214, gdzie zamieszczono dopracowane, ostateczne wersje jego pierwotnych programów sortujących. W Niemczech w 1945 roku, K. Zuse niezależnie opracował program dla sortowania przez proste wstawianie, jako jeden z najprostszych przykładów ope racji na listach liniowych w zaproponowanym przez niego języku „Plankalkiil” . (Ta pionierska praca pozostawała nieopublikowana przez blisko 30 lat; zobacz Berichte der Gesellschaft für M athem atik und Datenverarbeitung 63 (Bonn: 1972), część 4, 8 4 -8 5 ). Zaplanowana dla wczesnych komputerów pamięć wewnętrzna o małym, ogra niczonym rozmiarze skłaniała do myślenia zarówno o sortowaniu zewnętrznym, jak i wewnętrznym. W raporcie z wyników prac nad maszyną EDVAC („Report on the EDVAC” ), przygotowanym przez J. P. Eckerta i J. W. Mauchly’ego z Moore School of Electrical Engineering (30 września 1945 roku), wskazywano na to, że kom puter wyposażony w druty magnetyczne lub urządzenia taśmowe, mógłby symulować maszyny sortujące, uzyskując przy tym większą szybkość sor towania. W raporcie opisano zrównoważone dwustopniowe sortowanie pozycyjne oraz zrównoważone scalanie dwuwejściowe, wykorzystujące cztery przewody ma gnetyczne lub urządzenia taśmowe, wczytując lub zapisując „co najmniej 5000 impulsów na sekundę” . W 1946 roku, John Mauchly mówił o „sortowaniu i scalaniu” na specjalnej sesji poświęconej obliczeniom, mającej miejsce w Moore School. Z notatek do jego
5.5
PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA
415
wykładu powstało pierwsze opulikowane omówienie sortowania komputerowego [Theory and Techniques for the Design o f Electronic Digital Com puters, pod redakcją G. W. Pattersona, 3 (1946), 22.1-22.20]. Mauchly rozpoczął swoją prezentację od interesującej uwagi: „Wymaganie od jednej maszyny, by jednocze śnie potrafiła liczyć i sortować, może wydawać się tym samym co wymaganie od pojedynczego urządzenia, by pełniło równocześnie funkcję otwieracza do konserw i pióra wiecznego” . Następnie zauważył, że urządzenie zdolne do wykonywania skomplikowanych procedur m atem atycznych musi mieć również zdolność do sor towania i klasyfikowania danych. Pokazał, że sortowanie może być użyteczne w połączeniu z obliczeniami numerycznymi. Opisał proste wstawianie i wstawia nie binarne, zauważając przy tym, że pierwsza m etoda potrzebuje średnio około N 2/4 porównań, a druga z nich nigdy nie wymaga więcej niż N l g N . Stwier dził jednak, że wyszukiwanie binarne wymaga dość skomplikowanej struktury danych, po czym wykazał, że do scalania dwuwejściowego wystarcza taka sam a m ała liczba porównań, przy wykorzystaniu tylko sekwencyjnego dostępu do list. O statnia część wykładu dotyczyła m etod sortowania pozycyjnego z częściowymi przebiegami, które symulują sortowanie kart cyfrowych na czterech taśm ach, przy mniej niż czterech przebiegach na każdą cyfrę (zobacz punkt 5.4.7). W krótce potem , Eckert i Mauchly założyli firmę, która produkowała jedne z pierwszych komputerów elektronicznych, BIN AC (do zastosowań wojskowych) oraz UNIVAC (do zastosowań komercyjnych). Amerykańskie Biuro Spisów po nownie odegrało częściową rolę w procesie rozwoju komputerów, otrzym ując pierwszy egzemplarz UNIVAC-a. W tym czasie nie było jasne, czy kom putery będą ekonomicznie opłacalne; mogły sortować szybciej niż urządzenia do sorto wania kart, ale były droższe. Dlatego programiści UNIVAC-a, pod kierownictwem Frances E. Holberton, włożyli dużo wysiłku w przygotowanie programów bardzo szybkiego sortowania zewnętrznego, a ich pierwsze programy m iały wpływ na prace nad sprzętem. Według ich szacunków, 100 milionów rekordów o rozmiarze 10 słów można było posortować na UNIVAC-u w 9000 godzin lub 375 dni. UNIVAC I, oficjalnie zaprezentowany w lipcu 1951 roku, miał pamięć we wnętrzną zbudowaną z tysiąca 12-znakowych (72-bitowych) słów. Był w stanie odczytywać z taśm y i zapisywać na taśmie bloki o rozmiarze 60 słów, z szybkością 500 słów na sekundę; można było czytać zarówno w przód, jak i wstecz, możliwe też było jednoczesne czytanie, zapisywanie i obliczanie. W 1948 roku pani Hol berton opracowała interesujący sposób wykonywania scalania dwuwejściowego, z doskonałym pokrywaniem się czytania, zapisywania i obliczania, wykorzystując do tego celu sześć wejściowych buforów: z każdym plikiem wejściowym wiążemy jeden „bieżący bufor” i dwa „bufory pomocnicze” ; scalanie można przeprowadzać w taki sposób, że kiedykolwiek nadchodzi czas wypisania na wyjście jednego bloku, dwa bieżące bufory zawierają w sumie jeden blok nie przetworzonych rekordów. Tak więc podczas formowania każdego wyjściowego bloku dokładnie jeden bufor staje się pusty, co umożliwia taką organizację obliczeń, żeby zawsze trzy, spośród czterech pomocniczych buforów, były pełne w czasie wczytywania do czwartego. Ta m etoda jest trochę szybsza od m etody z przewidywaniem z algorytmu 5.4.6F, ponieważ nie istnieje potrzeba kontroli wyniku jednego wczy
416
SORTOWANIE
5.5
tyw ania przed rozpoczęciem następnego. [Zobacz „Collation M ethods for the UNIVAC System” , (Eckert-M auchly Com puter Corp., 1950), 2 tomy]. Punktem kulminacyjnym tej pracy był generator programów sortujących, który okazał się pierwszym poważnym programem, jaki kiedykolwiek został na pisany do wspomagania autom atyzacji programowania. Użytkownik określał roz m iar rekordu, pozycje do pięciu kluczy w polach składowych każdego rekordu oraz klucze-znaczniki oznaczające koniec pliku. Mając takie dane, generator tworzył chroniony prawem autorskim program sortujący pliki jednotaśmowe. Pierwszy przebieg tego program u polegał na sortowaniu wewnętrznym bloków, po 60 słów każdy. Do tego celu stosowano zliczanie przez porównywanie (algo rytm 5.2C). Następnie wykonywano pewną liczbę przebiegów zrównoważonego scalania dwuwejściowego. W ykorzystywano czytanie wstecz i unikano blokowania taśm y w sposób opisany powyżej. [Zobacz „Master Generating Routine for 2-way Sorting” (Eckert-Mauchly Division of Remington Rand, 1952); pierwsza wersja tego rap o rtu była zatytułow ana „M aster Préfabrication Routine for 2-way Colla tion” . Zobacz również F. E. Holberton, Sym posium on A utom atic Programming (Office of Naval Research, 1954), 34-39]. Do 1952 roku znanych już było wiele m etod sortowania wewnętrznego, ale podstawy teoretyczne sortowania wewnętrznego rozwinęły się w niewielkim stop niu. Daniel Goldenberg [„Time analyses of various m ethods of sorting d ata” , Digital Com puter Laboratory memo M-1680 (Mass. Inst, of Tech., 17 Octo ber 1952)] zaprogramował dla kom putera W hirlwind pięć różnych algorytmów sortowania i dokonał analizy najlepszego i najgorszego przypadku dla każdego z tych programów. Odkrył, że do posortowania stu słów 15-bitowych z kluczami 8-bitowymi najszybszym sposobem było wykorzystanie 256-słowowej tablicy, w której każdy rekord umieszcza się na pozycji odpowiadającej wartości jego klucza, a następnie kompresuje się całą tablicę. M etoda ta m iała jednak wyraźną wadę, gdyż gubiła dany rekord, gdy tylko któryś z kolejnych rekordów miał ten sam klucz. Pozostałe cztery algorytmy Golgenberg uszeregował następująco (od najlepszego do najgorszego): proste scalanie dwuwejściowe, sortowanie pozycyjne o podstawie 2 , proste wybieranie, sortowanie bąbelkowe. W yniki Goldenberga zostały rozwinięte przez Harolda H. Sewarda w jego pracy magisterskiej z 1954 roku [„Information sorting in the application of electronic digital com puters to business operations” , Digital Com puter Lab. report R-232 (Mass. Inst, of Tech., 24 May 1954; 60 pages)]. Seward był autorem pomysłów zliczania przez rozrzucanie i wyboru z podmianą; pokazał, że średnia długość pierwszego sekwensu w losowej perm utacji wynosi e — 1 . Analizował zarówno sortowania wewnętrzne, jak i zewnętrzne, dla różnych rodzajów pamięci masowych, w tym także taśm . Być może jeszcze większą wagę m iała praca - w istocie praca doktorska - napisana w 1956 roku przez Howarda B. Dem utha [„Electronic D ata Sor ting” (Stanford University, October 1956), 92 pages; IE E E Trans. C -3 4 (1985), 296-310]. P raca ta legła u podstaw teorii złożoności obliczeniowej. Rozważa się w niej trzy abstrakcyjne modele obliczeń dla problemu sortowania: z pa mięcią cykliczną, liniową i o dostępie swobodnym. Dla każdego z tych modeli
5.5
PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA
417
zaproponowano optymalne lub prawie optym alne rozwiązania (zobacz ćwiczenie 5.3.4-68). Chociaż z pracy D em utha nie wynikały żadne bezpośrednie praktyczne rozwiązania, rzuciła ona światło na to, jak łączyć teorię z praktyką. Tak więc historia sortowania jest ściśle związana z wieloma „pierwszymi” wydarzeniami w informatyce: pierwsze maszyny przetwarzające dane, pierwsze maszyny z programami w pamięci, pierwsze oprogramowanie, pierwsze m etody buforowania, pierwsza praca na tem at analizy algorytmów i złożoności oblicze niowej . Żadna z prac na tem at komputerów, wspomnianych do tej pory, nie jest „otwarcie” dostępna. Tak naprawdę większość m ateriałów dotyczących począt ków historii informatyki to stosunkowo trudno dostępne raporty, gdyż niewiele osób interesowało się informatyką w tam tym czasie. M ateriały dotyczące sor towania ukazały się w końcu w druku w latach 1955-1956, w postaci trzech artykułów przeglądowych. Pierwsza praca była dziełem J. C. Hoskena [Proc. Eastern Joint Com puter Conference 8 (1955), 39-55]. Rozpoczął bystrą obserwacją: „W celu obniżenia kosztu jednostkowego produktu (danych wyjściowych), najczęściej zwiększa się objętość wykonywanych operacji. Jednak w przypadku sortowania koszt jed nostkowy miast spadać, rośnie” . Hosken wymienił wszystkie dostępne na rynku specjalizowane urządzenia sortujące, jak również m etody sortowania za pomocą komputerów. Stworzona przez niego bibliografia zawierająca 54 pozycje pow stała głównie na podstawie broszur producentów. Obszerna praca „Sorting on Electronic Com puter Systems” , napisana przez E. H. Frienda [JACM 3 (1956), 134-168], była kamieniem milowym w rozwoju sortowania. Choć od 1956 roku opracowano wiele nowych m etod, praca ta pod wieloma względami jest ciągle niezwykle aktualna. Friend podał precyzyjne opisy kilku algorytmów sortowania wewnętrznego i zewnętrznego, a szczególnie wiele uwagi poświęcił m etodom buforowania i taśm om magnetycznym. W prowadził kilka nowych m etod (na przykład wybieranie drzewowe, dwugłowej żmii czy przepowiadanie) oraz pokazał pewne m atem atyczne własności starszych m etod. Trzecim przeglądem m etod sortowania, który ukazał się w tam tym cza sie, była praca D. W. Daviesa [Proc. Inst. Elect. Engineers 103B , Supplement 1 (1956), 87-93]. W kolejnych latach ukazały się inne godne uwagi artykuły przeglądowe: D. A. Bell [Comp. J. 1 (1958), 71-77]; A. S. Douglas [Comp. J. 2 (1959), 1 -9 ]; D. D. McCracken, H. Weiss, T. Lee [Programming Business Computers (New York: Wiley, 1959), rozdz. 15, ss. 298-332]; I. Flores [JACM 8 (1961), 41-80]; K. E. Iverson [A Programming Language (New York: Wiley, 1962), rozdz. 6 , 176-245]; C. C. Gotlieb [CACM 6 (1963), 194-201]; T. N. Hibbard [CACM 6 (1963), 206-213]; M. A. Goetz [Digital Com puter User’s Handbook, pod redakcją M. Klerera i G. A. Korna (New York: McGraw-Hill, 1967), rozdz. 1 .10 , ss. 1.292-1.320]. W listopadzie 1962 stowarzyszenie ACM sponsorowało sympozjum na tem at sortowania; większość prac tam prezento wanych zostało opublikowanych w 1963 roku w majowym wydaniu C A C M i są one dobrym odzwierciedleniem ówczesnego stanu wiedzy. Szczególnie wartymi uwagi artykułam i w tej kolekcji są: przegląd współczesnych generatorów progra
418
SORTOWANIE
5.5
mów sortujących, napisany przez C. C. Gotlieba, przegląd algorytmów sortowa nia wewnętrznego z minimalną pamięcią, napisany przez T. N. Hibbarda oraz przegląd ówczesnych badań nad sortowaniem dyskowym, podany przez G. U. Hubbarda. W okresie tym powstawały również nowe metody sortowania: z wyliczaniem adresów (1956), scalanie ze wstawianiem (1959), pozycyjne z zamianami (1959), scalanie kaskadowe (1959), sortowanie Shella (1959), scalanie wielofazowe (1960), wstawianie do drzewa (1960), sortowanie oscylacyjne (1962), szybkie sortowanie Hoare’a (1962), sortowanie przez kopcowanie Williamsa (1964), scalanie z zamia nami Batchera (1964). Historia każdego z tych algorytmów została prześledzona w części rozdziału poświęconej temu algorytmowi. Późne lata sześćdziesiąte były także okresem bujnego rozwoju teorii sortowania. Pełna bibliografia prac poświęconych sortowaniu, które autor prześledził podczas pisania pierwszej wersji tego rozdziału, została opracowana przy pomocy R. L. Rivesta i ukazała się w Computing Reviews 13 (1972), 283-289. P ó źn iejsze b ad ania. Dziesiątki algorytmów sortujących zostało wymyślonych
począwszy od 1970 roku, choć niemal wszystkie są odmianami znanych wcześniej. Sortowanie szybkie z wieloma kluczami, które jest omawiane w odpowiedzi do ćwiczenia 5.2.2-30, jest doskonałym przykładem takiej nowej metody. Innym kierunkiem badań, jak dotąd tylko o znaczeniu teoretycznym, jest poszukiwanie metod sortowania, które są adaptacyjne w tym sensie, że działają szybciej dla danych wejściowych prawie uporządkowanych według różnego ro dzaju kryteriów. Zobacz dla przykładu H. Mannila, IEEE Transactions C-34 (1985), 318-325; V. Estivill-Castro i D. Wood, Computing Surveys 24 (1992), 441-476; C. Levcopoulos i O. Petersson, Journal of Algorithms 14 (1993), 395-413; A. Moffat, G. Eddy i O. Petersson, Software Practice &: Experience 26 (1996), 781-797. Zmiany w sprzęcie komputerowym były początkiem wielu interesujących badań nad wydajnością algorytmów sortowania przy innych kryteriach kosztu; zobacz dla przykładu ćwiczenie 5.4.9-20, gdzie jest mowa o pamięci wirtualnej. Wpływ pamięci podręcznych na sortowanie wewnętrzne badali A. LaMarca i R. E. Ladner, J. Algorithms 31 (1999), 66-104. Jedna z ich konkluzji mówi, że krok Q9 w algorytmie 5.2.2Q jest złym pomysłem na współczesnych komputerach (chociaż był dobrym na tradycyjnych komputerach jak MIX). Zamiast kończyć sortowanie szybkie za pomocą prostego wstawiania, lepiej wcześniej sortować krótkie podpliki, gdy jeszcze znajdują się w pamięci podręcznej. Jaki jest stan obecny, jeśli chodzi o sortowanie dużych ilości danych? Jednym z popularnych punktów odniesienia po 1985 roku jest posortowanie miliona 100-znakowych rekordów, których 10-znakowe klucze są generowane losowo z roz kładem jednostajnym. O danych wejściowych, jak i wyjściowych, zakłada się, że powinny znajdować się na dysku. Celem jest minimalizacja całkowitego czasu sor towania, włączając w to czas uruchamiania programu. R. C. Agarwal [SIGMOD Record 25, 2 (June 1996), 240-246] wykorzystał komputer IBMRS/6000 model 39H do implementacji sortowania pozycyjnego z plikami dzielonymi na pasma
5.5
PODSUMOWANIE, HISTORIA I BIBLIOGRAFIA
419
rozmieszczane na 8 dyskach. Czas działania jego programu wyniósł 5.1 sekund. Wejście/wyjście było głównym problemem; w rzeczywistości procesor potrzebo wał jedynie 0.6 sekund na sterowanie właściwym sortowaniem! Przy większej liczbie procesorów możliwe są jeszcze lepsze czasy: Sieć 32 stacji roboczych UltraSPARC I, każda wyposażona w dwa wewnętrzne dyski, jest w stanie posor tować milion rekordów w 2.41 sekund za pomocą metody hybrydowej o nazwie NOW-Sort [A. C. Arpaci-Dusseau, R. H. Arpaci-Dusseau, D. E. Culler, J. M. Hellerstein i D. A. Patterson, SIGMOD Record 2 6 , 2 (June 1997), 243-254]. Taki postęp oznacza, że test kontrolny z milionem rekordów stał się głównie testem na czas rozruchu i zatrzymania systemu; do uzyskania bardziej obiektyw nych rezultatów potrzebne są większe zestawy danych. Dla przykładu, aktualny rekord świata dla sortowania terabajtowego - 1010 rekordów stuznakowych, usta nowiony we wrześniu 1997 roku na komputerze Silicon Graphics 0rigin2000 z 32 procesorami, 8 gigabajtami pamięci wewnętrznej i 559 dyskami 4-gigabajtowymi - wynosi 2.5 godziny. Rekord ten został ustanowiony przy użyciu komercyjnie dostępnego programu sortującego o nazwie Nsort™, opracowanego przez C. Nyberga, C. Koestera i J. Graya, wykorzystującego nie opublikowane jak dotąd metody. Być może kiedyś również test terabajtowy zostanie uznany za zbyt mały. Obecnie najlepszym kandydatem na test kontrolny, który będzie żył wiecznie, jest Sortowanie Minutowe. Jak wiele 100-znakowych rekordów można posortować w 60 sekund? W chwili, gdy ta książka była oddawana do druku, najlepszy wynik został ustanowiony 30 marca 1997 przez NOW-Sort; 95 stacji roboczych potrzebowało jedynie 59.21 sekund na posortowanie 90.25 milionów rekordów. Jednak współczesne metody sortowania są jeszcze dalekie od rzeczywistych, prawdziwie fundamentalnych ograniczeń szybkości. Podsumowując, problem efektywnego sortowania jest dzisiaj nadał tak samo fascynujący, jak był zawsze. ĆW ICZENIA 1.
[05] P o d s u m u j
z a w a rto ś ć
te g o
r o z d z ia łu ,
fo r m u łu ją c
u o g ó ln ie n ie
t w ie r d z e n ia
5 .4 .6 A .
2 . [20] K o r z y s t a j ą c z t a b e li 1 , w s k a ż n a j le p s z ą m e t o d ę s o r t o w a n ia lis t o w e g o k l u c z y s z e ś c io c y fr o w y c h n a k o m p u t e r z e MIX.
(Sortowanie stabilne w m inim alnej pamięci) P o w ie m y , ż e a lg o r y t m s o r t o w a n ia w y m a g a minim alnej pam ięci , je ś li n a s w o je z m ie n n e p r z e z n a c z a t y l k o 0 ( ( l o g N ) 2) b it ó w p a m ię c i, n ie lic z ą c p a m ię c i p o t r z e b n e j d o z a p a m ię t a n i a N r e k o r d ó w . A l g o r y t m p o w in ie n b y ć o g ó ln y w t a k i m z n a c z e n iu , ż e b y d z i a ł a ł d la k a ż d e g o N , a n ie t y l k o d la s z c z e g ó ln e j w a r t o ś c i N , p r z y z a ło ż e n iu , ż e m a m y w y s t a r c z a j ą c o w ie le p a m ię c i o d o s t ę p ie 3.
[37]
s w o b o d n y m , ile k r o ć t y l k o a lg o r y t m j e s t w y k o n y w a n y . W ie le z p r e z e n t o w a n y c h p r z e z n a s m e t o d s o r t o w a n ia n ie s p e łn i a w a r u n k u m in im a ln o ś c i; w s z c z e g ó ln o ś c i w t a k i m p r z y p a d k u z a b r o n io n e j e s t u ż y w a n ie N p ó l n a d o w ią z a n ia . S o r to w a n ie s z y b k ie ( a l g o r y t m 5 .2 .2 Q ) s p e łn i a w a r u n e k o m in im a ln e j p a m ię c i, a le je g o p e s y m i s t y c z n y c z a s d z i a ła n i a j e s t p r o p o r c jo n a ln y d o N 2 . S o r t o w a n ie k o p c o w e ( a lg o r y t m 5 .2 .3 H ) j e s t j e d y n y m
a lg o r y t m e m , j a k i p o z n a liś m y , d z i a ł a j ą c y m
w c z a s ie
420
SORTOWANIE
5.5
0 ( N lo g N ) i w m in im a ln e j p a m ię c i, c h o c ia ż m o ż n a b y z a p r o p o n o w a ć je s z c z e je d e n t a k i a lg o r y t m , k o r z y s t a j ą c z p o m y s łu z ć w ic z e n ia 5 .2 .4 - 1 8 . N a j s z y b s z y m z r o z w a ż a n y c h p r z e z n a s o g ó ln y c h a lg o r y t m ó w s o r t o w a n ia stabilne
go j e s t s c a la n ie lis t o w e ( a l g o r y t m 5 .2 .4 L ) , a le n ie d z i a ła o n w m in im a ln e j p a m ię c i. W z a s a d z ie j e d y n y m i p o z n a n y m i p r z e z n a s s t a b iln y m i a lg o r y t m a m i s o r to w a n ia , k t ó r e j e d n o c z e ś n ie u ż y w a j ą m in im a ln e j p a m ię c i, s ą a lg o r y t m y d z i a ł a j ą c e w c z a s ie Q ( N 2): ( p r o s t e w s t a w ia n ie , s o r to w a n ie b ą b e lk o w e i w a r ia n t p r o s t e g o w y b ie r a n ia ) . Z a p r o j e k t u j s t a b l in y a lg o r y t m
s o r t o w a n ia w m in im a ln e j p a m ię c i, p o t r z e b u ją c y
[Wskazówka: S c a la n ie s t a b i ln e m o ż n a w y k o n a ć w m in im a ln e j p a m ię c i w c z a s ie O ( N l o g N ) ] .
w p e s y m is ty c z n y m
► 4. [28]
p r z y p a d k u 0 ( N ( \ o g N ) 2) je d n o s t e k c z a s u
P o w ie m y , ż e a lg o r y t m
s o r t o w a n ia j e s t
oszczędny , je ś li s o r t u je t y l k o p r z e z
p o r ó w n y w a n ie k l u c z y i n i g d y n ie w y k o n u je p o r ó w n a ń , k t ó r y c h w y n i k m o ż n a w y d e d u k o w a ć n a p o d s t a w ie w y n ik ó w w c z e ś n ie js z y c h p o r ó w n a ń . K t ó r e z m e t o d z t a b e li 1 s ą oszczęd n e?
5. [46]
D u ż o t r u d n ie j j e s t s o r t o w a ć n ie lo s o w e d a n e z lic z n y m i, t a k im i s a m y m i k lu
c z a m i, n iż s o r t o w a ć lo s o w e d a n e o r o z k ła d z i e j e d n o s t a j n y m . Z a p r o p o n u j t e s t k o n tr o ln y , k tó ry
(i) b y ł b y in t e r e s u ją c y n a d z ie ń d z i s i e j s z y i p r a w d o p o d o b n ie p o z o s t a n ie in t e
r e s u j ą c y z a 100 l a t o d d z is ia j; (ii) n ie w y m a g a k o r z y s t a n i a z k l u c z y g e n e r o w a n y c h lo s o w o z r o z k ła d e m j e d n o s t a j n y m ; (iii) n ie u ż y w a z e s t a w ó w d a n y c h , k t ó r e z m ie n ia ją się w c z a s ie .
Osiągnąłbym swój cel, gdybym posortował i ułożył w logicznym porządku istotną treść z olbrzymiej ilości m ateriałów, które się pojaw iły w ostatnich kilku latach na tem at sortowania.
— J. C. H O S K E N (1 9 55 )
ROZDZIAŁ
SZÓSTY
WYSZUKIWANIE Zajrzyjm y do kartoteki. — AL S M IT H
(1 9 2 8 )
Ten rozdział mógłby mieć bardziej pretensjonalny tytuł - „Przechowywanie i wy szukiwanie informacji”. Można by go również nazwać po prostu „Przeszukiwanie tablic”. Zajmiemy się w nim metodami przechowywania informacji w pamięci komputera w taki sposób, żeby można było znajdować żądaną informację tak szybko, jak to tylko możliwe. Czasami ilość danych jest dużo większa od napraw dę potrzebnych, wówczas najwłaściwsze może okazać się zapomnieć i zniszczyć większość z nich. Jednak często ważne jest, żeby dane zapamiętać i zorganizować w sposób umożliwiający ich szybkie odzyskiwanie. Główna część tego rozdziału dotyczy bardzo prostego problemu wyszukiwa nia: w jaki sposób odnajdywać dane, które zostały zapamiętane razem z identy fikującą je funkcją. Dla przykładu, w zastosowaniach numerycznych moglibyśmy chcieć znajdować dla danych argumentów x wartości funkcji /(# ), mając daną tablicę wartości /. Przykładem nienumerycznego zastosowania może być chęć znalezienia angielskiego tłumaczenia słowa z języka rosyjskiego. W ogólności przyjmiemy, że mamy zapamiętany zbiór N rekordów, a nasze zadanie polega na zlokalizowaniu właściwego z nich. Podobnie jak w przypadku sortowania, przyjmujemy że każdy rekord zawiera wyróżnione pole klucz (key ). Ten termin jest wyjątkowo udany, ponieważ wiele osób spędza każdego dnia wiele czasu na poszukiwaniu swoich kluczy. Zazwyczaj wymagamy, żeby wszystkie N kluczy było parami różnych. Wówczas klucze jednoznacznie identyfikują odpo wiadające im rekordy. Zbiór wszystkich rekordów nazywamy tablicą lub plikiem , gdzie słowo „tablica” oznacza zwykle mały plik, natomiast słowo „plik” oznacza dużą tablicę. Duży plik lub grupę plików nazywa się często bazą danych. Argumentem w algorytmie wyszukiwania jest klucz K , a nasze zadanie polega na odnalezieniu rekordu z tym kluczem. Wyszukiwanie może zakończyć się na dwa sposoby: sukcesem polegającym na zlokalizowaniu jedynego rekordu zawie rającego klucz K lub niepowodzeniem oznaczającym, że rekordu z kluczem K nie ma. W przypadku niepowodzenia czasami żąda się, żeby do tablicy dodać nowy rekord z kluczem K Algorytmy, które tak właśnie działają nazywamy algorytmami wyszukiwania-i-wstawiania. W urządzeniach zwanych pamięciami asocjacyjnymi wyszukiwanie jest wykonywane automatycznie, w sposób przy pominający działanie ludzkiego mózgu. Jednak tutaj zajmiemy się metodami wyszukiwania na konwencjonalnych komputerach o ogólnym przeznaczeniu. 421
422
WYSZUKIWANIE
6
Chociaż celem wyszukiwania jest odnalezienie informacji zapamiętanej w re' kordzie o danym kluczu K , w algorytmach z tego rozdziału ignorujemy zazwyczaj wszystko poza samymi kluczami. W praktyce, po zlokalizowaniu klucza K , łatwo już odnaleźć związaną z nim informację. Dla przykładu, jeśli miejscem położenia klucza K jest T A B L E -j-i, związana z nim informacja (lub dowiązanie do niej) może znajdować się pod adresem T A B L E + i + 1 lub DATA + i itd. Dlatego wygodnie będzie pominąć szczegóły tego, co należy zrobić po odnalezieniu klucza. Wyszukiwanie jest najbardziej czasochłonną częścią wielu programów i za miana złej metody wyszukiwania na lepszą prowadzi zazwyczaj do istotnego przyśpieszenia takich programów. W rzeczywistości często jest możliwa taka organizacja danych, że wyszukiwanie zostaje wyeliminowane całkowicie, ponie waż zawsze wiemy, gdzie znajduje się potrzebna nam informacja. W tym celu powszechnie stosuje się struktury dowiązaniowe. Dla przykładu, na liście dwu kierunkowej nie ma potrzeby wyszukiwania poprzednika lub następnika danego elementu. Inny sposób unikania wyszukiwania ma miejsce wtedy, gdy mamy swobodę w wyborze kluczy, ponieważ wówczas mogłyby to być równie dobrze liczby {1, 2, . . . , AT}. Wtedy rekord zawierający K można po prostu umieścić pod adresem T A B L E + K Obie te metody zostały użyte do wyeliminowania wyszukiwa nia z algorytmu sortowania topologicznego, o którym była mowa w punkcie 2.2.3. Jednakże wyszukiwanie byłoby niezbędne, jeśli obiekty z algorytmu sortowania topologicznego byłyby identyfikowane przez nazwy symboliczne, a nie liczby. Okazuje się więc, że efektywne algorytmy wyszukiwania są rzeczywiście ważne pod względem praktycznym. Metody wyszukiwania można sklasyfikować na różne sposoby. Moglibyśmy podzielić je na wyszukiwanie wewnętrzne i zewnętrzne, tak jak to uczyniliśmy w przypadku sortowania. Moglibyśmy podzielić je także na wyszukiwanie sta tyczne i dynamiczne. Słowo „statyczne” oznacza, że zawartość tablic w istocie nie ulega zmianie (zatem ważne jest, żeby minimalizować czas wyszukiwania, nie licząc czasu na przygotowanie takiej tablicy). Natomiast słowo „dynamicz ne” oznacza, że tablica ulega częstym zmianom w wyniku wstawiania nowych elementów i być może usuwania starych. Trzeci możliwy schemat klasyfikacji polega na podziale wyszukiwania w zależności od tego, czy wyszukiwanie jest wykonywane przez porównywanie kluczy, czy też korzysta się z ich własności nu merycznych. Podobnie rozróżnialiśmy sortowanie przez porównywanie od sorto wania przez rozrzucanie. Na koniec moglibyśmy podzielić metody wyszukiwania na te, w których wykorzystywane są rzeczywiste klucze, i te, które korzystają z kluczy w zmienionych postaciach. Organizacja tego rozdziału w zasadzie odpowiada dwóm ostatnim schema tom klasyfikacji. W podrozdziale 6.1 zajmujemy się „siłowymi” metodami wyszu kiwania sekwencyjnego, a następnie w podrozdziale 6.2 omówimy usprawnienia, które bazują na porównywaniu kluczy i wykorzystują porządek alfabetyczny lub numeryczny do sterowania procesem podejmowania decyzji. Podrozdział 6.3 poświęcimy wyszukiwaniu pozycyjnemu, natomiast w podrozdziale 6.4 zajmiemy się ważną klasą metod zwaną haszowaniem. W haszowaniu wykorzystuje się
6
WYSZUKIWANIE
423
arytmetycznie przekształcone rzeczywiste klucze. W każdym z tych podrozdzia łów zajmujemy się zarówno wyszukiwaniem wewnętrznym, jak i wyszukiwaniem zewnętrznym, zarówno statycznym, jak i dynamicznym. Każdy podrozdział uka zuje zalety i wady różnych rozwiązań. Wyszukiwanie i sortowanie są ze sobą blisko związane. Rozważmy dla przy kładu następujący problem: Dane są dwa zbiory liczbowe, A = {ai, a2, • • • 5bn}. Należy sprawdzić, czy A C B. Trzy rozwiązania nasuwają się same. 1 . Porównuj każde ¿u 2 kolejnymi elementami bj, aż znajdziesz parę takich
samych elementów. 2. Posortuj elementy o i b, a następnie przejrzyj po kolei oba ciągi, spraw dzając odpowiednie warunki. 3. Wprowadź elementy b do tablicy, a następnie sprawdź dla każdego a*, czy pojawia się w tej tablicy. Zależnie od tego, jak wielkie są m i n, każde z tych rozwiązań znajduje swoje zastosowanie. Rozwiązanie 1 zajmuje w przybliżeniu cimn jednostek czasu dla pewnej stałej c\ , natomiast rozwiązanie 2 wymaga około (m lg m + n lg n) jed nostek dla pewnej (większej) stałej Przy zastosowaniu odpowiedniej metody haszowania rozwiązanie 3 zabierze w przybliżeniu c^m-\-cyn jednostek czasu dla pewnych (jeszcze większych) stałych C3 i C4. Wynika stąd, że rozwiązanie 1 jest dobre dla bardzo małych m i n, ale rozwiązanie 2 okazuje się natychmiast lepsze, gdy m i n stają się większe. Przy coraz większych n lepsze w końcu okazuje się rozwiązanie 3 aż do momentu, gdy n przekroczy rozmiar pamięci wewnętrznej. Wówczas znowu lepsze staje się rozwiązanie 2, chyba że n ponownie bardzo urośnie. Tak więc czasami dobrze sortowanie zastąpić wyszukiwaniem, a czasami wyszukiwanie lepiej zastąpić sortowaniem. Bardziej skomplikowane problemy wyszukiwania można często zredukować do prostszego przypadku rozważanego tutaj. Załóżmy na przykład, że kluczami są słowa, w których mogą być literówki. Pomimo błędów, naszym celem jest znalezienie właściwego rekordu. Jeśli wykonamy dwie kopie pliku, jedną, w której klucze znajdują się w porządku leksykograficznym, i drugą, w której klucze są uporządkowane z prawa na lewo (tak jak byśmy słowa czytali od tyłu), wówczas przekłamany argument wyszukiwania będzie prawdopodobnie zgadzał się z pewnym elementem z jednego z tych plików, na co najmniej połowie swojej długości. Dlatego do znajdowania klucza, o który nam prawdopodobnie chodzi, można zaadaptować metody wyszukiwania z podrozdziałów 6.2 i 6.3. Podobny problem wzbudził znaczne zainteresowanie w związku z systemami rezerwacji biletów lotniczych, jak i innymi zastosowaniami, w których łatwo o przekłamania nazwisk z powodu nieczytelnego pisma lub zniekształconego głosu. Naszym celem jest zakodowanie argumentu wyszukiwania w taki sposób, żeby wszystkie warianty tego samego nazwiska były blisko siebie. Następująca, współczesna postać metody „Soundex”, pochodzącej oryginalnie od Margaret K. Odell i Roberta C. Russella [zobacz U.S. Patents 1261167 (1918), 1435663 (1922)], jest często używana do kodowania nazwisk:
424
WYSZUKIWANIE
6
1. Zostaw pierwszą literę nazwiska i usuń wszystkie pozostałe wystąpienia liter a, e, h, i, o, u, w, y. 2. Pozostałym literom występującym po pierwszej literze przypisz następujące liczby: b, f, p, v —►1 c, g, j, k, q, s, x, z-> 2 d, t —>3
1 —>4 m, n —> 5 r —> 6
3. Jeśli dwie lub więcejliter o tym samym kodzie sąsiadowało ze sobą w orygi nalnym nazwisku (przed krokiem 1 ) lub były oddzielone tylko wystąpieniami h lub w, to pomiń je wszystkie z wyjątkiem pierwszej z nich. 4. Dokonaj konwersji do postaci „litera, cyfra, cyfra, cyfra”, dodając zera (jeśli cyfr jest mniej niż trzy) lub usuwając skrajnie prawe cyfry (jeśli jest ich więcej niż trzy). Dla przykładu, kodami nazwisk Euler, Gauss, Hilbert, Knuth, Lloyd, Lukasiewicz i Wachs są odpowiednio E460, G200, H416, K530, L300, L222, W200. Oczywiście w tym systemie grupowane są razem nazwiska, które się znacznie różnią, jak i te, które są podobne. Ten sam kod dostalibyśmy dla nazwisk Ellery, Ghosh, Heiłbronn, Kant, Liddy, Lissajous i Waugh. Z drugiej strony, podobne nazwiska, jak Rogers i Rodgers lub Sinclair i St. Clair czy też Tchebysheff i Chebyshev, pozosta ją odseparowane. Jednak w bardzo wielu przypadkach kod Soundex znakomicie zwiększa szansę znalezienia właściwego nazwiska mimo przekłamań. [Więcej na ten temat można znaleźć w pracach C. P. Bourne’a i D. F. Forda, JACM 8 (1961), 538-552, Leona Davidsona, CACM 5 (1962), 169-171 i w Federal Population Censuses 1790-1890 (Washington, D.C.: National Archives, 1971), 90]. Gdy używamy takiego systemu jak Soundex, nie musimy rezygnować z zało żenia, że wszystkie klucze są różne. Możemy umieścić na jednej liście wszystkie rekordy o tym samym kodzie, a każdą z list traktować jako jeden element. W dużych bazach danych proces wyszukiwania informacji jest bardziej skom plikowany, ponieważ za potencjalne klucze przyjmuje się często wiele różnych pól w rekordzie i żąda się możliwości wyszukiwania dla tylko częściowo wyspecyfiko wanych argumentów. Na przykład w dużej bazie danych artystów producent mo że chcieć znaleźć wszystkie niezatrudnione aktorki w wieku 25-30 lat, utalento wane tanecznie i mówiące z francuskim akcentem. W dużym pliku statystycznym o rozgrywkach piłkarskich dziennikarz sportowy może zechcieć odnaleźć liczbę zwycięstw piłkarzy FC Barcelony w mistrzostwach kraju z 1964 roku, w których wygrywali co najmniej dwiema bramkami. Mając dany duży plik danych o czym kolwiek, można sobie wyobrazić zadawanie dowolnie skomplikowanych zapytań. Na przykład za bazę danych moglibyśmy uważać całą bibliotekę, a Czytelnik mógłby chcieć znaleźć wszystko, co było opublikowane na temat wyszukiwania informacji. Podrozdział 6.5 jest wprowadzeniem do metod wyszukiwania infor macji z takim (wieloatrybut owym) kluczem pomocniczym. Zanim przystąpimy do szczegółowych rozważań nad wyszukiwaniem, może okazać się pomocne, żeby spojrzeć na ten problem z perspektywy historycz
6.1
WYSZUKIWANIE LINIOWE
425
nej. W erze przedkomputerowej pojawiło się wiele książek z tablicami loga rytmicznymi, trygonometrycznymi itd., dzięki którym obliczenia matematyczne można było zastąpić wyszukiwaniem. Następnie tablice przeniesiono na karty dziurkowane i używano do obliczeń naukowych razem z maszynami scalającymi, sortującymi czy też dziurkarkami powielającymi. Po ukazaniu się komputerów z zapamiętywanymi programami szybko okazało się, że lepiej za każdym razem obliczać logrr lub cos#, niż wyszukiwać odpowiedzi w tablicy. Chociaż problem sortowania przyciągnął znaczącą uwagę już od pierwszych dni ery komputerowej, to stosunkowo mało zrobiono w przypadku algorytmów wyszukiwania. Przy małej pamięci wewnętrznej i przy braku innych mediów do przechowywania dużych plików, poza pamięciami o dostępie sekwencyjnym jak taśmy, wyszukiwanie albo było niesłychanie proste, albo w ogóle niemożliwe. Pojawienie się w latach pięćdziesiątych coraz większych i większych pamięci o dostępie swobodnym doprowadziło w końcu do uznania wyszukiwania jako ważnego i interesującego problemu. Po latach narzekania na ograniczoną ilość pa mięci we wczesnych maszynach, programiści zostali nagle skonfrontowani z dużą ilością pamięci, o której nie wiedzieli, jak ją efektywnie wykorzystać. Pierwsze przeglądy wyników na temat problemu wyszukiwania zostały opu blikowane przez A. I. Dumeya, Computers & Automation 5 , 12 (December 1956), 6 - 9; W. W. Petersona, IBM J. Research & Development 1 (1957), 130-146; A. D. Bootha, Information and Control 1 (1958), 159-164; A. S. Douglasa, Comp. J . 2 (1959), 1-9. Szerzej pisali później Kenneth E. Iverson, A Program ming Language (New York: Wiley, 1962), 133-158, i Werner Buchholz, IBM Systems J. 2 (1963), 86-111. Jak się wkrótce przekonamy, we wczesnych latach sześćdziesiątych pojawiło się szereg algorytmów wyszukiwania z wykorzystaniem struktur drzewiastych. Obecnie wyszukiwanie jest nadal przedmiotem aktywnych badań.
6-1. W YSZU K IW A N IE LINIOW E
„Przeglądaj klucze kolejno, aż znajdziesz ten właściwy; następnie zakończ wy szukiwanie” . Taki algorytm jest oczywistym sposobem wyszukiwania i stanowi dobry punkt startowy do naszych rozważań nad nim. Wyszukiwanie liniowe jest podstawą wielu bardziej skomplikowanych algorytmów. Przekonamy się, że mimo swojej prostoty, wyszukiwanie liniowe zawiera w sobie pewne interesujące idee. Algorytm wyszukiwania liniowego można sformułować bardziej precyzyjnie w następujący sposób. A lg o ry tm S ( Wyszukiwanie liniowe). Dana jest tablica rekordów R i ,R 2,...,R n , o kluczach, odpowiednio, Ab, K 2i. . . , K ^. Argumentem wyszukiwania w tym algorytmie jest K. Zakładamy, że N > 1.
51. [Inicjowanie] i <— 1. 52. [Porównywanie] Jeśli K = Ki, algorytm kończy się sukcesem.
426
WYSZUKIWANIE
6.1
53. [Dalej] Zwiększ z o l . 54. [Koniec pliku?] Jeśli i < N, wróć do S2. W przeciwnym razie algorytm kończy się niepowodzeniem. | Zauważmy, że wykonywanie tego algorytmu może zakończyć się na dwa sposoby, sukcesem (gdy poszukiwany klucz zostaje zlokalizowany) lub niepowo dzeniem (stwierdzeniem, że dany argument nie występuje w tablicy). To samo dotyczy większości pozostałych algorytmów w tym rozdziale.
t Nie
v SI. Inicjowanie
+(^S2. Porównaj
S3. Dalej
. f S4. Koniec pliku? Tak
Y
Y
SUKCES
NIEPOWODZENIE
R y s . 1.
W y s z u k i w a n ie lin io w e .
Program w języku MIX można napisać od ręki. P r o g r a m S ( Wyszukiwanie liniowe). Zakładamy, że Ki znajduje się pod ad
resem KEY + z, natomiast pozostałą część rekordu Ri znajdziemy pod adresem INFO + i. W programie poniżej rA = K, rll = i — N . LDA ENT1 02 CMPA 03 2H JE 04 INC1 05 J1NP 06 07 FAILURE EQU 01
START
K 1-N KEY+N,1 SUCCESS 1 2B *
1 1 C C C - S C —S 1 — 5
S l . Inicjowanie. i <- 1 . S2. Porównaj. K o n ie c z
K — Ki.
S3. D a le j. S4. K o n iec pliku? K o n ie c - n ie p o w o d z e n ie .
Instrukcja „LDA INF0+N,1” zapisana pod adresem SUCCESS spowoduje umiesz czenie poszukiwanej informacji w rA. | Analiza tego programu jest prosta. Wynika z niej, że czas działania algoryt mu S zależy od dwóch parametrów, C = liczba porównań kluczy;
5 — 1 przy sukcesie, 0 przy niepowodzeniu.
(i)
Program S zabiera 5C —25 + 3 jednostek czasu. Jeśli wyszukiwanie kończy się sukcesem z K = K i , to wówczas C = ż, 5 = 1, a stąd całkowity czas działania wynosi (5i + 1)u. Z drugiej strony, jeśli wyszukiwanie kończy się niepowodze niem, to C = N , S = 0, co daje czas działania równy (5N + 3)u. Jeśli każdy klucz występuje z takim samym prawdopodobieństwem, to średnią wartością C w przypadku sukcesu będzie 1 + 2+
N
b N _ A^ + l ” 2
(4
WYSZUKIWANIE LINIOWE
6.1
427
Odchylenie standardowe jest oczywiście dość duże i wynosi około 0.289N (zobacz ćwiczenie 1 ). Powyższy algorytm jest z pewnością powszechnie znany. Jednak tylko nie wiele osób wie, że nie jest to zawsze najwłaściwszy sposób implementacji wyszu kiwania liniowego! Prosta zmiana czyni ten algorytm szybszym, chyba że lista rekordów jest wyjątkowo krótka. A lg o ry tm Q (Szybkie wyszukiwanie liniowe). Ten algorytm jest taki sam jak
algorytm S, z wyjątkiem tego, że na końcu pliku zakłada się występowanie rekordu domyślnego ifo+ i. Q l . [Inicjowanie] Wykonaj i 1 i Kjy+i K. Q 2 . [Porównywanie] Jeśli K = Ki, przejdź do Q4. Q3. [Dalej] Zwiększ z o l i wróć do Q2. Q4. [Koniec pliku?] Jeśli i < JV, algorytm kończy się sukcesem, w przeciwnym razie kończy się niepowodzeniem (i = N + 1). | P rogram Q (Szybkie wyszukiwanie liniowe). rA = A, rll = i — N. 01 02
START
LDA STA
03
ENT1
K -N
IN C 1
1
05 06 07 08
CMPA
KEY+N , 1
JN E
*-2
J1N P
SU CCESS
F A IL U R E EQU
1
KEY+N+1
04
*
Q l . Inicjowanie . K N+1 < - K .
1 1
. ¿« -0 .
1 - 5 Q3. D a le j. C + 1 - 5 Q 2JP orów n ą jL C + 1 - 5 D o Q 3 , je ś li K i + K . 1 Q4. K o n iec pliku? (7 +
1 — 5
K o n ie c - n ie p o w o d z e n ie .
|
Biorąc pod uwagę wielkości C i 5 z analizy programu S, czas działania zmniejszył się do (4Ć7 —45 + 10)u. To jest lepiej, gdy C > 6 i wyszukiwanie kończy się sukcesem oraz gdy N > 8 i wyszukiwanie kończy się niepowodzeniem. Przejścia od algorytmu S do algorytmu Q dokonujemy, wykorzystując pewną ważną zasadę przyśpieszania: Jeśli w pętli wewnętrznej programu sprawdzamy więcej niż jeden warunek, należy spróbować zredukować liczbę sprawdzanych warunków do jednego. Korzystając z jeszcze innej metody, uczynimy program Q jeszcze szybszym. P rogram Q' (Szybsze wyszukiwanie liniowe). rA = JT, rll = i —N. 01 02 03 04 05 06 07 08 09 10 11
START
3H
K
1
STA
LDA
KEY+N+1
1
ENT1
-1-N
CMPA KEY+N , 1 JE
L((7 -
4F
CMPA K E Y + N + 1 , 1 JN E IN C 1 4H
1
[ ( C - S + 2)/2\ [(C - S + 2 )/ 2 j
IN C 1 2
3B
5 + 2 )/2 j
[(C -5 + 1)/2 J
[(O -
S + 1)/2 J
1
((7 - 5 ) m o d 2
J1N P SU CCESS
1
F A IL U R E EQU
*
1 — 5
Q l . Inicjowanie. K N+1 < - K . i<-------- 1 . Q3. D a le j, ( d w a r a z y ) Q 2JP orów na j± D o Q 4 , je ś li K = K i, Q 2 . Porów naj, ( n a s t ę p n e ) D o Q 3 , je ś li K ^
K l+ l.
Z w ię k s z i. Q Ł K o n ie c pliku? K o n ie c - n ie p o w o d z e n ie .
|
428
WYSZUKIWANIE
6.1
Pętla wewnętrzna została zduplikowana. W ten sposób unikamy około połowy instrukcji przypisania „i i + 1 ”, redukując czas wykonania do 3.5C - 3.5S + 10 + (C ~ S\ m° - 2 jednostek. Dla dużych tablic oszczędzamy 30 procent z czasu działania programu S. W ten sam sposób można usprawnić wiele istniejących programów. Te same idee mają zastosowanie w językach programowania wysokiego poziomu [Zobacz na przykład, D. E. Knuth, Computing Surveys 6 (1974), 266-269]. Algorytm wyszukiwania liniowego można lekko zmodyfikować, gdy wiemy, że klucze są uporządkowane rosnąco: A lgorytm T ( Wyszukiwanie liniowe w tablicy uporządkowanej). Dana jest ta blica rekordów i?i, , R n , których klucze są uporządkowane rosnąco K \ < K 2 < ••• < K n . Argumentem wyszukiwania jest K . Dla wygody i szybkości obliczeń przyjmujemy, że dany jest domyślny rekord iijv+i, dla którego klucz K j v - f i = 00 > K .
T l. [Inicjowanie] i «— 1. T 2 . [Porównywanie] Jeśli K < Ki, przejdź do T4. T3. [Dalej] Powiększ i o 1 i wróć do T 2. T4. [Równość?] Jeśli K — Ki, to algorytm kończy się sukcesem. W przeciwnym razie kończy się niepowodzeniem. | Jeśli wszystkie klucze wejściowe są jednakowo prawdopodobne, to ten algo rytm, dla obliczeń kończących się sukcesem, zabiera w zasadzie tyle samo czasu co algorytm Q. Jednak wyszukiwanie kończące się niepowodzeniem jest prawie dwukrotnie szybsze, ponieważ brak rekordu można stwierdzić dużo wcześniej. W każdym z powyższych algorytmów wykorzystuje się indeksy do wyzna czania elementów w tablicy. Wygodniej jest opisywać omawiane metody wyszu kiwania z pomocą takich indeksów, ale te same algorytmy można zastosować do tablic o reprezentacji dowiązaniowej, ponieważ dane i tak są przeglądane po kolei. (Zobacz ćwiczenia 2, 3 i 4). Częstość odwołań. Jak dotąd zakładaliśmy, że każdy argument pojawia się tak samo często jak każdy inny. Nie jest to zawsze realistyczne założenie. W ogólności klucz K j pojawia się z prawdopodobieństwem p j, gdzie p i+ p 2 -f------ 1~ P n = 1- Czas potrzebny na wykonanie wyszukiwania kończącego się sukcesem jest w zasadzie proporcjonalny do liczby porównań C, której średnią wartością jest C N = p i + 2p 2 +
b NpN .
(3)
Jeśli mamy możliwość rozmieszczania rekordów w tablicy w dowolnym porządku, to wówczas wielkość C m jest najmniejsza, gdy P l
> P
2
> •••
> P N ,
to jest wtedy, kiedy najczęściej używane rekordy znajdują się na początku.
(4)
WYSZUKIWANIE LINIOWE
6.1
429
Przyjrzyjmy się kilku rozkładom prawdopodobieństwa, żeby przekonać się, jak wiele zaoszczędzamy, gdy rekordy są rozmieszczone zgodnie z (4). Jeśli pi — P2 — ***= P n = 1/AĆ, z (3) otrzymujemy, że Cjy = (N + l)/2 , co dostaliśmy już w (2). Załóżmy z drugiej strony, że Pi
_ 1
2’
^
_ 1
4’
***7
P n —
1
1
2 ^-1 5
1
2 ^ —1"
Wówczas C# = 2 —21_iV (zobacz ćwiczenie 7). W tym przypadku średnia liczba porównań jest m n ie js z a od dwóch. Innym rozkładem prawdopodobieństwa, który się narzuca, jest Pi = Nc,
p2 = ( N - l) c ,
PN=C,
gdzie c =
2
+
.
(6 )
Ten rozkład nie odbiega tak bardzo od rozkładu jednostajnego jak rozkład (5 ). W tym przypadku dostajemy, że N
CN = c '£ k ( N + l - k ) = ^ l ,
(7)
fc=l
zatem oszczędzamy na czasie wyszukiwania około jednej trzeciej, w stosunku do przypadku, w którym rekordy są uporządkowane losowo. Oczywiście rozkłady prawdopodobieństwa z (5) i (6) są dość sztuczne i nie odzwierciedlają zbyt dobrze rzeczywistości. Dużo bardziej typowym ciągiem prawdopodobieństw jest ciąg Zipfa PI = c/l,
P2 —c/ 2 ,
pn = c/N ,
gdzie c = 1/ H N .
(8)
Ten rozkład został spopularyzowany przez G. K. Zipfa, który zauważył, że n-te najbardziej popularne słowo w języku naturalnym pojawia się z częstością pro porcjonalną w przybliżeniu do l/n . [The Psycho-Biology of Language (Boston, Mass.: Houghton Mifflin, 1935); Human Behavior and the Principle of Least Effort (Reading, Mass.: Addison-Wesley, 1949)]. Zipf zaobserwował też, że to samo zjawisko występuje w tablicach demograficznych, kiedy obszary miejskie są uporządkowane malejąco ze względu na liczbę ludności. Jeśli ciąg Zipfa odpowiada częstościom zapytań o klucze w tablicy, to natychmiast mamy, że CN = N /H n ,
(9)
co oznacza, że przeszukiwanie takiego pliku jest około ^lniV razy szybsze od przeszukiwania tego samego pliku, ale z losowym porządkiem rekordów. [Zobacz A. D. Booth, L. Brandwood, J. P. Cleave, Mechanical Resolution of Linguistic Problems (New York: Academic Press, 1958), 79]. Innym przybliżeniem rzeczywistych rozkładów jest praktyczna reguła „80-20”, którą obserwuje się powszechnie w zastosowaniach handlowych [zobacz na przy kład W. P. Heising, IBM Systems J. 2 (1963), 114-115]. Reguła ta mówi, że 80 procent odwołań odnosi się do co najwyżej 20 procent najbardziej aktywnych elementów pliku. Ta sama reguła stosuje się teraz do tych 20 procent najbardziej
430
6.1
WYSZUKIWANIE
aktywnych elementów, tak więc 64 procent odwołań ma zastosowanie do co najwyżej 4 procent najbardziej aktywnych elementów itd. Innymi słowy P i + P 2 +-----+ ^•2Q n- sa 0.80 Pl + P2 + P 3 4 \~Pn
Jeden z rozkładów, zgodnych z tą regułą dla wygląda następująco: P1 =C,
P2 = (2e- l ) c ,
dla każdego n. n
ps = (3e —2e)c,
( 10)
będących wielokrotnościami 5, pN = (N e- ( N - l ) e)c,
( 11 )
gdzie <1 2 >
ponieważ w tym przypadku pi + P2 + ■• *+ Pn — dla każdego n. Analiza rozkładu z (n ) nie jest łatwa, mamy jednak n6 —(n —l) e = On6" 1(l + G (l/n)), tak więc istnieje prostszy rozkład, który w przybliżeniu odpowiada regule 80-20. Jest nim rozkład P i =
c / l i ~ e
, p 2 = c/21~d,
pN = c /N 1- 0,
gdzie c =
( 13)
Tutaj, jak poprzednio, 0 = l o g 0 .8 0 / l o g 0.20, a jest A -t ą liczbą harmoniczną rzędu s, czyli l -s + 2“s + ■• • + N ~ s. Zauważmy, że ten rozkład prawdopodobień stwa jest bardzo podobny do rozkładu Zipfa z (8); gdy 0 zmienia się od 1 do 0, rozkład prawdopodobieństwa zmienia się od rozkładu jednostajnego do rozkładu Zipfa. Stosując (3) do ( 13 ), dostajemy średnią liczbę porównań dla reguły 80-20 (zobacz ćwiczenie 8) C N = H k 9)/H % ~e) =
+ O iN 1- 6) « 0.122JV.
(M)
Z badań nad częstościami występowania poszczególnych słów, przeprowa dzonych przez E. S. Schwartza [zobacz interesujący wykres na stronie 422 cza sopisma JACM 10 (1963)], wynika, że w takim przypadku lepszym rozkładem od rozkładu Zipfa (8) jest rozkład ( 13 ) z niewielką u j e m n ą wartością 0. W tym przypadku średnia wartość C„ =
'/*»-»> = f l +
+ O (N ^)
( . 5)
jest dla N —>00 istotnie mniejsza od tej z (9). Rozkłady takie, jak ( 11 ) i ( 13 ), były po raz pierwszy badane przez Vilfredo Pareto w związku z różnicami między zgłaszanymi dochodami a zamożnością [Cours d ’Economie Politique 2 (Lausanne: Rouge, 1897), 304-312]. Jeśli pk jest proporcjonalne do zamożności h-tego najbogatszego osobnika, to prawdopodo bieństwo, że zamożność tej osoby jest większa lub równa x razy od zamożności najbiedniejszego osobnika, wynosi A;/iV, gdy x = P k / P N • Zatem, gdy P k = ck e ~ l i x = ( k /N )e~l , wspomniane prawdopodobieństwo wynosi x ~ l ^ l ~e\ Taki roz kład nazywamy rozkładem Pareto z parametrem 1/(1 —6).
WYSZUKIWANIE LINIOWE
6.1
431
Ciekawe, że Pareto nie rozumiał swojego własnego rozkładu. Wierzył, że wartość 6 bliska 0 odpowiada społeczeństwu bardziej egalitarnemu niż ta sama wartość bliska 1 . Jego błąd naprawił Corrado Gini [Atti della III Riunione della Societa Italiana per il Progresso delle Scienze (1910), a także przedruk w Memorie di Metodologia Statistica 1 (Rome: 1955), 3-120], który jako pierwszy podał i wyjaśnił ważne wskaźniki podobne do zasady 80-20 z ( 10). Ciągle jednak występuje niezrozumienie takich rozkładów. Mówi się często o „zasadzie 75-25” lub „zasadzie 90-10”, jako o zasadach a-6, które mają sens tylko wtedy, kiedy a + b — 100, podczas gdy z ( 12) wynika, że suma 80 -f 20 nie ma większego znaczenia. Inne rozkłady dyskretne, analogiczne do ( 11 ) i ( 13 ), zostały wprowadzone przez G. Udny’ego Yulego w związku z jego badaniami nad rozwojem gatun ków biologicznych jako funkcji czasu, przy założeniu różnych modeli ewolucyj nych [.Philos. Trans. B 2 1 3 (1924), 21-87]. Rozkład Yulego ma zastosowanie, gdy 6 < 2: c 2c Pl = C, p 2 = - 7» P3 = 77 7777 77 > 2 -0 ’^ (3 —0)(2 —0) ’ 0 ±
»PiV = (V
v
x
(iV —l)!c (N —6 ) ... (2 —0)
c (£ -* )’
)
y N
j
Wartości graniczne c = 1 /H n lub c = l / N mają zastosowanie, gdy 0 = o lub 0 = 1. Sam oorganizujące się pliki. Analiza rozkładów jest bardzo przyjemna, ale
w większości przypadków nie znamy rozkładu prawdopodobieństwa. Moglibyśmy związać z każdym rekordem licznik odwołań i przemieszczać rekordy zgodnie z wartościami liczników. Wzory otrzymane powyżej sugerują, że takie postępo wanie prowadzi do istotnych oszczędności. Prawdopodobnie jednak nie chcemy poświęcić tak wiele pamięci na liczniki, ponieważ można taką pamięć wykorzystać lepiej, stosując nieliniowe metody wyszukiwania, o których będzie mowa dalej w tym rozdziale. Żeby utrzymywać zupełnie dobrą kolejność rekordów, nie musimy używać liczników. Wystarczy zastosować bardzo prosty schemat postępowania, będący w użyciu od szeregu lat, ale którego pochodzenie nie jest znane. Za każdym razem po zlokalizowaniu rekordu, przesuń go na początek tablicy. Pomysł takiej „samoorganizującej się” metody wynika z obserwacji, że naj częściej używane rekordy mają tendencję do grupowania się na początku tablicy. Jeśli przyjmiemy, że N kluczy występuje z prawdopodobieństwami odpowiednio { P i) P 2 ł ■■* 5 P a t} i że każde wyszukiwanie jest w pełni niezależne od wcześniej szych wyszukiwań, to można pokazać, że średnia liczba porównań potrzebna do zlokalizowania elementu w takiej samoorganizującej się strukturze dąży do granicznej wartości PiPj
1
432
WYSZUKIWANIE
6.1
(Zobacz ćwiczenie 11). Na przykład, jeżeli Pi = 1 /ATdlal < i < 7V, nasza samoor ganizująca się tablica jest zawsze uporządkowana losowo, a powyższy wzór redu kuje się do znanego, już otrzymanego wyrażenia, (iV + l)/2. W ogólności, średnia liczba porównań ( 17 ) jest zawsze mniejsza od podwojonej optymalnej wartości (3 ), ponieważ C n < 1 + U ~ 1)Pj = 2Cn — 1. W rzeczywistości Ć n jest zawsze mniejsze od tt/2 razy optymalna wartość C n [Chung, Hajela, Seymour, J. C om p. S yst. Sci. 36 (1988), 148-157]. W ogólności ten czynnik jest najlepszym z możliwych, ponieważ jest osiągalny, gdy p j jest proporcjonalne do l / j 2. Zobaczmy, jak dobrze zachowuje się algorytm samoorganizujący, gdy rozkład prawdopodobieństw dla kluczy jest rozkładem Zipfa (8). Mamy r —1 1 Cn~ 2 + 1
(CA)(CA?) _ 1 i r 2N
1 r n
7/T+c/j ~ 2 1
2
N
N
= - + c Y d{ H N + i - H i ) = - + c Y , H i - 2 c Y d H i 2=1
i= 1
1= 1
= 1 + c ( ( 2 N + 1 ) H2N — 2N — 2 ( N + 1 ) H N + 2 N )
£
= l + c ( N l a 4 - I n N + 0 ( 1)) & 2 N / l g N ,
(18)
co dostajemy z zależności 1.2.7-(8) i 1 .2 .7- ( 3). To jest istotnie lepiej niż gdy N jest odpowiednio duże, i to jest tylko około ln 4 w 1.386 razy więcej od liczby porównań dla optymalnego rozmieszczenia rekordów (zobacz (9)). Eksperymenty komputerowe przeprowadzane na rzeczywistych tablicach symboli występujących w procesie kompilacji pokazują, że samoorganizujący się algorytm zachowuje się nawet lepiej, ponieważ kolejne wyszukiwania nie są niezależne (małe grupy kluczy mają tendencję do występowania razem). Taki samoorganizujący się schemat po raz pierwszy został zaanalizowany przez Johna McCabe’a [O perations Research 13 (1965), 609-618], który podał wzór ( 17 ). McCabe zaproponował także inny interesujący schemat postępowania, w którym każdy zlokalizowany klucz, poza pierwszym, jest po prostu zam ie n ian y z kluczem poprzedn im , a nie przesuwany od razu na początek. McCabe przypuszczał, że graniczny średni czas wyszukiwania nigdy nie przekroczy ( 17 ). Kilka łat później Ronald L. Rivest udowodnił, że w rzeczywistości w metodzie transpozycji używa się dużo m n iej porównań niż w metodzie z przesuwaniem na początek, jeśli rozważyć dostatecznie wiele zapytań. Wyjątkiem jest oczywiście N < 2 i przypadek, w którym wszystkie niezerowe prawdopodobieństwa są takie same [C A C M 19 (1976), 63-67]. Jednakże zbieżność metody transpozycyjnej jest dużo wolniejsza niż metody z przesuwaniem na początek. Dlatego, jeśli wy szukiwanie nie jest powtarzane bardzo wiele razy, lepszą metodą jest przesuwanie na początek [J. R. Bitner, S IC O M P S (1979), 82-110]. Dodatkowo, J. L. Bentley, C. C. McGeoch, D. D. Sleator i R. E. Tarjan udowodnili, że w metodzie z przesu waniem na początek, liczba odwołań do pamięci jest zawsze mniejsza lub równa od poczwórnej liczby odwołań wykonywanych na liście liniowej przez dowolny
WYSZUKIWANIE LINIOWE
6.1
433
algorytm - nawet taki, w którym ciąg zapytań jest znany z góry (tej własności nie mają metody: z licznikami częstości i transpozycyjna [CACM 28 (1985), 202-208, 404-411]. W pracy R. Bachracha i R. El-Yaniva (SODA 8 (1997), 53-62), znajdziemy opis interesujących badań przeprowadzonych na ponad 40 heurystykach dla samoorganizujących się list. Spójrzmy na nasz problem z jeszcze innego punktu widzenia. Załóżmy, że tablica, w której wyszu kujemy, jest zapamiętana na taśmie i że poszczególne rekordy mogą mieć różne długości. Dla przykładu w dawnych systemach operacyjnych tak właśnie wyglą dała taśma z biblioteką systemową. „Rekordami” na tej taśmie były standardowe programy systemowe takie jak kompilatory, asemblery, programy ładujące czy też generatory raportów. Większość zadań użytkowników rozpoczynała się od wy szukania na takiej taśmie odpowiedniego programu. Takie postawienie problemu czyni nasze dotychczasowe analizy niepraktycznymi, ponieważ krok S3 wymaga za każdym razem innego czasu. W takim wypadku liczba porównań nie może być jedynym kryterium, które należy wziąć pod uwagę. Niech Li będzie długością rekordu Ri i niech pi będzie prawdopodobieństwem, że zapytamy o ten właśnie rekord. Średni czas wyszukiwania w takim przypadku będzie w przybliżeniu proporcjonalny do P rzeszu k iw an ie ta śm z rekordam i różnej d łu g o ści.
p \ L i + P 2 ( L i + L 2 ) + ■* • 4- p n { L \ + L% + T
3
+ • ■• + L p f ) .
( 19 )
Dla L\ = L2 = • • • = L jsi = 1 to redukuje się do (3), czyli do przypadku już wcześniej zbadanego. Wydaje się logicznym, żeby umieścić na początku taśmy częściej poszu kiwane rekordy. Okazuje się, że czasami to nie jest dobry pomysł! Załóżmy dla przykładu, że na taśmie znajdują się tylko dwa programy, A oraz £ , i że program A jest używany dwa razy częściej niż program £ , ale jest czterokrotnie dłuższy. Tak więc N = 2 , pA — | , L a — 4, pB = §, L B ~ 1. Jeśli, „zgodnie z logiką”, umieścimy program A jako pierwszy na taśmie, to średni czas wyszukiwania będzie wynosił | ■4 + ~ *5 = Jeśli jednak postąpimy „niezgodnie z logiką” i jako pierwszy umieścimy program £ , to wówczas średni czas działania redukuje się do | *1 + | *5 = Optymalne rozmieszczenie programów na taśmie można wyznaczyć w nastę pujący sposób. T w ierd zen ie S. Niech Li i pi będą takie, jak zdefiniowano powyżej. Rozmiesz
czenie rekordów w tablicy jest optymalne wtedy i tylko wtedy; gdy P i/L i > P2 /L 2 > • • • >
(20)
P n /L n .
Innymi słowy, minimalna wartość P a xL ai
+
P a2 (L a 1 +
A z 2 )
H
+
P a N { L ax Ą
+
L a N ),
po wszystkich permutacjach a ia 2 ...ajv zbioru {1,2,...,7V} jest równa ( 19) wtedy i tylko, gdy zachodzi (20).
434
WYSZUKIWANIE
6.1
Dowód. Załóżmy, że na taśmie zamieniono rekordy Ri oraz Ri+\. Koszt ( 19) zmienia się z ■■ ■ +
P i ( L 1 +
* ■* +
L i - 1 +
L i)
+
P i + \ ( L i
+
• • • +
£ ¿ + 1 )
+
■* *
na * * *
+
P i + i { L \
+
* • * +
L i - 1 +
L i + 1 )
4- P i ( L i
+
* - * +
^ ¿ + 1 )
+
• ■* ,
a zmiana wartości tej sumy wynosi —pi+iLi. Z tego powodu, jeśli Pi/Li < Pi+i/.Łi+i, to taka zmiana poprawia średni czas działania, a dane rozmieszczenie rekordów nie jest optymalne. Wynika stąd, że (20) zachodzi dla każdego opty malnego rozmieszczenia. Odwrotnie, załóżmy, że zachodzi (20). Należy udowodnić, że takie rozmiesz czenie jest optymalne. Powyższe uzasadnienie dowodzi, że takie rozmieszczenie jest „lokalnie optymalne” w takim znaczeniu, że sąsiednie zamiany nie powodują żadnych ulepszeń. Może jednak istnieje długi, skomplikowany ciąg zamian, który prowadzi do lepszego „globalnego optimum”. Przedstawimy dwa dowody, jeden „informatyczny”, a drugi „matematyczny”. Pierwszy dowód. Załóżmy, że zachodzi (20). Wiemy, że każdą permutację można posortować w porządku R\ R 2 ... R n za pomocą zamian sąsiednich rekordów. W każdej z tych zamian .. .R j R i . .. zostaje zastąpione przez ... R{Rj ... dla pewnych i < j. W ten sposób czas wyszukiwania maleje o nieujemną wiel kość piLj —p jL i. Dlatego minimalny czas działania dostajemy dla porządku R \ R 2 ... R n . Drugi dowód. Zamień każde prawdopodobieństwo pi przez Pi{e) = Pi + e* - (e1 + e2 + • • ■+ eN)/N ,
(21 )
gdzie e jest bardzo małą liczbą dodatnią. Jeśli e jest wystarczająco małe, nigdy nie dostaniemy x\p\(e) H \~x n Pn {ć) = 2/iPi(e)H \-Vn Pn {L)^ chyba że x\ — 2 / 1 , . . . , x n = Vn *W szczególności w (20) nie będziemy mieli równości. Rozważmy AH permutacji rekordów. Co najmniej jedna z nich jest optymalna i wiemy, że spełnia ona (20). Jednak dla tylko jednej permutacji zachodzi (20), ponieważ nie ma równości. Wynika stąd, że (20) jednoznacznie charakteryzuje optymalne rozmieszczenie rekordów w tablicy dla prawdopodobieństw Pi(e), jeśli tylko e jest wystarczająco małe. Z ciągłości wynika, że to samo rozmieszczenie musi być także optymalne, gdy e jest równe zeru. (Takie dowody, polegające na pozbywaniu się równości, są często używane w optymalizacji kombinatorycznej). | Twierdzenie S pochodzi od W. E. Smitha, Naval Research Logistics Quar~ terly 3 (1956), 59-66. W ćwiczeniach poniżej przedstawimy dalsze wyniki na temat optymalnych organizacji plików. Ć W IC ZEN IA 1.
[M20\ J e ś li w s z y s t k i e k lu c z e s ą je d n a k o w o p r a w d o p o d o b n e , t o ile w y n o s i o d c h y le
n ie s t a n d a r d o w e d la ś r e d n ie j l ic z b y p o r ó w n a ń w w y s z u k iw a n iu lin io w y m z a k o ń c z o n y m s u k c e s e m , w t a b l i c y z a w i e r a ją c e j N r e k o r d ó w ?
WYSZUKIWANIE LINIOWE
6.1 2.
[15]
435
Z a p is z a lg o r y t m S z a p o m o c ą n o t a c ji d o w ią z a n io w e j. ( D la P w s k a z u ją c e g o
n a r e k o r d w t a b l i c y p r z y jm u je m y , ż e K E Y (P ) j e s t k lu c z e m , IN F O (P ) j e s t s t o w a r z y s z o n ą in fo r m a c ją , n a t o m ia s t L IN K (P ) j e s t d o w ią z a n ie m d o n a s tę p n e g o r e k o r d u . Z a łó ż m y , ż e d o w ią z a n ie m d o p ie r w s z e g o r e k o r d u j e s t F IR S T , a o s t a t n i r e k o r d w s k a z u je n a A ) . 3.
[16] N a p is z p r o g r a m w j ę z y k u MIX d la a lg o r y t m u z ć w ic z e n ia 2. J a k i j e s t c z a s
d z i a ła n i a T w o j e g o p r o g r a m u j a k o fu n k c ji w ie lk o ś c i C i S z ( i ) ? 4.
[17] C z y a lg o r y t m Q m o ż n a z a p is a ć w n o t a c ji d o w ią z a n io w e j? ( Z o b a c z ć w ic z e
n ie 2 ). 5.
[20] D l a d u ż y c h C p r o g r a m Q ' j e s t o c z y w i ś c i e z a u w a ż a ln ie s z y b s z y o d p r o g r a m u
Q . C z y is t n ie ją j e d n a k ja k i e k o lw i e k m a łe w a r t o ś c i C i 5 , d la k t ó r y c h p r o g r a m Q ' d z i a ł a r z e c z y w iś c ie w o ln ie j o d p r o g r a m u Q ?
6 . [20] D o d a j d o p r o g r a m u Q ' t r z y n o w e in s t r u k c je , t a k ż e b y z r e d u k o w a ć c z a s d z i a ł a n ia d o o k o ło ( 3 .3 3 C + c o n s t a n t ) ^ .
[M20] O b li c z ś r e d n ią lic z b ę p o r ó w n a ń ( 3 ) d la „ b in a r n e g o ” r o z k ła d u p r a w d o p o d o b ie ń s t w a ( 5 ). 7.
8 . [HM22] Z n a j d ź r o z w in ię c ie H ^ w s z e r e g a s y m p t o t y c z n y , p r z y n —+ 00 i x ^ 1 . 9.
[HM28] W g łó w n y m t e k ś c ie z a u w a ż y liś m y , ż e r o z k ł a d y p r a w d o p o d o b ie ń s t w a ( 1 1 ), 0 < 1 i że ś r e d n ia lic z b a p o r ó w n a ń d la
( 13 ) i ( 1 6 ) s ą p r a w ie r ó w n o w a ż n e d la 0 < r o z k ła d u ( 13 ) w y n o s i q^ [ N + O ( N 1~ 0).
a) C z y ś r e d n ia lic z b a p o r ó w n a ń j e s t r ó w n a b)
Co w
N + 0 ( N 1~ 9) t a k ż e d la r o z k ła d u ( 1 1 )?
p r z y p a d k u r o z k ła d u ( 16 )?
c) J a k ( 1 1 ) i ( 16 ) m a j ą się d o ( 1 3 ), g d y 6 < 0?
[M20] N a j le p s z y s p o s ó b r o z m ie s z c z e n ia r e k o r d ó w w t a b l i c y lin io w e j j e s t o k r e ś lo n y p r z e z n ie r ó w n o ś c i ( 4 ). J a k i j e s t najgorszy s p o s ó b r o z m ie s z c z e n ia r e k o r d ó w ? P o k a ż , ż e 10 .
is t n ie je p r o s t a z a le ż n o ś ć m ię d z y ś r e d n ią l ic z b ą p o r ó w n a ń d la n a j g o r s z e g o r o z m ie s z c z e n ia a ś r e d n ią l ic z b ą p o r ó w n a ń d la n a jle p s z e g o r o z m ie s z c z e n ia .
11. [M30]
C e le m t e g o ć w ic z e n ia j e s t a n a li z a g r a n ic z n e g o z a c h o w a n ia s a m o o r g a n i z u ją
c e g o się p lik u d la h e u r y s t y k i z p r z e s u w a n ie m n a p o c z ą t e k . Z a c z n i jm y o d z d e f in io w a n ia p e w n y c h p o ję ć : N ie c h / m ( x 1 , 2:2 , . . . ,2Cm) b ę d z ie n ie s k o ń c z o n ą s u m ą w s z y s t k i c h r ó ż n y c h u p o r z ą d k o w a n y c h ilo c z y n ó w x%x Xi2 . . . Xi k , t a k i c h ż e 1 ^ i \ , . . . , %k ^ m , i k a ż d e z x i , X 2r . . , x iil w y s t ę p u j e w k a ż d y m z e s k ła d n ik ó w . N a p r z y k ł a d
h ( x , v) = Y (xl+,y(* + y)k + y 1+3x(x + y)k) = ,'k>o 1
( j ^ — + — !— ). y\i x 1 y/
x
D la d a n e g o z b io r u n z m ie n n y c h X = { x i , . . . , x n } n ie c h f m ( X j 1 , . . . , #jm);
Pnm = 1 ^,71
''' < i m
Qnm =
\ — X ‘ — 1 śŹ 3 l < "
im
— X
'
^
N a p r z y k ł a d P 32 = ¡ 2 ( x u x 2) + / 2( ® i , z 3) + f 2 ( x 2, x 3) o r a z Q 32 = 1 / ( 1 - x i - x 2) +
1 / (1 - x i - x 3) + 1 / ( 1 - x 2 - x 3). P r z y jm u je m y , ż e P no = Q no = 1 . a)
Z a łó ż m y , że d la s a m o o r g a n iz u ją c e g o s ię p lik u o p is a n e g o w t e k ś c ie r e k o r d R i j e s t o b s łu g iw a n y z p r a w d o p o d o b ie ń s t w e m pi. P o k a ż , że p o d łu g im c z a s ie R % b ę d z ie m - t y m r e k o r d e m w p lik u ( lic z ą c o d p o c z ą t k u ) z g r a n ic z n y m p r a w d o p o d o b ie ń s t w e m
P iP {N -i)(m -\), g d z ie z b io r e m z m ie n n y c h X j e s t { p i , . . . , p i - U p i + u . . . , p j v } .
436
WYSZUKIWANIE
6.1
b ) S u m u ją c w y n i k z (a ) d la m — 1 , 2 , . . . , o t r z y m u je m y t o ż s a m o ś ć Pnn
P n ( n — 1 ) “h * ' '
4“
P n O — Q r ir i ■
U d o w o d n ij, ż e w k o n s e k w e n c ji
P™ + ( “ - ” +
+ • ■• + ( “ - 2 + m ) p „ - < 3.,;
■+ ( - 1)" (" “ Z + ”*)«"” * P~
7 + ‘ c)
g r a n i c z n ą ś r e d n ią o d le g ło ś ć di =
O b li c z
m P iP ( N - i) ( 7n - i ) r e k o r d u R i o d
p o c z ą t k u lis ty . N a s t ę p n ie p o lic z C n —
1 2 . [M23] W y k o r z y s t a j w z ó r ( 17 ) d o p o lic z e n ia śr e d n ie j lic z b y p o r ó w n a ń p o t r z e b n y c h d o p r z e s z u k a n ia s a m o o r g a n iz u ją c e g o się p lik u d la p r z y p a d k u b in a r n e g o r o z k ła d u p r a w d o p o d o b ie ń s t w a k l u c z y 13 .
( 5 ).
[M27\ W y k o r z y s t a j ( 17 ) d o p o lic z e n ia C n d la r o z k ła d u p r a w d o p o d o b ie ń s t w a p o
d a n e g o w ( 6 ). 14.
[M21] D a n e s ą d w a c i ą g i
J a k a p e r m u t a c j a in d e k s ó w a \ «2
lic z b r z e c z y w i s t y c h
. . . a n m a k s y m a liz u je
{x\, x 2 , . . . >x n ) i {yi, V2 , • • •, J/n)su m ę
Xtya i7 J a k a p e r m u t a c ja
m i n im a liz u je t ę s u m ę ? ►15.
[M22] W t e k ś c ie o p is u je m y o p t y m a ln e r o z m ie s z c z e n ie p r o g r a m ó w n a t a ś m ie s y s
t e m o w e j, g d y p o t r z e b n y j e s t t y l k o j e d e n p r o g r a m . W p r z y p a d k u t a ś m z a w ie r a ją c y c h b i b li o t e k i podprogramów w ł a ś c i w s z y j e s t in n y z b ió r z a ło ż e ń , p o n ie w a ż p r o g r a m u ż y t k o w n ik a m o ż e w y m a g a ć z a ł a d o w a n i a w ię c e j n iż je d n e g o p o d p r o g r a m u . P r z y j m i j m y z a t e m , ż e p o d p r o g r a m j j e s t p o t r z e b n y z p r a w d o p o d o b ie ń s t w e m P j , n ie z a le ż n ie o d in n y c h p o d p r o g r a m ó w . W t e d y , d la p r z y k ł a d u , p r a w d o p o d o b ie ń s t w o , że ża d en p o d p ro g ra m
n ie b ę d z ie p o t r z e b n y , w y n o s i (1 — P i ) ( l — P 2) ■• • (1 — P /v),
n a t o m i a s t p r a w d o p o d o b ie ń s t w o , ż e w y s z u k iw a n ie z a k o ń c z y się z a r a z p o z a ła d o w a n iu
j - t e g o p o d p r o g r a m u , w y n o s i Pj (1 — P j + i ) . . . ( 1 — P jv ) . J e ś li Lj j e s t d łu g o ś c ią j - t e g o p o d p r o g r a m u , ś r e d n i c z a s w y s z u k i w a n i a b ę d z ie w ó w c z a s p r o p o r c jo n a ln y d o P 1 P 1 ( l - P 2) . . . ( l - P ; v ) + ( P l + L 2 ) P 2 ( l - P 3 ) . . . ( l - P i v ) + --- + ( ^ l + ” - + L iv ) P iV . J a k ie j e s t p r z y t y c h z a ło ż e n i a c h o p t y m a ln e r o z m ie s z c z e n ie p o d p r o g r a m ó w n a t a ś m ie ? 16.
[M22]
(H . R ie s e l) I s t n ie je c z ę s t o p o t r z e b a s p r a w d z e n ia , c z y w s z y s t k i e z d a n y c h n
w a r u n k ó w s ą s p e łn io n e . ( N a p r z y k ł a d m o ż e m y c h c ie ć s p r a w d z ić , c z y s p e łn io n e s ą je d n o c z e ś n ie o b ie n ie r ó w n o ś c i x > 0 i y < z 2, a n ie j e s t o d r a z u ja s n e , k t ó r y z t y c h w a r u n k ó w p o w in ie n b y ć s p r a w d z a n y j a k o p ie r w s z y ) . Z a łó ż m y , że s p r a w d z e n ie w a r u n k u j k o s z tu je
Tj
j e d n o s t e k c z a s u , a p r a w d o p o d o b ie ń s t w o , ż e j e s t s p e łn io n y , w y n o s i p j , n ie z a le ż n ie
o d w y n ik ó w s p r a w d z e ń in n y c h w a r u n k ó w . W j a k ie j k o le jn o ś c i n a le ż y s p r a w d z a ć z a d a n e w a r u n k i? 17.
[M23]
( W . E . S m it h ) P r z y p u ś ć m y , ż e m a m y d o w y k o n a n ia n p r a c . W y k o n a n ie
jf-te j p r a c y z a b i e r a c h w ili
Dj.
Tj
je d n o s t e k c z a s u , a czas j e j zakończenia n ie p o w in ie n p r z e k r o c z y ć
I n n y m i s ło w y , j - t a p r a c a p o w in n a z o s t a ć w y k o n a n a p o c o n a jw y ż e j
Dj
je d n o s t k a c h c z a s u o d c h w ili r o z p o c z ę c ia w y k o n y w a n ia p r a c . J a k i p la n w y k o n y w a n ia p r a c a i a 2 • • • a n m in im a liz u je m aksym alne opóźnienie , c z y l i w ie lk o ś ć m a x ( T ai —D a i ,
Tai -\-Ta2 “
D a2 ? • • • 5Pa\ ~\-Ta2 + ■■• ń~Tan ~ D a n ) ?
WYSZUKIWANIE LINIOWE
6.1
437
PN
P 1 P2
R y s . 2 . R o z m ie s z c z e n ie p r a w d o p o d o b ie ń s t w , k t ó r e m in im a liz u je ś r e d n i c z a s w y s z u k i w a n ia ła ń c u c h o w e g o .
18 .
[M30\
( Wyszukiwanie łańcuchowe) Z a łó ż m y , ż e N r e k o r d ó w R\ . . . R n z o s t a ł o
u m ie s z c z o n y c h w t a b lic y , a p r a w d o p o d o b ie ń s t w o z a p y t a n i a o r e k o r d R j w y n o s i p j. P r o c e s w y s z u k iw a n ia n a z y w a m y „ ła ń c u c h o w y m ” , je ś li k a ż d e w y s z u k i w a n i e r o z p o c z y n a się o d m ie js c a z a k o ń c z e n ia p o p r z e d n ie g o w y s z u k iw a n ia . J e ś li k o le jn e w y s z u k i w a n i a s ą n ie z a le ż n e , t o ś r e d n i c z a s w y s z u k i w a n i a w y n o s i ^ 2 ^ j ^ N P i P j d ( i , j ) j g d z ie d ( i , j ) r e p r e z e n t u je ilo ś ć c z a s u p o t r z e b n ą n a w y k o n a n ie w y s z u k i w a n i a z a c z y n a j ą c e g o s ię o d p o z y c ji i i k o ń c z ą c e g o s ię n a p o z y c j i j .
T e n m o d e l m a n a p r z y k ła d
z a s t o s o w a n ie
w w y s z u k iw a n iu d y s k o w y m , je ś li d ( i , j ) j e s t c z a s e m p o t r z e b n y m n a z m ia n ę c y l in d r a i n a c y lin d e r j .
C e le m t e g o ć w ic z e n ia j e s t s c h a r a k t e r y z o w a n ie o p t y m a ln e g o r o z m ie s z c z e n ia r e k o r d ó w d la w y s z u k iw a n ia ła ń c u c h o w e g o , p r z y z a ło ż e n iu , ż e d ( i , j ) j e s t fu n k c ją r o s n ą c ą z e w z g lę d u n a \i — j\. I n n y m i s ło w y , d ( i , j )
— d\i~j\ d la d\ < d
( W a r t o ś ć do n ie m a z n a c z e n ia ) . U d o w o d n ij, ż e w t a k i m r e k o r d ó w j e s t o p t y m a ln e w ś r ó d w s z y s t k i c h k o w t e d y , g d y a lb o pi
p N -i ^ P2 ^
^
N\
<
d jv -i.
p r z y p a d k u r o z m ie s z c z e n ie
m o ż liw y c h r o z m ie s z c z e ń w t e d y i t y l
pN ^ p2 ^ P n -i ^
^ P | n / 2J + i, a lb o p N ^
pi
^
^ P\n/2] • ( Z a t e m n a j le p s z y m r o z m ie s z c z e n ie m p r a w d o p o d o b ie ń s t w
j e s t to p r z y p o m i n a j ą c e p i s z c z a ł k i o r g a n ó w , j a k p o k a z a n o n a r y s u n k u 2 ). Wskazówka: R o z w a ż m y d o w o ln e r o z m ie s z c z e n ie , w k t ó r y m o d p o w ie d n im i p r a w d o p o d o b ie ń s t w a m i
są qi q2 . >. qk s rk
. . . r 2 ri ti . . . t m d la p e w n y c h m
0
ik
> 0;
N
= 2k + m
ż e le p s z e je s t r o z m ie s z c z e n ie q[ q2 . . . q!^ s r'k . . . r'2 r[ t x . . . t m , g d z ie
=
1. P o k a ż , m in (<^, r*)
i r'i = max ( q i , r i ), z w yjątkiem gdy dla każdego i, q[ = qt oraz r ' = r, lub gdy każdych i, j m a m y q[ = rt, r[ = qi oraz tj = 0. To samo zachodzi, gdy n ie m a s
d la i
N
19.
= 2k 4 - m. [M20] K o n t y n u u je m y ć w ic z e n ie 18 . J a k ie j e s t o p t y m a ln e r o z m ie s z c z e n ie r e k o r d ó w
d la w y s z u k iw a n ia ła ń c u c h o w e g o , je ś li fu n k c ja d ( i , j ) s p e łn i a w a r u n e k d ( i , j ) + d ( j , i ) — c d la w s z y s t k ic h i ^ j ? [T a k a s y t u a c j a w y s t ę p u j e n a p r z y k ł a d n a t a ś m a c h b e z m o ż liw o ś c i o d c z y t u w s t e c z , g d y n ie z n a m y k ie r u n k u , w k t ó r y m n a le ż y t a ś m ę p r z e s z u k iw a ć ; d la
i < j m a m y , p o w ie d z m y , d ( i , j ) = a + b ( L i+ H ------ l-T ? ) i d ( j , i ) = a-\-b(Lj + i-\ + r + b ( L i - f • • • + L i), g d z ie r j e s t c z a s e m p r z e w ija n ia ] . -
hL n )
2 0 . [M 28 ] K o n t y n u u j e m y ć w ic z e n ie 18 . J a k ie j e s t o p t y m a ln e r o z m ie s z c z e n ie r e k o r d ó w w w y s z u k iw a n iu ła ń c u c h o w y m , je ś li f u n k c ją d ( i , j ) j e s t m in ( d | i _ :i|, dn-\i~j\) d la
di < d 2 < ■* * ? [T a k a s y t u a c j a p o j a w i a się n a p r z y k ł a d w p r z y p a d k u d w u k ie r u n k o w y c h lis t c y k lic z n y c h lu b w d w u k ie r u n k o w y c h r e je s t r a c h p r z e s u w n y c h ] .
[M28] R o z w a ż m y n - w y m ia r o w ą k o s t k ę , k t ó r e j w ie r z c h o łk i m a j ą w s p ó łr z ę d n e ( d i , . . . , d n) z dj — 0 lu b 1 . P o w ie m y , ż e d w a w ie r z c h o łk i s ą sąsiednie, j e ś l i r ó ż n ią
2 1.
438
WYSZUKIWANIE
6.1
s i ę n a d o k ł a d n i e j e d n e j w s p ó ł r z ę d n e j . W i e r z c h o ł k o m k o s t k i n a l e ż y p r z y p i s a ć 2 n l ic z b xq ^ x\ ^ ^ X2 n_i w t a k i s p o s ó b , ż e b y s u m a Yli j \x* ~ xj\ k y ł a n a jm n ie js z a , g d z ie su m o w a n ie o d b y w a s ię p o w s z y s tk ic h ta k ic h i, j , ż e i X j s ą p r z y p is a n e d o s ą s ie d n ic h w ie r z c h o łk ó w . U d o w o d n ij, ż e m in im u m j e s t o s ią g a n e , g d y d la k a ż d e g o j lic z b ę X j p r z y p is z e m y d o w ie r z c h o łk a , k t ó r e g o w s p ó łr z ę d n e t w o r z ą b in a r n ą r e p r e z e n ta c ję lic z b y j . ► 2 2 . [20] P r z y p u ś ć m y , ż e c h c e m y p r z e s z u k a ć d u ż y p lik w p o s z u k iw a n iu 1 0 0 0 r e k o r d ó w , k t ó r y c h k l u c z e s ą najbliższe d a n e m u k l u c z o w i w t a k i m z n a c z e n i u , ż e d l a t y c h 1 0 0 0 r e k o r d ó w w a r t o ś c i d(Kj, K) s ą n a j m n i e j s z e d l a p e w n e j f u n k c j i o d l e g ł o ś c i d. J a k a s t r u k t u r a d a n y c h j e s t n a j le p s z a d la p r z e s z u k iw a n ia lin io w e g o w t y m p r z y p a d k u ?
Nie
u s ta w a j
w
c ią ż e n iu
b o je ś li s z u k a s z
— R O B E R T H E R R IC K ,
S eeke
, to
and
do
c e lu ,
z n a jd z ie s z .
fin d e
(1 6 48 )
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
439
6.2. W YSZU K IW A N IE PRZEZ PO RÓ W NYW ANIE KLUCZY
W tym podrozdziale omówimy metody wyszukiwania, które wykorzystują liniowe uporządkowania kluczy, takie jak porządek alfabetyczny czy numeryczny. Po porównaniu danego argumentu K z kluczem Ki z tablicy wyszukiwanie jest kontynuowane na trzy różne sposoby, zależnie od tego, czy K < Ki, K — Ki, czy też K > Ki. Metody liniowe z podrozdziału 6.1 ograniczały się w zasadzie do decyzji binarnych (K = Ki kontra K ^ Ki), jeśli jednak uwolnimy się od ograniczeń odnoszących się do przeszukiwania liniowego, możemy efektywnie wykorzystać relację porządku. 6.2.1. Wyszukiwanie w tablicy uporządkowanej
Co byśmy zrobili, gdyby ktoś wręczył nam dużą książkę telefoniczną i poprosił nas o znalezienie osoby, której numerem telefonu jest 795-6841? Nie ma lepszych sposobów poradzenia sobie z tym zadaniem niż zastosowanie jednej z metod liniowych z podrozdziału 6.1. (Oczywiście można by zadzwonić pod ten numer i porozmawiać z osobą, która podniesie słuchawkę. Można również spróbować otrzymać specjalną książkę telefoniczną uporządkowaną według numerów, za miast według nazwisk). Chodzi o to, że dużo łatwiej szukać po nazwiskach niż po numerach, chociaż książka telefoniczna zawiera wszystkie niezbędne informacje potrzebne w obu przypadkach. Gdy musimy przeszukać duży plik, przeglądanie liniowe jest niemal nie do pomyślenia, jednak relacja porządku ogromnie uprasz cza sprawę. Mając do dyspozycji tyle metod sortowania (rozdział 5), nie będzie zbyt trudno zorganizować plik w sposób wygodny dla wyszukiwania. Oczywiście, jeśli tablica musi być przeszukana tylko raz, przeszukiwanie liniowe będzie szybsze od sortowania. Jeśli jednak ten sam plik musi być przeszukiwany wielokrotnie, lepiej go mieć uporządkowanym. Dlatego w tym punkcie skoncentrujemy się na metodach odpowiednich do wyszukiwania w tablicy, w której klucze spełniają warunek K \ < K 2 < *** < Kpj i przy założeniu, że każdy klucz na każdej pozycji jest łatwo dostępny. Po po równaniu w takiej tablicy K z Ki zachodzi jedna z następujących sytuacji: • K < Ki
[Ri, Ri+ \ , . . . , R n są wyeliminowane z dalszych rozważań];
lub • K = Ki
[wyszukiwanie zakończone];
lub • K > Ki
[J7i, R 2, . . . , Ri są wyeliminowane z dalszych rozważań].
Każdy z tych trzech przypadków istotnie przybliża nas do celu, chyba że ijest bliskie jednego z końców. To tłumaczy dlaczego uporządkowanie prowadzi do efektywnych algorytmów wyszukiwania. Pierwsza metoda, która się sama nasuwa, polega na rozpoczęciu wyszukiwania od porównania K ze środkowym kluczem z ta blicy. W wyniku tego porównania wiemy, w której połowie tabeli kontynuować wyszukiwanie, i cały proces można powtórzyć, porównując K ze środkowym W yszu k iw an ie binarne.
440
WYSZUKIWANIE
6.2.1
SUKCES R y s . 3 . W y s z u k i w a n ie b in a r n e .
kluczem z wybranej połowy itd. Po wykonaniu około lg N porównań żądany klucz zostanie odnaleziony lub stwierdzimy, że nie ma go w tablicy. Powyższy algorytm jest czasami nazywany „wyszukiwaniem logarytmicznym” lub „bisekcją”, ale najczęściej jest nazywany wyszukiwaniem binarnym. Chociaż podstawowa idea wyszukiwania binarnego jest stosunkowo prosta, szczegóły są zaskakująco złożone i wielu dobrych programistów nie radzi sobie z nimi za pierwszym razem. Jedna z najpopularniejszych, poprawnych imple mentacji tego algorytmu wykorzystuje dwa wskaźniki l i u, które oznaczają dolne i górne ograniczenie przedziału wyszukiwania. A lg o r y tm B ( Wyszukiwanie binarne). Dana jest tablica rekordów R 1 R 2 .. - R n,
w której klucze są uporządkowane rosnąco K \ < K 2 < **• < Kn* Opisywany algorytm wyszukuje, mając dany parametr K. B I . [Inicjowanie] l
1, u
N.
B 2 . [Znajdowanie środka] (W tym miejscu wiemy, że jeśli K jest w tablicy, to
spełnia warunek Ki < K < K u. Dokładniejszy opis warunków zachodzących w tej sytuacji znajduje się w ćwiczeniu 1). Jeśli u < l, to algorytm kończy się niepowodzeniem. W przeciwnym razie wykonaj i <— [(/ + u)/2j (jest to przybliżony środek bieżącego obszaru przeszukiwania). B 3 . [Porównywanie] Jeśli K < Ki, przejdź do B4; jeśli K > Ki, przejdź do B5;
a jeśli K — Ki, zakończ algorytm z sukcesem. B 4 . [Aktualizacja u] Wykonaj u <— i — 1 i wróć do B2 . B 5 . [Aktualizacja l\ Wykonaj l <—i + 1 i wróć do B2.
|
Na rysunku 4 zilustrowano dwa przypadki działania tego algorytmu: w pierw szym argumentem wyszukiwania jest 653, które występuje w tablicy, natomiast w drugim argumentem wyszukiwania jest 400, którego w tablicy nie ma. Nawiasy
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ a)
441
W y s z u k i w a n ie 653: 426 50 3 509 5 1 2 6 1 2 6 53
6 7 7 70 3 7 6 5 8 9 7 908]
426 50 3 509 [5 12 6 1 2 653
6 7 7 70 3 7 6 5 8 9 7 908]
426 503 509 [5 12 6 1 2 653] 6 7 7 70 3 7 6 5 8 9 7 908 0 6 1 087 1 5 4 1 7 0 2 7 5
426 503 509 5 1 2 6 1 2 [653] 6 7 7 70 3 7 6 5 8 9 7 908
b ) W y s z u k i w a n ie 400: 426 503 509 5 1 2 6 1 2 653
061 087 154 170
6 7 7 70 3 7 6 5 8 9 7 908]
426 503] 509 5 1 2 6 1 2 653
6 7 7 70 3 7 6 5 8 9 7 908
426 503] 509 5 1 2 6 1 2 653
6 7 7 70 3 7 6 5 8 9 7 908
426 503 509 5 1 2 6 1 2 6 53
6 7 7 70 3 7 6 5 8 9 7 908
[426 503 509 5 1 2 6 1 2 6 53
6 7 7 70 3 7 6 5 8 9 7 908
R y s . 4 . P r z y k ł a d y w y s z u k i w a n i a b in a r n e g o .
kwadratowe wyznaczają l i u, natomiast podkreślony klucz odpowiada Ki. W obu przypadkach wyszukiwanie kończy się po wykonaniu czterech porównań. Program B ( Wyszukiwanie binarne). Podobnie jak w programach z podroz działu 6 .1 , zakładamy, że Ki jest kluczem zajmującym całe słowo i znajdującym się pod adresem KEY + U W poniższym programie rll = /, rI2 = u, rI3 = i. 01 02 03
ST A R T E N T 1
04
5H
05 06 07 08 09 10 11 12 13
1 1 1 Cl
1
EN T2 N
2H
JMP
2F
JE
SU CCESS
ENT1
1 ,3
ENTA 0 , 1 IN G A
0,2
SR B
1
STA
TEMP
CM P1 TEMP
3H
JG
F A IL U R E
LD 3
TEMP
LDA
K
H
CMPA K E Y , 3
15 16 17
JG E
5B
EN T2 - 1 , 3 JMP
2B
B I . Inicjowanie. I <— 1 .
N. D o B2. S k o k , je ś l i
C l- S
C C C C C C
+ + + + + +
l l l l l l
c c c c
-
C2 C2
S S S S S S
K = K i.
B5. A k tu a lizu j l. I <— i + 1 . B2. Z n a jd ź środek. r A <— l + u. rA
|_rA/2_|. ( r X z m ie n ia się t a k ż e ) .
S k o k , je ś l i u < L
i <— ś r o d e k . B3. Porównaj. S k o k , je ś li K ^ K i .
B4. A k tua liza cja u. u <— i — 1 . D o B2.
|
W przeciwieństwie do innych algorytmów, ten algorytm nie w pełni pasu je do maszyny M IX , ponieważ nie można na niej wykonywać zbyt wielu ope racji arytmetycznych na rejestrach indeksowych. Jego czas działania wynosi (18C - 105 + 12 ) u, gdzie C = C l+ C 2 jest liczbą wykonanych porównań (liczba wykonań kroku B3), a S = [koniec z sukcesem]. Operacja w wierszu 08 pro gramu, to „przesunięcie w prawo binarnej 1 ”, która jest dopuszczalna tylko na binarnych wersjach maszyny M IX. W ogólnym przypadku, tę instrukcję nale ży zastąpić przez „MUL = l//2 + l= ”, zwiększając tym samym czas działania do (26C - 185 + 20)«.
442
WYSZUKIWANIE
6.2.1
R e p rezen ta cja d rzew ia sta . Żeby naprawdę zrozumieć, co dzieje się w algo
rytmie B, najlepiej myśleć o nim jak o binarnym drzewie porównań, tak jak to przedstawiono na rysunku 5 dla przypadku N = 16.
Gdy N jest równe 16, pierwszym porównaniem wykonywanym w algoryt mie B jest K : Kg. Odpowiada mu korzeń drzewa (s) na rysunku. Następnie, jeśli K < Kg, algorytm przechodzi do lewego poddrzewa, porównując K z K ą . Podobnie, jeśli K > Kg, wykorzystujemy prawe poddrzewo. Wyszukiwanie koń czące się niepowodzeniem prowadzi do jednego z kwadratowych węzłów zewnętrz nych ponumerowanych od [o] do \n \. Dla przykładu, węzeł [ę] jest osiągany wtedy i tylko wtedy, gdy K q < K < K?. Drzewo binarne odpowiadające wyszukiwaniu binarnemu dla N rekordów można skonstruować w następujący sposób. Jeśli N = 0, takim drzewem jest po prostu [o]. W przeciwnym razie korzeniem drzewa jest (W /W ), lewym poddrzewem jest odpowiednie drzewo binarne z fiV/2j —1 węzłami, a pra wym poddrzewem jest odpowiednie drzewo binarne z [N/2\ węzłami, których numery są powiększone o fiV/2~|. W analogiczny sposób można za pomocą 7V-węzłowego drzewa binarnego, z ponumerowanymi węzłami od 1 do N , przedstawić dowolny algorytm wyszu kiwania przez porównywanie (bez redundantnych porównań) w uporządkowanej tablicy o długości AT. Na odwrót, każde drzewo binarne odpowiada pewnej po prawnej metodzie wyszukiwania w tablicy uporządkowanej. Po prostu etykietu jemy węzły
OD
®
□
©
0
...
\n ^
@
0
(i)
w porządku symetrycznym, od lewej do prawej. Jeśli argumentem wyszukiwania dla algorytmu B jest Kio, wówczas zostaną wykonane porównania K > Kg, K < K i2, K = K\$. Ten ciąg porównań
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
443
odpowiada ścieżce na rysunku 5 od korzenia do (io). Podobnie, zachowaniu się algorytmu B dla innych kluczy odpowiadają inne ścieżki wychodzące z korzenia drzewa. Z metody konstrukcji drzew binarnych odpowiadających algorytmowi B łatwo przez indukcję względem N udowodnić następujące twierdzenie. Twierdzenie B. Jeśli 2k~l < N < 2k, to wyszukiwanie za pomocą algorytmu B kończące się sukcesem wymaga (min 1, max k) porównań. Jeśli N = 2k —1 , wówczas wyszukiwanie zakończone niepowodzeniem wymaga k porównań, nato miast jeśli 2k~ 1 < N < 2k — 1 , to wyszukiwanie zakończone niepowodzeniem wymaga albo k — 1 , albo k porównań. | Dalsza analiza wyszukiwania binarnego. (Czytelnicy nie zainteresowani matematyką powinni od razu przejść do równań (4)). Reprezentacja drzewiasta pozwala w prosty sposób obliczyć średnią liczbę porównań. Niech C n będzie średnią liczbą porównań w wyszukiwaniu zakończonym sukcesem, przy założeniu, że każdy z N kluczy jest równy argumentowi wyszukiwania z jednakowym praw dopodobieństwem. Niech CfN będzie średnią liczbą porównań w wyszukiwaniu zakończonym niepowodzeniem, przy założeniu, że każdy z i V + l przedziałów wyznaczonych przez klucze jest jednakowo prawdopodobny. Wówczas mamy długość ścieżki wewnętrznej w drzewie Cn —1 + ----------------------- ^ ------------------nf °N=
,
długość ścieżki zewnętrznej w drzewie n
TT~
:1
co wynika z definicji długości ścieżek, wewnętrznej i zewnętrznej. Z 2.3.4.5-(3) wiemy, że długość ścieżki zewnętrznej jest zawsze o 2N większa od długości ścież ki wewnętrznej. Tak więc istnieje dość nieoczekiwany związek między CN a C'N: c N = ( i + j2 ) c 'N - i .
( 2)
Ta zależność pochodzi od T. N. Hibbarda [JACM 9 (1962), 16 -17] i jest prawdzi wa dla wszystkich metod wyszukiwania, które odpowiadają drzewom binarnym. Innymi słowy, jest ona prawdziwa dla wszystkich metod, w których nie wyko nuje się redundantnych porównań. Wariancję liczby porównań w wyszukiwaniu zakończonym sukcesem można także wyrazić w zależności od stosownej wariancji dla wyszukiwania zakończonego niepowodzeniem (zobacz ćwiczenie 25). Powyższe wzory mówią, że „najlepszym” sposobem wyszukiwania przez po równywanie jest ten, którego drzewo ma ścieżkę zewnętrzną o najmniejszej dłu gości spośród wszystkich drzew o N węzłach wewnętrznych. W tym sensie algo rytm B jest optymalny dla każdego N , ponieważ wiemy (ćwiczenie 5.3.1-20), że długość ścieżki zewnętrznej w drzewie binarnym jest najmniejsza wtedy i tylko wtedy, gdy wszystkie węzły zewnętrzne występują na dwóch sąsiednich pozio mach. Wynika stąd, że długość ścieżki zewnętrznej w drzewie odpowiadającym algorytmowi B wynosi (JV+l)(LlgiVj + 2) - 2 LlgJV-l+1.
( 3)
444 WYSZUKIWANIE
6.2.1
(Zobacz 5.3.1-(34)). Z tego wzoru i z(2) możemy obliczyć dokładną średnią liczbę porównań, przy założeniu, że wszystkie argumenty są jednakowo prawdo podobne. N =1 2 3 -1 U 7V — 1 s~i
/^f/ IV
1 1 1 2 1 2 I 3 -1 1 2 o
3
4
5
6
o z i}2 5
r\ 1
ci 2
Z5 n4 6
7
o3 Z6 Z7 06 o Z7 ^
8
9
10
o5 o7 o 9 Zg Z 9 Z 10 o 2 q_£. Qj5_ 9 10 ° 1 1
11 o ci q_ 8_ 12
12
13 14
o l
q 2 q 3 1.2 13 ^ 1 4 q K ) 9.12 ql_4 ° 13 ° 14 ° 1 5
15 q 4 ó 15 a
^
16 06
**16 a 2 ^17
W ogólności, dla k = [Ig iVJ mamy = fc + 1 —(2k+1 - k - 2 )/N = lg N - 1 + e + (k + 2)/N, C'N = k + 2 - 2fc+1/(7V + 1 )
- lg(AT ł l ) + e'
(4)
gdzie 0 < e,e' < 0.0861; zobacz 5 .3. 1- ( 35). Podsumowując, algorytm B nigdy nie wykonuje więcej niż |_lg A^J +1 porów nań, a w przypadkach zakończonych sukcesem, średnia liczba porównań wynosi około lgAT — 1 . Żadna metoda oparta na porównaniach nie jest lepsza. Średni czas działania programu B wynosi w przybliżeniu (18 lg N —16) u
dla wyszukiwań zakończonych sukcesem,
(181giV + 12)u
dla wyszukiwań zakończonych niepowodzeniem,
(ó)
jeśli założymy, że wszystkie wyniki wyszukiwania są jednakowo prawdopodobne. Ważny wariant. Zamiast trzech wskaźników /, i oraz u kusi, żeby do wyszu kiwania zastosować tylko dwa wskaźniki, a mianowicie bieżącą pozycję i oraz wielkość jej zmiany 8. Po każdym porównaniu, którego wynikiem jest brak rów ności, moglibyśmy wykonywać i i ± 5 oraz 8 <—8/2 (w przybliżeniu). To jest możliwe, ale wymaga wyjątkowej ostrożności, jeśli chodzi o szczegóły, co widać w algorytmie poniżej. Prostsze rozwiązania powodują głupie błędy! A lgorytm U (Jednorodne wyszukiwanie binarne). Dana jest tabela rekordów f l i , * 2,...,fljv, których klucze są uporządkowane rosnąco K i < K 2 < **• < K ^. Argumentem wyszukiwania w tym algorytmie jest K. Jeśli N jest parzyste, algo rytm będzie czasami odwoływał się do domyślnego klucza Ko, którego wartością jest —00 (lub dowolna wartość mniejsza od K ). Zakładamy, że N > 1. U l. [Inicjowanie] i fiV/2~|, m <— [N/2\. U2. [Porównywanie] Jeśli K < Ki, przejdź do U3; jeśli K > K %, przejdź do U4; a jeśli K — Ki, algorytm kończy się sukcesem. U3. [Zmniejszanie i] (Wyszukiwanie zawęziliśmy do przedziału zawierającego m lub m — 1 rekordów; i wskazuje na prawy koniec tego przedziału). Jeśli m = 0, algorytm kończy się niepowodzeniem. W przeciwnym razie wykonaj i i — \m / 2]; następnie wykonaj m <— Lm/2J i wróć do U2. U4. [Zwiększanie i] (Wyszukiwanie zawęziliśmy do przedziału zawierającego m lub m — 1 rekordów; i wskazuje na lewy koniec tego przedziału). Jeśli m = 0, algorytm kończy się niepowodzeniem. W przeciwnym razie wykonaj i i + \m /2 ] ; następnie wykonaj m [m/2J i wróć do U2 . |
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
445
<5= 3
6= 1
6= 1
R y s . 6 . D r z e w o p o r ó w n a ń d la „ je d n o r o d n e g o ” w y s z u k iw a n ia b in a r n e g o z N = 10.
Na rysunku 6 przedstawiono drzewo binarne odpowiadające takiemu wyszu kiwaniu dla N = 10. W przypadku wyszukiwania zakończonego niepowodzeniem, w algorytmie, tuż przed jego zakończeniem, może zostać wykonane jedno redundantne porównanie. Odpowiednie węzły są na rysunku zacieniowane. Taki proces wyszukiwania można nazwać jednorodnym, ponieważ różnica między numerem węzła na poziomie l a numerem jego przodka z poziomu l —1 jest stała i równa <5 dla wszystkich węzłów z poziomu 1. Działanie algorytmu U można wytłumaczyć w następujący sposób: Załóżmy, że przeszukiwany przedział ma długość n —1. Po wykonaniu porównania z ele mentem środkowym (dla n parzystego) lub z jednym z dwóch elementów środ kowych (dla n nieparzystego) dostajemy dwa przedziały o długościach |_n/2j —1 i |"n/2"| —1 . Po powtórzeniu tego procesu k razy otrzymujemy 2k przedziałów, z których najmniejszy ma długość [n/2k\ — 1 , a największy \n /2 k] — 1. Tak więc długości dwóch przedziałów z tego samego poziomu różnią się co najwyżej 0 jeden. To umożliwia wybór właściwego elementu „środkowego” bez potrzeby pamiętania dokładnych długości przedziałów. Główną zaletą algorytmu U jest to, że nie musimy w ogóle pamiętać wartości m. Wystarczą odwołania do krótkiej tablicy różnych <5, które należy stosować na różnych poziomach drzewa. Zatem algorytm przeszukiwania binarnego można zapisać w sposób, który jest jednakowo dobry dla komputerów binarnych, jak 1 komputerów dziesiętnych: Algorytm C (Jednorodne wyszukiwanie binarne). To jest prawie taki sam algorytm jak algorytm U, jednak stosuje się w nim dodatkową tablicę w miejsce obliczeń związanych z m. Wartościami tej tablicy są DELTAtj] = C l. [Inicjowanie] i
N + 2*7 2i
DELTA[1] , j
dla 1 < j < [Ig N \ + 2.
( 6)
2.
C 2 . [Porównywanie] Jeśli K < Ki, przejdź do C3; jeśli K > Ki, przejdź do C4; a jeśli K — Ki, to algorytm kończy się sukcesem.
446
6 .2.1
WYSZUKIWANIE
C3.
[Zmniejszanie i] Jeśli D E L TA [ J ] = O, algorytm kończy się niepowodzeniem. W przeciwnym przypadku wykonaj i i —D E L TA [ j ] , j <—j + 1 i przejdź do C2.
C4.
[Zwiększanie i] Jeśli D E L T A [j] = 0, algorytm kończy się niepowodzeniem. W przeciwnym razie wykonaj i <—i+ D E L T A [J], j j+ 1 i przejdź do C2. |
W ćwiczeniu 8 pokazujemy, że algorytm C odwołuje się do sztucznego klucza Ko = —oo tylko wtedy, kiedy N jest parzyste. wyszukiwanie binarne). Ten program jest podobny do programu B i implementuje algorytm C z rA = ić, rll = ż, rI2 = j, rI3 = D E L TA t j l . P ro g ram
01 02
START
03 04 05
06 07 08 09 10 11 12 13 14
3H
C
( Jednorodne
ENT1
N + l/ 2
ENT2
2
LDA
K
JMP
2F
JE
SU CCESS
J3Z
F A IL U R E
DEC1
0 ,3
5H
IN C 2
1
2H
LD3
D E L T A ,2
CMPA K E Y , 1 JLE
3B
1 1 1
- L( N
C l . Inicjowanie, i <-
C l
- s
C l- S - A
c-1 c c c
S k o k , je ś li
K = Ki.
S k o k , je ś li DELTA [ j ]
= 0.
CS. Zm niejsz i. 3 + 1C2. Porównaj. S k o k , je ś li K ś K i.
IN C 1
0 ,3
C 2
C4. Zwiększ i.
5B
C 2
S k o k , je ś li DELTA [ j ] ^ 0 .
*
1)/2J
1 C l
J3N Z F A IL U R E EQU
+
¿< -2 .
1 - 5
K o n ie c , je ś li n ie m a w t a b lic y .
|
W przypadku wyszukiwania zakończonego sukcesem, powyższy algorytm odpowiada drzewu binarnemu, którego długość ścieżki wewnętrznej jest taka sama jak w algorytmie B, tak więc średnia liczba porównań Cn jest taka sa ma jak poprzednio. W przypadku wyszukiwania zakończonego niepowodzeniem, algorytm C wykonuje zawsze [Ig A/J + 1 porównań. Całkowity czas działania programu C nie jest w pełni symetryczny dla lewego i prawego poddrzewa, ponieważ C l waży więcej niż C 2. W ćwiczeniu 11 pokazujemy jednak, że K < Ki występuje w przybliżeniu tak często jak K > Ki. Tak więc program C zabiera w przybliżeniu (8.5lg N —6)u
dla wyszukiwania z sukcesem,
(8.5 [lg A/J + 12 ) u
dla wyszukiwania z niepowodzeniem.
(7)
Jest to dwa razy szybciej niż wykonywanie programu B, bez wykorzystywania żadnych szczególnych własności komputerów binarnych, a nawet jeśli w czasie działania (5) programu B uwzględnimy możliwość wykonywania na maszynie MIX instrukcji „binarnego przesunięcia w prawo”. Inną modyfikację wyszukiwania binarnego zaproponował L. E. Shar w 1971 roku. Na pewnych maszynach tak zmodyfikowany algorytm jest jeszcze szybszy,
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
447
ponieważ jest jednorodny po pierwszym kroku i nie potrzebuje żadnych tablic. W pierwszym kroku porównujemy K z Ki, gdzie i = 2fc, k — [Ig N \ . Jeśli K < K i, to stosujemy wyszukiwanie jednorodne z wartościami 5 równymi 2fc_1, 2fc~2, .. . , 1, 0. Z drugiej strony, jeśli K > K i, to i nadajemy nową wartość if = AT+ 1 —2*, gdzie l — [lg(AT —2fc + 1 )], a następnie postępujemy tak, jak gdyby pierwsze porównanie dało K > K ¿/, stosując wyszukiwanie jednorodne z wartościami 5 równymi 2l~ \ 2Z“2, . . . , 1 , 0. Metoda Shara została zilustrowana na rysunku 7 dla AT = 10. Podobnie jak w poprzednich algorytmach, tak i w tym nie wykonuje się więcej niż [lg N \ + 1 porównań. Tak więc w tym algorytmie wykonuje się co najwyżej o jedno po równanie więcej od minimalnie możliwej średniej liczby porównań, mimo faktu, że czasami przechodzi się w nim przez kilka kolejnych redundantnych kroków (zobacz ćwiczenie 12). W ćwiczeniu 23 omawiamy jeszcze jedną modyfikację wyszukiwania binar nego, która dla bardzo dużych N przewyższa szybkością wszystkie dotychczas poznane metody. W ćwiczeniu 24 można zapoznać się z metodą jeszcze szybszą. *Wyszukiwanie Fibonacciego. Przy okazji scalania wielofazowego zobaczyli śmy, że liczby Fibonacciego odgrywają rolę analogiczną do roli potęg 2 . Podobne zjawisko ma miejsce w wyszukiwaniu, gdzie liczby Fibonacciego dają pewną alternatywę dla wyszukiwania binarnego. Nowa metoda nadaje się lepiej dla pewnych maszyn, ponieważ wykorzystuje się w niej tylko dodawanie i odejmo wanie, a nie korzysta się z dzielenia przez 2 . Algorytm, który za chwilę opiszemy, należy odróżnić od numerycznej metody lokalizacji maksimum funkcji unimodalnej, zwanej także „wyszukiwaniem Fibonacciego” [zobacz Fibonacci Quarterly 4 (1966), 265-269]. Na pierwszy rzut oka wyszukiwanie Fibonacciego wygląda bardzo tajemni czo, jeśli tylko wziąć program i próbować wyjaśniać, co się z nim dzieje. To jest jak magia. Czary znikają, jeśli tylko spojrzymy na drzewo wyszukiwania. Dlatego nasze rozważanie rozpoczniemy od analizy drzew Fibonacciego. Na rysunku 8 zaprezentowano drzewo Fibonacciego rzędu 6 . Jest ono bar dziej podobne do prawdziwej rośliny niż inne dotychczas rozważane drzewa, być może dlatego, że wiele naturalnych procesów jest zgodnych z prawem Fibonaccie-
448
6.2.1
WYSZUKIWANIE
go. W ogólności, drzewo Fibonacciego rzędu k ma Fk+1 —1 węzłów wewnętrznych (okrągłych), F^+i węzłów zewnętrznych (kwadratów) i powstaje w następujący sposób: Jeśli fc = 0 lub k = 1, drzewem jest po prostu Jeśli k > 2, korzeniem jest F^; lewym poddrzewem jest drzewo Fibonacciego rzędu k —1; natomiast prawym poddrzewem jest drzewo Fibonacciego rzędu fc —2 z liczbami powiększonymi o F*..
Z wyjątkiem węzłów zewnętrznych, liczby w dzieciach każdego węzła wewnętrz nego różnią się od liczby w rodzicu o tę samą wartość będącą liczbą Fibonacciego. Na rysunku 8 na przykład 5 = 8 —Fą i 11 = 8 + F4. Jeśli różnicą jest Fj, to odpowiednią różnicą Fibonacciego na następnej gałęzi na lewo jest Fj_i, podczas gdy na gałęzi prawej przeskakujemy do F j- 2. Na przykład 3 = 5 —F3, podczas gdy 10 = 11 —F 2. Jeśli połączymy te obserwacje z właściwym mechanizmem rozpoznawania węzłów zewnętrznych, otrzymamy następujący algorytm. A lgorytm F ( Wyszukiwanie Fibonacciego). Dana jest tablica rekordów Fi R 2 .. • Ftv, których klucze są uporządkowane rosnąco K \ < K 2 < **■< K ^. Argumen tem wyszukiwania jest K. Dla wygody opisu przyjmujemy, że N 1 jest doskonałą liczbą Fibonacciego równą F^+i. Nietrudno zmienić ten algorytm w taki sposób, żeby pracował poprawnie dla dowolnego N , jeśli tylko dokonamy inicjowania w odpowiedni sposób (zobacz ćwiczenie 14). F I. [Inicjowanie] i F&, p *—F&-15 q kolejnymi liczbami Fibonacciego).
Ffc_2. (W całym algorytmie p i q będą
F 2 . [Porównywanie] Jeśli K < K il przejdź do kroku F3; jeśli K > Ki, przejdź do F4; natomiast, jeśli K = Ki, algorytm kończy się sukcesem.
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
449
F3. [Zmniejszanie i] Jeśli q = 0, algorytm kończy się niepowodzeniem. W prze ciwnym razie wykonaj i i —q, następnie (p, q) <— (ą, p—g), a potem przejdź do F2. F4. [Zwiększanie i] Jeśli p = 1 , algorytm kończy się niepowodzeniem. W prze ciwnym razie wykonaj i ^ i q, p ^ p —
F I . Inicjowanie.
F fc
E N T 3 F fc_ 2 - 1
i +- Ffc. p + - Fk~ i. q < - F * _ 2.
JMP
D o kroku F2.
01
S T A R T LDA
02
ENT1
03 04 05 06 F 4 A 07 08 09 F 2 A 10 11 12 13
ENT2 F fe _ i-1
14
F3A
15 16 17 18 F 4 B 19 20 21 F 2 B
F2A
C 2 -S -A DEC2 1 , 3 C 2 -S -A DEC3 1 , 2 C 2 -S -A CMPA K E Y , 1 C JL F3A C JE SUCCESS C2 J2N ZF4A C2 — S JMP FAILU R E A DEC1 1 , 3 Cl IN C 1
1 ,3
DEC2 1 , 3 J3NN F 2 B
Cl Cl
F4. Zw iększ i. i
i + q.
p ^ p -q . q ^q -p . F2. Porów naj. D o F 3 , j e ś l i K < K i. K o n ie c , j e ś l i K — K i . D o F 4 , je ś li p
1.
K o n ie c , j e ś l i n ie m a w t a b lic y .
F3. Z m niejsz i. i
i — q.
p ^ p -q . Z a m ie ń r e je s t r y , je ś li q > 0.
JMP
FAILU R E 1 - 5 - A
K o n ie c , j e ś l i n ie m a w t a b lic y .
IN C 1
1 ,2
( W ie r s z e 1 8 - 2 9 o d p o w i a d a j ą w ie r s z o m 0 6 - 1 7 ) .
DEC3 1 , 2 DEC2 1 , 3 CMPA K E Y , 1
22 23
JL
F3B
JE
SUCCESS
24
J3NZ
F4B
25 26 F 3 B 27 28 29
JMP
FAILU R E
DEC1 1 , 2 DEC3 1 , 2 J2NN F 2 A JMP
FAILU R E
|
Czas działania powyższego programu analizujemy w ćwiczeniu 1 8 . Na ry sunku 8 widzimy, a analiza to potwierdza, że lewa gałąź jest wybierana trochę częściej niż prawa. Niech C, C l i (C2 — S ) będą liczbami wykonań kroków,
450
WYSZUKIWANIE
6.2.1
odpowiednio, F2, F3 i F4. Wówczas mamy C = (ave # A / 5 + 0(1), max k —1 ), C l = (ave fc/v^5 + 0(1), max k —1 ), 02 —5 = (ave <(>~l k/>/E + 0(1), max [k/ 2J).
(8)
Tak więc lewa gałąź jest wybierana około razy większa od prawej). Dlatego całkowity średni czas działania programu F wynosi w przybliżeniu ±((18 + Ą
(9)
w przypadku sukcesu, plus (9 —3(j>)u « 4.15u w przypadku niepowodzenia. Jest on szybszy od programu C, chociaż w pesymistycznym przypadku jego czas działania (w przybliżeniu 8.6 lg N) jest nieznacznie gorszy. W y szu k iw a n ie in terp o la cy jn e. Zapomnijmy przez chwilę o komputerach i po
myślmy, w jaki sposób ludzie rzeczywiście wyszukują. Czasami życie codziennie przynosi rozwiązania, które prowadzą do dobrych algorytmów. Wyobraźmy sobie, że szukamy pewnego słowa w słowniku. Prawdopodobnie nie rozpoczniemy od zajrzenia na środkową stronę, a następnie na strony w 1/4 lub 3/4 objętości słownika itd., jak byśmy postąpili, wyszukując binarnie. Jeszcze mniej prawdopodobne jest to, że zastosujemy wyszukiwanie Fibonacciego! Jeśli słowo zaczyna się od litery A, prawdopodobnie rozpoczniemy wyszuki wanie blisko początku słownika. W rzeczywistości w wielu słownikach zaznaczono pierwsze lub środkowe strony zawierające słowa zaczynające się na poszczególne litery. Taki pomysł łatwo zaadaptować w wyszukiwaniu komputerowym, znacznie przyśpiesza on wyszukiwanie. Takie algorytmy badamy w podrozdziale 6.3. Nawet jeśli wyznaczymy miejsce rozpoczęcia wyszukiwania, nadal prawdo podobnie postąpimy odmiennie od metod już omówionych. Jeśli zauważymy, że poszukiwane słowo jest alfabetycznie dużo większe od słów na stronie, od której rozpoczęliśmy wyszukiwanie, to przerzucimy bardzo wiele stron, zanim ponownie zajrzymy na jakąś stronę. To jest znaczna różnica w porównaniu z przedstawiony mi wcześniej algorytmami, w których nie było rozróżnień między „dużo większy” a „niewiele większy”. Te rozważania sugerują następujący algorytm, który mógłby nazywać się wy szukiwaniem interpolacyjnym. Jeśli wiemy, że K leży między Ki a K u, następny test można wykonać w (K —K i)/(K U — K{) drogi między l a u, zakładając, że klucze są liczbami i odległości między kolejnymi kluczami w tym przedziale są w przybliżeniu takie same. Wyszukiwanie interpolacyjne jest asymptotycznie dużo lepsze od wyszu kiwania binarnego. Jeden krok wyszukiwania binarnego redukuje naszą „nie wiedzę” z n do ±n, podczas gdy jeden krok wyszukiwania interpolacyjnego z n do y/n, przy założeniu, że rozkład kluczy jest losowy. Zatem wyszukiwanie interpolacyjne potrzebuje średnio około lg lg kroków do zredukowania naszej niewiedzy z N do 2 . (Zobacz ćwiczenie 22).
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
451
Jednakże symulacje komputerowe pokazują, że w wyszukiwaniu interpola cyjnym liczba porównań nie spada na tyle, żeby zrekompensować dodatkowe obliczenia, chyba że przeszukiwana tablica jest dostatecznie duża. Typowe pliki nie są wystarczająco losowe, a różnica między lg lg N a lg N nie jest istotna, chyba że N jest powiedzmy większe od 216 = 65.536. Wyszukiwanie interpolacyjne jest najbardziej przydatne w początkowych etapach przeszukiwania dużych plików zewnętrznych, kiedy to po zawężeniu obszaru wyszukiwania całość można szybko zakończyć wyszukiwaniem binarnym. (Zauważmy, że wyszukiwanie w słowniku jest w istocie przykładem wyszukiwania zewnętrznego, a nie wewnętrznego. Wy szukiwanie zewnętrzne omawiamy w dalszej części tej książki). H istoria i bibliografia. Najwcześniejszym, znanym przykładem długiego ciągu
elementów, uporządkowanego po to, żeby usprawnić przeszukiwanie, jest sławna babilońska tabliczka odwrotności Inakibit-Anu, pochodząca z okresu około 200 lat p.n.e. Ta gliniana tabliczka zawiera ponad 100 par wartości, które okazują się być początkiem ciągu, posortowanego w porządku leksykograficznym, około 500 liczb sześćdziesiątkowych wielokrotnej precyzji oraz ich odwrotności. Dla przykładu, do tego ciągu należą następujące pary: 0 1 1 3 09 3 4 29 08 08 5 3 20 0 1 1 3 14 3 1 52 30 0 1 13 43 40 48
49 12 2 7
0 1 1 3 48 40 30 0 1 1 4 04 26 40
4 8 46 22 59 25 2 5 5 5 33 20 48 36
49 09 07 12 48 49 4 1 15
Posortowanie 500 elementów podobnych do tych, z użyciem ówczesnej technolo gii, musiało być nie lada osiągnięciem. [Dalsze szczegóły znajdziemy w 11 roz dziale książki D. E. Knutha, Selected Papers on Computer Science (Cambridge Univ. Press, 1996)]. Porządek liczbowy jest całkiem naturalny, ale relacja porządku na literach lub słowach nie narzuca się tak od razu. Jednak uporządkowania liter, umożliwia jące ich porównywanie, były znane już dla większości starożytnych alfabetów. Dla przykładu, w wielu biblijnych psalmach wersety występują w ściśle alfabetycznej kolejności, pierwszy werset rozpoczyna się od alef, drugi od bet itd. Ułatwiało to ich zapamiętywanie. Kolejne litery alfabetu były używane przez Semitów i Greków do oznaczania kolejnych liczb. Na przykład a , ¡3, 7 oznaczały 1, 2 i 3. Wydaje się, że zastosowanie porządku alfabetycznego do porównywania ca łych słów było późniejszym wynalazkiem. Okazuje się, że o rzeczach, które są teraz oczywiste dla dzieci, kiedyś trzeba było uczyć dorosłych. Wiele zapisów z okresu około 300 lat p.n.e. zostało odnalezionych na Wyspach Egejskich. Znaj dowały się na nich listy nazwisk członków różnych grup religijnych. Listy były uporządkowane alfabetycznie, ale tylko względem pierwszej litery. Odpowiada to pierwszemu przebiegowi sortowania pozycyjnego z lewa na prawo. Na pew nych greckich papirusach, pochodzących z lat 134-135, znajdują się fragmen ty ksiąg podatkowych z nazwiskami podatników uporządkowanymi względem dwóch pierwszych liter. Apoloniusz Sofista wykorzystał porządek alfabetyczny względem dwóch pierwszych, a często i dalszych liter, w swoim słowniku poezji
452
WYSZUKIWANIE
6.2.1
Homerowskiej (pierwszy wiek n.e.). Znanych jest kilka przykładów doskonalszych uporządkowań alfabetycznych, w szczególności Komentarze do Hipokratesa Ga lena (około 200 roku), ale są one bardzo rzadkie. Względem tylko pierwszych liter były uporządkowane słowa w Etymologiarum Sw. Izydora (około 630 roku, księga x), natomiast Corpus Glossary (około 725 roku) wykorzystywał tylko dwie pierwsze litery każdego słowa. Dwie ostatnie prace były być może największymi nienumerycznymi plikami danych utworzonymi w średniowieczu. Pierwszym, który opisał w szczególny sposób prawdziwy porządek alfabe tyczny, był Giovanni di Genoa. Zrobił to w swojej książce Catholicon (1286). We wstępie do książki Giovanni wyjaśniał, że amo abeo amatus imprudens iusticia polisintheton
poprzedza poprzedza poprzedza poprzedza poprzedza poprzedza
bibo adeo amor impudens iustus polissenus
(w ten sposób podawał przykłady sytuacji, w których porządek między słowami jest wyznaczany przez 1 -szą, 2-gą,. . . , 6-tą literę), „i tak dalej w podobny spo sób”. Giovanni podkreślał, że odkrycie tych reguł wymagało sporego wysiłku. „Proszę cię drogi Czytelniku, nie traktuj mojej wielkiej pracy i tego porządku jako czegoś bezwartościowego”. Szczegółowe badania nad rozwojem porządku alfabetycznego, aż do czasów wynalezienia druku, zostały przeprowadzone przez Lloyda W. Daly’ego [Col lection Latomus 90 (1967), 100 stron]. Odkrył on interesujący, stary rękopis, który ewidentnie był wykorzystywany do sortowania słów po pierwszych literach (zobacz strony 89-90 w jego monografii). Pierwszy słownik języka angielskiego, Roberta Cawdreya Table Alphabeticall (London, 1604), zawiera następującą instrukcję: „Jeśli słowo, które chcesz odnaleźć, zaczyna się na (a), to szukaj go na początku tej książki, jeśli jednak pierwszą literą jest (v), to szukaj bliżej jej końca. Ponownie, jeśli twoje słowo zaczyna się od (ca), to szukaj na początku litery (c), jeśli jednak początkiem słowa jest (cu), to szukaj bliżej końca tej litery. Postępuj tak dalej do końca słowa itd.)”. Wydaje się, że Cawdrey uczył się sam porządku alfabetycznego podczas przy gotowywania słownika. Na pierwszych stronach można znaleźć pewną liczbę źle rozmieszczonych słów, ale porządek alfabetyczny w końcowej części nie jest już taki zły. Pierwszym, który napisał o wyszukiwaniu binarnym, był John Mauchly. Było to w prawdopodobnie pierwszym opublikowanym omówieniu nienumerycznych metod programowania [Theory and Techniques for the Design of Electronic Digital Computers, pod redakcją G. W. Pattersona, 1 (1946), 9.7-9.8; 3 (1946), 22.8-22.9]. Metoda stała się bardzo znana programistom, ale wydaje się, że nikt nie zastanawiał się nad szczegółami, gdy N nie było szczególnej postaci 2n —1 . [Zobacz A. D. Booth, Nature 176 (1955), 565; A. I. Dumey, Computers and
6.2.1
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
453
Automation 5 (December 1956), 7, gdzie nazwą wyszukiwania binarnego było „Dwadzieścia pytań”; Daniel D. McCracken, Digital Computer Programming (Wiley, 1957), 201-203; i M. Halpern, CACM 1 , 1 (February 1958), 1-3]. D. H. Lehmer [Proc. Symp. Appl. Math. 10 (1960), 180-181] był najpraw dopodobniej pierwszym, który opublikował algorytm wyszukiwania binarnego działający dla dowolnego N. Następny krok wykonał H. Bottenbruch [JACM 9 (1962), 214], który zaprezentował interesującą odmianę algorytmu B, w której to do samego końca unika się testów na równość. Stosując w kroku B 2 przypisanie i <— \(l + u )/ 2], zamiast i [(/ + u ) /2J, dla K > wykonuje l *— i. Wówczas u — l maleje w każdym kroku. Na koniec, gdy l = u, mamy Ki < K < Ki+i i za pomocą jednego dodatkowego porównania możemy sprawdzić, czy wyszukiwanie kończy się sukcesem. (Bottenbruch zakładał, że na początku K > K i). Ten pomysł na wielu maszynach nieznacznie przyśpiesza wewnętrzną pętlę, a te same zasady znajdują zastosowanie we wszystkich algorytmach omawianych w tym punkcie. Jednak wyszukiwanie zakończone sukcesem wymaga średnio około jednej iteracji więcej, co wynika z (2). Ponieważ pętla wewnętrzna jest wykonywana tylko około lg7V razy, ta zależność między dodatkową iteracją a szybszą pętlą nie pozwala zaoszczędzić na czasie działania, chyba że n jest bardzo duże. (Zobacz ćwiczenie 23). Z drugiej strony, algorytm Bottenbrucha znajduje skrajnie prawe wystąpienie danego klucza w tablicy dopuszczającej powtórzenia kluczy, a cza sami ta własność jest ważna. K. E. Iverson [A Programming Language (Wiley, 1962), 141] opisał algorytm B, ale bez rozważenia wyszukiwań kończących się niepowodzeniem. D. E. Knuth [CACM 6 (1963), 556-558] przedstawił algorytm B jako przykład zastosowania systemu automatycznego tworzenia schematów blokowych. Jednorodne wyszu kiwanie binarne, algorytm C, przedstawił autorowi w 1971 roku A. K. Chandra ze Stanford University. Wyszukiwanie Fibonacciego zostało odkryte przez Davida E. Fergusona [CACM 3 (1960), 648]. Drzewa binarne podobne do drzew Fibonacciego pojawiły się w pionierskiej pracy norweskiego matematyka Axela Thuego we wczesnych latach ubiegłego stulecia (zobacz ćwiczenie 28). Nieetykietowane drzewo Fibo nacciego znalazło się też jako ciekawostka w popularnej książce Hugona Stein hausa Kalejdoskop matematyczny (Warszawa: WSiP, 1989). Było narysowane do góry nogami i wyglądało jak prawdziwe drzewo, w którym prawe gałęzie są dwa razy dłuższe od lewych, tak że wszystkie liście znajdowały się na tym samym poziomie. Wyszukiwanie interpolacyjne zostało zaproponowane przez W. W. Petersona [IBM J. Res. & Devel. 1 (1957), 131 -132]. Poprawna analiza jego średniego czasu działania została podana wiele lat później (zobacz ćwiczenie 22). ĆW ICZENIA ►
1 • [21]
U d o w o d n ij, ż e je ś li w k r o k u B 2 a lg o r y t m u w y s z u k i w a n i a b in a r n e g o u < /, t o
w ó w c z a s u = l — 1 i K u < K < K\. ( P r z y j m ij u m o w n ie , ż e K q — —00 i K n + i = + 00 ,
454
WYSZUKIWANIE
6.2.1
c h o c ia ż w r z e c z y w i s t o ś c i t e s z t u c z n e k lu c z e n ig d y n ie s ą w a lg o r y t m i e u ż y w a n e i d la t e g o n i g d y n ie w y s t ę p u j ą w p r a w d z iw e j t a b li c y ) . ►
2 . [22] C z y a lg o r y t m B n a d a l p r a c o w a łb y p o p r a w n ie , d la k l u c z a K o b e c n e g o w t a b lic y , je ś li (a ) w k r o k u B 5 w y k o n a m y „/ «— i ” z a m ia s t „Z i + 1 ” ? (b ) w k r o k u B 4 w y k o n a m y „ u +— ż” z a m ia s t „ u <— i — 1 ” ? (c) d o k o n a m y o b u t y c h z m ia n ? 3.
[15]
J a k i a lg o r y t m w y s z u k i w a n i a o d p o w i a d a d r z e w u
(^ )
f
t
?
,
Ile w y n o s i ś r e d n ia lic z b a p o r ó w n a ń w p r z y p a d k u w y s z u k iw a n ia z a k o ń c z o n e g o s u k c e s e m , a ile w p r z y p a d k u z a k o ń c z o n e g o n ie p o w o d z e n ie m ? 4.
[20] J e ś li w y s z u k iw a n ie z a p o m o c ą p r o g r a m u 6 . 1 S ( w y s z u k iw a n ie lin io w e ) z a b ie r a
d o k ła d n ie 638 j e d n o s t e k c z a s u , t o ile c z a s u z a b ie r z e w y s z u k iw a n ie z a p o m o c ą p r o g r a m u B ( w y s z u k iw a n ie b in a r n e ) ? 5 . [M2Ą] D l a j a k i c h w a r t o ś c i N p r o g r a m B j e s t w ś r e d n im p r z y p a d k u r z e c z y w iś c ie wolniejszy o d w y s z u k i w a n i a lin io w e g o ( p r o g r a m 6 . 1 Q ), p r z y z a ło ż e n iu , ż e w y s z u k iw a n ie k o ń c z y s ię s u k c e s e m ?
6 . [28]
( K . E . I v e r s o n ) Ć w i c z e n ie 5 p o d p o w ia d a , że n a jle p ie j b y ł o b y m ie ć m e t o d ę
h y b r y d o w ą , w k t ó r e j p r z e c h o d z i ło b y s ię o d w y s z u k iw a n ia b in a r n e g o d o w y s z u k iw a n ia lin io w e g o , g d y d łu g o ś ć p r z e d z i a ł u w y s z u k i w a n i a z m a l a ł a b y p o n iż e j o d p o w ie d n io d o b r a n e j s t a łe j . Z a p r o g r a m u j e fe k t y w n ie t a k i a lg o r y t m w j ę z y k u MIX i w y z n a c z w ła ś c iw ą s t a łą . ►
7.
[M22] C z y a lg o r y t m U n a d a l p o z o s t a n ie p o p r a w n y , g d y k r o k U l z m ie n im y w n a
s tę p u ją c y sp osób : a) za ró w n o
i, j a k
i
b) za ró w n o i, ja k i
m m
z o s t a n ie p r z y p i s a n a w a r t o ś ć [iV / 2j ? z o s t a n ie p r z y p i s a n a w a r t o ś ć [7V /2 ]?
[ Wskazówka: P r z y p u ś ć m y , ż e w k r o k u p ie r w s z y m m ie lib y ś m y „ P r z y p i s z i
0, m <— N
( lu b N + 1 ) , p r z e jd ź d o U 4 ” ].
8 . [M20] N ie c h Sj = DELTA [ j ] b ę d z ie j - t y m p r z y r o s t e m z a lg o r y t m u C , z d e fin io w a n y m w ( 6 ). a ) Ile w y n o s i s u m a
ft?
b ) J a k ą n a jm n ie js z ą , a j a k ą n a j w i ę k s z ą w a r t o ś ć m o ż e p r z y j ą ć i w k r o k u C 2 ? 9.
[20] C z y is t n ie je ja k a k o lw i e k w a r t o ś ć N > 1 , d la k t ó r e j a lg o r y t m y B i C s ą d o
k ł a d n i e r ó w n o w a ż n e w t a k i m z n a c z e n iu , ż e w o b u p r z y p a d k a c h d la k a ż d e g o a r g u m e n t u z o s ta n ą w y k o n a n e te sa m e c ią g i p o ró w n a ń ? 10 .
[21 ] W y j a ś n i j , w j a k i s p o s ó b n a p is a ć p r o g r a m w j ę z y k u MIX im p le m e n t u ją c y a lg o
r y t m C , k t ó r y b ę d z ie z a w i e r a ł w p r z y b liż e n iu 7 lg A? in s t r u k c ji i k t ó r e g o c z a s d z ia ła n ia b ę d z ie w y n o s ił o k o ło 4 .5 lg iV je d n o s t e k . 11.
[M26]
Z n a j d ź d o k ła d n e w z o r y n a ś r e d n ie w a r t o ś c i C l , C 2 i A z a n a liz y p r o g r a m u
C , j a k o fu n k c je N i S .
1 2 . [20] N a r y s u j d r z e w o b in a r n e o d p o w i a d a j ą c e m e t o d z ie S h a r a d la N = 1 2 . 13 .
[M2Ą] U łó ż t a b li c ę ś r e d n ic h lic z b p o r ó w n a ń w y k o n y w a n y c h w a lg o r y t m ie S h a r a N ^ 1 6 , u w z g l ę d n i a ją c w y s z u k i w a n i a k o ń c z ą c e s ię z a r ó w n o s u k c e s e m , j a k
d la 1 ^
i n ie p o w o d z e n ie m .
6.2.1 14.
WYSZUKIWANIE W TABLICY UPORZĄDKOWANEJ
455
[21] W y ja ś n i j, w j a k i s p o s ó b r o z s z e r z y ć a lg o r y t m F , ż e b y m o ż n a g o b y ł o s t o s o w a ć
d la k a ż d e g o N ^ 1. 15.
[ M l 9] D l a ja k i c h w a r t o ś c i k d r z e w o F i b o n a c c i e g o r z ę d u k d e fin iu je o p t y m a ln y
a lg o r y t m w y s z u k i w a n i a w t a k i m z n a c z e n iu , ż e w y k o n u je o n ś r e d n io n a j m n i e j s z ą lic z b ę p o ró w n ań ?
[21] N a r y s u n k u 9 p r z e d s t a w io n o d ia g r a m p r z y r o s t u p o p u la c ji k r ó lik ó w w o r y g in a ln y m p r o b le m ie F i b o n a c c ie g o ( z o b a c z p u n k t 1 . 2 . 8). C z y is t n ie je p r o s t y z w i ą z e k 16.
m ię d z y t y m d ia g r a m e m a d r z e w a m i F i b o n a c c i e g o o m a w ia n y m i w g łó w n y m t e k ś c ie ?
Para wyjściowa Pierwszy miesiąc Drugi miesiąc Trzeci miesiąc Czwarty miesiąc Piąty miesiąc Szósty miesiąc R y s . 9 . P a r y k r ó lik ó w r o z m n a ż a ją c e się z g o d n ie z z a s a d ą F ib o n a c c ie g o .
17.
[M21]
N a p o d s t a w ie ć w ic z e n ia 1 .2 .8 - 3 4 ( lu b ć w ic z e n ia 5 .4 .2 - 1 0 ) w ie m y , ż e k a ż d ą
d o d a t n ią lic z b ę c a ł k o w it ą n m o ż n a w s p o s ó b j e d n o z n a c z n y p r z e d s t a w ić j a k o s u m ę lic z b F ib o n a c c ie g o U = F ai + Fa2 4- * * * + F ar ,
aj ^ a j + i + 2 d la 1 ^ j < r i aT ^ 2. U d o w o d n ij, ż e w d r z e w ie F i b o n a c c i e g o r z ę d u k ś c ie ż k a o d k o r z e n ia d o ( n ) m a d łu g o ś ć k + 1 — r — a r .
g d z ie : r ^ 1 ,
18 .
[M30] P o d a j d o k ła d n e w z o r y n a ś r e d n ie w a r t o ś c i C l , (72 i A z a n a li z y p r o g r a m u
F , ja k o fu n k c je k, F&, F k + 1 i S. 19 .
[MĄ2] P r z e p r o w a d ź d o k ła d n ą a n a liz ę ś r e d n ie g o c z a s u d z i a ła n i a a lg o r y t m u z a p r o
p o n o w a n e g o w ć w ic z e n iu 14 .
2 0 . [M22] L ic z b a p o r ó w n a ń w y m a g a n y c h w w y s z u k iw a n iu b in a r n y m w y n o s i w p r z y b liż e n iu lo g 2 N, a w w y s z u k i w a n i u F i b o n a c c ie g o w y n o s i w p r z y b l i ż e n iu (ej)/y/E) lo g ^ N . C e le m t e g o ć w ic z e n ia j e s t p o k a z a n ie , ż e t e w z o r y s ą s z c z e g ó ln y m p r z y p a d k i e m d u ż o o g ó ln ie js z e g o r e z u lt a t u . N ie c h p i q b ę d ą lic z b a m i d o d a t n im i, t a k i m i ż e p + q = 1 . R o z w a ż m y a lg o r y t m w y s z u k iw a n ia , k t ó r y m a j ą c d a n ą t a b li c ę N l ic z b u p o r z ą d k o w a n y c h r o s n ą c o , r o z p o c z y n a w y s z u k iw a n ie o d p o r ó w n a n ia a r g u m e n t u z k lu c z e m (p N )- t y m , a n a s t ę p n ie p o w t a r z a t e n k r o k w m n ie js z y c h b lo k a c h . ( W w y s z u k i w a n i u b in a r n y m p = q = 1 / 2 ; w w y s z u k i w a n i u F ib o n a c c ie g o p ~ 1/cj), q = 1 /4>2). J e ś li C ( N ) o z n a c z a ś r e d n ią lic z b ę p o r ó w n a ń w y m a g a n ą d o p r z e s z u k a n ia t a b l i c y r o z m ia r u N, t o w p r z y b liż e n iu j e s t s p e łn io n e n a s t ę p u ją c e r ó w n a n ie :
C ( 1 ) = 0;
C (N ) = 1 + p C (p N ) + qC (qN )
d la N > 1 .
J e s t t a k d la t e g o , ż e p o p ie r w s z y m p o r ó w n a n iu , z p r a w d o p o d o b ie ń s t w e m p ( w p r z y b l i ż e n iu ) w y s z u k iw a n ie r e d u k u je się d o w y s z u k i w a n i a w t a b l i c y p N - e le m e n t o w e j, a z p r a w d o p o d o b ie ń s t w e m q d o w y s z u k i w a n i a w t a b l i c y ą iV - e le m e n t o w e j. D l a d u ż y c h N m o ż e m y z ig n o r o w a ć m a ł y e fe k t u b o c z n y p o w o d o w a n y fa k t e m , że p N i q N n ie z a w s z e s ą lic z b a m i c a łk o w it y m i.
456
6.2.1
WYSZUKIWANIE
a ) P o k a ż , ż e d la p e w n e g o o d p o w ie d n io d o b r a n e g o Z>, C ( N ) = \ogb N s p e łn ia d o k ła d n ie p o d a n e z a le ż n o ś c i. W p r z y p a d k u w y s z u k iw a ń , b in a r n e g o i F ib o n a c c ie g o , w a r to ś ć
b z g a d z a s ię z w c z e ś n ie j w y p r o w a d z o n y m i w z o r a m i. b ) R o z w a ż m y n a s t ę p u j ą c e r o z u m o w a n ie : „ Z p r a w d o p o d o b ie ń s t w e m
p r o z m ia r
p r z e g lą
d a n e g o w a lg o r y t m i e p r z e d z i a ł u j e s t d z ie lo n y p r z e z l / p ; z p r a w d o p o d o b ie ń s t w e m q z a ś p r z e z l/ q . D la t e g o ś r e d n io r o z m ia r z o s t a n ie p o d z ie lo n y p r z e z p - ( 1 /p) + q- ( 1 /q)
= 2 , t a k w ię c t e n a lg o r y t m j e s t t a k s a m o d o b r y j a k w y s z u k iw a n ie b in a r n e , n ie z a le ż n ie o d p i qv . C z y j e s t c o k o lw ie k z łe g o w t y m r o z u m o w a n iu ?
21. [20]
N a r y s u j d r z e w o b in a r n e o d p o w i a d a j ą c e w y s z u k iw a n iu i n t e r p o la c y jn e m u d la
N = 10.
22. [MĄ1] (A.
C . Y a o i F . F . Y a o ) P o k a ż , ż e w ł a ś c iw ie z o r g a n iz o w a n e w y s z u k iw a n ie
i n t e r p o la c y jn e w y m a g a w p r z y b li ż e n iu ś r e d n io lg l g N p o r ó w n a ń , g d y z a s t o s u je m y j e d o
N k l u c z y w y b r a n y c h n ie z a le ż n ie z r o z k ła d e m je d n o s t a j n y m , a n a s tę p n ie p o s o r to w a n y c h . P o n a d t o , każdy a lg o r y t m w y s z u k i w a n i a z a s t o s o w a n y d o t a k ie j t a b l i c y m u s i ś r e d n io w y k o n a ć lg lg N p o r ó w n a ń . ► 23.
[25]
W s p o m n ia n y
pod
k o n ie c t e g o
p u n k tu
a lg o r y t m
w y s z u k iw a n ia b in a r n e g o
H . B o t t e n b r u c h a u n ik a d o s a m e g o k o ń c a t e s t ó w n a r ó w n o ś ć . ( P o d c z a s w y k o n y w a n ia a lg o r y t m u w ie m y , ż e K i
^ K < K u+ i, a r ó w n o ś ć j e s t s p r a w d z a n a d o p ie r o , g d y l = u). T a k a s z t u c z k a p o w o d u je , ż e d la d u ż y c h N p r o g r a m B d z i a ł a t r o c h ę s z y b c ie j,
p o n ie w a ż z p ę t l i w e w n ę t r z n e j m o ż e m y u s u n ą ć in s t r u k c ję „JE ” . ( J e d n a k t e n p o m y s ł n ie j e s t z b y t p r a k t y c z n y , p o n ie w a ż l g i V j e s t z a z w y c z a j m a łe ; m u s ie lib y ś m y m ie ć N > 266, ż e b y z r ó w n o w a ż y ć d o d a t k o w ą p r a c ę , k t ó r ą w y k o n u je m y w p r z y p a d k u w y s z u k iw a n ia k o ń c z ą c e g o się s u k c e s e m , g d y ż c z a s d z i a ła n i a a lg o r y t m u m a le je z (1 8 lg N — 1 6 ) u ( z o b a c z ( 5 )) d o ( 1 7 . 5 l g N + 1 7 ) u ! ) . P o k a ż , ż e każdy a lg o r y t m w y s z u k i w a n i a o d p o w i a d a j ą c y p e w n e m u d r z e w u b in a r n e m u m o ż n a p r z e k s z t a łc i ć w a lg o r y t m , k t ó r y w w ę z ła c h w e w n ę t r z n y c h m a t y lk o d w a r o z g a ł ę z i e n ia ( < k o n t r a ^ ) z a m ia s t t r z e c h r o z g a łę z ie ń ( < , = m o w a w g łó w n y m
t e k ś c ie . W
lu b > ), o ja k i c h b y ł a
s z c z e g ó ln o ś c i p o k a ż , j a k w t e n s p o s ó b z m o d y fik o w a ć
a lg o r y t m C . ► 24.
[23]
W p o d p u n k c ie 2 .3 .4 .5 i p u n k c ie 5 .2 .3 p r z e k o n a liś m y się , ż e z u p e łn e d r z e w o
b in a r n e m o ż n a w y g o d n i e p a m ię t a ć w k o le jn y c h lo k a c ja c h w p a m ię c i. Z a p r o p o n u j e fe k t y w n y a lg o r y t m w y s z u k i w a n i a w y k o r z y s t u j ą c y t a k ą r e p r e z e n t a c ję . [ Wskazówka: C z y m o ż n a w w y s z u k i w a n i u b in a r n y m
w y k o r z y s t a ć m n o ż e n ie p r z e z 2 z a m ia s t d z ie le n ia
p r z e z 2 ?] ► 25.
[M25]
Z a łó ż m y , ż e w d r z e w ie b in a r n y m
m a m y ak w ę z łó w w e w n ę t r z n y c h i bk
w ę z łó w z e w n ę t r z n y c h n a p o z io m a c h k = 0 , 1 , . . . . ( K o r z e ń j e s t n a p o z io m ie z e r o ) . T a k w ię c d la d r z e w a z r y s u n k u 8 m a m y (a o , a i , . . . , a s ) = ( 1 , 2 , 4 , 4 , 1 , 0 ) i ( 60, b\ , . . . , 65) = ( 0 ,0 , 0 ,4 , 7, 2 ). a ) Z n a j d ź p r o s t ą z a le ż n o ś ć a lg e b r a ic z n ą , k t ó r a z a c h o d z i d la fu n k c ji t w o r z ą c y c h
A(z)
=
J 2 k a kz k i B ( z ) = Y , k bf=zk . b ) R o z k ł a d p r a w d o p o d o b ie ń s t w a d la w y s z u k i w a n i a k o ń c z ą c e g o s ię s u k c e s e m m a fu n k c ję t w o r z ą c ą p o s t a c i g(z) =
z A ( z ) / N , n a t o m ia s t w p r z y p a d k u p o r a ż k i fu n k c ją
t w o r z ą c ą j e s t h ( z ) = B ( z ) / ( N + 1 ) . ( Z a t e m p r z y o z n a c z e n ia c h z g łó w n e g o t e k s t u m am y C n
=
m ea n (^ ), C N f
=
m ea n (ń ), a
( 2 ) o p is u je z a le ż n o ś ć m ię d z y t y m i
w ie lk o ś c ia m i) . Z n a j d ź z w i ą z e k m ię d z y vai(g) i v a r ( h ) .
26. [22]
P o k a ż , ż e d r z e w a F i b o n a c c i e g o m a j ą z w ią z e k z s o r to w a n ie m n a t r z e c h t a
ś m a c h p r z e z s c a la n ie w ie lo fa z o w e .
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
27. [M30\
457
(H . S, S t o n e i J o h n L in n ) R o z w a ż m y p r o c e s w y s z u k i w a n i a t y l k o p r z e z
p o r ó w n y w a n ie k lu c z y , w k t ó r y m k o r z y s t a s ię je d n o c z e ś n ie z k r o k u w y s z u k iw a n ia m a m y d a n e
k
in d e k s ó w
k
p roceso rów . W k a żd y m
i w y k o n u je m y je d n o c z e ś n ie
k
— K i ., t o w y s z u k iw a n ie k o ń c z y s ię s u k c e s e m . i W p r z e c iw n y m p r z y p a d k u p r z e c h o d z im y d o n a s tę p n e g o k r o k u , z g o d n ie z j e d n y m z 2 m o ż liw y c h w y n ik ó w p o r ó w n a ń K < lu b K > K i j d la 1 ^ j ^ k. p o r ó w n a ń . J e ś li d la p e w n e g o j ,
K
U d o w o d n ij, ż e w k a ż d y m t a k i m p r o c e s ie z a w s z e w y k o n y w a n y c h j e s t ś r e d n io c o n a jm n ie j (w p r z y b liż e n iu ) l o g fc+1 N k r o k ó w , g d y N —> oo i p r z y z a ło ż e n i u , ż e k a ż d y k lu c z w t a b l i c y j e s t a r g u m e n t e m w y s z u k i w a n i a z t a k i m s a m y m p r a w d o p o d o b ie ń s t w e m . ( Z a t e m p o t e n c ja ln e p r z y ś p ie s z e n ie w s t o s u n k u d o je d n o p r o c e s o r o w e g o w y s z u k i w a n i a b in a r n e g o j e s t t y l k o lg ( f c - ł- l) - k r o t n e , a n ie
k-k r o t n e ,
j a k m o g lib y ś m y o c z e k iw a ć . W t y m
s e n s ie d u ż o le p ie j p r z e z n a c z y ć p r o c e s o r y d o r ó ż n y c h n ie z a le ż n y c h p r o b le m ó w w y s z u k i w a n ia , n iż k a z a ć im w s p ó ln ie w y k o n y w a ć p o je d y n c z e w y s z u k iw a n ie ) . 28.
[M 2 3 ] Drzewa Thuego Tn d e fin iu je się p r z e z w y r a ż e n i a a lg e b r a ic z n e z je d n y m
o p e r a t o r e m b in a r n y m *: To(x) — x * x, T \(x) — x, T n+ 2 {%) = T n+\(x) * T n (x). a ) L ic z b a liś c i w d r z e w ie T n j e s t l ic z b ą w y s t ą p i e ń x w T n (x) p o j e g o p e ł n y m r o z p i s a n iu . W y r a ź t ę lic z b ę w z a le ż n o ś c i o d lic z b F ib o n a c c ie g o . b ) U d o w o d n ij, ż e je ś li o p e r a t o r * s p e łn i a a k s jo m a t ((x * x ) * x) * ( ( X * x) * x) = X ,
t o w ó w c z a s T m (T n {x)) = T m + n _ i ( x ) d la k a ż d e g o m ^ 0 i n ^ 1 . ► 29.
[22]
( P a u l F e ld m a n ,
1985)
Z a m ia s t z a k ł a d a ć , ż e K i < K 2 < • ■■< K n , z a łó ż m y ,
że K p(1) < K p(2) < • • • < K p (n ), g d z ie p ( l ) p ( 2 ) . . . p ( N) j e s t i n w o lu c ją i p( j ) ~ j d la k a ż d e g o p a r z y s t e g o j . P o k a ż , ż e m o ż n a z lo k a liz o w a ć k lu c z K lu b s t w ie r d z ić j e g o b r a k , w y k o n u ją c c o n a j w y ż e j 2 |_lgiVj + 1 p o r ó w n a ń .
[27]
(Kodowanie przez inwolucje) W y k o r z y s t u j ą c p o m y s ł z p o p r z e d n ie g o ć w ic z e n ia , z n a jd ź s p o s ó b r o z m ie s z c z e n ia N r ó ż n y c h k l u c z y t a k , ż e b y w z g lę d n y p o r z ą d e k 30.
m ię d z y n im i k o d o w a ł n ie ja w n ie d o w o ln ą d a n ą t a b li c ę t - b i t o w y c h l ic z b c a ł k o w it y c h X i ,
%2 , .
x m, gd y m
N f 4 + 1 — 2*. Z a p o m o c ą T w o j e g o r o z m ie s z c z e n ia p o w in n o
b y ć m o ż liw e w y z n a c z e n ie
k
n a jb a r d z ie j z n a c z ą c y c h b it ó w l ic z b y X j z a p o m o c ą t y l k o
k
p o r ó w n a ń , d la d o w o ln e g o d a n e g o j , j a k i z lo k a liz o w a n ie d o w o ln e g o k l u c z a z a p o m o c ą ^ 2 |_lgiVJ 4 - 1 p o r ó w n a ń . ( T e n w y n i k z o s t a ł w y k o r z y s t a n y w t e o r e t y c z n y c h b a d a n ia c h n a d s t r u k t u r a m i d a n y c h , k t ó r e s ą a s y m p t o t y c z n i e e fe k t y w n e z a r ó w n o c z a s o w o , j a k i p a m ię c io w o ) .
6.2.2. Wyszukiwanie w drzewach binarnych
W poprzednim punkcie przekonaliśmy się, że ukryta struktura drzewa binarne go umożliwia lepsze zrozumienie wyszukiwania binarnego i Fibonacciego. Dla danej wartości N drzewo odpowiadające wyszukiwaniu binarnemu gwarantuje teoretyczną minimalną liczbę porównań, potrzebną do wyszukiwania w tablicy za pomocą porównań kluczy. Jednak metody opisane w poprzednim punkcie nadają się głównie dla tablic o ustalonym rozmiarze, ponieważ liniowa alokacja rekordów powoduje, że ich wstawianie i usuwanie jest dość drogie. Jeśli tablica zmienia się dynamicznie, możemy więcej czasu spędzać na utrzymywaniu jej właściwej organizacji, niż oszczędzamy, wyszukując w sposób binarny.
458
WYSZUKIWANIE
6.2.2
Jawne zastosowanie drzew binarnych umożliwia szybkie wstawianie i usu wanie rekordów, jak i efektywne przeszukiwanie tablicy. W rzeczywistości dosta jemy w ten sposób metodę, która jest przydatna zarówno do wyszukiwania, jak i sortowania. Taki wzrost elastyczności jest możliwy przez dodanie do rekordów w tablicy dwóch pól na dowiązania. Metody przeszukiwania rosnących tablic nazywane są często algorytmami dla tablic symboli, ponieważ takie metody są zazwyczaj używane w asemblerach, kompilatorach i innych programach systemowych do przetwarzania symboli de finiowanych przez użytkownika. Dla przykładu, w kompilatorze klucz w każdym rekordzie może być identyfikatorem zmiennej w programie w języku FORTRAN lub C, a reszta rekordu może zawierać informacje o typie tej zmiennej i jej miejscu w pamięci. Klucz mógłby być także symbolem w programie w języku MIX, a reszta rekordu mogłaby zawierać ekwiwalent dla tego symbolu. Algorytmy wyszukiwania drzewowego i procedury wstawiania, opisane w tym punkcie, znaj dują efektywne zastosowanie w algorytmach dla tablic symboli, w szczególności gdy istnieje potrzeba wypisywania listy symboli w porządku alfabetycznym. Inne algorytmy dla tablic symboli są opisane w podrozdziałach 6.3 i 6.4. Na rysunku 10 przedstawiono drzewo wyszukiwań binarnych zawierające nazwy jedenastu znaków zodiaku po łacinie. Jeśli teraz chcemy znaleźć dwunasty znak, SAGITTARIUS, patrzymy na korzeń lub szczyt drzewa i widzimy, że jest on większy od słowa CAPRICORN, zatem idziemy w prawo; poszukiwany symbol jest większy od słowa PISCES, tak więc ponownie idziemy w prawo; jest mniejszy od TAURUS, zatem idziemy w lewo; i jest mniejszy od SCORPIO, więc dochodzimy do węzła zewnętrznego [sj. Wyszukiwanie kończy się niepowodzeniem; możemy te raz wstawić słowo SAGITTARIUS (Łucznik) w miejsce zakończenia wyszukiwania, dowiązując go do drzewa w miejscu węzła zewnętrznego 8 . W ten sposób można
R y s . 1 0 . D r z e w o w y s z u k i w a n i a b in a r n e g o .
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
459
powiększyć tablicę bez konieczności przesuwania żadnego z istniejących rekor dów. Drzewo z rysunku 10 można otrzymać, zaczynając z pustego drzewa i wsta wiając kolejno klucze C A P R IC O R N (Koziorożec), A Q U A R IU S (Wodnik), P I S C E S (Ry ba), A R I E S (Baran), T A U R U S (Byk), G E M IN I (Bliźnięta), C A N C E R (Rak), L E O (Lew), V IR G O (Panna), L I B R A (Waga), S C O R P IO (Skorpion) w tej kolejności. Wszystkie klucze z lewego poddrzewa korzenia na rysunku 10 są alfabetycz nie mniejsze od C A P R IC O R N , a wszystkie klucze w prawym poddrzewie są alfabe tycznie większe. To samo jest prawdziwe dla lewego i prawego poddrzewa każdego węzła. Wynika stąd, że klucze pojawiają się w ściśle alfabetycznym porządku A Q U A R IU S ,
A R IE S ,
CANCER,
C A P R IC O R N ,
G E M IN I,
LEO,
...,
V IR G O
jeśli przechodzimy drzewo z lewa na prawo w porządku symetrycznym (zobacz punkt 2.3.1), ponieważ w tym porządku najpierw jest przeglądane lewe poddrzewo każdego węzła, potem sam węzeł, a na koniec prawe poddrzewo. W algorytmie poniżej przedstawiamy szczegółowo procesy wyszukiwania i wstawiania. Algorytm T ( Wyszukiwanie w drzewie i wstawianie do drzewa). Dana jest tablica rekordów, które tworzą drzewo binarne w sposób opisany powyżej. W tym algorytmie wyszukujemy z danym argumentem K. Jeśli K nie ma w tablicy, to do drzewa, we właściwe miejsce, jest wstawiany nowy węzeł z kluczem K . O w ę z ła c h w d r z e w ie z a k ła d a s ię , ż e z a w ie r a j ą c o n a jm n ie j n a s t ę p u j ą c e p o la : K E Y (P ) = k lu c z p a m i ę t a n y w N O D E (P ); L L IN K (P ) = d o w ią z a n ie d o le w e g o p o d d r z e w a N O D E (P ); R L IN K (P ) = d o w ią z a n ie d o p r a w e g o p o d d r z e w a N O D E (P ).
Puste poddrzewa (węzły zewnętrzne na rysunku 10) są reprezentowane przez puste dowiązanie A. Zmienna RO O T wskazuje na korzeń drzewa. Dla wygody przyjmujemy, że drzewo jest niepuste (tzn. RO O T ^ A), ponieważ w takim przy padku wiadomo, co trzeba zrobić. T l . [ I n ic jo w a n ie ] P
ROOT. ( Z a p o m o c ą z m ie n n e j P b ę d z i e m y p o r u s z a ć s ię w d ó ł
d r z e w a ). T 2.
T 3.
T 4.
T 5.
[Porównywanie] Jeśli K < K E Y ( P ) , przejdź do T3; jeśli K > K E Y ( P ) , przejdź do T4; jeśli natomiast K —K E Y ( P ) , to zakończ wyszukiwanie sukcesem. [Przejście w lewo] Jeśli L L I N K ( P ) ^ A, przypisz P <— L L I N K ( P ) i wróć do T2. W przeciwnym razie przejdź do T5. [Przejście w prawo] Jeśli R L I N K ( P ) ^ A, przypisz P R L I N K ( P ) i wróć do T2, [Wstawianie do drzewa] (Wyszukiwanie zakończyło się niepowodzeniem; teraz wstawiamy K do drzewa). Przypisz Q 4= A V A I L , adres nowego węzła. Wykonaj K E Y (Q ) <— K, L L I N K ( Q ) R L IN K (Q ) A. (W praktyce należy także zainicjować pozostałe pola w rekordzie). Jeśli K jest mniejsze od K E Y ( P ) , to L L I N K ( P ) <— Q , w przeciwnym razie R L I N K ( P ) <— Q. (W tym miejscu moglibyśmy wykonać P Q i zakończyć algorytm sukcesem). |
460
WYSZUKIWANIE
6.2.2
R y s . 1 1 . W y s z u k i w a n ie w d r z e w ie i w s t a w ia n ie d o d r z e w a .
Ten algorytm nadaje się do wygodnej implementacji w języku maszynowym. Możemy przyjąć dla przykładu, że węzły drzewa mają postać +
0
L L IN K
R L IN K
|
i
1
KEY ]l
i
i
i
J
rozszerzoną być może o dodatkowe słowa IN F O . Wykorzystując listę A V A I L jako pulę wolnej pamięci, jak w rozdziale 2, możemy napisać następujący program na maszynę M IX . Program T ( Wstawianie do drzewa i wyszukiwanie w drzewie). rA = K , rll = P , r I 2 = Q.
01 02 03 04 05 06 07 08
L L IN K
EQU
2 :3
R L IN K
EQU
4 :5
S T A R T LDA
4H
K
LD1
ROOT
JMP
2F
LD2
0 , 1 (R L IN K )
J2Z
5F
1H
ENT1
0 ,2
09 10 11 12 13
2H
CMPA
1,1
14 15 16 17 18 19
5H
20 21
JG
4B
JE
SU CCESS
LD2
0 , 1 (L L IN K )
J2N Z
IB
LD2
A V A IL
J2Z
OVERFLOW
1 1 1 C2 C2 C - 1 C C Cl C l - S C l - S 1 - 5 1 -s
T l . Inicjowanie. P < - ROOT.
T4. P r zejd ź w p r a w o . Q <- R L IN K (P ) D o T 5 , je ś li Q = A . p ^ q .
T2. Porównaj. D o T 4 , je ś li K > K E Y (P ). K o n ie c , je ś li K = K E Y (P ) T3. P r zejd ź w lewo. Q <— L L IN K (P ). D o T 2 , je ś li Q ^ A . T5. W staw do drzewa.
LDX
0 , 2 (R L IN K )
1 - 5
ST X
A V A IL
1 - 5
Q
STA
1,2 0 ,2
1 - 5
K E Y(Q ) < - K .
1 - 5
L LIN K (Q )
JL
IF
1 - 5
ST2
0 , 1 (R L IN K )
STZ
A
AVAIL. R LIN K (Q ) < - A .
K < K EY( P ) ? R L IN K (P )
Q.
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
22 23
1H
24
DONE EQU
JMP ST2
A
*+ 2 0 , 1 (L L IN K )
*
461
1 - S - A
1 —5
LLIN K (P ) < - Q. K o n ie c p o w s t a w ie n iu .
|
W pierwszych 13 wierszach tego programu jest wykonywane wyszukiwanie; w ostatnich 11 wierszach jest wykonywane wstawianie. Czas działania fazy wy szukiwania wynosi {1C + C l —35 + 4)u, gdzie C Cl C2 5
= liczba wykonanych porównań; = lic z b a p r z y p a d k ó w , g d y K < K E Y (P ); = lic z b a p r z y p a d k ó w , g d y K >K E Y (P ); = [wyszukiwanie zakończone sukcesem].
Średnio C l = ~{C + 5), ponieważ C l + C 2 = C, a C l —5 ma ten sam rozkład prawdopodobieństwa co C 2; zatem czas działania wynosi około (7.5C—2.55+4)t¿. To wypada korzystniej w porównaniu z algorytmami wyszukiwania binarnego wykorzystującymi drzewo niejawnie (zobacz program6.2.1 C).Dublując kod tak jak w programie 6.2.1F, moglibyśmy wyeliminować z programuTwiersz08, redukując czas działania do (6.5C —2.55 + 5) w. Jeśli wyszukiwanie kończy się niepowodzeniem, to faza wstawiania kosztuje dodatkowo 14u lub 15u. Algorytm T można w zwykły sposób zaadaptować dla rekordów i kluczy o zmiennych długościach. Na przykład, jeśli alokujemy dostępną pamięć sekwen cyjnie, zgodnie z zasadą „ostatni na wejściu, pierwszy na wyjściu”, można łatwo formować węzły o zmiennym rozmiarze; pierwsze słowo w ( 1 ) mogłoby wskazywać na rozmiar węzła. Ponieważ jest to efektywny sposób wykorzystania pamięci, algorytmy dla tablic symboli działające na drzewach są często szczególnie atrak cyjne do wykorzystania w kompilatorach, asemblerach i programach ładujących. Co z przyp ad k iem p esy m isty czn y m ? Gdy programiści pierwszy raz widzą
algorytm T są raczej sceptyczni. Jeśli klucze z rysunku 10 są wstawiane do drzewa w porządku alfabetycznym A Q U A R IU S , . . . , V IR G O , a nie kalendarzowym C A P R IC O R N , . . . , S C O R P IO , to wówczas dostaniemy zdegenerowane drzewo odpo wiadające wyszukiwaniu liniowemu. Wszystkie dowiązania L L IN K będą puste. Podobnie, jeśli klucze pojawią się w rzadkim porządku A Q U A R IU S , V IR G O , A R I E S , TA U R U S, CAN CER , S C O R P IO , C A P R IC O R N , P I S C E S , G E M IN I, L I B R A , LEO
to dostaniemy drzewo „zygzakowate”, które jest tak samo złe. (Spróbuj sam!) Z drugiej strony, drzewo z rysunku 10 wymaga średnio tylko 3 ^ porównań w wyszukiwaniu zakończonym sukcesem; to jest tylko trochę więcej, niż wy nosi minimalna średnia liczba porównań, 3, osiągana w najlepszym możliwym drzewie. Gdy drzewo jest w pełni zrównoważone, czas wyszukiwania jest w przybliże niu proporcjonalny do log N; jeśli jednak drzewo jest zdegenerowane, to wówczas czas wyszukiwania jest w przybliżeniu proporcjonalny do N. Z ćwiczenia 2.3.4.5-5 otrzymujemy, że średni czas wyszukiwania byłby w przybliżeniu y/Ñ, gdyby
462
6.2.2
WYSZUKIWANIE
wszystkie 7V-węzłowe drzewa binarne były jednakowo prawdopodobne. Jakiego zachowania się algorytmu T można tak naprawdę oczekiwać? Szczęśliwie okazuje się, że wyszukiwanie drzewowe wymaga tylko około 2 ln N «1.386 lg N porównań, jeśli klucze zostały wstawione do drzewa w losowej kolejności; dobrze zrównoważone drzewa pojawiają się często, natomiast drzewa zdegenerowane pojawiają się rzadko. Istnieje zadziwiająco prosty dowód tego faktu. Załóżmy, że każdy z NI możliwych ciągów N kluczy zostaje z jednakowym prawdopodobieństwem wy korzystany do budowy drzewa. Liczba porównań potrzebna do znalezienia da nego klucza jest o jeden większa od liczby porównań, która była potrzebna do jego wstawienia. Dlatego, jeśli przez C n oznaczymy średnią liczbę porównań potrzebnych w wyszukiwaniu zakończonym sukcesem, a przez CfN średnią liczbę porównań w wyszukiwaniu zakończonym niepowodzeniem, to wówczas mamy, że c ^ i + c i + c i+ N -+ c '» - '.
(,)
Ale z zależności łączącej długości ścieżek wewnętrznej i zewnętrznej wiemy, że Cn —
^
—1 ;
(3 )
to jest wzór 6 .2. 1- ( 2). Biorąc razem (3) i (2) dostajemy (N + 1 )C fN = 2N + Cq + C[ + *• • + C n - i -
(4)
To równanie już łatwo rozwiązać. Odejmując stronami równanie NC'n _ 1 = 2 ( N - 1 ) + C'0 + C'1 + --- + C'n _2, dostajemy (N + 1)C^ - NC'n ^ x = 2 +
C'N = CfN
stąd
+ 2 /(N + 1).
Ponieważ Cg = 0, zatem - 2H n +i - 2.
(5)
Biorąc (3), po uproszczeniach dostajemy poszukiwany wynik <7* = 2 ( 1 + ^ ) ^
-3.
(6)
Ćwiczenia 6 ,7 i 8 zawierają więcej szczegółowej informacji; można podać do kładny rozkład prawdopodobieństwa C n i C[N, a nie tylko ich średnie wartości. S o rto w an ie p rzez w sta w ia n ie do drzew a. Algorytm T został zaprojektowa
ny do wyszukiwania. Można go jednak użyć jako podstawy pewnego algorytmu sortowania wewnętrznego; w rzeczywistości możemy na niego patrzeć jak na naturalne uogólnienie wstawiania na listę (algorytm 5.2.1L). Jeśli zaprogramu jemy go właściwie, będzie tylko nieznacznie wolniejszy od najlepszych algoryt mów omawianychw rozdziale 5. Po zbudowaniu drzewa ze wszystkimikluczami przechodzimy przez drzewo w porządku symetrycznym (algorytm 2.3.1T), od wiedzając rekordy w posortowanej kolejności.
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
463
Musimy jednak zachować kilka środków ostrożności. Należy zrobić coś innego w przypadku, gdy w kroku T2 K = K E Y ( P ) , ponieważ teraz sortujemy, a nie wyszukujemy. Jedno z rozwiązań polega na tym, żeby traktować K = K E Y ( P ) dokładnie tak jak K > K EY ( P ) ; w ten sposób dostajemy algorytm stabilny. (Takie same klucze niekoniecznie muszą być sąsiednimi w drzewie; będą sąsiednie tylko w porządku symetrycznym). Jednak powtarzające się klucze mogą spowodować, że drzewo stanie się wyjątkowo źle zrównoważone, a samo sortowanie zostanie spowolnione. Inny pomysł polega na trzymaniu z każdym węzłem listy wszystkich rekordów o tym samym kluczu; to wymaga dodatkowego pola na dowiązanie, ale uczyni sortowanie szybszym w przypadku, gdy występuje dużo takich samych kluczy. Tak więc, jeśli jesteśmy zainteresowani tylko sortowaniem, a nie wyszukiwa niem, algorytm T nie jest najlepszy, ale też nie jest zły. Jeśli jednak interesują nas zastosowania łączące w sobie wyszukiwanie i sortowanie, można gorąco tę metodę polecić. Warto zauważyć, że istnieje silny związek między analizą sortowania przez wstawianie do drzewa a analizą szybkiego sortowania, chociaż obie metody wyda ją się na pierwszy rzut oka różne. Jeśli do początkowo pustego drzewa wstawiamy kolejno N kluczy, to z małymi wyjątkami wykonujemy taką samą średnią liczbę porównań jak w algorytmie 5.2.2Q. Dla przykładu, w algorytmie drzewiastym każdy klucz jest porównywany z K u a następnie każdy klucz mniejszy od K \ jest porównywany z pierwszym kluczem mniejszym od K \ itd.; w sortowaniu szybkim każdy klucz jest porównywany z pierwszym elementem dzielącym /ć, a następnie każdy klucz mniejszy od K jest porównywany z pewnym szczególnym elementem mniejszym od K itd. Średnia liczba porównań potrzebna w obu przypadkach wynosi N C n —N . (W rzeczywistości jednak algorytm 5.2.2Q wykonuje trochę więcej porównań po to, żeby przyśpieszyć wewnętrzne pętle). U s u w a n i e . Czasami chcemy, żeby komputer zapomniał o jednym z elementów tablicy. Możemy łatwo usunąć węzeł, w którym L L IN K lub R L I N K = A ; jeśli jednak oba poddrzewa są niepuste, to musimy zrobić coś specjalnego, ponieważ nie możemy wskazywać dwóch dróg naraz. Rozważmy dla przykładu ponownie rysunek 10; w jaki sposób moglibyśmy usunąć korzeń C A P R IC O R N ? Jedno rozwiązanie polega na usunięciu alfabetycznie następnego, dla którego zawsze dowiązanie L L I N K jest puste, a następnie wsta wieniu go na powrót w miejsce węzła, który rzeczywiście chcemy usunąć. Dla przykładu, na rysunku 1 0 moglibyśmy usunąć G E M IN I i zastąpić C A P R IC O R N przez G E M I N I. Ta operacja zachowuje istotny dla nas porządek między elementami w tablicy. W poniższym algorytmie opisujemy proces usuwania szczegółowo.
(Usuwanie z drzewa). Niech Q będzie zmienną wskazującą na węzeł drzewa wyszukiwań binarnych, które reprezentujemy tak jak w algorytmie T. Ten algorytm usuwa wskazany węzeł w taki sposób, żeby w wyniku dostać nadal drzewo wyszukiwań binarnych. (W praktyce albo Q = R 0 0 T , albo Q = L L IN K ( P ) , albo też R L I N K ( P ) dla pewnego węzła w drzewie. W opisywanym algorytmie A lg o r y tm D
464
6.2.2
WYSZUKIWANIE
pamięć przeznaczona na węzeł wskazywany przez Qjest zwracana do puli wolnej pamięci, żeby rzeczywiście odzwierciedlić usuwanie). D l . [Czy
jest puste?] T Q. Jeśli R L I N K ( T ) = A, to wykonaj Q < — i przejdź do D4. (Na przykład, jeśli Q = R L IN K ( P ) dla jednego P, to wykonałoby się R L I N K ( P ) <— L L I N K ( T ) ) . R L IN K
L L IN K (T )
D 2 . [Znajdowanie następnika]
Jeśli i przejdź do D4.
R <— R L I N K ( T ) .
L L IN K (R ) < - L L IN K (T ), Q < - R
D 3 . [Znajdowanie pustego L L IN K ]
L L IN K (R ) =
A, to wykonaj
<—L L I N K ( R ) . Następnie, jeśli L L I N K ( S ) ^ A, wykonaj R <— S i powtarzaj ten krok aż L L I N K ( S ) = A. (W tym miejscu S będzie równe Q$, to jest symetrycznemu następnikowi Q). Na koniec wykonaj L L IN K (S )
S
L L IN K (T ), L L IN K (R )
< - R L I N K (S ) , R L IN K (S )
< - R L IN K (T ),
Q < - S.
D 4 . [Zwalnianie węzła] Wykonaj
węzeł do puli wolnej pamięci.
A V A IL
<= T , zwracając w ten sposób usunięty
|
Zachęcamy Czytelnika, żeby spróbował zastosować ten algorytm do usunię cia A Q U A R IU S , CAN CER i C A P R IC O R N z drzewa z rysunku 10; każdy przypadek jest inny. Uważny Czytelnik mógł zauważyć, że żaden szczególny test nie jest wykonywany, gdy R L IN K ( T ) ^ A, L L IN K ( T ) = A; odkładamy omówienie tego przypadku na później, gdyż algorytm w takiej postaci ma pewne interesujące własności. Ponieważ algorytm D jest w pełni niesymetryczny między lewym a prawym poddrzewem, można by przypuszczać, że ciąg usuwań spowoduje degenerację drzewa, a co za tym idzie, ocena efektywności, której dokonaliśmy, przestanie być dalej prawdziwa. Jednak w rzeczywistości usunięcia nie powodują wcale degeneracji drzewa! Twierdzenie H (T. N. Hibbard, 1962). Po usunięciu algorytmem D losowego elementu z losowego drzewa, otrzymane drzewo będzie nadal losowe. [Czytelnicy nie interesujący się matematyką proszeni są o przejście od razu do wyrażenia (io)]. Takie sformułowanie twierdzenia jest niewątpliwie zupełnie nieprecyzyjne. Bardziej precyzyjnie można omawianą sytuację opisać następu jąco. Niech T będzie drzewem o n elementach i niech P(T) będzie prawdopo dobieństwem pojawienia się T, gdy klucze są wstawiane w losowym porządku za pomocą algorytmu T. Pewne drzewa są bardziej prawdopodobne od innych. Niech Q(T) będzie prawdopodobieństwem, że T pojawi się, jeśli n + 1 elementów wstawimy za pomocą algorytmu T, a następnie jeden z nich wybierzemy losowo i usuniemy algorytmem D. Przy liczeniu P(T) zakładamy, że każda z n! permutacji kluczy jest jednakowo prawdopodobna; przy liczeniu Q(T) zakładamy, że każda para z (n + 1 )! (n + 1 ) par, permutacja kluczy i wybrany klucz do usunięcia, jest jednakowo prawdopodobna. Przy tych założeniach twierdzenie mówi, że dla każdego T zachodzi P(T) = Q(T). Dowód. Stoimy teraz przed faktem, że to permutacje są jednakowo prawdopo dobne, a nie drzewa, i dlatego udowodnimy żądany wynik, rozważając permutacje
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
465
jako losowe obiekty. Zdefiniujemy usuwanie z permutacji, a następnie pokażemy, że „w wyniku usunięcia losowego elementu z losowej permutacji dostajemy nadal losową permutację”. Niech a ia 2 . . . a n+i będzie permutacją liczb {1, 2, . . . , n+1}; naszym ce lem jest zdefiniowanie operacji usunięcia a*, w wyniku której dostaniemy per mutację bib 2 ...b n liczb { l , 2, . . . , n} . Ta operacja powinna odpowiadać algo rytmom T i D w taki sposób, że jeśli rozpoczynamy od drzewa zbudowane go w wyniku wykonania ciągu wstawień oi, 02, . . . , an+ił a następnie usunie my di i przenumerujemy klucze od 1 do n, to otrzymamy drzewo powstające z b\ &2 • *■bn. Taką operację usuwania nie jest trudno zdefiniować. Mamy dwa przypadki. Przypadek 1: ai — n + 1 lub a% + 1 .= aj dla pewnego j < i. (To jest w zasadzie warunek, że „RLINK(aD = A”). Usuwamy a* z ciągu i odejmujemy jeden od każdego elementu większego od a*. Przypadek 2: ai + 1 = aj dla pewnego j > i. Zamieniamy a; przez aj, usuwamy aj z jego oryginalnej pozycji i odejmujemy jeden od każdego elementu większego od a*. Załóżmy dla przykładu, że dana jest permutacja 4 6 1 3 5 2. Jeśli kółkiem otoczymy usuwany element, to mamy =
4 5 1 3 2
46
4(6)1352 =
4 1 3 5 2
4 6 1 3 0 2
4 6 (T) 3 5 2 =
3 5 1 2 4
4 6 1 3
@ 6
1 3 5 2
1( 3) 5 2 =
3 5 1 42
=
4 5 1 3 2
5 (2 )=
3 5 1 24
Ponieważ możliwych operacji usuwania jest (n + 1)! (n + 1), zatem twierdzenie zostanie dowiedzione, jeśli pokażemy, że każdą z permutacji liczb { 1 , 2, . . . ,n} można otrzymać w wyniku dokładnie (n + l )2 usunięć. Niech 61 62 • • • bn będzie permutacją liczb {1, 2, . . . , n}. Zdefiniujemy (n + 1)2 usunięć, jedno dla każdej pary i, j, 1 < z, j < n + 1 . Dla i < j usunięciem jest (7) Tutaj, jak i niżej, błk jest równe albo bk, albo 6^ + 1 , zależnie od tego, czy 6^ jest mniejsze od elementu w kółku, czy też nie. To usunięcie odpowiada przypadkowi 2. Dla i > j usunięciem jest
(8) to usunięcie pasuje do definicji z przypadku 1 . Na koniec, jeśli i = mamy jeszcze jedno usunięcie z przypadku 1, a mianowicie (9)
466
WYSZUKIWANIE
6.2.2
Jako przykład weźmy n = 4 i rozważmy 25 usunięć, które dają permutację 3 1 4 2: 2= 1
j j j j j
= 1 © 3 1 4 2
= = = =
2 3 4 5
© © © ©
4 1 14 15 15
52 52 42 24
i= 2 4© 1 3© 1 4©2 405 405
5 2 4 2 5 3 2 3 3 2
7= 4
7= 3
4 1 @5 2 4 205 3 3 1© 4 2 3 1 @5 2 3 1©2 5
4 4 3 3 4
1 2 1 1 1
5©2 503 502 4©2 503
7= 5
4 4 3 4 3
1 5 2 0 2 5 3 0 1 5 2 0 1 5 3© 1 4 2©
Element w kółku jest zawsze na pozycji 7, a dla ustalonego i skonstruowa liśmy n + 1 różnych usunięć, po jednym dla każdego j; w ten sposób dla każdej permutacji b\ &2 • *• bn podaliśmy ( n + 1 )2 różnych usunięć. Ponieważ wszystkich usunięć jest tylko (n + l) 2n!, musieliśmy znaleźć wszystkie z nich. | Dowód twierdzenia H nie tylko mówi, co dostajemy w wyniku usuwania, ale pozwala także zanalizować średni czas wykonania usuwania. W ćwiczeniu 12 pokazujemy, że możemy oczekiwać, że średnio krok D2 wykonujemy w trochę mniej niż połowę czasu, gdy usuwamy losowy element z losowego drzewa. Rozważmy teraz, jak często musi być wykonywana pętla w kroku D3: Załóż my, że usuwamy węzeł z poziomu l i że węzeł zewnętrzny, który występuje bez pośrednio po nim w porządku symetrycznym, jest na poziomie k. Dla przykładu, jeśli usuwamy CAPRICORN z drzewa na rysunku 10, to / = 0 i A; = 3, ponieważ węzeł [jJ jest na poziomie 3. Jeśli k = Z+1, to w kroku D l, RLINK(T) = A. Jeśli na tomiast k > Z+l, to wówczas w kroku D3 dokładnie k —l —2 razy wykonamy przy pisanie S LLINK(R). Średnią wartością l jest (długość ścieżki wewnętrznej)/N; średnią wartością k jest (długość ścieżki zewnętrznej —odległość do najbardziej lewego węzła zewnętrznego)/^. Odległość do najbardziej lewego węzła zewnętrznego jest liczbą lewostronnych minimów w ciągu wstawień, a zatem jej średnia wartość wynosi H n , co wynika z analizy z punktu 1.2.10. Ponieważ różnicą długości ścieżki zewnętrznej i dłu gości ścieżki wewnętrznej jest 27V, średnia wartość k — l — 2 wynosi —H ^/N . Po dodaniu do tego średniej liczby przypadków, w których k — l — 2 wynosi —1, widzimy, że operacja S LLINK(R) z kroku D3, w losowym usuwaniu, jest wykonywana średnio tylko \ + (I - Hn ) /N ( i o) razy. To jest uspokajające, ponieważ przypadek pesymistyczny może być na prawdę wolny (zobacz ćwiczenie 1 1 ). Chociaż twierdzenie H jest rzeczywiście prawdziwe w sformułowanej postaci, to nie można go zastosować do ciągu usunięć, a następnie wstawień, tak jak byśmy się tego spodziewali. Drzewo pozostaje losowym po wykonaniu usunięć, ale względny rozkład wartości w drzewie mógł ulec zmianie i okazuje się, że
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
467
pierwsze losowe wstawienie po wykonaniu usunięcia niszczy własności losowości drzewa. Ten zaskakujący fakt pierwszy zauważył Gary Knott w 1972 roku i mu simy to zobaczyć (ćwiczenie 15), żeby uwierzyć. Jeszcze bardziej zaskakujące są dowody empiryczne zebrane przez J. L. Eppingera [CACM 26 (1983), 663-669, 27 (1984), 235], który odkrył, że długość ścieżki lekko maleje po wykonaniu kilku losowych usunięć i wstawień, żeby następnie rosnąć aż do osiągnięcia stanu stabilności po wykonaniu około N 2 operacji wstawiania/usuwania. Ten stan jest gorszy od zachowania się losowego drzewa dla N większego od około 150. Dalsze badania przeprowadzone przez Culbersona i Munro [Comp. J. 32 (1989), 68-75; Algorithmica 5 (1990), 295-311] doprowadziły do możliwej do przyjęcia hipotezy, że średni czas wyszukiwania w stanie stabilności wynosi asymptotycznie y/2N/97r. Jednakże Eppinger wymyślił także prostą modyfikację, polegającą na naprzemiennym wykonywaniu algorytmu D i jego lewo-prawego odbicia zwier ciadlanego. Odkrył, że prowadzi to do doskonałego stanu stabilnego, w którym długość ścieżki redukuje się do 88% normalnej wartości dla drzew losowych. Ciągle jednak brakuje teoretycznego wytłumaczenia dla tego zachowania. Jak już wspomnieliśmy wcześniej, w algorytmie D nie wykonuje się testu dla przypadku L L I N K ( T ) = A, chociaż jest to jeden z łatwych przypadków dla usuwania. Moglibyśmy dodać nowy krok między Dl a D2, a mianowicie D l | . [Czy L L IN K jest puste?] Jeśli L L I N K ( T ) = A, wykonaj Q < - R L I N K ( T ) i przejdź do D4. W ćwiczeniu 14 pokazujemy, że algorytm D z takim dodatkowym krokiem za wsze pozostawia co najmniej tak dobre drzewo, w sensie długości ścieżki, jak oryginalny algorytm D, a czasami nawet lepsze. Jeśli ten pomysł połączymy z symetryczną strategią usuwania Eppingera, długość ścieżki w stanie stabilnym, przy wielokrotnym powtarzaniu losowych operacji usuwania/wstawiania, maleje do 86% wartości dla przypadku tylko ze wstawianiem. Częstość odwołań. Jak dotąd zakładaliśmy, że każdy klucz jest z jednakowym prawdopodobieństwem argumentem wyszukiwania. W ogólniejszej sytuacji za łóżmy, że pk jest prawdopodobieństwem tego, że ma miejsce wyszukiwanie fc-tego ze wstawionych elementów, gdzie p\ H W n = 1* Wówczas prosta modyfikacja zależności (2), jeśli pozostaniemy przy założeniu o losowym porządku, tak że drzewo jest nadal losowe i zachodzi (5 ), pokazuje, że średnia liczba porównań w wyszukiwaniu zakończonym sukcesem wynosi N
N
(1 1 ) Dla przykładu, jeśli prawdopodobieństwa są zgodne z prawem Zipfa, 6-1—(8), średnia liczba porównań redukuje się do hn
- 1 + h ™/ h n
( 12 )
dla kluczy wstawionych w malejącym porządku ze względu na ich ważność. (Zobacz ćwiczenie 18). To jest około połowy porównań, jakie wynikają z analizy w przypadku równych częstości, i jest to mniej niż dla wyszukiwania binarnego.
468
R ys.
WYSZUKIWANIE
6.2.2
1 2 . 3 1 n a jc z ę ś c ie j p o j a w i a j ą c y c h się s łó w w j ę z y k u a n g ie ls k im , w s ta w io n y c h
w k o le jn o ś c i m a l e j ą c y c h c z ę s t o ś c i.
Na rysunku 12 jest przedstawione drzewo powstałe w wyniku wstawienia do początkowo pustego drzewa 31 najczęściej pojawiających się słów w języku angielskim w kolejności częstości ich występowania. Z każdym słowem została pokazana jego względna częstość. Do tego celu użyto danych statystycznych z książki H. F. Gainesa, Cryptanalysis (New York: Dover, 1956), 226. Śred nia liczba porównań w wyszukiwaniu zakończonym sukcesem wynosi dla tego drzewa 4.042; wyszukiwanie binarne, za pomocą algorytmu 6 .2.IB lub 6.2.1C, wymagałoby w tym przypadku 4.393 porównań. O p ty m aln e d rzew a w y szu k iw a ń binarnych. Te rozważania prowadzą do naturalnego pytania o najlepsze możliwe drzewo wyszukiwania w tablicy z klu-
R ys.
1 3 . O p t y m a l n e d r z e w o w y s z u k i w a ń d la 3 1 n a jc z ę ś c ie j p o j a w i a j ą c y c h się s łó w
w j ę z y k u a n g ie ls k im .
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
469
czarni o danych częstościach. Dla przykładu, optymalne drzewo dla 31 najczęściej pojawiających się słów w języku angielskim zostało pokazane na rysunku 13; potrzeba dla niego średnio tylko 3.437 porównań w wyszukiwaniu zakończonym sukcesem. Zajmiemy się teraz problemem znajdowania optymalnego drzewa. Rozważ my dla przykładu N = 3 i załóżmy, że klucze K \ < K 2 < K% mają odpowiednio prawdopodobieństwa p, ą, r. Istnieje pięć możliwych drzew: II
III
IV
V
(!3)
Rysunek 14 przedstawia zakresy p, ą, r, w których każde z tych drzew jest optymalne; drzewo zrównoważone jest najlepsze w około 45 procent przypadków, jeśli p, ą i r będziemy wybierać losowo (zobacz ćwiczenie 21 ). Niestety, dla dużych N mamy '2 N '
(T N ) / (iV + 1 ) w 4 7
( v ^ 3/2)
drzew binarnych, tak że nie możemy sprawdzić każdego z nich i wybrać tego najlepszego. Żeby więc znaleźć lepszy sposób znajdowania optymalnych drzew wyszukiwań binarnych, zbadajmy dokładniej ich własności.
'(0, 0, 1) R y s . 1 4 . J e ś li w z g lę d n y m i c z ę s t o ś c ia m i ( K i , K 2 , K 3 ) s ą (p, ą, r ) , t o t e n w y k r e s p o k a z u je , k t ó r e z p ię c iu d r z e w z ( 1 3 ) j e s t n a jle p s z e . F a k t , ż e p + ą + r — 1 c z y n i t e n w y k r e s d w u w y m ia r o w y m , c h o c ia ż m a m y t r z y w s p ó łr z ę d n e .
470
WYSZUKIWANIE
6.2.2
Jak dotąd rozważaliśmy tylko prawdopodobieństwa dla wyszukiwania koń czącego się sukcesem; w praktyce trzeba również brać pod uwagę wyszukiwanie kończące się niepowodzeniem. Na przykład, 31 słów z rysunku 13 składa się tylko na 36 procent typowego angielskiego tekstu; pozostałe 64 procent będzie miało z pewnością wpływ na strukturę optymalnego drzewa wyszukiwań. Dlatego sformułujmy nasz problem w następujący sposób: Mamy danych 2n + 1 prawdopodobieństw p i, p 2, . . . , pn i Qo>• • • >Qn, gdzie: — prawdopodobieństwo, że K i jest argumentem wyszukiwania; qi == prawdopodobieństwo, że argument wyszukiwania leży między Ki a Ki+\.
Pi
(Przyjmujemy, że q0 jest prawdopodobieństwem tego, że argument wyszukiwania jest mniejszy od X i, a qn jest prawdopodobieństwem tego, że argument wyszu kiwania jest większy od K n). Tak więc pi + p2 H \-pn + ę0 + qi H b qn = 1 i naszym zadaniem jest znaleźć drzewo binarne, które minimalizuje oczekiwaną liczbę porównań w wyszukiwaniu, czyli n
n
pj (p°ziom( © ) + ! ) + ^ 2 qk P °ziom( E ) > J= l
(m)
k= 0
gdzie Q ) oznacza j -ty węzeł wewnętrzny w porządku symetrycznym, [T] ozna cza (k + l)-szy węzeł zewnętrzny i gdzie korzeń jest na poziomie zero. Tak więc oczekiwana liczba porównań dla drzewa
(i5)
wynosi 2#o + 2pi + 3gi + 3^2 + 3ć/2 + ^ 3 + ^ 3. Nazwijmy wartość tego wyrażenia kosztem drzewa. O drzewie o minimalnym koszcie mówimy, że jest optymalne. W tej definicji nie ma potrzeby, żeby wartości p i q sumowały się do jedyn ki; możemy pytać o drzewo o minimalnym koszcie dla dowolnego ciągu „wag*1 (Pl,---,Pn\ 90, W podpunkcie 2.3.4.5 poznaliśmy algorytm Huffmana konstruujący drzewa, w których ważona długość ścieżki jest minimalna. Jednak w tamtym algorytmie wymaga się, żeby wszystkie p były równe zeru, a w powstającym drzewie wagi węzłów zewnętrznych (ę0, *• *, Qn) nie zawsze występują we właściwym porządku symetrycznym z lewa na prawo. Dlatego potrzebujemy innego rozwiązania. Ratuje nas to, że wszystkie poddrzewa drzewa optymalnego są optymalne. Na przykład, jeśli ( 15) jest drzewem optymalnym dla wag (pi,P 2,P3; to lewe poddrzewo musi być optymalne dla (pi,P 2; tfu £2); każde poprawienie poddrzewa poprawia całe drzewo. Powyższa reguła podpowiada algorytm, który systematycznie znajduje coraz większe i większe optymalne poddrzewa. Prawie taki sam pomysł zastosowali śmy w punkcie 5.4.9 do konstruowania optymalnych schematów scalania; ogólna
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
471
metoda rozwiązywania problemów w taki właśnie sposób nosi nazwę „programo wania dynamicznego” i będzie o niej mowa dalej w podrozdziale 7.7. Niech c(i,j) będzie kosztem optymalnego poddrzewa dla wag (p*+i,... ,pj\ . . . , qj)\ i niech w (i,j) = -j \~Pj +qi~\ h qj będzie sumą wszystkich tych wag; tak więc c(i,j) i w (i,j) zostały zdefiniowane dla 0 < i < j < n. Wynika stąd, że c(i ,i ) = 0, c(i,j) = w(i, j ) + min (c(i, k - 1) + c(k, j ) )
dla i < j,
(16)
i< k ^j
ponieważ minimalny możliwy koszt drzewa o korzeniu (X) wynosi w (i,j) + c(i,k —1 ) + c(fc,j). Dla i < j niech R{i>j) będzie zbiorem wszystkich k, dla których w ( 16) osiągane jest minimum; ten zbiór wskazuje na wszystkie możliwe korzenie drzew optymalnych. Równanie ( 16) pozwala obliczać c(i, j) dla j —i = l , 2, . . . , n; takich wartości jest około \ n 2, a w operacjach liczenia minimum przeglądanych jest około |n 3 wartości k. To oznacza, że drzewo optymalne można znaleźć w czasie 0 (n 3), wykorzystując 0 (n 2) komórek pamięci. W rzeczywistości z czasu działania można usunąć czynnik n, korzystając z pewnej własności monotoniczności. Niech r(i,j) oznacza element z R (i,j); nie musimy obliczać całego zbioru R(i, j), jeden reprezentant wystarczy. Jeśli już obliczyliśmy —1) i r(ż+l, j), to na podstawie ćwiczenia 27 zawsze możemy przyjąć, że r(i, j - 1 ) < r ( i , j ) < r ( i + l , j ) ,
(17)
jeśli tylko wagi są nieujemne. W ten sposób ograniczamy przeszukiwanie do tylko r(i+ l, j) —r(i, j —1) + 1 wartości k zamiast j —i, które należy sprawdzić w ( 16). Całkowita ilość pracy dla j —i — d jest teraz ograniczona przez szereg teleskopowy y;
j) - r(i, j —1 ) + l) = r ( n - d + l , n) - r( 0, d —1 ) + n —d + 1 < 2n;
i = j —d
zatem całkowity czas działania redukuje się do 0 (n2). Poniższy algorytm jest uszczegółowieniem opisanej procedury postępowania. Algorytm K (Znajdowanie optymalnych drzew wyszukiwań binarnych). Dla da nych 2n + l nieujemnych wag (pi,... ,pn; ąo, ■■■An) w tym algorytmie konstruuje my drzewa binarne t(i,j) o minimalnym koszcie dla wag (pi+i,... ,Pj] q%,... w znaczeniu zdefiniowanym powyżej. Podczas działania algorytmu są obliczane trzy tablice: c[i,j] r[i,j] w[i,j]
dla 0 < i < j < n, dla 0 < i < j < n, dla 0 < i < j < n,
koszt korzeń całkowita waga
Wyniki działania algorytmu są zapisywane w tablicy r: Jeśli i = j, jest puste; w przeciwnym razie jego lewym poddrzewem jest t(i, r[i, j] —1 ), natomiast prawym poddrzewem jest j).
472
6.2.2
WYSZUKIWANIE
K I. [Inicjowanie] Dla 0 < i < n, j = i + l , . . . , n , c[i,i] <— 0, u;[i,ż] *— qi iw [ij] <- ty[i, J -l]+ P j+ g j. Następnie dla 1 < j < n, c [ j - l , j ] w[j-T,j] i r[j —1, j] <—j. (W ten sposób zostały wyznaczone wszystkie jednowęzłowe drzewa optymalne). K 2 . [Pętla po d] Wykonaj krok K3 dla d = 2, 3, . . . , n, a następnie zakończ wykonywanie algorytmu. K3. [Pętla po j] (Wyznaczyliśmy już drzewa optymalne o mniej niż d węzłach. W tym kroku wyznaczamy wszystkie d-węzłowe drzewa optymalne). Wyko naj krok K4 dla j = d, d + 1, . . . , n. K4. [Znajdowanie c[i,j], r[z,j]] Wykonaj i +—j —d. Następnie wykonaj c[i,j\
+ minr[ij _ i ] ^ r[i+i ij](c[i, fc-l] + c[fc,j]),
a w zmiennej r[z,j] zapamiętaj wartość fc, dla którego było minimum. (W ćwiczeniu 22 dowodzimy, że r[z, j —1 ] < r[ż+l, j]). I Jako przykład zastosowania algorytmu K rozważmy rysunek 15. Powstał on w następujący sposób. Tytuły wszystkich artykułów z pierwszych dziesięciu roczników czasopisma Journal of the ACM zostały posortowane tak, żeby można było przygotować indeks, który zawierałby jeden wiersz dla każdego słowa z każ dego tytułu. Jednakże pewne słowa, jak „THE” i „EQUATION”, okazały się mało informacyjne i musiały wypaść z indeksu. Taki sposób indeksowania nazywa się indeksowaniem słów kluczowych w kontekście lub indeksowaniem KWIC (Key Word In Context). Słowa, które nie zmieściły się w indeksie, i częstości ich wystąpień zostały pokazane w węzłach wewnętrznych na rysunku 15. Zauważmy, że tytuł taki jak „On the solution of an equation for a certain new problem” jest zupełnie nieinformacyjny i w ogóle nie znalazłby się w indeksie! Pomysł indeksowania KWIC pochodzi od H. P. Luhna, Amer. Documentation 1 1 (1960), CD CD CM
R y s . 1 5 . O p t y m a l n e d r z e w o w y s z u k i w a ń b in a r n y c h d la in d e k s o w a n ia K W I C .
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
473
288-295. (Zobacz W. W. Youden, JACM 1 0 (1963), 583-646, gdzie znajduje się pełny indeks KWIC). Przygotowując płik z indeksem KWIC do sortowania, moglibyśmy wyko rzystać drzewo wyszukiwań binarnych do sprawdzania, czy dane słowo ma być w indeksie, czy nie. Słowa, które mają być w indeksie, wpadają między słowa spoza indeksu z częstościami pokazanymi na rysunku 15 w węzłach zewnętrznych; tak więc, w tytułach artykułów w JACM z lat 1954-1963 tylko 277 słów znajduje się alfabetycznie między słowami „PROBLEMS” i „SOLUTION”. Rysunek 15 przedstawia drzewo otrzymane za pomocą algorytmu K dla n = 35. Wartościami r[0, j] dla j = 1, 2, . . . , 35 są (1,1,2, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8,11,11,..., 11,21,21,21,21,21,21); wartościami r[i, 35] dla i = 0, 1, . . . , 34 są (21,21,..., 21, 25, 25, 25, 25, 25, 25, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30,33, 33, 33, 35,35). a)
§
CM
R y s . 1 6 . O p t y m a ln e d r z e w a w y s z u k i w a ń b in a r n y c h d la p o ło w y d a n y c h z r y s u n k u 15 : (a) z p o m in ię t y m i c z ę s t o ś c ia m i z e w n ę t r z n y m i; w n ę t r z n y m i.
(b ) z p o m in ię t y m i c z ę s t o ś c ia m i w e
474
WYSZUKIWANIE
6.2.2
Częstości zewnętrzne qj mają zauważalny wpływ na strukturę drzewa opty malnego; rysunek 16 (a) przedstawia drzewo optymalne, które można by otrzy mać, gdyby wszystkie qj były równe zeru. Równie ważne są częstości wewnętrzne Pi; rysunek 16(b) przedstawia drzewo optymalne, gdy pi są równe zeru. Jeśli rozważymy wszystkie częstości, to drzewo z rysunku 15 wymaga tylko 4.15 porównań, natomiast drzewa z rysunku 16 wymagają 4.69 i 4.55 porównań. Ponieważ algorytm K wymaga czasu i pamięci proporcjonalnych do n2, zatem staje się niepraktyczny dla bardzo dużych n. Oczywiście w świetle innych metod wyszukiwania, o których będzie mowa później w tym rozdziale, możemy naprawdę nie chcieć używać wyszukiwania binarnego. Załóżmy mimo wszystko, że naszym celem jest znalezienie dla dużych n optymalnego lub prawie optymal nego drzewa. Zobaczyliśmy już, że pomysł wstawiania kluczy w kolejności malejących częstości może dać zupełnie dobre drzewo w średnim przypadku; ale może być ono bardzo złe (zobacz ćwiczenie 20), a zazwyczaj nie jest zbyt bliskie drzewu optymalnemu, ponieważ nie korzysta się przy jego konstrukcji z wag qj. Inne po dejście polega na wyborze korzenia w taki sposób, żeby max(u;(0, k —1 ), w(k, n)) było możliwie najmniejsze. Takie rozwiązanie może również być niezbyt dobre, ponieważ jako korzeń można wybrać węzeł z bardzo małym pk; jednakże twier dzenie M poniżej pokazuje, że wynikowe drzewo nie będzie krańcowo dalekie od optymalności. Bardziej satysfakcjonujący algorytm można otrzymać, łącząc obie te me tody w sposób zaproponowany przez W. A. Walkera i C. C. Gotlieba [Graph Theory and Computing (Academic Press, 1972), 303-323]. Należy starać się utrzymywać równowagę między wagami z lewej i prawej strony, ale czasami trzeba przesuwać korzeń kilka kroków w prawo lub w lewo, żeby znaleźć węzeł o względnie dużym Pk- Rysunek 17 pokazuje, że jest to racjonalna metoda: Jeśli
R y s . 1 7 . O b r a z z a c h o w a n ia s ię k o s z t u j a k o fu n k c ji k o r z e n ia ,
k.
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
475
sporządzimy wykres c(0, —1) + c(k,n) jako funkcji k dla danych z rysunku 15, przekonamy się, że wynik całkowicie zależy od tego, jak duże jest pk. Metodę zstępującą, taką jak tę, można stosować dla dużych n, wybierając najpierw korzeń, a następnie budując lewe i prawe poddrzewa. Kiedy zejdziemy w dół do wystarczająco małych drzew, możemy skorzystać z algorytmu K. Otrzy many w ten sposób algorytm daje całkiem niezłe rezultaty (mówi się, że te drzewa są 2 lub 3 procent gorsze od optymalnych), a wymaga tylko 0(n) jednostek pamięci i 0 (n log n) jednostek czasu. W rzeczywistości M. Fredman pokazał, że jeśli zastosujemy odpowiednie struktury danych, to wystarczy 0 (n ) jednostek czasu [STOC 7 (1975), 240-244]; zobacz K. Mehlhorn, Data Structures and Algorithms 1 (Springer, 1984), podrozdział 4.2. Drzewa optymalne i entropia. Minimalny koszt jest blisko związany z mate matycznym pojęciem entropii, które zostało wprowadzone przez Claude’a Shannona w jego doniosłej pracy o teorii informacji [Bell System Tech. J. 27 (1948), 379-423, 623-656]. Jeśli pi, P2, • * *, Pn są prawdopodobieństwami i pi + P 2 + hPn = 1 , to wówczas entropię ii(p i,p 2, ... ,pn) definiujemy wzorem n 1 H (p1,P2,---,Pn) = Y Y f c l g — ' (l8 ) tl Pk Intuicyjnie, jeśli możliwych jest n zdarzeń i prawdopodobieństwo k-tego zda rzenia wynosi pk, to możemy sobie wyobrazić, że zajście fe-tego zdarzenia daje lg(l/pfc) bitów informacji. (Zdarzenie o prawdopodobieństwie ^ daje 5 bitów in formacji itd.). Wówczas H (p i,p 2 , . **,pn) jest oczekiwaną liczbą bitów informacji otrzymywanych w losowym zdarzeniu. Dla p& = 0 przyjmujemy, że pk lg (l¡Pk) = 0, ponieważ lim e lg - = lim — lg m = 0. e—>0+ € rn^+oo Tfl Taka umowa pozwala nam stosować ( 18) nawet wtedy, kiedy pewne prawdopo dobieństwa są równe zero. Funkcja x \g (l/x ) jest wklęsła; tzn. jej druga pochodna, —l/(xln2), jest ujemna. Dlatego H (p i,p 2, ... ,pn) osiąga maksymalną wartość dla pi = P2 = ••• = p n = l/n , czyli # ( 1 , 1 , • • • , ! ) =lgn. ( 19) \n n n/ W ogólności, jeśli określimy pi, . . . , pn_fc, ale dopuścimy, żeby pozostałe praw dopodobieństwa Pn-fc+1 , . . . , pn się zmieniały, to wówczas g\ ,Pn~k' k) = H (p1, . . . , p n_k,q) +qlgk,
(20)
■^(Pl, • • • ,Pn—fc,Pn—&+1, • • • ,Pn) ^ ^(Pl, • **,Pn—fc, 0,. . . , 0) = //(p i, . . . iPn—ki 9),
(^1 )
H(p i ) **• )Pn—A:5Pn—fc+1) ***)Pn) < H \ p 1 ,. . .
gdzie i = 1 - (pi + • • • + Pn-k)-
g
476
WYSZUKIWANIE
6.2.2
Rozważmy drzewo, nie musi być binarne, w którym prawdopodobieństwa przypisano liściom, powiedzmy
(22)
Tutaj pk jest prawdopodobieństwem, że wyszukiwanie zakończy się w liściu [k_ Wówczas rozgałęzienie w każdym węźle wewnętrznym (nie liściu) odpowiada lokalnemu rozkładowi prawdopodobieństwa, w którym prawdopodobieństwo wy brania danego poddrzewa zależy od sumy prawdopodobieństw liści z tego pod drzewa. Dla przykładu, w węźle (a) pierwsze, drugie i trzecie poddrzewa są wybierane odpowiednio z prawdopodobieństwami (Pl + P 2+ P 3+ Pi, P5, P6+P7+PS+ P9), a w węźle Cb) odpowiednimi prawdopodobieństwami są
(Pl,P2,P3 +P4)/(Pl +P2 +P3+Pi)Zdefiniujmy entropię węzła wewnętrznego jako entropię jego lokalnego rozkładu prawdopodobieństwa; tak więc H(A) = (Pl+P2+P3+P4)lg
P1+P2+P.3+P4
1
+ P5 lg — + (P6+P7+P8+P9) Ig P5 P6+P7+P8+P9 H(B) =
, P1+P2+P3+P4 , P2 P1+P2+P3+P4 P1 lg --------------------h lg P1 +P 2+P3+P4 Pl P1+P2+P3+P4 P2 P1+P2+P3+P4 P3+P4 + lg P1+P2+P3+P4 P3+P4
H (C) = ? i i g ą P2 P2 H(D) = H(E)
=
P3 P3+P4
lg ^ ± P 4 + Ps
Pa P3+P± lg P3+PA Pa
P6+ P 7+ P 8+ P 9 t P6+P7+P8+P9 Pl lg ------------------ + lg P6+P7+P8+P9 P6+P7+P8+P9 P7 P6 P8 P9 P6+P7+P8+P9 lg ff6+P7+p8+P9 , + lg i>6+P7+P8+^9 P8 P6+P7+P8+P9 P9 P6
,
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
477
Lemat E. Suma ^ p(o) H(a) po wszystkich węzłach wewnętrznych a w drzewie, gdzie p(a) jest prawdopodobieństwem dojścia do węzła a, a H(a) jest entropią a, jest równa entropii rozkładu prawdopodobieństwa w łiściach. Dowód. Łatwo udowodnić tę tożsamość przez indukcję względem wysokości drzewa (z dołu do góry). Na przykład zgodnie z powyższymi wzorami H{ A ) + (Pi +P2+P3 +P4 ) H (B) +P2 H ( C ) + (P3 + P i ) H ( D ) + (p6+ p 7+ p s + p 9) H { E )
, 1 1"P2 lg , 1 1 = Pl Ig Pl P2
, — 1 h p9 lg P
9
Wszystkie składniki zawierające lg(pi + P 2 +P 3 +Pa), lg(p3 +Pa) i lg(P6 +P 7 + p8 + P9) redukują się. | Jako wniosek z lematu E możemy zastosować entropię do pokazania pewnej użytecznej dolnej granicy kosztu dowolnego drzewa binarnego. Twierdzenie B. Niech (pi, ... ,pn; qo, . . . , qn) będą nieujemnymi wagami jak w algorytmie K, ale unormowanymi, tak żep\Ą----- \-pn + qo H-------bqn = 1. i niech P = Pi + *** + Pn będzie prawdopodobieństwem wyszukiwania zakończonego sukcesem. Niech H = H ( p 1, . . . , p nyq0, ■• - ,g „)
będzie entropią takiego rozkładu prawdopodobieństwa i niech C będzie minimal nym kosztem zdeńniowanym w ( 14 ). Wówczas, jeśli H > 2P/e, to eH
C > H - P lg— .
(23)
Dowód. Weźmy drzewo binarne o koszcie C i przypiszmy prawdopodobieństwa qk do jego liści. W każdym węźle wewnętrznym dodajmy także nową środko wą krawędź prowadzącą do nowego liścia o prawdopodobieństwie pk. Wówczas C ~ J2p(a )i gdzie sumowanie odbywa się po wszystkich węzłach wewnętrz nych a otrzymanego drzewa trójkowego, a H = ^ p(a) H (a), co wynika z le matu E. Entropia H ( a ) odpowiada trój elementowemu rozkładowi, w którym jednym z prawdopodobieństw jest pj/p(a), jeśli a jest węzłem wewnętrznym (j). W ćwi czeniu 35 dowodzimy, że H( p , q , r ) < p l g x + 1 + lg ( l + - b )
(24)
dla każdego x > 0, kiedy tylko p + q + r = 1 . Dlatego dla każdego dodatniego x prawdziwa jest nierówność n 1 ff = £ p (a )J i(a ) < ¿ a
P i lg a ; + . ( l + I g ( l + _ ) ) c '
j= l
Biorąc 2x — H / P dostajemy poszukiwany wynik, ponieważ
478
6 .2.2
WYSZUKIWANIE
C>
(H~pl<4 ")
1 + lg(l + P / H )
, eIi + P lg e) “ 1 + lg(l + P / H ) g 2 P
= 1 + lg(l + P / H ) ^
gdyż lg(l + y) < ylge dla każdego y > 0.
|
Nierówność (23) nie musi być prawdziwa dla bardzo małej entropii. Ale ograniczanie się do przypadków, w których H > 2P/e nie jest bolesne, ponieważ wartość H jest zazwyczaj bliska lg n; zobacz ćwiczenie 37. Zauważmy, że w tym dowodzie nie korzysta się z uporządkowania węzłów z lewa na prawo; dolna grani ca (23) zachodzi dla każdego drzewa binarnego, którego węzły wewnętrzne mają prawdopodobieństwa p j , natomiast węzły zewnętrzne mają prawdopodobieństwa (te, przypisane w dowolnym porządku. Entropia daje także górne ograniczenie, które nie jest zbyt odległe od tego z (23), nawet jeśli weźmiemy pod uwagę porządek węzłów z lewa na prawo: Twierdzenie M. Przy założeniach z twierdzenia B zachodzi C < H + 2-P.
(25)
Dowód. Rozważmy n + 1 sum s 0 = \qo, si = qo + P i + \q \, s2 = qo + P i + qi + P 2 + 5 <72, • • •, Sn = <7o + P i H + Q n -1 + Pn + \q n\ możemy założyć, że ¿o < si < **' < sn (zobacz ćwiczenie 38). Każdą sumę s&wyraźmy jako ułamek binarny, biorąc sn = ( . l l l . . . ) 2, gdy sn = 1. Wówczas niech słowo a&będzie najkrótszym ciągiem najbardziej znaczących bitów z który pozwala odróżnić Sk każdego Sj dla j ^ k. Na przykład moglibyśmy mieć n = 3 i s 0 = (.0000001)2 51 = (.0000101)2
5 2
(7 2
=
( . 0
0
0
1
0
1
1
) 2
=
0 0 0 1
53 = (.1100000)2 (73 = 1 Zbudujmy drzewo binarne o n + 1 liściach i takie, że Ok odpowiada ścieżce od korzenia do [fc] dla 0 < k < n, gdzie ‘0’ oznacza przejście w lewo, a ‘l ł oznacza przejście w prawo. Dodatkowo, jeśli Ok-i ma postać a^O/3fc, a Ok postać ajbl7 fc dla pewnych a*., (3k i 7 to niech węzeł wewnętrzny (fc) odpowiada ścieżce a^. Zatem dla powyższego przykładu mielibyśmy
WYSZUKIWANIE W DRZEWACH BINARNYCH
6.2.2
479
Nadal mogą być jeszcze bezimienne węzły; każdy z nich zastępujem y przez jedyne jego dziecko. Koszt wynikowego drzewa wynosi najwyżej Y^k^iPkilotkl + 1) 4Ponieważ s k < (.0:^)2 + 2
i s*,_ 1 > (.0^ ) 2, zatem mamy
Pfe < ¿gfc-i+p/c + \ q k = sk ~ s k- 1 < 2 - l afel.
(26)
Ponadto, jeśli qk > 2” *, to sjt > s k- 1 + 2_i_1 i s^+i > + 2_i_1, a stąd | < t + 1. W ynika stąd, że qk < 2_ lafcl+2; zbudowaliśmy drzewo binarne o koszcie
n
n
<
”
1 + 1«*;!)+ /c=
f c = l
0
/
l \ n / 1 \ 1 + ig — ) + ^ 9 fc i2 + ig —j f c = l
Pk
k
= 0
= P + 2(1 — P ) + H = H + 2 — P. I
W przypadku indeksowania KW IC z rysunku 15 mamy P = 1304/3288 « 0.39659 i H ( p i ,. . . , P35, go, • • • >^35) ^ 5.00635. Tak więc twierdzenie B mówi nam, że C > 3.3800, natom iast twierdzenie M, że C < 6.6098. ^ A lgorytm G arsii-W ach sa. Istnieje zadziwiająco lepszy algorytm od algo rytm u K w specjalnym przypadku, gdy pi = *• ■ = pn = 0. Taki przypadek, w którym istotne są tylko prawdopodobieństwa liści (go,gi, - • • , g™), jest szcze gólnie ważny, ponieważ pojawia się w wielu istotnych zastosowaniach. Z tego powodu w pozostałej części tego punktu zakładamy, że prawdopodobieństwa pj są równe zeru. Zauważmy, że z twierdzeń B i M mamy zatem nierówności H{q0, q i , - . . , q n ) < C(q0, q i , . . . ,qn ) < H(q0, q i , . . . , qn ) + 2;
(27)
a funkcja kosztu ( 14 ) upraszcza się do
n c = ^ 2 qklk’
lk —p°ziom E ■
(28)
k=0
Kluczową własnością, która czyni istnienie takiego algorytm u możliwym, jest następująca obserwacja: L em at W . h ^
Jeśli qk~ i > qk+i, to wówczas w każdym optym alnym drzewie ,
Dowód. Załóżmy, że qk- \ > qk+\ i rozważmy drzewo, w którym lk > /^+iWówczas [F] musi być prawym dzieckiem, a z jego lewej strony znajduje się poddrzewo L o wadze w > qk~\. Zastąpm y ojca [kj przez drzewo L, a następnie w miejsce fc+ 1 wstawmy węzeł, którego dziećmi będą & i fc+1 . To zmienia całkowity koszt drzewa o wartość —w —qk (lk — lk+\ — 1 ) 4 *gj^+i ^ Qk+1 —qk- i* Tak więc, gdy qk_i > g^+i, to rozważane drzewo nie jest optymalne, a jeśli Qk~i = gfc+i5 to nasze optymalne drzewo jest przekształcane na inne optymalne drzewo. W tym drugim przypadku znaleźliśmy optymalne drzewo, w którym h ^ ¿fc+i- I Głębsza analiza struktury optymalnego drzewa powie nam znacznie więcej.
480
WYSZUKIWANIE
6.2.2
L em at X . Niech j i k będą indeksami, takim i że j < k; m am y i) > qi +1 dla 1 < i < k; ii) qk~i < gjfe+1 ; iii) qi < gfc_i + qu dla j < i < /c — 1 oraz
iv) ę?-i > gfc-i + h - Ale z lem atu W oraz (i) wynika również, że ¿i < ¡2 ^ *** < h - Dlatego l k~1 = hPrzypuśćmy, że ls < lk — 1 < ls+1 dla pewnego s przy j < s < k. Niech t będzie najm niejszym takim indeksem < fc, że lt = h - Wówczas Za+i = *• • = h - i = h ~ 1 i 15+ 1 1 jest lewym dzieckiem; stąd wynika, że i —s jest nieparzyste, a węzeł [ 0 jest lewym dzieckiem, dla i = s + 1, s + 3, . . . , t. Zamieńmy ojca |T~] przez 11+ 1 1; zamieńmy [7] przez | i + 1 1dla s < i < i;zamieńmy również węzeł zewnętrzny 0 przez węzeł wewnętrzny,którego dziećmi są 0 i | s+ 1 1. W ten sposób koszt zmienia się o wartość < qs — qt — qt+1 < qs ~ Qk-i ~ qk, i jest mniejszy, jeśli qs < q k -i + qk- Dlatego przy założeniu (iii) zachodzi lj > — 1. Ciągle jeszcze nie skorzystaliśmy z założenia (iv). Jeśli lj = /& i 0 nie jest lewym dzieckiem, wówczas 0 musi być prawym bliźniakiem dla | jf—1 Zamieńmy ich rodzica przez \ j - 1 1; następnie zamieńmy liść 0 przez [ ¿ - 0 dla j < i < k; a na koniec zamieńmy węzeł zewnętrzny 0 przez węzeł wewnętrz ny, którego dziećmi są | fc—1 | i 0 . W ten sposób koszt zmienia się o war tość —q j - 1 + q k - 1 + Qk ^ 0, a zatem otrzymujemy drzewo optymalne spełniające punkt (b). | L em at Y . Niech j i k będą takie ja k w lemacie X i rozważm y zmodyńkowane prawdopodobieństwa W o i • • • >Q n - l ) = (Q(n *• • >
otrzym ane przez usunięcie
qk~ i
Q k - 1 + Qk i Qj i **■>Q k - 2> tffc+l’ • • *>
i
qk i
wstawienie
qk - 1 - f Qk P ° Q j - i -
Wówczas
C(qo,---,q'n- 1 ) < ( q k - i + Q k ) + C ( q 0, . . . , q n).
( 29)
Dowód. W ystarczy pokazać, że każde optymalne drzewo dla (go? • • • ?Qn) moż na przekształcić na drzewo o takim samym koszcie, w którym | k —1 1 i 0 są bliźniakami, a liście w ystępują w przepermutowanej kolejności
m
\k~ 2
k+1
n
(30)
Rozpoczynamy od drzewa skonstruowanego w lemacie X. Jeśli drzewo jest ty pu (b), to po prostu przemianowujemy liście, przesuwając | k —1 1 i 0 w lewo 0 k — 1 — j pozycji. Jeśli drzewo jest typu (a), to załóżmy, że ls_ 1 = lk — 1 1 ls = postępujem y jak następuje. Najpierw przesuwamy |fc -l| i 0 w lewo o k — 1 — s pozycji; następnie zamieniamy ich (nowego) ojca przez s - 1 1; na koniec zamieniamy 0 przez węzeł, którego dziećmi są |fc—1 1 i 0 , a także zamieniamy węzeł 0 przez | i —1 [, dla j < i < S . I
6 .2 .2
WYSZUKIWANIE W DRZEW ACH
U
2
64
13 4
A
B
6
22 C
6
32 D
21
103 5
4
E
F
6
15 G
6
47
H
1
57 5
4
I
5 7
J
32 7
K
L
6
M
20
57
63
15
5
4
4
N
D
P
6
Q
1
6
R
48
51
80
5
4
S
T
23 4
U
6
V
8 W
6
18 X
6
1 Y
8
16 Z
8
1
481
R y s. 18. Algorytm Garsii-Wachsa zastosowany do danych mówiących o częstości pojawiania się znaków w tekście w języku angielskim: fazy 1 i 2.
BINARNYCH
186
482
6.2.2
WYSZUKIWANIE
L e m a t Z. P rzy założeniach z lem atu Y w (29) m am y równość. Dowód. Każde drzewo dla (gó,. . . , gń_i) odpowiada pewnemu drzewu o liściach (30), w którym dwa psujące porządek liście, węzły fc-l] i [fc], są bliźniakami. Niech ich rodzicem będzie węzeł wewnętrzny (5). Chcemy pokazać, że każde optymalne drzewo tego typu można przekształcić na drzewo o tym samym kosz cie, w którym liście w ystępują w zwykłym porządku [o] ... n Dla j — k — 1 nie m a co dowodzić. W przeciwnym razie mamy qfi _ 1 > g'+1 dla j < i < k — 1, ponieważ qj - 1 > g ^ -i + Qk > Qj • Zatem z lem atu W mamy < 2, gdzie lx jest poziomem (aT), natom iast li jest poziomem [7] dla j < i < k — 1. Dla lx = l k - 2 po prostu przesuwamy węzeł (x) w prawo, ... fc—2 | ( x ) ; w ten sposób liście zam ieniając ciąg \j_ k - 2 na znajdą się w żądanej kolejności. W przeciwnym razie załóżmy, że ls = lx i > lx . Najpierw zamieniamy ©
E ■■■ 0 przez E *** 0 © ’ ^ aj e ^ ^ ^ ‘ ^ h - 2 >gdzie l = + 1 j es^ poziomem, na którym leżą węzły fc—1 1 i [fc]. Na koniec zastępujemy
fc—1
fc
s +1
...
fc—2
fc—2
cyklicznie przesuniętym ciągiem s +1
fc—1 1 [fc].
W ćwiczeniu 40 dowodzimy, że ta operacja zmniejsza koszt drzewa, chyba że l k_2 = l. Ale z lem atu Y wynika, że kosztu nie można zmniejszyć. Dlatego Zfc_2 = Z, co kończy dowód. | Te lem aty pokazują, że problem dla n + 1 wag go, gi, . . . , qn można zre dukować do problemu dla n wag: Najpierw znajdujemy najmniejszy indeks fc, dla którego g ^ -i < gfc+i; następnie znajdujem y największe j < fc, dla którego q j- i > q k-\ + Qk5 potem usuwamy z listy qk-x 1 qk i wstawiamy sumę qk~\ + qk bezpośrednio po g^-i- Z powyższych dowodów wynika, że w szczególnych przy padkach j = 0 lub fc = n, należy postępować tak, jakby występowały nieskoń czone wagi g_i i gn+i z lewej i prawej strony. Dowody wskazują także na to, że każde optym alne drzewo T ;, otrzymywane dla nowych wag (gó,. . . , g^_i), można przekształcić w drzewo T z oryginalnymi wagami (go,. . . , gn ) znajdującymi się we właściwej kolejności z lewa na prawo; ponadto, w obu drzewach T i T ', każda waga znajdzie się na tym samym poziomie. Dla przykładu, na rysunku 18 pokazano naszą konstrukcję dla wag qkl któ re są względnymi częstościami występowania znaków u , A, B, . . . , Z w tekście angielskim. Pierwszymi kilkoma wagami są 186, 64, 13, 22, 32, 103, . . . i zachodzi 186 > 13, 64 > 22, 13 < 32; dlatego zamieniamy „13,22” na 35. W nowym ciągu 186, 64, 35, 32, 103, ... zastępujem y „35,32” przez 67 i przesuwamy 67 na lewo od 64, otrzymując ciąg 186, 67, 64, 103,
6 .2 .2
WYSZUKIWANIE W DRZEWACH BINARNYCH 483
R y s . 19. Algorytm Garsii-Wachsa zastosowany do danych mówiących o częstości pojawiania się znaków w tekście w języku angielskim: faza 3.
484
WYSZUKIWANIE
6.2.2
Następnie „67,64” zmienia się w 131 i rozpoczynamy oglądanie wag, które w ystępują po 103. Po połączeniu wszystkich 27 oryginalnych wag w jedną wagę 1000, historia kolejnych połączeń definiuje drzewo binarne, w którym ważona długość ścieżki jest rozwiązaniem wyjściowego problemu. Ale liście w drzewie z rysunku 18 wcale nie występują we właściwej ko lejności, ponieważ zostają pomieszane podczas przesuwania qk- i 4- qk w lewo (zobacz ćwiczenie 41). Nadal jednak dowód lem atu Z gwarantuje, że istnieje drzewo zawierające liście we właściwej kolejności i na dokładnie takich samych poziomach jak w drzewie pomieszanym. To uporządkowane drzewo, rysunek 19, jest zatem optymalne; jest to drzewo, które dostajemy w wyniku działania algo rytm u Garsii-W achsa. A lg o r y tm G (Algorytm Garsii-W achsa budowy optymalnych drzew binarnych). Dla danego ciągu nieujemnych wag wq, w i , . . . , u>n , ten algorytm buduje drzewo binarne o n węzłach wewnętrznych, dla którego suma wklk jest minimalna, gdzie /fc jest odległością od korzenia węzła [ k j. W algorytmie korzysta się z tabli cy dla 2 n + 2 węzłów o adresach Xk dla 0 < k < 2n + l; na każdy węzeł przeznacza się cztery pola o nazwach WT, LLINK, RLINK i LEVEL. Liśćmi budowanego drzewa będą węzły Xq . . . Xn ; węzłami wewnętrznymi będą Xn+i .. . X2n ; korzeniem będzie X2nj a X2„+i pełni rolę tymczasowego wartownika. W algorytmie korzysta się także z roboczych tablic wskaźników Po, Pi, . . . , Pi, gdzie t < n + 1. G l. [Początek fazy 1] W ykonaj WT(Xfc) 4- wk i LLINK(X&) <- RLINK(X&) <- A dla 0 < k < n. W ykonaj także Po X2n+i, WT(P0) 00, Pi X0, t 1, m n. Następnie wykonaj krok G2 dla j = 1,2, . . . , n i przejdź do G3. G 2. [Pochłanianie Wj] (W tym miejscu zachodzi podstawowy warunek, że WT(Pi_i) > WT(P<+1)
dla 1 < i < t;
( 31 )
innymi słowy, wagi w tablicy roboczej są „2-malejące”). Powtórz zero lub więcej razy podprogram C opisany poniżej, aż WT(Pt_ i) > Wj. Następnie wykonaj t t + 1 i P^ X^. G 3. [Koniec fazy 1] Powtórz zero lub więcej razy podprogram C, aż t = 1. G 4. [Faza 2] (Teraz Pi = X2n jest korzeniem drzewa binarnego i WT(Pi) = wq + *** -h wn ). Do zmiennej lk przypisz odległość węzła Xk od węzła Pi dla 0 < A; < n. (Zobacz ćwiczenia 43. Przykład jest podany na rysunku 18, gdzie numer poziomu pokazano po prawej stronie każdego węzła). G 5. [Faza 3] Zmieniając dowiązania w Xn + ł, . . . , X2n, zbuduj nowe drzewo z takim i samymi numerami poziomów ale w którym liście występują w porządku symetrycznym Xo,.. . , Xn . (Zobacz ćwiczenie 44; przykład znaj duje się na rysunku 19). | P o d p r o g r a m C (Łączenie). Ten podprogram jest sercem algorytmu Garsii-W achsa. Łączy się w nim dwie wagi, przesuwa odpowiednio w lewo i dba o to, żeby był spełniony warunek (3 1 ).
WYSZUKIWANIE W DRZEWACH BINARNYCH
6.2.2
485
C l . [Inicjowanie] k <— N C 2 . [Utworzenie nowego węzła] (W tym miejscu mamy k > 2). m
m+1,
L L I N K ( X m ) < - P fe_ i , R L I N K ( X m ) < - P fc, W T ( X m ) < - W T ( P fc_ i ) + W T ( P fc) .
C 3. [Przesuwanie węzłów z prawej strony w lewo] W ykonaj t <— t —1 , a następnie Pj+i Pj dla A: < j < t. C 4. [Przesuwanie węzłów poprzedzających w prawo]W ykonaj j <— k —2; a na stępnie dopóki WT(Pj) < WT(Xm), wykonuj Pj+i Pj oraz j <— j — 1. C 5. [Wstawianie nowego węzła] C 6 . [Koniec?] Jeśli j > 0 i do C2. |
P j+ i
W T (P j_ i)
Xm. <
WT(Xm ) ,
to
wykonaj k <— j i wróć
Podprogram C zapisany w ten sposób może potrzebować co najm niej fi(n) kroków do utworzenia i wstawienia nowego węzła, ponieważ używa się w nim tablic zamiast struktur dowiązaniowych. Dlatego całkowity czas działania algo rytm u G może wynieść D (n2). Jednak stosując wymyślniejsze struktury danych, można fazę 1 wykonać w O (n lo g n ) krokach (zobacz ćwiczenie 45). Fazy 2 i 3 potrzebują tylko 0 (n ) kroków. Kleitman i Saks [SIAM J. Algeb. Discr. M ethods 2 (1981), 142-146] udo wodnili, że optym alna ważona długość ścieżki nigdy nie przekroczy wartości optymalnej ważonej długości ścieżki dla wartości q rozmieszczanych w „porządku piłowym” : 90 < 92 < 94 < ••• < 92|n/2J < 9 2 ^ /2 1 -1 < ' ' ' < 93 < 9l •
( 32)
(Ten porządek jest odwrotnością porządku organowego omawianego w ćwiczeniu 6.1-18). W tym ostatnim przypadku algorytm Garsii-W achsa w zasadzie redu kuje się do algorytmu Huffmana dla wag q$ + gi, #2 + #3? • *• > ponieważ wagi w roboczej tablicy będą w rzeczywistości uporządkowane nierosnąco (a nie tylko „2-malejąco” jak w (31 )). Dlatego można poprawić górną granicę z twierdzenia M bez znajomości porządku wag. Optymalne drzewo z rysunku 19 m a tak samo ważne zastosowanie w teorii kodowania, jak i w wyszukiwaniu. Jeśli użyjemy 0 do oznaczenia lewej gałęzi, a 1 do oznaczenia prawej gałęzi, otrzym am y następujące słowa kodowe o zmiennej długości: u A B C D E F G H
00 0100 010100 010101 01011 0110 011100 011101 01111
1000 J 1001000 K 1001001 L 100101 10011 M N 1010 0 1011 P 110000 Q 110001 I
11001 s 1101 T 1110 u 111100 V 111101 w 111110 X 11111100 Y 11111101 Z 1111111 R
486
WYSZUKIWANIE
6.2.2
Tak więc kodem komunikatu „RIGHT ON” jest słowo 1100110000111010111111100010111010 .
Mimo że kody są o zmiennej długości, dekodowanie jest łatwe (przy odczycie z lewa na prawo), ponieważ korzystając ze struktury drzewiastej, możemy wy krywać, kiedy kończy się jedno słowo, a zaczyna drugie. Ta m etoda kodowa nia zachowuje alfabetyczny porządek kodowanych komunikatów i używa średnio około 4.2 bitów na znak. Zatem taki kod może zostać użyty do kompresji pli ków z zachowaniem leksykograficznego porządku przechowywanych informacji. (Liczba 4.2 bitów na znak jest najm niejszą po wszystkich kodach uzyskiwanych za pomocą drzew binarnych, chociaż można zmniejszyć ją do 4.1 bitów na znak, gdy zrezygnujemy z zachowania porządku alfabetycznego. Możliwa jest dalsza redukcja liczby bitów, przy zachowaniu porządku alfabetycznego, gdy dopuścimy kodowanie par liter). H is to r ia i b ib lio g ra fia . M etody wyszukiwania, o których była mowa w tym punkcie, zostały odkryte w latach pięćdziesiątych niezależnie przez wiele osób. W nieopublikowanych notatkach z sierpnia 1952 roku A. I. Dumey opisał w na stępujący sposób podstawową postać wstawiania drzewowego: Rozważ bęben zawierający 2 n jednostek pamięci, z których każda ma swój adres binarny. Postępuj zgodnie z poniższym programem: 1 . W czytaj pierwszy element i zapam iętaj go po adresem 2n~ ł, czyli
na środkowym miejscu w pamięci. 2 . W czytaj następny element. Porównaj go z pierwszym.
3. Jeśli jest większy, to umieść go pod adresem 2n~ 1 + 2n_2. Jeśli jest mniejszy, to umieść go pod adresem 2n_2 . . . . Inna wczesna postać wstawiania drzewowego pochodzi od D. J. Wheelera, który w rzeczywistości rozważał rozgałęzienia wyższych stopni, podobne do tych, o któ rych będzie mowa w punkcie 6.2.4; również C. M. Berners-Lee [zobacz Comp. J. 2 (1959), 5] wymyślił technikę wstawiania do drzewa binarnego. Jako pierwsi opisy wstawiania drzewowego opublikowali P. F. Windley [Comp. J. 3 (1960), 84-88], A. D. Booth i A. J. T. Colin [Information and Control 3 (1960), 327-334] i Thomas N. Hibbard [JACM 9 (1962), 13-28]. W ydaje się, że każdy z tych autorów odkrył omawianą metodę niezależnie od innych, a w każdej pracy średnia liczba porównań (6 ) została otrzym ana w inny sposób. Poszczególni autorzy zajmowali się też różnymi aspektami tego algorytmu: W indley omówił szczegółowo sortowanie przez wstawianie do drzewa; B ooth i Colin zbadali, jakie warunki musi spełniać pierwszych 2n —1 elementów, żeby otrzymywane drzewo było doskonale zrównoważone (zobacz ćwiczenie 4); H ibbard był pomysłodawcą usuwania i pokazał związek między analizą wstawia nia drzewowego a analizą szybkiego sortowania. Optymalne drzewa wyszukiwań binarnych były najpierw badane w szcze gólnym przypadku, gdy p i = • • * = pn — 0, w kontekście binarnego kodowania
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
487
alfabetycznego podobnego do tego z ( 33 ). Ten problem i jego związek z inny mi problemami kodowania zostały omówione w bardzo interesującym artykule autorstw a E. N. G ilberta i E. F. M oore’a [Bell System Tech. J. 38 (1959), 933 - 968]. Gilbert i Moore udowodnili twierdzenie M w szczególnym przypadku P = 0 i zauważyli, że optymalne drzewo można skonstruować w 0 (n3) krokach za pomocą m etody podobnej do algorytmu K, ale nie wykorzystującej relacji monotoniczności ( 17 ). K. E. Iverson [A Programming Language (Wiley, 1962), 142 -144] rozważał niezależnie drugi przypadek, w którym wszystkie q są równe zero. Iverson myślał, że optymalne drzewo można otrzym ać wybierając korzeń równoważący prawdopodobieństwa lewego i prawego poddrzewa, najlepiej jak to jest możliwe; przekonaliśmy się jednak, że to nie był dobry pomysł. Następnie D. E. K nuth [Acta Informática 1 (1971), 1 4 -2 5 , 270] zbadał ogólny przypadek dla dowolnych wag p i q i udowodnił, że liczbę kroków algorytm u można zre dukować do 0 ( n 2). K nuth pokazał także przykładowe zastosowanie omawianych m etod w konstrukcji kompilatorów, w których kluczami były „słowa zastrzeżone” w języku algolopodobnym. T. C. Hu przez kilka lat zajmował się swoim własnym algorytmem dla przypadku pj = 0; z powodu skomplikowania problemu trudno było znaleźć ścisły dowód poprawności tego algorytmu, ale w końcu udało mu się to do spółki z A. C. Tuckerem [SIAM J. Applied M ath. 2 1 (1971), 514-532]. Uproszczenia prowadzące do algorytmu G zostały odkryte kilka lat później przez A. M. Garsiego i M. L. Wachsa, SICO M P 6 (1977), 622-642, chociaż ich dowód był nadal dość skomplikowany. Lematy W, X, Y i Z pochodzą od J. H. Kingstona, J. Algorithms 9 (1988), 129-136. Należy także zajrzeć do pracy Hu, K leitm ana i Tamakiego, SIA M J. Applied M ath. 37 (1979), 246-256, w której znajduje się elementarny dowód poprawności algorytmu Hu-Tuckera, jak i pewne uogólnienia na inne funkcje kosztu. Twierdzenie B pochodzi od Paula J. Bayera, raport M IT /L C S/T M -69 (Mass. Inst, of Tech., 1975), który udowodnił także trochę słabszą postać twierdzenia M. Twierdzenie w tej wersji udowodnił K. Mehlhorn, SIC O M P 6 (1977), 235-239. ĆWICZENIA 1 . [1 5 ] A lg o r y t m T z o s t a ł s fo r m u ło w a n y t y lk o d la n ie p u s t y c h d r z e w . J a k ic h z m ia n n a le ż a ło b y d o k o n a ć , ż e b y d z ia ła ł w ła ś c iw ie ta k ż e d la p u s te g o d r z e w a ? 2.
D o k o n a j m o d y fik a c ji a lg o r y t m u T , t a k ż e b y d z ia ła ł d la d r z e w p r a w o s t r o n n i e s f a s t r y g o w a n y c h . ( Z o b a c z p u n k t 2 .3 .1 ; w t a k i c h d r z e w a c h s y m e t r y c z n e o b e j ś c i a s ą ła tw ie js z e ). [2 0 ]
► 3 . [ 2 0 ] W p o d r o z d z i a l e 6.1 z a u w a ż y l i ś m y , ż e n i e w i e l k a z m i a n a w a l g o r y t m i e l i n i o w e g o w y s z u k i w a n i a 6 . 1 S c z y n i g o s z y b s z y m ( a l g o r y t m 6. 1 Q ) . C z y p o d o b n ą s z t u c z k ę m o ż n a z a s to s o w a ć d o p r z y ś p ie s z e n ia a lg o r y t m u T ?
4.
(A . D . B o o t h i A . J . T . C o lin ) D a n y c h j e s t N lo s o w o u p o r z ą d k o w a n y c h k lu c z y . Z a łó ż m y , ż e p ie r w s z e 2 n — 1 z n ic h w y k o r z y s t u j e m y d o z b u d o w a n ia d o s k o n a le z r ó w n o w a ż o n e g o d r z e w a , u m i e s z c z a j ą c 2k k l u c z y n a p o z i o m i e k d l a 0 ^ k < n ; n a s t ę p n i e p o z o s t a łe k lu c z e w s t a w ia m y z a p o m o c ą a lg o r y t m u T . J a k a j e s t ś r e d n ia lic z b a p o r ó w n a ń w w y s z u k i w a n i u k o ń c z ą c y m s i ę s u k c e s e m ? [ W s k a z ó w k a : Z m o d y f i k u j w z ó r ( 2)]. [M 2 Ą ]
488
WYSZUKIWANIE
6.2.2
► 5. [M25] Istnieje 11 ! = 39916 800 różnych uporządkowań, względem których nazwy CAPRICORN, AQUARIUS itd. można wstawić do drzewa binarnego. a) Dla ilu z tych uporządkowań dostaniemy drzewo z rysunku 10? b) Ile uporządkowań wyprodukuje drzewo zdegenerowane, w których, LLINK lub RLINK jest równe A dla każdego węzła? 6 . [M26] Niech Pnk będzie liczbą permutacji a± a
a) Udowodnij, że P(n+i)fc = 2 Pn ^ - i ) — 1 )Pnk- [Wskazówka: Rozważ, kiedy an+i spada w drzewie poniżej an]. b) Znajdź prosty wzór dla funkcji tworzącej Gn (z) = PnkZk i wykorzystaj go do wyrażenia Pnk za pomocą liczb Stirlinga. c) Jaka jest wariancja tego rozkładu? 7. [M2 5} (S. R. Arora i W. T. Dent) Załóżmy, że do początkowo pustego drzewa wstawiono za pomocą algorytmu T, w losowej kolejności, n elementów. Ile średnio trzeba wykonać porównań, żeby odnaleźć m-ty największy z nich? 8 . [M38] Niech p(n, k) będzie prawdopodobieństwem, że k jest długością ścieżki
wewnętrznej w drzewie zbudowanym algorytmem T, zastosowanym do n losowo upo rządkowanych kluczy. (Długość ścieżki wewnętrznej jest równa liczbie porównań wyko nywanych w algorytmie sortowania drzewowego w fazie budowy drzewa). a) Znajdź zależność rekurencyjną, która definiuje odpowiadającą temu rozkładowi funkcję tworzącą. b) Oblicz wariancję tego rozkładu. [Kilka z ćwiczeń z punktu 1.2.7 może być tutaj pomocnych]. 9. [Ąl] Udowodniliśmy, że wyszukiwanie i wstawianie wymagają średnio około 2 In A porównań, gdy klucze są wstawiane w losowym porządku; w praktyce jednak kolejność wstawiania nie musi być losowa. Zbadaj doświadczalnie, jak dobre jest wstawianie do drzewa dla tablic symboli używanych w kompilatorach lub asemblerach. Czy identy fikatory używane w typowych, dużych programach prowadzą do rzeczywiście dobrze zrównoważonych drzew wyszukiwań binarnych? ►10. [22] (R. W. Floyd) Załóżmy, że nie jesteśmy zainteresowani możliwością sortowa nia za pomocą algorytmu T, ale wiemy, że dane wejściowe nie będą losowe. Zaproponuj sposób, który umożliwi efektywne wyszukiwanie w drzewie, tak wpływając na dane, żeby „pojawiały” się w losowym porządku. 11. [20] Ile razy maksymalnie może być wykonywane przypisanie S <— LLINK (R) w kroku D3, podczas usuwania węzła z drzewa o rozmiarze N ? 12. [M22] Jak często średnio przechodzimy z kroku D l bezpośrednio do D4, podczas wykonywania losowego usuwania z losowego N -e le me nto we go drzewa? (Zobacz dowód twierdzenia H). ►13. [M23] Czy po usunięciu korzenia losowego drzewa za pomocą algorytmu D otrzy mane drzewo jest nadal losowe?
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
489
►14. [22] Udowodnij, że długość ścieżki w drzewie otrzymywanym za pomocą algoryt mu D, z dodanym krokiem D l | , nigdy nie jest większa niż długość ścieżki w drzewie otrzymywanym bez tego kroku. Znajdź przykład, dla którego krok D l | rzeczywiście daje ścieżkę o mniejszej długości. 15. [23] Niech a \ a$ cu będzie permutacją liczb { 1 ,2 ,3 ,4 } i niech j = 1 , 2 lub 3. Weźmy jednoelementowe drzewo z kluczem a\ i wstawmy a 2 , <23, korzystając z algoryt mu T; następnie usuńmy aj za pomocą algorytmu D; potem wstawmy '04 za pomocą algorytmu T. Dla ilu z 4! x 3 możliwości dostaniemy drzewo o kształcie odpowiednio I, II, III, IV i V z ( 13 )? ►16. [25] Czy operacja usuwania jest p rze m ie n n a ? To znaczy, czy jeśli algorytm D zastosujemy do usunięcia X , a następnie Y, to otrzymamy takie samo drzewo, gdy algorytm D użyjemy najpierw do usunięcia Y, a następnie X I 17. [25] Pokaż, że jeśli w algorytmie D zamienimy w pełni rolami lewe i prawe dowią zania, to wówczas łatwo rozszerzyć algorytm, tak żeby usuwał wskazany węzeł z drzewa praw ostron nie sfastrygow anego , zachowując niezbędne fastrygi. (Zobacz ćwiczenie 2). 18. [M21] Pokaż, że prawo Zipfa rodzi ( 12 ). 19. [M23] Ile wynosi w przybliżeniu średnia liczba porównań ( 11 ), gdy wejściowe prawdopodobieństwa są zgodne z prawem 80-20 zdefiniowanym w 6 . 1- ( n ) ?
2 0. [M20] Załóżmy, że do drzewa wstawiliśmy klucze w kolejności nierosnących czę stości p i ^ P 2 ^ ^ p n • Czy takie drzewo może być znacząco gorsze od optymalnego drzewa wyszukiwań? 21. [M20] Załóżmy, że prawdopodobieństwa p , ą, r wybrano losowo, zgodnie z wa runkiem p -\-q + r = 1. Jakie jest prawdopodobieństwo, że drzewa I, II, III, IV, V z ( 13 ) są (odpowiednio) optymalne? (Rozważ odpowiednie obszary na rysunku 14).
22 . [M20] Udowodnij, że gdy w algorytmie K jest wykonywany krok K4, wówczas r[i, j —1] nigdy nie jest większe od r[ż + l, j], ►23. [M23] Znajdź optymalne drzewo wyszukiwań binarnych dla przypadku N = 40, z wagami pi — 9, p 2 — ps = • ■• = P40 = 1,
n—1
przez
w dowolnym optymalnym drzewie dla (p i,. 25. [M20] Niech A i B będą niepustymi zbiorami liczb rzeczywistych. Piszemy A jeśli jest spełniony następujący warunek: (a 6 A, b E B i b < a)
implikuje
B,
(a € B i b € A).
a) Udowodnij, że ta relacja dla niepustych zbiorów jest przechodnia. b) Udowodnij lub wykaż, że to nieprawda: A ^ B wtedy i tylko wtedy, gdy A ^
AUB^B. 26. [M22] Niech (p i, . . . , pn; <70, . . . , qn) będą nieujemnymi wagami, gdzie pn + qn = Udowodnij, że gdy x zmienia się od 0 do 0 0 , podczas gdy ( p i,. . . ,p n- 1; £0 , ■. *, qn- 1) są stałe, to koszt optymalnego drzewa wyszukiwań c( 0 , n) jest wklęsłą (ciągłą) i kawałkami
490
6.2.2
WYSZUKIWANIE
liniową funkcją zmiennej x , o całkowitych współczynnikach nachylenia. Innymi słowy, udowodnij, że istnieją dodatnie liczby całkowite lo > h > *** > Zm i rzeczywiste stałe 0 = Xq X\ Xyn < Xm + 1 — oo oraz y0 < y± • *• < pm, takie że c(0, n) = yh + h x , gdy Xh ^ x ^ Xh+1 dla 0 ^ h ^ m. 27. [Af55] Celem tego ćwiczenia jest udowodnienie, że zbiory korzeni R ( i , j ) optymal nych drzew wyszukiwań binarnych spełniają warunek R ( i , j - 1) ^ R ( i J ) ^ R(i+1, j )
dla j - i ^ 2,
gdzie ^ jest relacją zdefiniowaną w ćwiczeniu 25, a wagi ( p i,. . . ,pn; qo, . . . , qn ) są nieujemne. Dowód przeprowadza się przez indukcję względem j — i; naszym zadaniem jest udowodnienie, że R(0, n —1) ^ R ( 0, n) przy założeniu, że n ^ 2 i że podana relacja zachodzi dla j — i < n. [Przez symetrię R ( 0 ,n ) ^ jR(l,n)]. a) Udowodnij, że jeśli pn = qn = 0, to R(Q,n — 1) ^ R(0, n). (Zobacz ćwiczenie 24). b) Niech pn + qn ~ x. Przy oznaczeniach z ćwiczenia 26 niech Rh będzie zbiorem i?(0,n) optymalnych korzeni, gdy Xh < x < Xh+1, a R hf niech będzie zbiorem optymalnych korzeni, gdy x = Xh• Udowodnij, że Ą SC R 0 ^ R[ ^ R i ^
^ R'm ^ Rm-
Stąd, na podstawie części (a) i ćwiczenia 25, mamy, że dla każdego x zachodzi R(0, n —1) ^ R (0,n). [Wskazówka: Rozważ przypadek x — X h i załóż, że oba drzewa ¿(0, r — 1)
n
t (r, n )
n a p o z io m ie l
t ( 0 , s — 1)
t(s , n )
rt na p o z io m ie lf
są optymalne, przy s < r i l ^ l\ Wykorzystaj założenie indukcyjne do dowodu, że istnieje takie drzewo optymalne o korzeniu ( r ) , że n jest na poziomie a także takie drzewo optymalne o korzeniu (J ), że [n~] jest na poziomie /]. 28. [24] Wykorzystajmy jakiś język makroinstrukcji do zdefiniowania makra do „opty malnego wyszukiwania binarnego”, którego parametrem jest zagnieżdżona specyfikacja pewnego optymalnego drzewa wyszukiwań binarnych. 29. [Ą0] Jakie jest możliwie najgorsze drzewo wyszukiwań binarnych dla 31 najbar dziej popularnych słów w języku angielskim dla częstości z rysunku 12? 30. [M34] Udowodnij, że koszty optymalnych drzew wyszukiwań binarnych spełniają „nierówność czworokąta” c ( i , j ) — —1) ^ c(i + l, j) —c ( i+ l, j —1), gdy j ^ i + 2. 31. [M35] (K. C. Tan) Udowodnij, że wśród wszystkich możliwych zbiorów prawdopo dobieństw ( p i,. . . ,p n; q Q f - , q n ) , dla których pi H Kpn+<7oH b
6.2.2
WYSZUKIWANIE W DRZEWACH BINARNYCH
491
33. \MĄ1] Żeby znaleźć drzewo binarne, które minimalizuje czas działania programu T, powinniśmy minimalizować wielkość 7C + C 1, a nie po prostu liczbę porównań C. Zaproponuj algorytm, który znajduje optymalne drzewa wyszukiwań binarnych, gdy lewym i prawym gałęziom (przejściom) w drzewie odpowiadają różne koszty. (Nawiasem mówiąc, gdy prawy koszt jest dwa razy większy od lewego, a częstości węzłów są takie same, optymalnymi okazują się być drzewa Fibonacciego; zobacz L. E. Stanfel, J A C M 17 (1970), 508-517. Na maszynach, na których nie można wykonywać porównań dających od razu jedną z trzech odpowiedzi, w programie implementującym algorytm T musimy wykonywać dwa porównania w kroku T2, jeden test na równość i jeden test na mniejszość; B. Sheil i V. R. Pratt zauważyli, że nie muszą być one wykonywane dla tego samego klucza i może lepiej mieć drzewo binarne, w którego węzłach wewnętrznych specyfikuje się, który z testów ma być wykonany: albo na równość, albo na mniejszość, ale nie oba. Taka sytuacja jest interesująca do zbadania jako alternatywa dla naszego problemu). 34. [HM21] Pokaż, że asymptotyczna wartość współczynnika multimianowego
(\ PlN,
N
)
p 2N , . . . , p nN ) ’
przy N —* oo, ma związek z entropią H ( p i , p 2 , . . . ,pn)35. [HM22] Uzupełnij dowód twierdzenia B, dowodząc prawdziwości nierówności ( 24 ). ►36. [HM25] (Claude Shannon) Niech X i Y będą zmiennymi losowymi o skończonych zbiorach wartości { x i , . , . ,£ m} i {y \ , . . . , y n } i niech pi = Pr(V = Xi), qj = Pr(Y = yj), n j = Pr(X = Xi i Y = yj). Niech H ( X ) = H ( p u . . . ,p m) i H ( Y ) = H ( q i ,. . . , q n ) będą odpowiadającymi tym zmiennym entropiami oraz niech H ( X Y ) = H ( r n , . . . , rmn) będzie entropią ich łącznego rozkładu. Udowodnij, że H (X ) ^ H ( X Y ) ^ H {X) + H(Y). [Wskazówka: Jeśli / jest funkcją wklęsłą, to zachodzi E f ( X ) ^ f ( E X ) ] . 37. [HM26] (P. J. Bayer, 1975) Załóżmy, że ( P i , . . . , P n) jest losowym rozkładem prawdopodobieństwa, czyli losowym punktem w (n — l)-wymiarowym sympleksie zde finiowanym przez nierówności Pk ^ 0 dla 1 ^ k ^ n, i równość Pi + *♦* + Pn = 1. (Równoważnie, ( P i , . . . , P n) jest zbiorem losowych przerw w znaczeniu z ćwiczenia 3.3.2-26). Jaka jest oczekiwana wartość entropii P ( P i , . . . , Pn)? 38. [M20] Wyjaśnij, dlaczego twierdzenie M jest prawdziwe w ogólności, chociaż udo wodniliśmy je tylko dla przypadku so < S i < S 2 < * * ■ < $ n ►39. [M25] Niech tią, . . . , w n będą nieujemnymi wagami i takimi, że w\ + • • *+ w n = 1. Udowodnij, że ważona długość ścieżki w drzewie Huffmana z podpunktu 2.3.4.5 jest mniejsza od H (w 1, . . . , w n ) + 1. Wskazówka: Zobacz dowód twierdzenia M. 40. [M26] Uzupełnij dowód lematu Z. 41. [21] Na rysunku 18 przedstawiono konstrukcję pewnego „przemieszanego” drze wa binarnego. Wypisz jego liście w kolejności od lewego do prawego. 42. [23] Wyjaśnij, dlaczego podprogram C zachowuje warunek uporządkowania 2 -malejącego ( 31 ). 43. [20] Wyjaśnij, w jaki sposób zaimplementować efektywnie drugą fazę algorytmu Garsii-Wachsa.
492
WYSZUKIWANIE
6.2.2
►44. [25] Wyjaśnij, w jaki sposób zaimplementować efektywnie trzecią fazę algorytmu Garsii-Wachsa: zbuduj drzewo binarne, znając poziomy ¿o, ¿i, • • •, In jego liści, podane w porządku symetrycznym. ►45. [30] Wyjaśnij, w jaki sposób zaimplementować efektywnie podprogram C, żeby całkowity czas działania algorytmu Garsii-Wachsa wynosił co najwyżej 0 (n log n). 46. [M30] (C. K. Wong i Shi-Kuo Chang) Rozważmy schemat postępowania, w któ rym drzewo wyszukiwań binarnych jest konstruowane za pomocą algorytmu T, z wy jątkiem przypadków, gdy liczba węzłów staje się liczbą postaci 2n —1, kiedy to drzewo zostaje przekształcone w pełni zrównoważone drzewo binarne, z 2k węzłami na poziomie k dla 0 ^ k < n. Udowodnij, że całkowita liczba porównań wykonywanych podczas konstrukcji takiego drzewa wynosi średnio iVlgAT + O (N ). (Nietrudno pokazać, że całkowity czas potrzebny na wykonanie wszystkich reorganizacji wynosi O(N)) . 47. [MĄO] Uogólnij twierdzenia B i M na drzewa wyższych stopni. Jeśli to możliwe, weź także pod uwagę różne koszty przejścia po różnych gałęziach, tak jak to zrobiliśmy w ćwiczeniu 33. 48. [MĄ 7] Przeprowadź ścisłą analizę stanu stabilności drzewa wyszukiwań binarnych dla losowych wstawień i usunięć. 49. [HMĄ2] Zanalizuj średnią wysokość losowego drzewa wyszukiwań binarnych.
6.2.3. Drzewa zrównoważone
Przekonaliśmy się, że drzewa powstające w wyniku wstawiania losowych danych są dobrymi drzewami wyszukiwań, ale ciągle jednak pozostaje niepokój w związ ku z możliwością pojawienia się drzewa zdegenerowanego. Być może moglibyśmy znaleźć algorytm, który cały czas zachowuje optymalność drzewa, ale to wydaje się niestety bardzo trudne. Inny pomysł polega na pam iętaniu długości ścieżki i całkowitym przeorganizowywaniu drzewa, ilekroć jej długość przekroczy, po wiedzmy, 5 N lg N . Jednak takie rozwiązanie może wymagać podczas budowy drzewa około y / N / 2 reorganizacji. Bardzo ładne rozwiązanie problemu utrzym ywania dobrego drzewa wyszu kiwań znaleźli w 1962 roku dwaj rosyjscy matematycy, G. M. Adelson-Wielski i J. M. Łandis [Dokłady Akadem ii N auk SSSR 146 (1962), 263-266]. Zapro ponowana przez nich m etoda wymaga tylko dwóch dodatkowych bitów na każ dy węzeł i nigdy nie potrzebuje więcej niż 0 (lo g N ) operacji na przeszukanie drzewa i wstawienie nowego elementu. W rzeczywistości przekonamy się, że to rozwiązanie prowadzi do ogólnej metody, która dobrze nadaje się do reprezentacji dowolnej listy liniowej o długości N, w sposób umożliwiający wykonanie na niej w 0 ( \o g N ) jednostkach czasu każdej z następujących operacji : i) znajdź element o zadanym kluczu, ii) dla danego fc, znajdź fc-ty element, iii) wstaw element na zadane miejsce, iv) usuń zadany element. Jeśli do list liniowych zastosujemy alokację sekwencyjną, to operacje (i) i (ii) są efektywne, natom iast operacje (iii) i (iv) zabierają czas rzędu 7V; z drugiej strony, jeśli skorzystamy z alokacji dowiązaniowej, to operacje (iii) i (iv) sta
6.2.3
DRZEWA ZRÓWNOWAŻONE
493
ją się efektywne, natom iast operacje (i) i (ii) wym agają rzędu N kroków. Za pomocą drzewiastej reprezentacji listy liniowej wszystkie cztery operacje można wykonać w O (log IV) krokach. Możliwe jest również efektywne wykonywanie in nych standardowych operacji. Na przykład połączenie dwóch list, M-elementowej z ^-elem entow ą, można wykonać w 0 (lo g (M + N )) krokach. Strukturę danych, która umożliwia to wszystko, będziemy nazywali drzewem zrównoważonym. (Wielu autorów nazywa ją także AVL-drzewem , gdzie AV po chodzi od Adelson-Velsky, natom iast L od Landis) Poprzedni akapit jest reklam ą drzew zrównoważonych, w którym chwalimy je, jak gdyby były panaceum na wszystko, a inne sposoby reprezentacji danych już wychodziły z użycia. Powin niśmy jednak wyważyć nasz stosunek do drzew zrównoważonych! W zastosowa niach nie wymagających wszystkich czterech operacji być może jesteśm y w stanie dostać to samo, ale mniejszym kosztem i za pomocą prostszych programów. Ponadto, drzewa zrównoważone osiągają przewagę dopiero dla odpowiednio du żych N ; tak więc jeśli dysponujemy efektywną m etodą, która wymaga 641g7V jednostek czasu, i nieefektywną m etodą, która zabiera 2 N jednostek czasu, po winniśmy wybrać nieefektywną metodę dla N nie większych od 256. Jednakże N nie powinno być również zbyt duże. Drzewa zrównoważone nadają się głównie dla danych mieszczących się w pamięci wewnętrznej. O m etodach lepiej pasujących dla plików zewnętrznych o dostępie bezpośrednim będziemy mówili w punkcie 6.2.4. Ponieważ z biegiem czasu pamięci wewnętrzne sta ją się coraz większe, drzewa zrównoważone są coraz ważniejsze. Wysokość drzewa definiujemy jako maksymalny numer poziomu w tym drze wie, czyli długość najdłuższej ścieżki od korzenia do węzła zewnętrznego. Po wiemy, że drzewo binarne jest zrównoważone, jeśli dla każdego węzła wysokość jego lewego poddrzewa nigdy nie różni się więcej niż o ± 1 od wysokości je go prawego poddrzewa. Na rysunku 20 przedstawiono drzewo zrównoważone o 17 węzłach wewnętrznych i wysokości 5; w każdym węźle wewnętrznym za znaczono współczynnik zrównoważenia, + , • lub —, w zależności od tego, czy różnica wysokości prawego i lewego poddrzewa wynosi +1, 0 łub —1. Drzewo
R y s. 20. Drzewo zrównoważone.
4 94
WYSZUKIWANIE
6.2.3
Fibonacciego z rysunku 8 (punkt 6.2.1) jest przykładem innego drzewa zrówno ważonego o wysokości 5, ale mającego tylko 12 węzłów wewnętrznych; większość współczynników zrównoważenia w tym drzewie wynosi —1. Drzewo dla znaków zodiaku z rysunku 10 (punkt 6 .2 .2) nie jest drzewem zrównoważonym, ponieważ ograniczenia na wysokości poddrzew nie są zachowane w węzłach AQUARIUS i GEMINI. Taka definicja zrównoważenia zawiera kompromis między optymalnymi drze wami binarnym i (które wym agają, żeby wszystkie węzły zewnętrzne znajdowały się na dwóch sąsiednich poziomach) i dowolnymi drzewami binarnymi (bez ogra niczeń). Zatem naturalne jest pytanie, jak bardzo drzewo zrównoważone odbiega od drzewa optymalnego. Odpowiedzią jest, że długość ścieżki wyszukiwania w ta kim drzewie nigdy nie przekracza długości optymalnej o więcej niż 45 procent. T w ie rd z e n ie A (Adelson-Wielski i Łandis). Wysokość drzewa zrównoważonego o N węzłach wewnętrznych leży m iędzy lg (N + 1 ) a 1.4405 lg(N + 2) —0.3277. Dowód. Drzewo binarne o wysokości h w oczywisty sposób nie może mieć więcej węzłów zewnętrznych niż 2h\ tak więc N + 1 < 2 \ a zatem w dowolnym drzewie binarnym h > [lg(N + 1 )]. Żeby znaleźć m aksym alną wartość h, rozważmy trochę inne zadanie i zapy tajm y o m inim alną możliwą liczbę węzłów w drzewie zrównoważonym o wyso kości h. Niech Th będzie takim drzewem z najmniejszą możliwą liczbą węzłów; wówczas jedno z poddrzew korzenia, powiedzmy lewe, m a wysokość h —1 , a wyso kość drugiego wynosi h — 1 lub h —2 . Ponieważ chcemy, żeby liczba węzłów w Th była minimalna, możemy założyć, że lewym poddrzewem korzenia jest T h - 1 , a prawym poddrzewem jest T h - 2- Z takiego rozumowania wynika, że drzewo Fibonacciego rzędu h + 1 m a najm niejszą możliwą liczbę węzłów wśród wszystkich drzew zrównoważonych o wysokości h . (Zobacz definicję drzew Fibonacciego w punkcie 6.2.1). Zatem N > F h+2 - 1 > h+2/y / 5 - 2 , a stąd dostajem y żądany wynik w podobny sposób jak w twierdzeniu 4.5.3F.
|
Z dowodu powyższego twierdzenia wynika, że wyszukiwanie w drzewie zrów noważonym wymaga co najm niej 25 porównań dopiero wtedy, kiedy liczba wę złów w drzewie wynosi co najmniej F2s — 1 = 317810. Rozważmy teraz co dzieje się, gdy do drzewa zrównoważonego zostanie wstawiony nowy węzeł przy użyciu zwykłego algorytmu wstawiania (algorytm 6.2.2T). Drzewo z rysunku 20 będzie nadal zrównoważone, jeśli nowy węzeł zaj mie miejsce węzła zewnętrznego [T |, [ s ] , [ej], |T ], (To| lub [ 1 3 ] . Jeśli jednak nowy węzeł znajdzie się w innym miejscu, konieczne będą jakieś poprawki. Problem pojaw ia się, jeśli po wykonaniu wstawienia w zrasta wysokość prawego poddrzewa węzła, którego współczynnik zrównoważenia wynosi + 1 lub, symetrycznie, jeśli rośnie wysokość lewego poddrzewa węzła o współczynniku —1. Nietrudno się przekonać, że takie problemy w ystępują tylko w dwóch przypadkach:
6.2.3
DRZEWA ZRÓWNOWAŻONE
495
(i)
(Dwa inne, w zasadzie identyczne przypadki, powstają, gdy odbijemy syme trycznie te diagramy, zamieniając dowiązania lewe i prawe). Na powyższych diagramach, duże prostokąty a , ¡3, 7 , S odpowiadają drzewom o podanych odpowiednio wysokościach. Przypadek 1 zachodzi wtedy, kiedy nowy element spowodował wzrost wysokości prawego poddrzewa węzła B z wartości h do h + 1 , natom iast przypadek 2 pojawia się wtedy, gdy w zrasta wysokość lewego poddrzewa węzła B . W tym drugim przypadku albo h = 0 (a zatem X jest nowo wstawionym węzłem), albo węzeł X m a dwa poddrzewa o wysokościach (h —l , h ) lub (h, h —1 ). Zrównoważenie w obu tych przypadkach można przywrócić za pomocą bar dzo prostych transformacji, które w dodatku zachowują porządek symetryczny węzłów w drzewie:
P rzyp a d e k 1
(2 )
W przypadku 1 po prostu dokonujemy „rotacji” drzewa w lewo, podczepiając /3 do A, zamiast jak dotychczas do B . Taka transform acja jest podobna do zastosowania prawa łączności w wyrażeniu algebraicznym, w którym a(f3j) za stępuje się przez W przypadku 2 wykonujemy podwójną rotację. Najpierw obracamy (X , B) w prawo, a następnie (^4, X ) w lewo. W obu przypadkach musimy zmienić w drzewie tylko kilka dowiązań. Zauważmy ponadto, że nowe drzewa m ają wysokość h + 2 , czyli dokładnie tyle, ile wynosiła ich wysokość sprzed wstawienia. Zatem reszta drzewa (jeśli jest), oryginalnie znajdująca się nad ^4, pozostaje zawsze zrównoważona. Dla przykładu, jeśli w drzewie z rysunku 20 nowy węzeł pojawi się na pozycji 17 , wówczas, po wykonaniu pojedynczej rotacji (przypadek 1 ), otrzym am y drzewo zrównoważone przedstawione na rysunku 21. Zauważmy, że zmianie uległo kilka współczynników zrównoważenia. Omówiony algorytm wstawiania można zaimplementować na wiele sposo bów. W ydaje się, że stos jest niezbędny, żeby pamiętać węzły, których atrybuty mogą wymagać aktualizacji, jednak w poniższej implementacji uzyskujemy pew-
6 .2 .3
WYSZUKIWANIE
496
R y s. 21. Drzewo z rysunku 20, po wstawieniu nowego klucza R i wykonaniu stosownego wyważenia.
ne przyśpieszenie, zauważając, że przed wstawieniem współczynnik zrównoważe nia węzła B z (i) jest równy zeru. A lg o r y tm A ( Wyszukiwanie i wstawianie do drzewa zrównoważonego). Dana jest tablica rekordów, które tworzą zrównoważone drzewo binarne, takie jak opisano powyżej. W tym algorytmie wykonujemy wyszukiwanie dla danego ar gum entu K. Jeśli K nie ma w tablicy, to na właściwe miejsce wstawiamy nowy węzeł zawierający K i przywracamy, jeśli trzeba, równowagę w drzewie. O w ę z ła c h d r z e w a , p o d o b n ie j a k w a lg o r y t m ie 6 .2 .2 T , z a k ła d a m y , ż e z a w ie r a j ą p o l a K E Y , L L IN K i R L I N K . D o d a t k o w o m a m y j e s z c z e j e d n o p o l e B ( P ) = w s p ó ł c z y n n ik z r ó w n o w a ż e n ia w ę z ł a N O D E (P ),
wysokość prawego poddrzewa minus wysokość lewego poddrzewa; zawartością tego pola jest zawsze +1, 0 lub —1. Do dyspozycji mamy także specjalny węzeł nagłówkowy, który znajduje się w lokacji H E A D ; wartością R L IN K (H E A D ) jest wskaźnik do korzenia drzewa, natom iast L L IN K (H E A D ) wykorzystujemy do pa m iętania wysokości całego drzewa. (Znajomość wysokości drzewa nie jest tak naprawdę w tym algorytmie potrzebna, ale jest przydatna w algorytmie sklejania, o którym będzie jeszcze mowa). O drzewie zakładamy, że jest niepuste, czyli R L I N K (H E A D ) ^ A. Dla przejrzystości opisu używamy oznaczenia L IN K ( a , P ) jako synonimu L L IN K ( P ) , gdy a = - 1 , i R L IN K ( P ) , gdy a = + 1 . A l . [ I n i c j o w a n i e ] T <— H E A D , S
P
R L IN K (H E A D ). ( Z m i e n n a w s k a ź n i k o w a P
b ę d z ie p r z e s u w a ła s ię w d ó ł d r z e w a ; S b ę d z ie w s k a z y w a ła m ie js c e , w k tó r y m b y ć m o ż e b ę d z ie k o n ie c z n e w y w a ż e n ie d r z e w a , a T z a w s z e w s k a z u je n a r o d z ic a S ). A 2.
[Porównywanie] Jeśli K < K E Y ( P ) , to przejdź do A3; jeśli K > K E Y ( P ) , to przejdź do A4; natom iast jeśli K = K E Y ( P ) , to zakończ wyszukiwanie sukcesem.
6.2.3
DRZEWA ZRÓWNOWAŻONE
497
R y s . 22 . W y s z u k i w a n i e i w s t a w i a n i e d o d r z e w a z r ó w n o w a ż o n e g o .
A 3. [Przejście w lewo] Q «— LLINK(P). Jeśli Q = A, to wykonaj Q 4= AVAIL i LLINK(P) <— Q, a następnie przejdź do kroku A5. W przeciwnym razie, jeśli B(Q) ^ 0, to wykonaj T PiS Q. Na koniec wykonaj P ^— Q i wróć do kroku A 2 . A 4. [Przejście w prawo] Q <— RLINK(P). Jeśli Q = A, to wykonaj Q <= AVAIL i RLINK(P) Q, a następnie przejdź do kroku A5. W przeciwnym razie, jeśli B(Q) 0, to wykonaj T P i S <— Q. Na koniec wykonaj P <— Q i wróć do kroku A 2 . (O statni fragment tego kroku można połączyć z ostatnim fragmentem kroku A3). A 5. [Wstawianie] (Właśnie przyłączyliśmy do drzewa nowy węzeł NDDE(Q) i musimy zainicjować jego pola). KEY(Q) A, LLINK(Q) <—RLINK(Q) A, B(Q) <-0. A 6 . [Korekta współczynników zrównoważenia] (Teraz musimy zmienić współ czynniki zrównoważenia z zera na ±1 dla węzłów między S a Q). Jeśli K < KEY(S ), to a < l , w przeciwnym razie a <— 1-1. Następnie wykonaj R P LINK (a , S), a potem pow tarzaj zero lub więcej razy wyko nywanie poniższych operacji, aż P = Q: Jeśli K < KEY(P), to wykonaj B(P) <----- 1 i P <- LLINK(P); jeśli K > KEY(P), to wykonaj B(P) <- +1
498
WYSZUKIWANIE i P
6.2.3
R L IN K ( P ) . ( J e ś l i
K
=
K E Y (P ), w ó w c z a s P =
Q i p r z e c h o d z im y d o
n a s tę p n e g o k r o k u ). A 7 . [W y w a ż a n ie ] M a m y k ilk a p r z y p a d k ó w : i) J e ś li B ( S ) =
0 (d r z e w o u r o s ło ), to w y k o n a j B (S )
a , L L I N K (H E A D )
L L IN K (H E A D ) + 1 i z a k o ń c z w y k o n y w a n i e a l g o r y t m u . ii) J e ś li B ( S ) = — a ( d r z e w o s t a ł o s ię b a r d z ie j z r ó w n o w a ż o n e ) , t o w y k o n a j B (S )
0 i z a k o ń c z w y k o n y w a n ie a lg o r y tm u .
iii) J e ś li B ( S ) —
a
(d r z e w o n ie j e s t ju ż z r ó w n o w a ż o n e ), t o p r z e jd ź d o k r o k u
A 8 , g d y B ( R ) = a , n a t o m i a s t d o A9, g d y B ( R ) — — a . ( P r z y p a d e k (iii) o d p o w ia d a s y t u a c j i z r y s u n k u ( i ) , g d y w s k a z u ją , o d p o w ie d n io , n a w ę z ły z u je n a a A 8. [ P o j e d y n c z a
a
=
+1; S i R
A i B , n a to m ia s t L IN K (—a , S ) w s k a
itd .). r o t a c j a ] W y k o n a j k o l e j n o P R , L IN K ( a , S )
L IN K (—a ,R ) ,
L I N K ( - a .R ) < - S, B (S ) < - B (R ) < - 0 . P r z e jd ź d o A 1 0 . A 9 . [ P o d w ó j n a r o t a c j a ] W y k o n a j P<— L I N K ( — o , R ) , L I N K ( — a , R ) L IN K ( a , P )
< - R , L IN K ( a , S )
< - L I N K ( - a ,P ) , L I N K ( - a ,P )
L IN K ( a , P ) , < - S. T eraz
w ykonaj ( —a, 0)
d la B ( P ) — a;
(
0 ,0 )
d la B (P ) =
(
0,
d la B (P ) = —a;
a)
( 3)
0;
a p o t e m B ( P ) <— 0 . A 1 0 . [O s ta tn ie k o r e k ty ] (Z a k o ń c z y liś m y w y w a ż a n ie d r z e w a , p r z e k s z ta łc a ją c je z ( 1 ) n a ( 2) . T e r a z P w s k a z u j e n a k o r z e ń n o w e g o p o d d r z e w a , n a t o m i a s t T w s k a z u je n a r o d z ic a k o r z e n ia s t a r e g o p o d d r z e w a S ). J e ś li S = R L IN K (T ), t o w y k o n a j R L IN K (T )
P , w p r z e c i w n y m r a z i e w y k o n a j L L I N K ( T ) <— P .
|
P r z e d s t a w io n y a lg o r y tm j e s t d o ś ć d łu g i, a le d z ie li s ię n a tr z y p r o s te c z ę
A 1 -A 4 j e s t w y k o n y w a n e w y s z u k i w a n i e , w k r o k a c h A 5 -A 7 j e s t A 8 - A 10 j e s t p r z w r a c a n a r ó w n o
ś c i: w k r o k a c h
w s ta w ia n y n o w y w ę z e ł, n a to m ia s t w k r o k a c h w a g a d r z e w a (je ś li j e s t ta k a p o tr z e b a ). W
z a s a d z ie ta k i s a m
z a s to s o w a ć d la d r z e w le w o s tr o n n ie lu b p r a w o s tr o n n ie
a lg o r y tm
s fa s tr y g o w a n y c h
m ożna (z o b a c z
ć w i c z e n i e 6 . 2 . 2- 2 ) , p o n i e w a ż w y w a ż a n i e n i e p o c i ą g a z a s o b ą z ł o ż o n y c h z m i a n ty c h p o w ią z a ń . W ie m y , ż e c z a s d z ia ła n ia p o w y ż s z e g o a lg o r y tm u w y n o s i o k o ło
C
lo g
N
je d
n o s t e k d la p e w n e g o C , a le d o b r z e p o z n a ć w p r z y b liż e n iu w a r to ś ć C , ż e b y m ó c p r z e k o n a ć s i ę , j a k d u ż e p o w i n n o b y ć 7V , d l a k t ó r e g o o p ł a c a s i ę s t o s o w a ć d r z e w a z r ó w n o w a ż o n e . P o n i ż s z a i m p l e m e n t a c j a w j ę z y k u M IX u d z i e l a p e w n e j o d p o w i e d z i n a t o p y ta n ie .
P ro g ra m A
( W y s z u k iw a n ie
i w s ta w ia n ie
do
d rzew a
zró w n o w a żo n eg o ).
W ty m
p r o g r a m ie , im p le m e n t u j ą c y m a lg o r y t m A , z a k ła d a s ię , ż e w ę z ły s ą p o s t a c i ~B L L IN K R L I N K H ----- 1- ----- \----- 1- ---- 1- ------ ; K EY
( 4)
6.2.3
DRZEWA ZRÓWNOWAŻONE
499
rA = K , r l l = P, rI2 = Q, rI3 = R, rI4 = S, rI5 = T. Kod dla kroków A 7 - A9 jest powielony tak, że wartość a występuje w tym programie niejawnie.
01 02 03 04
B L L IN K R L IN K STA R T
05 06 07 08
4H
09
10 11 12 13
1H
2H
U 15 16 17 18 19
20 21 22
5H
23 24 25 26 27 28 29
1H
30
6H
31 32 33 34 35 36 37 38
4H
39
40 41
1H
42 43 44 45 46 4 7
7H
E Q U 0:1 EQ U 2 : 3 EQ U 4 : 5 LDA K E N T 5 H EAD L D 2 0 , 5 (R L IN K ) JM P 2 F L D 2 0 , 1 (R L IN K ) J2Z 5F LD X 0 . 2 ( B ) JX Z * + 3 ENT5 0 ,1 ENT4 0 ,2 ENT1 0 ,2 CMPA 1 , 1 4B JG JE SU CCESS L D 2 0 , 1 (L L IN K ) J2N Z IB L D 2 A V A IL J 2 Z OVERFLOW L D X 0 , 2 (R L I N K ) S T X A V A IL STA 1,2 S T Z 0,2 IF JL S T 2 0 , 1 (R L I N K ) JM P *+2 S T 2 0 , 1 (L L IN K ) CM PA 1 , 4 *+3 JL L D 3 0 , 4 (R L IN K ) JM P *+2 L D 3 0 ,4 (L L I N K ) ENT1 0 ,3 ENTX -1 JM P 1 F 7F JE STX 0 , 1 ( 1 : 1 ) L D 1 0 , 1 (R L IN K ) CMPA 1 , 1 JG E 4 B STX 0 . 1 ( B ) L D 1 0 , 1 (L L IN K ) JM P I B LD2 0 .4 ( B ) STZ 0 . 4 ( B )
1 1 1 1
A l.
2 2
C C C
-
1
C
- 1
D
- 1
.
T <- HEAD. Q +—RLINK(HEAD), Do A2 przy S P Q. A 4 . P r z e j d ź w prawo. Q < — RLINK(P). Do A5, jeśli Q= A.
rX^B(Q).
D
Skok, jeśli B(Q) = 0. T <- P. S <— Q.
C
P<-Q.
2.
C
A
C
Do A4, jeśli K > KEY(P). Koniec, jeśli K = KEY(P). A 3 . P r z e j d ź w l e w o . Q< — LLINK(P). Skok, jeśli Q ^ A. A 5. Wstaw.
C l
C l —5 C
In ic jo w a n ie
l - S
1 1 1 1 1 1 1
-5 -5 -5 -5 -5 -5 -5 A A 1 — 5 —A 1 -5 1 -5 E
P o r ó w n a j.
Q <= AVAIL. KEY(Q) <- K. LLINK(Q) <- RLINK(Q) <- A. Czy K < KEY(P)? RLINK(P) <- Q. LLINK(P) <- Q. A 6. Skoryguj w s p ó ł c z y n n i k i Skok, jeśli K < KEY(S). R <- RLINK(S).
z r ó w n o w a ż e n ia .
E
1 — 5 — £7 1 -5 1 -5 1 -5 F 2 + 1 -5 F F
2 2
F + l-5 F + l-5 FI FI F I
1 -5 1 -5
R +- LLINK(S). P *—R. rX <- - 1 . Do pętli porównującej. Do A7, jeśli K = KEY(P). B(P) « hl (było +0). P <- RLINK(P). Skok, jeśli K ^ KEY(P). B(P) <- - 1 . P <- LLINK(P). Do pętli porównującej. A 7. Wyważanie. rI2 <— B(S). B(S) < -0 .
500
WYSZUKIWANIE
48 49
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
A7L
A9L
A8L
A7R
A9R
A8R
8H A10
Tl T2 6H
1 -5 CMPA1.4 JG A7R 1 -5 J2P D0NE Ul J2Z 7F Gl-\-J 1 ENT1 0 ,3 G1 LD2 0 ,3 (B ) Gl J2N A8L G1 LD1 0 , 3 (RLINK) HI LDX 0 , 1 (LLINK) HI STX 0 , 3 (RLINK) HI HI ST3 0 , 1 (LLINK) LD2 0 , 1 (B) HI LDX T l, 2 HI STX 0 ,4 (B ) HI LDX T 2 ,2 HI STX 0 ,3 (B ) HI LDX 0 , 1 (RLINK) Gl STX 0 , 4 (LLINK) Gl ST4 0 , 1 (RLINK) Gl JMP 8F Gl J2N D0NE U2 J2Z 6F G2Ą-J2 ENT1 0 ,3 G2 LD2 0 ,3 (B ) G2 J2P A8R G2 LD1 0 , 3 (LLINK) H2 LDX 0 , 1 (RLINK) H2 STX 0 , 3 (LLINK) H2 ST3 0 , 1 (RLINK) H2 LD2 0 , 1 (B) H2 LDX T 2 ,2 H2 STX 0 ,4 (B ) H2 LDX T l , 2 H2 STX 0 ,3 (B ) H2 LDX 0 , 1 (LLINK) G2 STX 0 , 4 (RLINK) G2 ST4 0 , 1 (LLINK) G2 STZ 0 , 1 (B) G CMP4 0 ,5 (RLINK) G JNE *+3 G ST1 0 , 5 (RLINK) G3 JMP D0NE G3 ST1 0 , 5 (LLINK) <54 JMP DONE <54 C0N +1 C0N 0 C0N 0 C0N -1 ENTX +1 J2
6.2.3
Przypadek a = +1, gdy K > KEY(S) Koniec, jeśli rI2 = —o. Skok, jeśli B(S) było zerem. P <- R. rI2 <— B(R). Do A 8 , jeśli rI2 = a. A9. Podwójna rotacja. LINK (a , P <- LINK(-a.R)) -+ LINK(—o ,R ). LINK (a , P) <- R. rI2 <- B(P). —a, 0 lub 0 -> B(S). 0 , 0 lub a -> B(R). A8. Pojedyncza rotacja•„ LINK(a.S) <— LINKC—a ,P ) . LINKC—a,P ) <- S. Podwiąż inną krawędzią. Koniec, jeśli rI2 = —a. Skok, jeśli B(S) było zerem. P <— R. rI2 <— B(R). Do A 8 , jeśli rI2 = a. A9. Podwójna rotacja. LINK(a,P ♦- LINKC—a ,R )) -*• LINKC—a ,R ). LINK(o.P) <- R. rI2 <- BCP). —a, 0 lub 0 - > B(S). 0 , 0 lub a BCR). A8. Pojedyncza rotacja. LINK Ca, S) « - LINKC-a,P). LINKC-a,P) <- S. BCP) <- 0. A10. Ostatnie korekty. Skok, jeśli RLINKCT) / S. RLINKCT) t - P. Koniec. LLINKCT) <- P. Koniec. Kod dla (3 ).
rX <---- 1-1.
DRZEWA ZRÓWNOWAŻONE
6.2.3
97 7H 98 99 100
101 DONE
STX 0 ,4 (B ) LDX HEAD(LLINK) INCX1 STX HEAD(LLINK) EQU *
J B(S) <- a. J LLINK(HEAD) J + 1 J —+ LLINK(HEAD). 1— 5 Wstawianie zakończone.
501
|
A n a liz a w s ta w ia n ia d o d rz e w a z ró w n o w a żo n e g o . [Czytelników nie zain teresowanych m atem atyką prosimy o przejście do (io)]. Żeby wyznaczyć czas działania algorytmu A, powinniśmy znaleźć odpowiedzi na następujące pytania: • Ile porównań jest wykonywanych podczas wyszukiwania? • Jak daleko od siebie znajdą się węzły S i Q? (Innymi słowy, ile korekt jest potrzebnych w kroku A 6?) • Jak często musimy wykonywać pojedynczą lub podwójną rotację? Korzystając z twierdzenia A, nie jest trudno wyprowadzić górne ograniczenia w pesymistycznym przypadku, ale w praktyce najbardziej interesujące jest zacho wanie przeciętne. Z powodu jego skomplikowania, jak dotąd nie udało się w pełni opisać teoretycznie średniego zachowania się powyższego algorytmu. Uzyskano jednak kilka interesujących wyników teoretycznych i empirycznych. Na samym początku zapytajm y o liczbę B nh wszystkich drzew zrównowa żonych o n węzłach wewnętrznych i wysokości h. W ykorzystując zależności B i { z ) = z,
B 0(z) = 1,
B h+1{z) = z B h{ z ) ( B h{z) + 2 B h- i { z ) ) ,
nie jest trudno policzyć funkcję tworzącą Bh(z) = Yhn> o^nhZ,n wartości h. (Zobacz ćwiczenie 6 ). Tak więc
(5 )
m afych
B 2 {z) = 2z 2 + z \ Bz(z) = Az 4 -f 6 z 5 + 4z 6 + z 7, B 4 ( z) = 16z7 + 32z8 + 44 ^9 + • - • + 8z 14 + £15, a w ogólności Bh{z) m a postać 2 Fh+ 1 ~ 1 z Fh+2~ 1 + 2 F h+1~ 2 Lh~ iZ Fh+2 +skonxp\ikowa.ne
w yrazy+ 2/z- 12:2h - 2+ z 2h~1
(6) dla h > 3, gdzie Lk = Fk +1 + Ą - i * (Ten wzór uogólnia twierdzenie A). Łącz na liczba drzew zrównoważonych o wysokości h wynosi Bh = Bh( 1 ) i spełnia równanie rekurencyjne Bq = B \ = U
Bh+i — B l + 2B hBh~i-
(7)
Tak więc B 2 = 3, £?3 = 3 *5, Bą = 32 - 5 *7, B§ — 33 • 52 • 7 *23; w ogólności Bh = A ^ A ^ . . . A ^ _ X ° ,
(8)
gdzie A 0 = 1, Ai = 3, A 2 = 5, A s = 7, A 4 = 23, A 5 = 347, . . . , A h = A h ~ \B h ~2 + 2 . Ciągi Bh i Ah rosną bardzo szybko; w rzeczywistości są one podwójnie wykładnicze. W ćwiczeniu 7 pokazujemy, że istnieje liczba rzeczywista 0 as 1.43687, taka że Bh =
-
l o
+ l ^ - 2j - • • • + ( - D n ^ 20j-
(9 )
502
WYSZUKIWANIE
6.2.3
Jeśli przyjmiemy, że każde z drzew B& jest jednakowo prawdopodobne, to z ćwi czenia 8 mamy, że średnia liczba węzłów w drzewie o wysokości h wynosi B'h{ l ) / B h{\) « (0.70118)2h - 1.
( 10)
To wskazuje, że wysokość AT-węzłowego drzewa zrównoważonego jest dużo bliższa log 2 AT niż log¿ N . Niestety, te wyniki w rzeczywistości niewiele m ają wspólnego z algorytmem A, ponieważ mechanizmy użyte w tym algorytmie powodują, że pewne drzewa są dużo bardziej prawdopodobne od innych. Rozważmy przypadek N = 7, w któ rym możliwych jest 17 drzew zrównoważonych. Istnieje 7! = 5040 możliwych kolejności, w jakich 7 kluczy może zostać wstawionych do drzewa. Doskonale zrównoważone drzewo „zupełne”
(n )
otrzym ujem y 2160 razy. Dla kontrastu drzewo Fibonacciego
( 12 )
pojawia się tylko 144 razy, a podobne drzewo
( 13 )
występuje 216 razy. Zamieniając lewe poddrzewa z ( 12 ) i ( 13 ) przez dowolne drzewo zrównoważone o czterech węzłach, a następnie odbijając symetrycznie lewe z prawym, dostaniemy 16 różnych drzew; każde z ośmiu drzew otrzymywa nych z ( 12 ) pojawia się 144 razy, natom iast każde drzewo otrzymywane z ( 13 ) występuje 216 razy. Jest zadziwiające, że drzewo ( 13 ) pojawia się częściej niż ( 12 ). Fakt, że doskonale zrównoważone drzewo jest otrzymywane z tak dużym prawdopodobieństwem - łącznie z fclktem wynikającym z ( 10), który odpo wiada przypadkowi takich samych prawdopodobieństw - wskazuje, że średni czas wyszukiwania w drzewie zrównoważonym powinien wynosić około lg N + c porównań dla pewnej niewielkiej stałej c. Jednak R. W. Floyd zauważył, że jest nieprawdopodobne, żeby współczynnik przy lg AT wynosił dokładnie 1 , ponieważ
6.2.3
DRZEWA ZRÓWNOWAŻONE
503
Rys. 23. Klasyfikacja węzłów, która określa zachowanie się algorytmu A po wstawieniu nowego węzła.
wówczas korzeń byłby blisko mediany, a korzenie jego poddrzew byłyby blisko „ćwiartek” ; pojedyncza lub podwójna rotacja nie jest w stanie zapewnić, żeby korzeń był bliski mediany. Testy empiryczne wskazują, że prawdziwa średnia licz ba porównań, potrzebna do wstawienia 7V-tego elementu, wynosi 1.01 lg N + 0.1 (wyjątkiem są bardzo małe N ). W celu zbadania zachowania się faz wstawiania i wyważania z algorytm u A, poklasyfikujemy węzły zewnętrzne, tak jak to pokazano na rysunku 23. Każdej ścieżce prowadzącej z węzła zewnętrznego do korzenia odpowiada jednoznacznie ciąg plusów i minusów, przy czym + oznacza prawe dowiązanie, natom iast - lewe dowiązanie; każdy z takich ciągów będziemy zapisywać tylko do pierwszego węzła z niezerowym współczynnikiem zrównoważenia lub (gdy takiego węzła nie ma) do osiągnięcia korzenia. Następnie dopisujemy A lub B, w zależności od tego, czy po wstawieniu w dane miejsce nowego węzła drzewo pozostanie zrównoważone, czy też pozbawione równowagi. Tak więc ścieżką dla HT! jest ++-B, co oznacza „dowiązanie w prawo, dowiązanie w prawo, dowiązanie w lewo, brak równowagi” . Dla ścieżek kończących się na A żadne wyważanie po wstawieniu nowego węzła nie jest potrzebne; dla ścieżek kończących się na ++B łub —B jest wym agana pojedyncza rotacja, natom iast dla ścieżek kończących się na +-B lub -+B jest wymagana podwójna rotacja. Gdy w opisie ścieżki występuje k dowiązań, wów czas w kroku A 6 jest wykonywana korekta dokładnie k — 1 współczynników zrównoważenia. Tak więc opisy ścieżek zawierają istotne elementy, od których zależy czas wykonania kroków od A 6 do A 10 . Przeprowadzone na liczbach losowych testy empiryczne dla 100 < N < 2000 dały przybliżone prawdopodobieństwa pojaw iania się różnych typów ścieżek (zobacz tabela 1 ); te prawdopodobieństwa bardzo szybko zbiegają do swoich wartości granicznych, gdy N —> oo. W tabeli 2 pokazano dokładne prawdopodo bieństwa dla N = 10, odpowiadające tym z tabeli 1, przy założeniu, że każda z 10!
504
WYSZUKIWANIE
6.2.3
Tabela 1 PRZYBLIŻONE PRAWDOPODOBIEŃSTWA DLA WSTAWIANIA N-TEGO ELEMENTU Długość ścieżki k 1 2 3 4 5 > 5 io 20.78
Bez wyważania
Pojedyncza rotacja Podwójna rotacja
0.143 0.152 0.092 0.060 0.036 0.051
0.000 0.143 0.048 0.024 0.010 0.009
0.000 0.143 0.048 0.024 0.010 0.008
łącznie 0.534
0.233
0.232
Tabela 2 DOKŁADNE PRAWDOPODOBIEŃSTWA DLA WSTAWIANIA 10. ELEMENTU Długość ścieżki k
Bez wyważania
1 2 3 4
1/7 6/35 4/21 0
0 1/7 2/35 1/21
0 1/7 2/35 1/21
53/105
26/105
26/105
ednio 247/105
Pojedyncza rotacja Podwójna rotacja
perm utacji jest jednakowo prawdopodobna. (Prawdopodobieństwa 0.143 z tabeli 1 są w rzeczywistości równe 1/7, dla każdego N > 7; zobacz ćwiczenie 1 1 . Dla N < 15 pojedyncze i podwójne rotacje są jednakowo prawdopodobne, natom iast dla N > 16 podwójne rotacje zdarzają się trochę rzadziej). Na podstawie tabeli 1 możemy zauważyć, że k jest < 2 z prawdopodo bieństwem około 0.143 + 0.153 + 0.143 4- 0.143 = 0.582; tak więc krok A 6 jest dość prosty w prawie 60 procentach przypadków. Średnia liczba zmian współczynników zrównoważenia w tym kroku, z 0 na ± 1 , wynosi około 1 .8. Średnia liczba zmian współczynników zrównoważenia z ± 1 na 0, w krokach od A7 do A10, wynosi w przybliżeniu 0.534 + 2(0.233 + 0.232) w 1.5; tak więc w wyniku wstawienia nowego węzła liczba węzłów niezrównoważonych wzrasta średnio o 1.8 — 1.5 = 0.3. To zgadza się z faktem, że w losowych drzewach budowanych za pom ocą algorytm u A, około 68 procent węzłów okazuje się być zrównoważonych. Model umożliwiający zbadanie przybliżonych zachowań algorytmu A za proponował Foster [Proc. A C M Nat. Conf. 20 (1965), 192-205]. Ten model nie jest zupełnie ścisły, ale jest wystarczająco bliski rzeczywistości, żeby dać pewien pogląd na sprawę. Przyjmijmy, że p jest prawdopodobieństwem tego, że współczynnik zrównoważenia danego węzła, w dużym drzewie zbudowanym za pom ocą algorytm u A, wynosi 0; następnie przyjmijmy, że ten współczyn nik wynosi + 1 z prawdopodobieństwem ~ ( 1 — p) oraz —1 także z tym samym prawdopodobieństwem ^(1 —p). Załóżmy dalej (bez żadnego uzasadnienia), że współczynniki zrównoważenia we wszystkich węzłach są niezależne. Wówczas
6.2.3
DRZEWA ZRÓWNOWAŻONE
505
prawdopodobieństwo, że w kroku A 6 dokładnie w f c - 1 węzłach współczynniki zrównoważenia zmienią się na niezerowe, wynosi p k~l (l —p). Zatem średnią war tością k jest 1/(1 - p). Prawdopodobieństwo tego, że będziemy musieli dokonać rotacji części drzewa wynosi q ~ W stawienie nowego węzła powinno zwiększyć liczbę zrównoważonych węzłów średnio o p; w rzeczywistości ta liczba rośnie o 1 w kroku A5, o —p/ ( 1 —p) w kroku A 6 , o q w kroku A7 i o 2 q w kroku A 8 lub A9, a zatem powinniśmy mieć p — 1 —p / ( l - p) ± Sq « 5/2 - p/ ( 1 - p). Rozwiązanie tego równania dla p dość dobrze zgadza się z danymi z tabeli 1: p&
9 —\ / i I --------- 0.649;
1/(1 —p) « 2.851.
( 14 )
Czas działania fazy wyszukiwania z program u A (wiersze 0 1 -1 9 ) wynosi 10C + C l ± 2 L > ± 2 - 3 5 ,
(15)
gdzie C, C l, 5 są takie same jak w poprzednich algorytmach z tego rozdziału, na tomiast D jest liczbą niezrównoważonych węzłów napotykanych na ścieżce wyszu kiwania. Testy empiryczne pokazują, że możemy wziąć D « C l « |( C + 5), C ± 5 « 1.01 lg iV -h 0.1. Zatem średni czas wyszukiwania wynosi w przybliżeniu 11.3 lg N -f 3.3 — 13.75 jednostek. (Jeśli wyszukiwanie jest wykonywane dużo częściej niż wstawianie, moglibyśmy do wyszukiwania zastosować inny, dużo szybszy program, ponieważ nie ma wówczas konieczności oglądania współczyn ników zrównoważenia; wtedy średni czas wyszukiwania wynosiłby tylko około (6.6 lg N —3.4)u, a pesymistyczny czas działania byłby w rzeczywistości lepszy od średniego czasu działania otrzymywanego za pomocą program u 6.2.2T). Gdy wyszukiwanie kończy się niepowodzeniem, wówczas czas działania fazy wstawiania w programie A (wiersze 2 0 -4 5 ) wynosi 8F + 26 + (0, 1 lub 2) jednostek. Dane z tabeli 1 wskazują, że w średnim przypadku F « 1.8. Faza wyważania (wiersze 46-101) zabiera 16.5, 8, 27.5 lub 45.5 (±0.5) jednostek cza su, zależnie od tego, czy całkowita wysokość drzewa zwiększa się, czy kończymy, nie wykonując rotacji, czy też wykonujemy rotację pojedynczą lub podwójną. Pierwszy przypadek prawie nigdy nie m a miejsca, natom iast pozostałe w ystępują z prawdopodobieństwami w przybliżeniu 0.534, 0.233, 0.232. Zatem średni czas działania połączonej fazy wstawiania z wyważaniem wynosi około 63u. Te liczby pokazują, że utrzymywanie drzewa zrównoważonego w pamięci jest rzeczywiście szybkie, nawet jeśli program okazał się dość długi. Jeśli dane wejściowe są losowe, to prosty algorytm wstawiania do drzewa z punktu 6 .2.2 jest na każde wstawienie w przybliżeniu o 50w szybszy; jednak drzewa zrównoważone są niezawodne nawet dla nielosowych danych. Jeden ze sposobów porównania program u A z program em 6.2.2T polega na rozpatrzeniu pesymistycznego przypadku dla tego drugiego. Jeśli popatrzymy, ile czasu potrzeba do wstawienia do początkowo pustego drzewa N kluczy upo rządkowanych rosnąco, to okazuje się, że program A jest wolniejszy dla N < 26 i szybszy dla N > 27.
506
WYSZUKIWANIE
6.2.3
R e p r e z e n ta c ja list lin io w y c h . Wróćmy teraz do stwierdzenia z początku tego punktu, że drzewa zrównoważone można stosować do reprezentowania list linio wych w sposób umożliwiający szybkie wstawianie elementów (pokonując w ten sposób trudności wynikające z alokacji sekwencyjnej), a na dodatek zapewniający także swobodny dostęp do elementów listy (pokonując w ten sposób trudności wynikające z alokacji dowiązaniowej). Pomysł polega na wprowadzeniu do każdego węzła nowego pola RA N K . To pole mówi, jaka jest względna pozycja danego węzła w jego poddrzewie, co ozna cza że wartość R A NK jest o jeden większa od liczby węzłów w lewym poddrzewie tego węzła. Na rysunku 2 4 pokazano wartości pól RANK dla węzłów z drzewa z rysunku 2 3 . Pole K EY możemy całkowicie usunąć; można też, jeśli jest taka potrzeba, trzym ać oba pola K E Y i RA NK i wyszukiwać elementy albo po kluczach, albo po ich względnych położeniach na liście.
M ając takie pole R A N K , wyszukiwanie po pozycji jest prostą modyfikacją dotychczas poznanych algorytmów wyszukiwania. A lg o r y tm B ( Wyszukiwanie drzewowe po pozycji). D ana jest lista liniowa reprezentowana za pomocą drzewa binarnego. W tym algorytmie dla danego k znajdujem y k-ty element z listy (A;-ty węzeł w drzewie w porządku syme trycznym ). O drzewie zakładamy, że zawiera pola L L IN K i R L IN K oraz nagłówek, podobnie jak w algorytmie A. Dodatkowo przyjmujemy, że mamy pola RANK opisane powyżej. B I . [Inicjowanie] M< - fc, P < - R L I N K ( H E A D ) . B 2 . [Porównywanie] Jeśli P = A, algorytm kończy się niepowodzeniem. (To może zdarzyć się tylko, gdy k jest większe od liczby węzłów w drzewie lub gdy k < 0). W przeciwnym razie, jeśli M < R A N K ( P ) , to przejdź do B3; jeśli M > R A N K ( P ) , to przejdź do B4; natom iast, jeśli M = R A N K ( P ) , algorytm kończy się sukcesem (P pokazuje na k-ty węzeł).
6.2.3
DRZEWA ZRÓWNOWAŻONE
507
B 3. [Przejście w lewo] W ykonaj P -i— LLINK(P) i wróć do B2. B 4. [Przejście w prawo] W ykonaj M<— M—RANK(P) i P <— RLINK(P), a następnie wróć do B2. | Jedyna nowa rzecz w arta uwagi w tym algorytmie to um iejętna aktualizacja Mw kroku B4. W ten sam sposób możemy zmodyfikować algorytm wstawiania, chociaż szczegóły są trochę trudniejsze: A lg o ry tm C (Wstawianie po pozycji do drzewa zrównoważonego). Dane są: lista liniowa reprezentowana przez zrównoważone drzewo binarne, pozycja k na liście oraz wskaźnik Q do nowego węzła. W tym algorytmie wstawiamy nowy węzeł tuż przed fc-tym węzłem na liście. Jeśli k = N + 1 , nowy węzeł zostaje wstawiony po ostatnim elemencie z listy. O drzewie zakładamy, że jest niepuste i że zawiera pola LLINK, RLINK i B oraz nagłówek, podobnie jak w algorytmie A. Dodatkowo zakładam y istnienie pól RANK o znaczeniu opisanym wcześniej. Ten algorytm jest w zasadzie kopią algorytmu A; różnica polega na tym , że używamy w nim, i aktualizujemy, pola RANK zamiast pól KEY. C l . [Inicjowanie] T «- HEAD, S <- P <- RLINK (HEAD), U <- M«- k. C 2. [Porównywanie] Jeśli M< RANK(P), to przejdź do C3, w przeciwnym razie przejdź do C4. C 3. [Przejście w lewo] RANK(P) RANK(P) + 1 (nowy węzeł wstawimy na lewo od P). R <— LLINK(P). Jeśli R = A, to wykonaj LLINK (P) Q i przejdź do C5. W przeciwnym razie, jeśli B(R) 7^ 0, to wykonaj T <— P, S <— R oraz U <— M. Na koniec wykonaj P R i wróć do C2. C 4. [Przejście w prawo] W ykonaj M -i— M — RANK(P) i R RLINK(P). Jeśli R = A, to wykonaj RLINK(P) <— Q i przejdź do C5. W przeciwnym razie, jeśli B(R) 7^ 0, to wykonaj T <— P, S <— R i U M. Na koniec wykonaj P <— R i wróć do C2. C 5. [Wstawianie] RANK(Q) +- 1, LLINK(Q) 4- RLINK(Q) <- A, B(Q) <- 0. C 6 . [Korekta współczynników zrównoważenia] M U. (Przywracam y poprzed nią wartość M, gdy P było równe S; wartości wszystkich pól RANK są już poprawne). Jeśli M < RANK(S), to wykonaj R P «— LLINK(S) i a <------1; w przeciwnym razie wykonaj R «— P RLINK(S), a +1, i M M— RANK(S). Następnie pow tarzaj wykonywanie następujących operacji, aż P = Q: Jeśli M< RANK(P), to wykonaj B(P) <----- 1 i P LLINK(P); jeśli M > RANK(P), to wykonaj B(P) <- +1, M<- M- RANK(P) i P <- RLINK(P). (Jeśli M= RANK(P), to P = Q i przechodzimy do następnego kroku). C 7. [Wyważanie] Mamy kilka przypadków. i) Jeśli B(S) = 0, to wykonaj B(S) u, LLINK (HEAD) <- LLINK (HEAD) + 1 i zakończ wykonywanie algorytmu. ii) Jeśli B(S) = —a, to wykonaj B(S) <— 0 i zakończ wykonywanie algoryt mu.
508
WYSZUKIWANIE
6.2.3
iii) Jeśli B(S) = a, to przejdź do kroku C 8, gdy B(R) = a, natom iast do C9, gdy B(R) = —a. C 8 . [Pojedyncza rotacja] P = R, LINK(a,S) <- LINK(—a,R), LINK(-a,R) <- S, B(S) B(R) 0. Jeśli a = +1, to wykonaj RANK(R) RANK(R) + RANK(S); jeśli a = - 1 , to wykonaj RANK(S) <- RANK(S) —RANK(R). Przejdź do CIO. C 9 . [Podwójna rotacja] W ykonaj wszystkie operacje z kroku A9 (algorytm A). Następnie, jeśli a ~ +1, to wykonaj RANK(R) <— RANK(R) - RANK(P), RANK(P) <- RANK(P) + RANK(S); jeśli a = - 1 , to wykonaj RANK(P)
( P i , ai),
•••,
(P i,a i),
( 16 )
gdzie P 0 = HEAD, a 0 = +1; LINKCa» ,P j) = P i+1 dla 0 < i < l\ P t = P; natom iast LINK (aj , P j) = A. Elementy takiej listy można umieszczać na stosie podczas przechodzenia drzewa w dół. Usunięcie węzła P polega na wykonaniu LINK(aj_i , P j _ i ) LINK(—aj , Pj ) , a następnie poprawieniu współczynnika zrównoważenia dla węzła P/_i. Przypuśćmy, że musimy skorygować współczyn nik zrównoważenia w węźle P&, ponieważ zmniejszyła się właśnie wysokość odpo wiadającego poddrzewa ajt- Do tego celu należy zastosować następującą procedu rę: Jeśli k — 0, wykonaj LLINK(HEAD) <— LLINK(HEAD) —1 i zakończ wykonywanie algorytmu, ponieważ zmniejszyła się wysokość drzewa. W przeciwnym razie rozważ współczynnik zrównoważenia B(Pfc); mamy trzy przypadki: i) B(Pfc) = a*;. W ykonaj B(Pjt) 0, zmniejsz k o 1, a następnie powtórz procedurę korekcji dla nowej wartości k. ii) B(Pfc) = 0. Przypisz B(P^) nową wartość — i zakończ wykonywanie algo rytm u. iii) B(Pfc) = —a*. W ymagane jest wyważanie!
6.2.3
DRZEWA ZRÓWNOWAŻONE
509
Sytuacje, w których jest wymagane wyważanie, są prawie takie same jak w przy padku wstawiania; patrząc na rysunek (i), A jest węzłem Ą , natom iast B jest węzłem LI NK( — z poddrzewa przeciwnego do tego, z którego miało miej sce usuwanie. Jedynym nowy zjawiskiem jest to, że węzeł B może być zrównowa żony; to prowadzi do przypadku 3, który przypom ina przypadek 1 z wyjątkiem tego, że (3 ma wysokość h + 1. W yważanie w przypadkach 1 i 2 , zgodne z ry sunkiem (2), oznacza, że zmniejsza się wysokość drzewa; tak więc przypisujemy zmiennej LINKCa^-i , P k - i ) wskaźnik do korzenia drzewa z (2 ), zmniejszamy k o 1 i ponawiamy procedurę korekcji dla nowej wartości k. W przypadku 3 wykonujemy pojedynczą rotację, po której współczynniki zrównoważenia obu węzłów A i B są niezerowe, natom iast wysokość całego poddrzewa pozostaje bez zmian; na koniec przypisujemy zmiennej LINK(a*;_i , P k - i ) wskaźnik do węzła B i kończymy wykonywanie algorytmu. Istotną różnicą między usuwaniem a wstawianiem jest to, że usuwanie może wymagać do log N rotacji, natom iast wstawianie nigdy nie potrzebuje ich więcej niż jedna. To stanie się jasne, gdy spróbujemy z drzewa Fibonacciego (zobacz rysunek 8 w punkcie 6.2.1) usunąć skrajnie prawy węzeł. Jednak testy empiryczne pokazują, że średnio jedno usuwanie wymaga 0.21 rotacji. Jeśli chcemy stosować drzewa zrównoważone do reprezentowania list linio wych, powinniśmy także umieć wykonywać łączenie polegające na przyłączeniu całego drzewa L 2 do drzewa L \ z jego prawej strony, zachowując jednocześnie równowagę. Clark A. Crane był twórcą pierwszego, bardzo ładnego algorytmu łączenia. Załóżmy, że wysokość(Li) > w y s o k o ś ć ^ ); przypadek przeciwny jest podobny. Z drzewa L 2 usuwamy pierwszy węzeł. Nazwijmy go węzłem łączącym J . Niech L 2f będzie nowym drzewem L% \ {J} . Teraz posuwamy się w dół drzewa L i po prawych dowiązaniach, aż dojdziemy do węzła P , takiego że wysokość(P) —wysokość(I/2) — 0 lub 1; to jest zawsze możliwe, ponieważ wysokość zmienia się o 1 lub 2 przy każdym przejściu o jeden poziom w dół drzewa. Następnie zamieniamy ( p ) przez
i przystępujemy do poprawiania drzewa L 1 , tak jakbyśmy dopiero co wstawili węzeł J za pomocą algorytmu A. Crane rozwiązał także dużo trudniejszy problem odwrotny, polegający na po dziale listy na dwie podlisty, które po połączeniu dają listę wyjściową. Rozważmy dla przykładu problem podziału listy z rysunku 20 na dwie listy, jedną zawiera jącą elementy {A,. . . , 1} i drugą o elementach { J , . . . , Q}; wymaga to połączenia odpowiednich poddrzew. W ogólności, jeśli chcemy podzielić drzewo w pewnym węźle P , ścieżka prowadząca do P będzie wyglądała mniej więcej tak jak ta z rysunku 25. Naszym celem jest sformowanie lewego drzewa, które zawierałoby uporządkowane symetrycznie węzły z 04 , P i, 04 , P 4, a 6, P&j £*7 , P 7 , a , P , oraz sfor-
510
WYSZUKIWANIE
6.2.3
R y s. 25. Problem podziału listy.
mowanie prawego poddrzewa zawieraj ącego /?, P8, 0$, Ą , 8 $, Ą . Ą3, P2, 02 • Moż na to zrobić, wykonując ciąg połączeń. Najpierw wstawiamy P z prawej strony a , następnie łączymy (3 z /J8, wykorzystując P 8 jako węzeł łączący, łączymy a 7 z a P , wykorzystując P 7 jako węzeł łączący, z a 7P 7a P , wykorzystując P 6, ¡3Pgj3g z /?5 , wykorzystując P 5 itd .; węzły P 8, P 7, . . . , Pi na ścieżce prowadzącej do P służą nam za węzły łączące. Crane udowodnił, że gdy wyjściowe drzewo zawiera N węzłów, wówczas algorytm podziału wymaga tylko O (log N ) jednostek czasu. W ynika to z obserwacji, że dla danego węzła łączącego, połączenie dwóch drzew wykonuje się w 0 (k) krokach, gdzie k jest różnicą wysokości łączonych drzew, a wartości fc, które należy zsumować w obu przypadkach, lewego i prawego poddrzewa, tworzą szereg teleskopowy. W szystkie z przedstawionych algorytmów można stosować, wykorzystując albo pole KEY, albo pole RANK, albo oba pola razem (chociaż w przypadku łączenia wszystkie klucze z L 2 muszą być większe od kluczy z L\ ), W ogólnych zastosowaniach wygodnie jest korzystać z drzew z trzema dowiązaniami, UP (do rodzica), LLINK i RLINK, jak i z dodatkowym jednobitowym polem mówiącym o tym , czy dany węzeł jest lewym, czy też prawym dzieckiem swojego rodzica. Taka reprezentacja upraszcza algorytmy i umożliwia operowanie na węzłach, bez konieczności przechodzenia najpierw po ścieżkach prowadzących do tych węzłów; możemy napisać podprogram do usuwania węzła NODE(P), m ając dane P, lub podprogram do usuwania węzła, który jest kolejnym po NODE(P) w porządku symetrycznym, lub też do znajdowania listy zawierającej węzeł NODE(P) itd. W algorytmie usuwania dla drzewa z trzem a dowiązaniami nie potrzeba budować listy ( 1 6 ), ponieważ dowiązania UP zawierają wystarczająco wiele informacji. Oczywiście w przypadku drzew z trzem a dowiązaniami musimy dokonać więcej
6.2.3
DRZEWA ZRÓWNOWAŻONE
511
zmian w dowiązaniach podczas wykonywania wstawień, usunięć czy też rotacji. W ykorzystanie drzew z trzem a dowiązaniami, zamiast z dwoma, jest analogiczne do użycia listy dwukierunkowej zam iast listy jednokierunkowej. Możemy zacząć z dowolnego miejsca i posuwać się do przodu lub do tyłu. Pełny opis algorytmów listowych w implementacji na drzewach z trzem a dowiązaniami znajduje się w pracy doktorskiej Clarka A. C rane’a (Stanford University, 1972). S t r u k t u r y a lte r n a ty w n e d la d rz e w A V L. Istnieje wiele innych sposobów organizacji drzew, które gw arantują logarytmiczny czas dostępu. Na przykład C. C. Foster [CACM 16 (1973), 513-517] rozważał drzewa binarne, które po wstają, gdy pozwolimy, żeby różnica w wysokościach poddrzew wynosiła co najwyżej fc. Takie struktury nazywamy drzewami HB(fc) (height-balanced, czy li zrównoważone po wysokościach), tak więc zwykłe drzewa zrównoważone to szczególny przypadek drzew HB(1). J. Nievergelt, E. Reingold i C. K. Wong byli pomysłodawcami drzew zrówno ważonych wagowo. Zamiast rozważać wysokości drzew, zażądali, żeby poddrzewa każdego węzła spełniały warunek w agaleweg 1 < v i + 1 waga prawego gdzie waga poddrzewa to liczba należących do niego węzłów zewnętrznych. Można pokazać, że do utrzym ywania warunku równowagi podczas wstawiania w ystar czą tylko pojedyncze i podwójne rotacje w wyważaniu takim jak w algorytmie A (zobacz ćwiczenie 25). Jednakże pojedyncze wstawienie może wymagać wie lu wyważeń. Można osłabić warunki z ( 17 ), zmniejszając liczbę wyważeń, ale kosztem zwiększenia czasu wyszukiwania. W ydaje się, że drzewa zrównoważone wagowo wym agają więcej pamięci od zwykłych drzew zrównoważonych, ale w rzeczywistości czasami potrzebują jej trochę mniej! Jeśli w reprezentacji listy liniowej w każdym węźle mamy już pole RANK, to jest to dokładnie waga lewego poddrzewa, natom iast odpowiadające im wagi prawych poddrzew można obliczyć podczas wędrówki w dół drzewa. Jednakże okazuje się, że czas potrzebny do utrzym ania równowagi wagowej jest większy niż w algorytmie A i wyeliminowanie dwóch bitów z każdego węzła nie jest prawdopodobnie warte zachodu. Dlaczego nie połączyć ich w tró jk i? — przypisuje się Misiowi Y O G I (około 1970 roku)
Inną interesującą alternatyw ą dla drzew AVL są tak zwane „2-3-drzewa” , zaproponowane w 1974 roku przez Johna Hopcrofta [zobacz Aho, Hopcroft, Ullman, Projektowanie i analiza algorytmów komputerowych (Warszawa: PW N, 1983), rozdział 4]. Pomysł polega na tym, żeby w każdym węźle mieć albo 2 , albo 3 rozgałęzienia i dodatkowo wymagać, żeby wszystkie węzły zewnętrzne znajdowały się na tym samym poziomie. Każdy węzeł wewnętrzny zawiera albo jeden klucz, albo dwa klucze, jak pokazano na rysunku 26. W stawianie do 2-3-drzewa jest trochę łatwiejsze do wyjaśnienia od wstawia nia do drzewa AVL. Jeśli chcemy umieścić nowy klucz w węźle, który zawiera tył-
512
WYSZUKIWANIE
6.2.3
( EJ (aTcJ
rśj C KJ
(L,l) ÓnYR)
0 ^ 0
R ys. 26. 2-3-drzewo. ko jeden klucz, wystarczy po prostu dostawić go jako drugi klucz. Jednakże, jeśli taki węzeł zawiera już dwa klucze, to dzielimy go na dwa węzły z pojedynczymi kluczami i środkowy klucz umieszczamy w węźle-rodzicu. To może spowodować podobny podział węzła-rodzica, jeśli zawiera on już dwa klucze. Na rysunku 27 przedstawiono proces wstawiania nowego węzła do 2-3-drzewa z rysunku 26.
R ys. 27. Wstawianie nowego klucza „M” do 2-3-drzewa z rysunku 26. Hopcroft zauważył, że również usuwanie, łączenie i podział są możliwe do wykonania na 2-3-drzewach, w niezbyt skomplikowany sposób analogiczny do odpowiednich operacji na drzewach AVL. R. Bayer [Proc. A C M -SIG F ID E T Workshop (1971), 219-235] był autorem interesującej reprezentacji 2-3-drzew za pomocą drzew binarnych. Przyjrzyj my się rysunkowi 28, na którym przedstawiono drzewo binarne reprezentujące drzewo z rysunku 26; w każdym węźle wykorzystuje się jeden bit do rozróż niania „poziomych dowiązań” RLINK od „dowiązań pionowych” . Zauważmy, że klucze są uporządkowane symetrycznie z lewa na prawo, tak jak w każdym drzewie wyszukiwań binarnych. Okazuje się, że przekształcenia, które musimy wykonać na takim drzewie binarnym po wstawieniu nowego klucza w sposób przedstawiony na rysunku 27, to dokładnie pojedyncze i podwójne rotacje, które stosowaliśmy podczas wstawiania nowego węzła do drzewa AVL, chociaż w tym przypadku korzystamy tylko z jednej wersji każdej rotacji (nie potrzebujemy przypadków otrzymywanych w wyniku odbicia lewe-prawe, które były konieczne w algorytmach A i C). Dalsze rozwinięcie tych pomysłów doprowadziło do powstania całej gamy różnorodnych odm ian drzew zrównoważonych. Do najważniejszych z nich należą
6.2.3
DRZEWA ZRÓWNOWAŻONE
513
R ys. 28. Drzewo binarne reprezentujące 2-3-drzewo z rysunku 26. drzewa czerwono-czarne, nazywane także symetrycznymi B-drzewami binarnym i lub drzewami półzrównoważonymi [R. Bayer, A cta Informática 1 (1972), 2 9 0 -306; L. Guibas i R. Sedgewick, FOCS 19 (1978), 8 - 2 1 ; H. J. Olivié, R A IR O Informatique Théorique 16 (1982), 5 1 -7 1 ; R. E. Tarjan, Inf. Proc. L etters 16 (1983), 253-257; T. H. Cormen, C. E. Leiserson i R. L. Rivest, Wprowadzenie do algorytmów (Warszawa, W N T 2001), rozdział 14; R. Sedgewick, Aigorithm s in C (Addison-Wesley, 1997), §13.4]. Bardzo blisko z nimi związane są B-drzewa histeryczne lub (a, 6)-drzewa, szczególnie (2 , 4)-drzewa [D. Maier i S. C. Salveter, Inf. Proc. Letters 12 (1981), 199-202; S. Huddleston i K. Mehlhorn, A cta Informática 17 (1982), 157-184]. Jeśli odwołania do pewnych kluczy zdarzają się częściej niż do innych, to chcielibyśmy, żeby ważniejsze klucze znajdowały się blisko korzenia, podobnie jak w optymalnych drzewach wyszukiwań binarnych z punktu 6 .2 .2 . S. W. Bent, D. D. Sleator i R. E. Tarjan, SICO M P 14 (1985), 545-568, jak również J. Feigenbaum i R. E. Tarjan, Bell System Tech. J. 62 (1983), 3139-3158, byli twórcami drzew dynamicznych nazywanych „drzewami przystosowawczym i’, które umożliwiają utrzymywanie równowagi wagowej odbiegającej od optymalnej tylko o stały czynnik. Jednakże zaproponowane przez nich algorytmy są dość skomplikowane. Dużo prostsza jest samoorganizująca się struktura danych, znana pod nazwą drzewa typu spiay, która została zaproponowana później przez D. D. Sleatora i R. E. Tarjana [JACM 32 (1985), 652-686]. W ykorzystuje się w niej pomysły podobne do heurystyk z przesuwaniem na początek i transpozycyjnej, o których była mowa w podrozdziale 6 . 1 ; podobnymi m etodam i zajmowali się wcześniej B. Allen i I. Munro [JACM 25 (1978), 526-535] oraz J. Bitner [SICO M P 8 (1979), 82-110]. Drzewa typu splay, podobnie jak inne rodzaje drzew zrówno ważonych, o których wspominaliśmy, umożliwiają wykonywanie w szczególnie prosty sposób zarówno operacji wstawiania i usuwania, jak i łączenia i podziału. Ponadto okazuje się, że dla dowolnego ciągu operacji zamortyzowany czas dostę pu do danych w drzewie typu splay jest tylko o stały m ały czynnik gorszy od czasu dostępu w statystycznie optymalnym drzewie. Tak naprawdę Sleator i Tarjan postawili hipotezę, że łączny czas dostępu do danych w drzewie typu splay jest równy co najwyżej stała razy optym alny czas dostępu do danych i wykonywania rotacji w dowolnym dynamicznym algorytmie dla drzew binarnych. Randomizacja doprowadziła do pow stania metod, które okazują się być jeszcze prostsze i szybsze od drzew typu splay. Jean Vuillemin [CACM 23 (1980), 229-239] jest twórcą drzew kartezjańskich, w których każdy węzeł m a dwa
514
WYSZUKIWANIE
6.2.3
klucze (x, y). Klucze x są uporządkowane symetrycznie z lewa na prawo jak w drzewach binarnych, klucze y są uporządkowane z góry na dół jak w kolejkach priorytetowych z punktu 5.2.3. C. R. Aragon i R. G. Seidel nadali tej strukturze danych wdzięczniejszą nazwę drzepiec (oryginalnie „treap” ), ponieważ trafnie łączy w sobie pojęcia drzewa („tree”) i kopca („heap”). Dla danych n par kluczy ( xi , yi ) , . . . , ( xn , y n), jeśli iksy i igreki są różne, to można zbudować tylko jeden drzepiec. Można go otrzymać, wstawiając iksy za pomocą algorytmu 6.2.2T w kolejności zadanej przez igreki. Istnieje także prosty algorytm wsta wiania bezpośrednio do drzepca dowolnej nowej pary. Aragon i Seidel zauważyli [FOCS 30 (1989), 540-546], że jeśli iksy są zwykłymi kluczami, a igreki są losowe, to możemy być pewni, że drzepiec m a postać losowego drzewa wyszu kiwań binarnych. W szczególności oznacza to, że drzepiec z losowymi warto ściami y będzie zawsze dość dobrze zrównoważony, z wyjątkiem przypadków zachodzących z wykładniczo m ałym prawdopodobieństwem (zobacz ćwiczenie 5.2.2-42). Aragon i Seidel pokazali także, że drzepce łatwo przystosowywać. Na przykład, klucz x o względnej częstości / znajdzie się zadowalająco bli sko korzenia, gdy stowarzyszymy go z y = U 1^ , gdzie U jest liczbą loso wą między 0 a 1 . Drzepce zachowywały się stale lepiej od drzew typu splay w eksperym entach przeprowadzonych przez D. E. Knutha, a mających związek z obliczaniem wypukłych otoczek [Lecture Notes in Comp. Sci. 606 (1992), 53-55]. / £ \ W następnym wydaniu tej książki planowany jest nowy p u n k t 6.2.5, poświęJL eony zrandomizowanym strukturom danych. Omówimy w nim „listy z prze skokam i” [W. Pugh, C A C M 33 (1990), 668-676] i „zrandomizowane drzewa wyszukiwań binarnych” [S. Roura i C. M artinez, JA C M 45 (1998), 288-323], ja k i drzepce. ĆW ICZENIA 1 . [01] Dlaczego w przypadku 2 z (i) zamiana lewych poddrzew A i B nie jest dobrym pomysłem na przywrócenie równowagi? 2. [16] Wyjaśnij dlaczego drzewo rośnie o jeden poziom, jeśli do kroku A7 wejdziemy z B(S) = 0. ► 3. [M2 5] Udowodnij, że drzewo zrównoważone o N węzłach wewnętrznych nigdy nie zawiera więcej niż (— 1) N « 0.61803iV węzłów, dla których współczynnik zrównowa żenia jest niezerowy. 4. [M22] Udowodnij lub pokaż, że to nieprawda: wśród wszystkich drzew zrównowa żonych o Fh +1 —1 węzłach wewnętrznych, drzewo Fibonacciego rzędu h ma największą długość ścieżki wewnętrznej. ► 5. [M 2 5 ] Udowodnij lub pokaż, że to nieprawda: jeśli algorytm A wykorzystamy do wstawienia kolejno uporządkowanych rosnąco kluczy K 2 , .. -, K n do drzewa, które po czątkowo zawiera tylko jeden klucz K \ , gdzie K \ < K 2 < **• < K n , to wówczas zawsze dostaniemy drzewo optymalne (tzn. drzewo z minimalną długością ścieżki wewnętrznej wśród wszystkich N -węzłowych drzew binarnych).
DRZEWA ZRÓWNOWAŻONE
6.2.3
515
6 . [M21] Udowodnij, że równania ( 5 ) definiują funkcję tworzącą dla drzew zrówno ważonych o wysokości h.
7. [M27] (N. J. A. Sloane i A. V. Aho) Udowodnij godny uwagi wzór ( 9 ) na liczbę drzew zrównoważonych o wysokości h. [Wskazówka: Niech Cn — B n + B n- 1; skorzystaj z faktu, że log(Cn+ i / 0 ^) jest niezmiernie małe dla dużych n\. 8.
[M24] (L. A. Chizdier) Pokaż, że istnieje taka stała /3, że B hf (l) / Bh(l) — 2 hf3 —
1 + 0 ( 2 / B h - i ) , gdy h -> 0 0 .
9. [HMĄĄ] Jaka jest asymptotyczna liczba drzew zrównoważonych o n węzłach wewnętrznych, czyli ^ 2h>0 B nh7 Jaka jest ich asymptotyczna średnia wysokość E / 1^0 h B n h / E h >0 Bnh?►10. [27] (R. C. Richards) Pokaż, że kształt drzewa zrównoważonego można odtworzyć jednoznacznie z listy jego współczynników zrównoważenia B(1)B(2) .. . B(iV) danych w porządku symetrycznym. 11. [M2Ą] (Mark R. Brown) Udowodnij, że dla n ^ 6 , średnia liczba węzłów zewnętrz nych każdego z typów +A, - A , ++B, +-B, -+B, —B w losowym drzewie zrównoważonym o n węzłach wewnętrznych zbudowanym za pomocą algorytmu A, wynosi dokładnie (n + l)/1 4 . ►12. [24] Jaki jest maksymalny możliwy czas działania programu A, gdy do drzewa zrównoważonego wstawiamy ósmy węzeł? Jaki jest minimalny czas działania dla takiego wstawiania? 1 3 . [05] Dlaczego lepiej korzystać z pól RANK zdefiniowanych tak jak w głównym tekście, zamiast po prostu pamiętać indeks każdego węzła, jako jego klucz (oznaczając pierwszy węzeł przez „1”, drugi węzeł przez „2 ” itd.)?
14. [11] Czy algorytmy 6 .2 . 2 T i 6 .2 .2 D można by zaadaptować do pracy z listami liniowymi, korzystając z pola RANK, dokładnie tak jak uczyniliśmy to z algorytmami dla drzew zrównoważonych z tego punktu? 15. [18] (C. A. Crane) Załóżmy, że uporządkowana lista liniowa jest reprezentowana przez drzewo binarne z obydwoma polami KEY i RANK w każdym węźle. Ułóż algorytm, który przeszukuje drzewo z danym kluczem K i wyznacza pozycję K na liście; tzn. znajduje taką liczbę m, że K jest m-tym najmniejszym kluczem. ►16. [20] Narysuj drzewo zrównoważone, które powstaje z drzewa z rysunku 20 w wy niku usunięcia węzła E i korzenia F, za pomocą algorytmu usuwania zaproponowanego w głównym tekście. ►17. [21] Narysuj drzewa zrównoważone otrzymywane w wyniku „przyłączenia” drze wa Fibonacciego ( 12 ) do drzewa z rysunku 20: (a) z jego prawej strony, (b) z jego lewej strony. Do tego celu skorzystaj z algorytmu łączenia zaproponowanego w głównym tekście. 18. [22] Narysuj drzewa zrównoważone, które otrzymujemy w wyniku podziału drze wa z rysunku 20 na dwie części (A, . . . , 1} i { J , . . . , Q} za pomocą algorytmu zapropo nowanego w głównym tekście. ►19. [26] Znajdź metodę przekształcania danego drzewa zrównoważonego w taki spo sób, żeby współczynnik zrównoważenia w korzeniu był różny od —1. Takie przekształce nie powinno zachowywać porządek symetryczny węzłów i powinno dawać nowe drzewo zrównoważone w 0 (1 ) jednostkach czasu, niezależnie od rozmiaru wyjściowego drzewa.
516
6.2.3
WYSZUKIWANIE
20. [40] Zbadaj pomysł użycia tylko ograniczonej klasy drzew zrównoważonych, w któ rych współczynnik zrównoważenia w każdym węźle jest równy 0 lub +1. (Wówczas długość pola B można zredukować do tylko jednego bitu). Czy dla takich drzew istnieje zadowalająco efektywny algorytm wstawiania? ►2 1 . [30] (Doskonałe wyważanie) Ułóż algorytm, który buduje N- węzłowe drzewa bi narne, optymalne w znaczeniu z ćwiczenia 5. Zaproponowany algorytm powinien wyko nywać O(N) kroków i działać w trybie bezpośrednim, tzn. powinien pobierać po jednym węźle w porządku rosnącym i budować po drodze częściowe drzewa, nie wiedząc z góry, jaka jest ostateczna wartość N . (Taki algorytm znajduje zastosowanie, gdy chcemy zrestrukturyzować źle zrównoważone drzewo lub gdy chcemy scalić w jednym drzewie klucze z dwóch drzew). 22 . [M20] Co jest odpowiednikiem twierdzenia A dla drzew zrównoważonych wagowo? 23. [M20] (E. Reingold) Pokaż, że nie istnieje żaden prosty związek między drzewami zrównoważonymi po wysokościach a drzewami zrównoważonymi wagowo; a) Udowodnij, że istnieje drzewo zrównoważone po wysokościach o dowolnie małym stosunku (waga lewego)/(waga prawego) w znaczeniu z ( 17 ). b) Udowodnij, że istnieją drzewa zrównoważone wagowo o dowolnie dużej różnicy między wysokościami lewego i prawego poddrzewa. 24. [M22] (E. Reingold) Udowodnij, że jeśli wzmocnimy warunek ( 17 ) do 1 ^ waga lewego ^ ^ 2 waga prawego
to jedynymi drzewami binarnymi, które spełniają ten nowy warunek, są drzewa dosko nale zrównoważone o 2n — 1 węzłach wewnętrznych. (W takich drzewach wagi lewego i prawego poddrzewa są w każdym węźle sobie równe). 25. [27] (J. Nievergelt, E. Reingold, C. Wong) Pokaż, że można zaprojektować algo rytm wstawiania do drzew zrównoważonych wagowo, w którym dla zachowania warunku ( 17 ) wykonuje się co najwyżej 0 (logJV) rotacji na jedną operację wstawiania. 26. [4 0 ] Zbadaj własności drzew zrównoważonych o stopniach większych niż 2. ►27. [M23] Oszacuj maksymalną liczbę porównań potrzebną do przeszukania 2-3-drzewa o N węzłach wewnętrznych. 28. [41] Zaimplementuj efektywnie algorytmy dla 2-3-drzew. 29. [M47] Dokonaj analizy średniego zachowania się 2-3-drzew dla losowych wsta wień. 30. [26] (E. McCreight) W podrozdziale 2.5 omawiamy kilka strategii dla dynamicznej alokacji pamięci, a wśród nich strategię najlepszego dopasowania (polegającą na wy borze najmniejszego pasującego obszaru pamięci) oraz pierwszego dobrego (polegającą na wyborze pasującego obszaru pamięci o najmniejszym adresie). Pokaż, że jeśli wolne obszary zorganizujemy właściwie w drzewo zrównoważone, to alokacji (a) najlepiej pasującego obszaru (b) pierwszego dobrego obszaru można dokonać w O(logn) jed nostkach czasu, gdzie n jest liczbą wolnych obszarów w pamięci. (Algorytmy realizacji tych metod z podrozdziału 2.5 wymagają n kroków). 31. [34] (M. L. Fredman, 1975) Zaproponuj implementację listy liniowej, która dla danej pozycji m umożliwia wstawienie nowego elementu między pozycjami m — 1 a m w O (logm ) jednostkach czasu.
6.2.4
DRZEWA WYŻSZYCH STOPNI
517
32. [M27] Niech T i T' będą dwoma n-węzłowymi drzewami binarnymi. Piszemy T , gdy T' można otrzymać z T za pomocą ciągu zero lub więcej rotacji w prawo. Udowodnij, że T K T* wtedy i tylko wtedy, gdy r k ^ r kf dla 1 ^ k ^ n, gdzie r k i r k oznaczają odpowiednio rozmiary prawych poddrzew fc~tych węzłów w porządku symetrycznym w drzewach T i T ;. ►33. [25] (A. L. Buchsbaum) Wyjaśnij, w jaki sposób zakodować niejawnie w drze wie AVL współczynniki zrównoważenia, oszczędzając dwa bity na węzeł, ale kosztem dodatkowej pracy podczas każdego odwołania do drzewa. Samuel kazał wystąpić wszystkim pokoleniom Izraela i padł los na pokolenie Beniamina. Nakazał potem by wystąpiło pokolenie Beniamina według swoich rodów, i padł los na pokolenie M atriego. I nakazał wystąpić z rodu M atriego po jednem u, a los pad ł na Saula syna Kiszą. Szukano go, lecz nie znaleziono. — Pierwsza Księga Samuela 1 0 : 2 0 - 2 1 * )
6.2.4. Drzewa wyższych stopni
Metody wyszukiwania drzewowego, o których mówiliśmy dotychczas, były rozwi jane głównie dla wyszukiwania wewnętrznego, gdy przeszukiwana tablica w ca łości mieści się w szybkiej pamięci wewnętrznej. Zajmijmy się teraz problemem wyszukiwania zewnętrznego, kiedy to chcemy wydobyć informację z bardzo du żego pliku znajdującego się w pamięci o dostępie bezpośrednim, takiej jak dyski czy bębny. (W stępne informacje o dyskach i bębnach znajdują się na początku punktu 5.4.9). Struktury drzewiaste świetnie nadają się w takich sytuacjach, jeśli tylko znajdziemy odpowiedni sposób reprezentacji drzewa. Rozważmy duże drzewo wyszukiwań binarnych pokazane na rysunku 29 i wyobraźmy sobie, że zostało ono zapamiętane w pliku dyskowym. (Dowiązania LLINK i RLINK w drzewie są teraz adresami dyskowymi, a nie adresami w pamięci wewnętrznej). Jeśli wyszukiwanie w takim drzewie przeprowadzimy w sposób naiwny, korzystając po prostu z poznanego algorytmu dla wyszukiwania w pamięci wewnętrznej, to będziemy musieli odwoływać się do dysku około lg N razy, zanim wyszukiwanie się zakończy. Oznacza to, że dla N równego milion będziemy mieli około 20 prze szukiwań dysku. Przypuśćmy jednak, że tablicę podzieliliśmy na 7-węzłowe „stro ny” , w sposób przedstawiony na rysunku 29 za pomocą linii kropkowanych. Jeśli możemy w jednej chwili dostać się do całej strony, to potrzebujem y około jednej trzeciej przeszukań dysku z poprzedniego przypadku, a co za tym idzie wyszukiwanie wykonuje się trzy razy szybciej! Takie grupowanie węzłów w strony powoduje, że drzewo w zasadzie zmie nia się z drzewa binarnego w drzewo ósemkowe, w którym w każdym węźle mamy 8-stopniowe rozgałęzienie. Jeśli strony mogą być jeszcze większe, np. *) Pismo Święte Starego i Nowego Testamentu. Biblia tysiąclecia. Wydawnictwo Pallotinum, Poznań-Warszawa 1980.
518
WYSZUKIWANIE
6.2.4
R y s. 29. Duże drzewo wyszukiwań binarnych można podzielić na „strony”.
128-stopniowe, to wówczas żądany klucz można znaleźć w tablicy z milionem elementów, zaglądając tylko na trzy strony. Stronę-korzeń możemy zawsze trzy mać w pamięci wewnętrznej, a wówczas w ystarczają tylko dwa odwołania do dysku, nawet gdy w pamięci wewnętrznej nigdy nie potrzebujem y jednocześnie więcej niż 254 kluczy. Oczywiście nie możemy uczynić stron dowolnie wielkimi, ponieważ rozmiar pamięci wewnętrznej jest ograniczony oraz dlatego, że odczytanie dużej strony zabiera dużo czasu. Dla przykładu przyjmijmy, że odczytanie strony gwarantują cej m-stopniowe rozgałęzienie zabiera 72.5 + 0.05m milisekund. Czas wewnętrz nego przetwarzania takich stron będzie wynosił około a + 5 Igra, gdzie a jest małe w porównaniu z 72.5 ms. Tak więc łączna ilość czasu potrzebnego do przeszukania dużej tablicy jest w przybliżeniu proporcjonalna do Ig N razy (72.5 + 0 .0 5 ra)/lg ra + b. To wyrażenie przyjmuje najm niejszą wartość, gdy ra ^ 307; w rzeczywistości minimum jest bardzo „szerokie” - prawie optym alną wartość dostajemy dla wszystkich ra między 200 a 500. W praktyce zakres dobrych wartości dla ra jest podobny i zależy od charakterystyk poszczególnych urządzeń pamięci zewnętrz nej i długości rekordów w tablicy. W. I. Landauer [IEEE Trans. E C -1 2 (1963), 863-871] jest autorem pomysłu budowania drzew stopnia ra, dla których żąda się, żeby przed zapoczątkowaniem poziomu l + 1 poziom l był prawie pełny. Jego propozycja wymaga dość skompli kowanych rotacji, ponieważ wstawienie pojedynczego elementu może pociągnąć za sobą dużo zmian w całym drzewie; Landauer przyjął, że wyszukiwanie zdarza się dużo częściej od wstawiania i usuwania. Dla plików pam iętanych na dysku i dla których stosunkowo rzadko jest wykonywane wstawianie i usuwanie, dobrym rozwiązaniem jest drzewo trzypozio mowe, w którym pierwszy poziom rozgałęziania służy do wyznaczania właściwego cylindra, na drugim poziomie wyznacza się właściwą ścieżkę, natom iast poziom trzeci zawiera już same rekordy. Tak zorganizowane pliki nazywa się plikami indeksowo-sekwencyjnymi [zobacz JA C M 16 (1969), 569-571]. R. M untz i R. Uzgalis [Proc. Princeton Conf. on Inf. Sciences and Sys tem s 4 (1970), 345-349] zaproponowali modyfikację algorytmu wyszukiwania
6.2.4
DRZEWA WYŻSZYCH STOPNI
519
w drzewie i wstawiania do drzewa, algorytm 6.2.2T, tak żeby wszystkie nowo wstawiane węzły znajdowały się, jeśli to tylko możliwe, na tej samej stronie co ich węzły-rodzice; jeśli strona jest pełna, to zawsze, gdy jest to tylko możliwe, rozpoczyna się budowę nowej strony. Można pokazać, że jeśli liczba stron jest nieograniczona i dane napływ ają w losowej kolejności, to średnia liczba dostępów do stron wynosi w przybliżeniu Hi v / ( Hm — 1), czyli tylko trochę więcej niż mielibyśmy w najlepszym możliwym drzewie o stopniu m. (Zobacz ćwiczenie 8). B -d rz e w a . Twórcami nowego podejścia do wyszukiwania zewnętrznego za po mocą drzew byli w 1970 roku R. Bayer i E. McCreight [Acta Informática 1 (1972), 173-189] i niezależnie, mniej więcej w tym samym czasie, M. Kaufman [nie opublikowano]. Ich pomysł to propozycja nowej, uniwersalnej stru k tu ry danych nazywanej B-drzęwem, która umożliwia przeszukiwanie i aktualizację dużego pliku, gwarantując efektywność w pesymistycznym przypadku przy zastosowaniu stosunkowo prostych algorytmów. B-drzewem rzędu m nazywamy drzewo, które spełnia następujące warunki: i) Każdy węzeł ma co najwyżej m dzieci. ii) Każdy węzeł, z wyjątkiem korzenia, m a co najmniej m / 2 dzieci. iii) Korzeń ma co najmniej 2 dzieci (chyba, że jest liściem). iv) Wszystkie liście znajdują się na tym samym poziomie i nie zawierają żadnej informacji. v) Węzeł nie będący liściem i który ma k dzieci zawiera k — 1 kluczy. (Jak zazwyczaj, przez „liść” rozumiemy węzeł końcowy, który nie m a dzieci. Ponieważ liście nie zawierają żadnej informacji, możemy je traktow ać jako węzły zewnętrzne, których tak naprawdę nie m a w drzewie. Zatem A jest wskaźnikiem na liść). Na rysunku 30 przedstawiono B-drzewo rzędu 7. Każdy węzeł (z wyjątkiem korzenia i liści) ma więcej niż [7/2] i nie więcej niż 7 dzieci, czyli zawiera 3, 4, 5 lub 6 kluczy. Korzeń może zawierać od 1 do 6 kluczy; w tym przypadku zawiera 2 klucze. W szystkie liście znajdują się na poziomie 3. Zauważmy, że (a) klucze są uporządkowane rosnąco z lewa na prawo, jeśli w naturalny sposób rozszerzymy porządek symetryczny; (b) liczba liści jest dokładnie o jeden większa od liczby kluczy. B-drzewa rzędu 1 lub 2 są oczywiście mało interesujące, tak więc będziemy rozważali tylko przypadek, gdy m > 3. Zdefiniowane pod koniec poprzedniego punktu 2-3-drzewa są równoważne B-drzewom rzędu 3. (Bayer i McCreight rozważali tylko przypadek, gdy m jest nieparzyste; niektórzy autorzy uważają, że B-drzewo rzędu m to jest to, co my nazywamy B-drzewem rzędu 2m + 1). Węzeł, który zawiera j kluczy i m a j + 1 wskaźników, można reprezentować jako
gdzie K i < K
LJKIWANIE '
T
6.2.4
011 017 023
041 ' __ 047 059 067 ' __ 073 T~ 083
031 097
f 103 ' __ 109 T 127
137 191
149 ' __ 157 ' __ 167 T 179
T
197 211 227
f~ ~ 241 ' __ 257 269 ;__ 277
\ 307 ' __ 313 331 T 347 f 367 ' __ 379 389 f
419 431 | __ 439
283 353 401
449
461 ' __ 467 T 487 f 509 ’__ 523 ' __ 547 563 571 587 | 607 ' __ 617 631 “__ 643 ' __ 653 T~~ 661 691 709 ' __ 727 ' __ 739 "__ 751 T 761 797 811 823 | 853 ' __ 859 T 877 f ' __ "__ ' __
907 919 937 947 967
R y s. 30. S-drzewo rzędu 7, w którym wszyst kie liście leżą na poziomie 3. Każdy węzeł zawie ra 3, 4, 5 lub 6 kluczy. Przez A oznaczono liść, który poprzedza klucz 449; zobacz (8).
6.2.4
DRZEWA WYŻSZYCH STOPNI
521
a Ki+ 1 . Wyszukiwanie w £?-drzewie nie jest zbyt skomplikowane: Po ściągnię ciu węzła (i) do pamięci wewnętrznej poszukujemy danego argum entu wśród kluczy K u K 2 , . . . , K j . (Dla dużych j prawdopodobnie będzie to wyszukiwanie binarne; jeśli jednak j jest niewielkie, najlepsze jest wyszukiwanie liniowe). Jeśli wyszukiwanie kończy się sukcesem, to poszukiwany klucz został odnaleziony; jeśli jednak wyszukiwanie kończy się niepowodzeniem, ponieważ argum ent leży między K i a Ki+ 1 , ściągamy węzeł wskazywany przez P* i powtarzam y cały proces. Jeśli argument jest mniejszy od to posługujemy się wskaźnikiem Po, jeśli natom iast argument jest większy od K j , to bierzemy wskaźnik P^. Jeśli ?i A, to całe wyszukiwanie kończy się niepowodzeniem. Miłe jest również w £?-drzewach to, że wstawianie jest także dość proste. Rozważmy dla przykładu rysunek 30; każdy liść reprezentuje miejsce, gdzie nowe wstawienie może się wydarzyć. Jeśli chcemy wstawić nowy klucz 337, to po prostu zamieniamy stosowny węzeł z =
N C O H M -
O ICO^ CO CO CO co
O r-t co CO ^ co co co co co
na
( 2)
□□□□□ m oooa Jednakże, jeśli chcemy wstawić nowy klucz 071, to okazuje się, że nie ma miejsca, ponieważ właściwy węzeł z poziomu 2 jest już „pełny” . W tym przypadku możemy podzielić pełny węzeł na dwie części, z trzem a kluczami w każdej z nich, i przenieść środkowy klucz o poziom wyżej: . . .
tCO a o o
. . •
1-1^ io co r- COt- COoo t - O t - t- h
o o o o o o o
zmienia się w
(3)
□□□□□□□□ W ogólności, jeśli chcemy do jB-drzewa rzędu m wstawić nowy element, a wszystkie liście są na poziomie /, to wstawiamy nowy klucz do odpowiedniego węzła na poziomie l — 1 . Jeśli taki węzeł zawiera teraz m kluczy, czyli m a postać ( 1 ) z j = m, dzielimy go na dwa węzły p' a . * (P 0 , 1^1, P 1 j • ■ • 5K \ m j 2] —l)P[m/ 2~j—1 )
>—
t
^
---------
( P \mj 2") i ^ [m/2]+l7P[m/2'|-j-l; ■ **>
i Pm j
(4)
9 ----------- — —
i wstawiamy klucz Xpm/ 2] do rodzica oryginalnego węzła. (W ten sposób wskaź nik P z węzła-rodzica zostaje zastąpiony ciągiem P , K ^ m f 2] , P ' ) - To wstawienie może spowodować, że węzeł-rodzic będzie zawierał m kluczy, a jeśli tak, należy podzielić go w taki sam sposób. (Na rysunku 27 z poprzedniego punktu zilustro wano przypadek m = 3). Jeśli istnieje potrzeba podziału węzła-korzenia, który to nie ma rodzica, po prostu tworzymy nowy korzeń z jednym kluczem K ^m/ 2]; w takim przypadku wysokość drzewa zwiększa się o jeden. Taka procedura wstawiania bez problemu zachowuje wszystkie własności 5-drzewa; żeby Czytelnik mógł docenić całe piękno tego pomysłu, zachęcamy go
522
6.2.4
WYSZUKIWANIE
do przerobienia ćwiczenia 1. W tym przypadku drzewo naprawdę rośnie u góry, a nie u dołu, ponieważ zmiana wysokości następuje tylko wtedy, kiedy podzielony zostaje korzeń. Usuwanie z B -drzew jest tylko nieznacznie bardziej skomplikowane od wsta wiania. (Zobacz ćwiczenie 6 ). G órn e o g ra n iczen ia na czas d ziałan ia. Zastanówmy się teraz, do ilu węzłów musimy się odwołać w pesymistycznym przypadku, gdy przeszukujemy R-drzewo rzędu m. Załóżmy, że mamy N kluczy i że -b 1 liści znajduje się na poziomie 1. W tedy na poziomach 1 , 2 , 3 , . . . znajduje się co najmniej 2, 2 |~m/2], 2 [~m/2~|2, ... węzłów; zatem N + l > 2 \ m / 2 \ l- \ (5) Innymi słowy, l < 1 + log [771/ 2] ( — g— ) ; to oznacza dla przykładu, że jeśli N = 1999 998 i m = 199, to l wynosi co najwyżej 3. Ponieważ liczba węzłów, do których się musimy odwołać, wynosi co najwyżej Z, powyższy wzór gwarantuje rzeczywiście mały czas działania. Podczas wstawiania nowego klucza możemy zostać zmuszeni do podziału aż l węzłów. Jednakże średnia liczba węzłów, które trzeba podzielić, jest dużo mniejsza, ponieważ ogólna liczba podziałów wykonywanych podczas budowy drzewa jest dokładnie liczbą węzłów wewnętrznych w drzewie minus l. Jeśli mamy p węzłów wewnętrznych, to w drzewie jest co najmniej 1 + (|~m/2] — l )(p — 1 ) kluczy; zatem W -l P + \m /2 \ - 1 ' W ynika stąd, że średnia liczba podziałów węzła podczas budowy drzewa z N kluczami wynosi mniej niż l /(|~ra/ 2] — l) podział na wstawienie. U le p sz e n ia i odm iany. Istnieje kilka sposobów ulepszenia podstawowej struk tu ry R-drzewa, jeśli osłabimy trochę ograniczenia. Zauważmy najpierw, że wszystkie wskaźniki w węzłach z poziomu l — 1 są równe A, a wszystkie pozostałe wskaźniki są różne od A. W ten sposób często m arnuje się wiele miejsca w pamięci. Możemy zaoszczędzić na czasie i pamięci, eliminując wszystkie A i biorąc inną wartość m dla wszystkich „dolnych” węzłów. Różne wartości m nie są przeszkodą w algorytmie wstawiania, ponieważ obie połówki podzielonego węzła pozostają na tym samym poziomie co węzeł orygi nalny. W rzeczywistości moglibyśmy zdefiniować uogólnione R-drzewo o rzędach m i, m 2, m 3 , ..., żądając, żeby wszystkie węzły różne od korzenia na poziomie l — k m iały co najm niej m ^ j 2 i co najwyżej dzieci; w takim R-drzewie na każdym poziomie mamy inne m, a mimo to algorytm wstawiania w zasadzie nie wymaga żadnych zmian. Rozwijając pomysł z poprzedniego akapitu, moglibyśmy stosować zupełnie różne form aty węzłów na każdym poziomie drzewa, jak również przechowywać informacje w liściach. Czasami klucze stanowią tylko niewielki fragment rekordów pliku. W takich przypadkach jest błędem pam iętanie całych rekordów w węzłach
6.2.4
DRZEWA WYŻSZYCH STOPNI
523
wewnętrznych położonych blisko korzenia, ponieważ wówczas m byłoby zbyt małe, żeby gwarantować efektywne rozgałęzianie. Rozważmy raz jeszcze rysunek 30 i wyobraźmy sobie, że wszystkie rekordy z pliku znajdują się teraz w liściach, a tylko niewiele kluczy zostało powielo nych w węzłach wewnętrznych. Przy tej interpretacji skrajnie lewy liść zawiera wszystkie rekordy, których klucze są < 011; liść oznaczony A zawiera wszystkie rekordy, których klucze spełniają nierówności 439 < K < 449;
( 8)
i tak dalej. Przy takiej interpretacji węzły-liście rozrastają się i dzielą tak jak pozostałe węzły, z tą różnicą, że rekord nigdy nie wędruje z liścia na wyższy poziom. W ten sposób liście są zawsze w połowie zapełnione. Za każdym razem, gdy liść zostaje podzielony, nowy klucz zostaje wprowadzony do części drzewa powyżej liści. Jeśli każdy liść dowiążemy do jego następnika w porządku syme trycznym, to uzyskamy możliwość efektywnego i wygodnego przeglądania pliku zarówno sekwencyjnie, jak i swobodnie. Ten wariant R-drzew jest znany pod nazwą B +~drzew. Z obliczeń dokonanych przez S. P. Ghosha i M. E. Senko [JACM 16 (1969), 569-579] wynika, że niezłym pomysłem może być, żeby liście były naprawdę duże, powiedzmy o długości 10 kolejnych stron. Interpolując liniowo w znanym zakresie kluczy dla każdego liścia, możemy zgadnąć, na której z 10 stron znajduje się prawdopodobnie dany argum ent wyszukiwania. Jeśli zgadliśmy źle, tracim y czas, ale eksperymenty wskazują, że taka stra ta może być mniejsza niż czas, jaki oszczędzamy, zmniejszając rozmiar drzewa. T. H. M artin [nie opublikowno] zauważył, że pomysł będący podstaw ą B -drzew można zastosować także do kluczy o zm iennych długościach. Nie musimy ustalać ograniczeń [ra/ 2 . . m] na liczbę dzieci każdego węzła; zam iast tego mo żemy po prostu powiedzieć, że każdy węzeł powinien być w połowie zapełniony danymi. Mechanizmy wstawiania i podziału nadal funkcjonują, nawet jeśli do kładna liczba kluczy w węźle zależy od tego, czy klucze są długie, czy krótkie. Jednakże nie można zezwolić na to, żeby klucze były ekstrem alnie długie, bo wówczas nie unikniemy kłopotów. (Zobacz ćwiczenie 5). Inną ważną modyfikację B -drzew zaproponowali Bayer i McCreight. Ich po mysł polega na usprawnieniu wstawiania przez „rzadsze wykonywanie podziałów węzłów; zamiast tego wykonuje się lokalne rotacje. Załóżmy, że pewien węzeł jest przepełniony, ponieważ zawiera m kluczy i m + 1 wskaźników; zam iast go dzielić, możemy najpierw przyjrzeć się jego bliźniakowi z prawej strony, który ma powiedzmy j kluczy i j + 1 wskaźników. W węźle-rodzicu znajduje się klucz K f) który rozdziela klucze tych dwóch bliźniaków; na schemacie wygląda to tak
524
WYSZUKIWANIE
6.2.4
Jeśli j < m — 1, to dzielenia możemy uniknąć, przemieszczając po prostu klucze: W węźle z lewej strony pozostawiamy [ ( m+j i)/ 2j kluczy, w węźle-rodzicu zamie niamy K f przez K ^ m+ j y 2j+i> a pozostałe \{m + j ) / 2 ] klucze (włączając w to K f ) i odpowiadające im wskaźniki umieszczamy w węźle z prawej strony. Tak więc zawartość pełnego węzła „przepływa” do jego bliźniaka. Z drugiej strony, jeśli bliźniak też jest już pełny (j = m — 1 ), możemy podzielić oba te węzły, tworząc trzy węzły, każdy zapełniony w około dwóch trzecich i zawierające odpowiednio |_(2m —2)/3_|, |_(2ra—l ) / 3 j i |_2m/3j kluczy: ^L(2m+l)/3j
[(m—1)/3J \ V
iK i Por
Pi
K2
-'■Kr
Kf
(io)
Ki
V
Jeśli wyjściowy węzeł nie m a bliźniaka z prawej strony, to możemy postąpić prawie tak samo z jego lewym bliźniakiem. (Jeśli wyjściowy węzeł ma obu bliź niaków, lewego i prawego, to możemy nawet wstrzymywać podział, aż obaj bliź niacy się zapełnią). Na koniec, jeśli węzeł, który ma zostać podzielony, nie ma w ogóle bliźniaków, to musi być korzeniem; możemy zmienić definicję B -drzewa dopuszczając, żeby korzeń zawierał do 2 [(2m —2)/3j kluczy. Wówczas w wyniku podziału korzenia dostajem y dwa węzły zawierające po [(2m —2)/3j kluczy. W wyniku zastosowania wszystkich usprawnień z poprzedniego akapitu do stajem y ulepszone drzewa, nazwijmy je jB*-drzewami rzędu m, które można zdefiniować następująco: i) Każdy węzeł z wyjątkiem korzenia ma co najwyżej m dzieci. ii) Każdy węzeł z wyjątkiem korzenia i liści m a co najmniej (2m —l ) / 3 dzieci. iii) Korzeń ma co najm niej 2 i co najwyżej 2 [(2m —2)/3j -f 1 dzieci. iv) W szystkie liście znajdują się na tym samym poziomie. v) Węzeł różny od liścia i m ający k dzieci zawiera k — 1 kluczy. W ażną zmianą jest warunek (ii), który gwarantuje wykorzystanie co najmniej w dwóch trzecich dostępnego w każdym węźle miejsca. Ta zmiana nie tylko zapewnia lepsze wykorzystanie pamięci, ale czyni też szybszym proces wyszuki wania, ponieważ w ( 6 ) i ( 7 ) możemy [m / 2] zastąpić przez ["(2m —1)/3~|. Jednak proces wstawiania staje się wolniejszy, ponieważ zapełniające się węzły wymagają większej uwagi; w pracy B. Zhanga i M. Hsu, A cta Informática 26 (1989), 421 -4 3 8 , znajdziemy przybliżoną analizę zależności między czasami wyszukiwania i wstawiania a rozm iarami węzłów. Jednakże czasami jest lepiej pozwolić na to, żeby w drzewach, które ulegają częstym zmianom, w szczególności gdy wstawień jest dużo więcej niż usunięć, węzły były zapełnione mniej niż w połowie. Taką sytuację analizowali T. Johnson i D. Shasha, J. Comput. Syst. ScL 47 (1993), 4 5 -7 6 .
6.2.4
DRZEWA WYŻSZYCH STOPNI
525
Być może Czytelnik nadal nie jest przekonany do £?-drzew, ponieważ stopień korzenia może spaść nawet do 2. Dlaczego musimy marnować całe jedno odwoła nie do dysku, żeby tylko mieć 2 możliwości dalszego postępowania?! R adą na to jest prosty schemat buforowania, znany pod nazwą najdawniej używana strona do wymiany; część pamięci wewnętrznej przeznaczamy na bufory, co pozwala unikać odwołań do dysku, gdy poszukiwana strona jest już w pamięci. Przy takiej organizacji w algorytmach wyszukiwania lub wstawiania pojaw iają się polecenia „wirtualnego odczytu” , które są tłum aczone na rzeczywiste instrukcje czytania z dysku, gdy potrzebnej strony nie ma w pamięci. Gdy odczytujem y bufor i być może jego zawartość ulega modyfikacji, wydawane jest polecenie jego „zwolnienia” . Gdy konieczny jest rzeczywisty odczyt z dysku, wówczas wybierany jest bufor, dla którego polecenie „zwolnienia” zostało najdawniej wydane. Zawartość takiego bufora jest zapisywana na dysk, jeśli zmieniła się od ostatniego odczytu, a następnie żądana strona zostaje do niego wczytana. Ponieważ liczba poziomów w drzewie jest zazwyczaj m ała w porównaniu z liczbą buforów, taki schemat buforowania zapewnia, że strona-kor zeń jest za wsze w pamięci, a jeśli korzeń ma tylko 2 lub 3 dzieci, strony z pierwszego poziomu znajdują się też tam prawie na pewno. Strony, które muszą zostać podzielone podczas wstawiania, są autom atycznie obecne w pamięci, ponieważ pozostały tam po wykonaniu wcześniejszego wyszukiwania. Eksperymenty przeprowadzone przez E. McCreight pokazały, że taki sposób postępowania przynosi efekty. Dla przykładu, z jego doświadczeń wynikło, że przy 10 buforach i m = 1 2 1 , wstawienie 100000 kluczy w porządku rosnącym wymaga tylko 22 rzeczywistych odczytów z dysku i tylko 857 rzeczywistych za pisów na dysk; tak więc większość działań miało miejsce w pamięci wewnętrznej. Ponadto, drzewo zawierało tylko 835 węzłów, tylko o jeden więcej niż m inim alna możliwa wartość |"l00000/(m — 1)] = 834; tak więc wykorzystanie pamięci było prawie stuprocentowe. W przeprowadzonym eksperymencie zastosowano m etodę przepływu kluczy, ale węzły były dzielone tylko na 2 mniejsze jak w (4 ), a nie na 3 jak w ( 10). (Zobacz ćwiczenie 3). W innym z eksperymentów przeprowadzonym przez M cCreighta, tak sa mo z 10 buforami, m = 121 i z zastosowaniem m etody przepływu kluczy, do początkowo pustego drzewa wstawiono w losowym porządku 5000 kluczy. W wy niku, po wykonaniu 2762 rzeczywistych odczytów i 2793 rzeczywistych zapi sów, otrzym ano 2-poziomowe drzewo o 48 węzłach (87-procentowe wykorzystanie pamięci). Wykonanie 1000 losowych wyszukiwań wymagało 786 rzeczywistych odczytów. Taki sam ekperyment, ale bez zastosowania m etody przepływu kluczy, dał 2-poziomowe drzewo o 61 węzłach (67-procentowe wykorzystanie pamięci). Do jego budowy potrzebnych było 2743 rzeczywistych odczytów i 2800 rzeczywis tych zapisów. Wykonanie następnie 1000 losowych wyszukiwań wymagało 836 rzeczywistych odczytów. Te doświadczenia pokazują, że nie tylko odpowiedni schemat stronicowania przynosi efekty, ale także m ądrą rzeczą jest stosowanie lokalnego przepływu kluczy, zanim zdecydujemy się na podział węzła. Andrew Yao udowodnił, że średnia liczba węzłów w drzewie powstałym w wyniku wykonania losowych wstawień, bez stosowania m etody przepływu
526
6.2.4
WYSZUKIWANIE
kluczy, wynosi dla dużych N i m 7V/(mln2) +
0
( N / m 2);
tak więc wykorzystanie pamięci wynosi w przybliżeniu ln 2 — 69.3 procent [Acta Informática 9 (1978), 159-170]. Bardziej szczegółowe analizy można znaleźć w pracach B. E isenbartha, N. Zivianiego, G. H. Gonneta, K. Mehlhorna i D. Wooda, Information and Control 55 (1982), 125-174 oraz R. A. Baeza-Yatesa, Acta Informática 26 (1989), 439-471. B-drzewa stały się popularne wkrótce po ich odkryciu. Zobacz dla przykła du artykuł Douglasa Gomera w C om puting Surveys 1 1 (1979), 121-138, 412, w którym autor omawia wczesne prace nad rozwojem B-drzew i opisuje szeroko stosowany IBM-owski system o nazwie VSAM (Virtual Storage Access M ethod - m etoda dostępu do pamięci w irtualnej). Jedną z innowacji wprowadzonych w systemie VSAM była replikacja bloków na ścieżce dyskowej, która umożliwiała minimalizowanie czasu oczekiwania. Dwie najbardziej interesujące odmiany podstawowego B-drzewa m ają nie szczęśliwie prawie identyczne nazwy: „SB-drzewa” i „SB-drzewa” . SB-drzewa P. E. 0 ’Neila [Acta I n f 29 (1992), 241-265] zostały zaprojektowane w celu minimalizacji czasu wejścia/wyjścia za pomocą alokacji pobliskich rekordów na tej samej ścieżce lub cylindrze. Umożliwia to utrzym anie efektywności zastoso wań, w których potrzebujem y jednocześnie dostępu do wielu kolejnych rekor dów. W tym przypadku „S B ” piszemy kursywą, a S oznacza „sekwencyjny” . SB-drzewa R Ferragina’ego i R. Grossiego [STOC 27 (1995), 693-702; SODA 7 (1996), 373-382] są ładnym połączeniem struktury B-drzewa z drzewami o nazwie Patricia, o których będzie mowa w podrozdziale 6.3; w tym przypadku „SB” piszemy normalnie, a S oznacza „słowo” . SB-drzewa m ają wiele zastosowań w przetwarzaniu tekstów na dużą skalę i są podstawą efektywnego dyskowego sor towania słów o zmiennych długościach [zobacz Arge, Ferragina, Grossi i Vitter, S T O C 29 (1997), 540-548]. ĆW IC ZEN IA
1. [10] Jakie B-drzewo rzędu 7 otrzymamy po wstawieniu klucza 613 do drzewa z rysunku 30? (Nie stosuj metody przepływu kluczy). 2. [15] Odpowiedz na to samo pytanie co w ćwiczeniu 1 , ale zastosuj metodę prze pływu kluczy i podziału na 3 węzły z (io). ► 3. [23] Załóżmy, że do początkowo pustego B-drzewa rzędu 101 wstawiamy kolejno klucze 1, 2, 3, . . . . Po wstawieniu którego klucza liście po raz pierwszy znajdą się na poziomie 4: a) gdy nie stosujemy przepływu kluczy? b) gdy stosujemy przepływ i tylko podział na 2-węzły z ( 4 )? c) gdy używamy B *-drzewa rzędu 101 i stosujemy przepływ oraz podział na 3 węzły z ( 10 )?
4. [21] (Bayer i McCreight) Wyjaśnij, w jaki sposób wykonywać wstawianie do ugólnionego B-drzewa tak, żeby wszystkie węzły, poza korzeniem i liśćmi, miały zawsze co najmniej |m — ^ dzieci.
6.2.4
DRZEWA WYŻSZYCH STOPNI
527
► 5. [21] Załóżmy, że rozmiar węzła odpowiada 1000 znakom. Załóżmy też, że na każdy wskaźnik przeznaczamy 5 znaków i że długości kluczy wahają się od 5 do 50 znaków, ale są zawsze wielokrotnościami 5 znaków. Jaka jest minimalna liczba zajętych pozycji (jedna pozycja, jeden znak) w węźle po podzieleniu go podczas wstawiania? (Rozważamy tylko prostą procedurę podziału bez przepływu kluczy, analogiczną do tej z głównego tekstu dla B-drzew z kluczami o stałej długości; w górę należy przesuwać klucz, który dzieli węzeł na mniej więcej dwie równe części). 6. [23] Zaproponuj algorytm usuwania dla B-drzew. 7. [28] Zaprojektuj algorytm łączenia B-drzew (zobacz punkt 6.2.3).
► 8 . [HM37] Rozważmy uogólnienie wstawiania do drzewa zaproponowane przez Muntza i Uzgalisa dla przypadku, gdy każda strona może pomieścić 'M kluczy. Załóżmy, że wstawiliśmy N losowych elementów. Tak więc w drzewie jest N + 1 węzłów zewnętrz nych. Niech b$k będzie prawdopodobieństwem, że wyszukiwanie zakończone porażką wymaga dostępu do k stron i kończy się w węźle zewnętrznym, którego węzeł-rodzic zawiera j kluczy. Jeśli B ApW — S t $ kZk jest funkcją tworzącą tego prawdopodobień stwa, to udowodnij, że = Sjiz i
B " ){z) = b
B " ~ l(z) + iv T T B » : i )(z)
dla 1 < j < M;
( n (*) = '^ 7 1
B » ){z) = 7 T T
« + 7 F T I B^
1){z]'
Wyznacz asymptotyczną wartość C N f — J 2 j L i ^ N ^ W średniej liczby dostępów do stron podczas wyszukiwania zakończonego porażką. [Wskazówka: Wyraź te równania rekurencyjne za pomocą macierzy
/ - -3 3
0
0
-4 4
0 V 0
0 0
.,
..
—M —1 .. Af+1
... . .,
0 0 0
2z \ 0 0 0 - 2/
i znajdź związek C fN z wielomianem iV-tego stopnia od W (l)]. 9. [22] Czy można pomysł z B-drzewami wykorzystać do wyszukiwania elementów list liniowych po pozycjach, a nie po kluczach? (Zobacz algorytm 6.2.3B). ►10. [55] Zastanów się, jak duży plik zorganizowany w B-drzewo może być używany współbieżnie przez dużą liczbę pracujących jednocześnie użytkowników w taki sposób, żeby użytkownicy różnych stron rzadko sobie przeszkadzali.
Niewiele wiemy; nawet w przypadku innych równoważnych algorytmów, o optymalizowaniu alokacji pamięci, minimalizowaniu liczby wymaganych operacji i tak dalej. Dalszy postęp badań w tej dziedzinie wymaga sięgnięcia po najsilniejsze zasoby czystej i stosowanej matematyki. —
A N T H O N Y G. O E T T IN G E R (1961)
528
WYSZUKIWANIE
6.3
6.3. W YS ZU K IW A N IE CYFROWE
Zamiast wyszukiwać przez porównywanie kluczy możemy wykorzystać ich cy frową lub znakową reprezentację. Rozważmy dla przykładu indeks alfabetyczny z wcięciami na brzegu dużego słownika. Za pomocą tego indeksu możemy na tychm iast zlokalizować wszystkie strony zawierające słowa rozpoczynające się od danej litery. Jeśli rozwiniemy powyższy pomysł w jednym z rozsądnych kierunków, doj dziemy do algorytmu wyszukiwania wykorzystującego iterowane „indeksowanie” i pokazanego w tabeli 1. Załóżmy, że chcemy sprawdzić, czy dany argument (słowo) jest wśród 31 najpopularniejszych słów w języku angielskim (zobacz rysunki 12 i 13 z punktu 6.2.2). Dane w tabeli 1 są zorganizowane w drzewo o nazwie trie; ta nazwa została zaproponowana przez E. Fredkina [CACM 3 (1960), 490-500], ponieważ jest to część angielskiej frazy „information retrieval” (wyszukiwanie informacji). Drzewo trie jest w istocie drzewem stopnia M , któ rego węzłami są M-ełementowe wektory. Składowe wektora odpowiadają cyfrom lub literom. Każdy węzeł na poziomie l reprezentuje zbiór wszystkich kluczy zaczynających się od pewnego ciągu l znaków, nazywanego ich prefiksem; z węzła można wyjść na jeden z M sposobów, zależnie od (l + l)-szego znaku. Dla przykładu drzewo trie z tabeli 1 m a 12 węzłów; węzeł ( 1 ) jest korzeniem i tu ta j jest oglądany pierwszy znak. Jeśli pierwszą literą jest powiedzmy N, tabela mówi nam, że naszym słowem musi być NOT (w przeciwnym razie nie ma go w tabeli). Z drugiej strony, jeśli pierwszą literą jest W, węzeł (1 ) mówi nam, że należy przejść do węzła (9) i popatrzeć w ten sam sposób na drugi znak; węzeł (9) mówi, że drugą literą powinno być A, H lub I. Prefiksem węzła (10) jest HA. Puste miejsca w tabeli odpow iadają pustym dowiązaniom. Kolejność składowych wektorów-węzłów jest zgodna z tablicą kodów zna ków maszyny MIX. Oznacza to, że wyszukiwanie w drzewie trie jest naprawdę szybkie, ponieważ odnajdowanie słów odbywa się przez wykorzystanie znaków z naszych kluczy jako indeksów. Metody, w których decyzje podejmowane są za pomocą indeksów, zostały nazwane „zaglądaniem do tablicy” (table look-at) w przciwieństwie do „przeglądania/przeszukiwania tablicy” (table look-up) [zo bacz P. M. Sherman, C A C M 4 (1961), 172-173, 175]. A lg o r y tm T ( Wyszukiwanie w drzewie trie). Dana jest tablica rekordów, które tworzą drzewo trie o stopniu M , oraz argument wyszukiwania K. Węzłami w drzewie trie są wektory indeksowane od 0 do M — 1; każda składowa takiego wektora jest albo kluczem, albo dowiązaniem (być może pustym). T l . [Inicjowanie] Przypisz do zmiennej P wskaźnik na korzeń drzewa trie. T 2 . [Wybór gałęzi] Niech k będzie następnym znakiem z argum entu wejściowe go RT, w kolejności z lewa na prawo. (Jeśli argument został już w całości obejrzany, zmiennej k przypisujemy znak „pusty” lub znak końca słowa. Znak powinien być reprezentowany jako liczba z zakresu 0 < fc < M ). Niech X będzie składową węzła N0DE(P) o indeksie k. Jeśli X jest dowiązaniem, przechodzimy do T3; jeśli jednak X jest kluczem, przechodzimy do T4.
WYSZUKIWANIE CYFROWE
6.3
529
Tabela 1 DRZEWO TRIE DLA 31 NAJPOPULARNIEJSZYCH SŁÓW W JĘZYKU ANGIELSKIM
(1) A B C D E F G H I A J
(2)
(3)
(4)
(5)
A
u
(6)
(7)
(8)
(9)
(10)
I
(11)
(12)
HE THAT
WAS
(10) (3)
HAD BE
THE
(U )
OF
(4)
(12)
(s) W
HIS
WHICH WITH
THIS
K
L M N NOT 0 (7)
P q R
z
n s T (3) u V w (9) X Y YOU Z
AND
IN
ON
FOR ARE
TO
FROM
AS AT
OR
HER
IS IT BUT HAVE BY
T 3 . [Do przodu] Jeśli X ^ A, wykonaj P X i wróć do kroku T2; w przeciwnym razie wykonanie algorytmu kończy się niepowodzeniem. T 4 . [Porównywanie] Jeśli X = K, algorytm kończy się sukcesem; w przeciwnym razie kończy się niepowodzeniem. | Zauważmy, że jeśli wyszukiwanie kończy się niepowodzeniem, to wówczas zostaje odnalezione jego najdłuższe dopasowanie. Ta własność przydaje się w róż nego rodzaju zastosowaniach. Żeby móc porównać szybkość naszego algorytmu z innymi algorytmam i z tego rozdziału, napiszemy krótki program na maszynę MIX, przyjmując, że znaki są jednobajtowe, a klucze zawierają co najwyżej 5 znaków. P r o g r a m T (Wyszukiwanie w drzewie trie). W tym programie zakładamy, że wszystkie klucze są reprezentowane w jednym słowie maszyny MIX, uzupełnionym znakami odstępu, jeśli klucz składa się z mniej niż pięciu znaków. Ponieważ posługujemy się kodami znaków maszyny MIX, zatem o każdym bajcie argum entu wyszukiwania zakłada się, że zawiera liczbę mniejszą od 30. Dowiązania są
530
WYSZUKIWANIE
6.3
R y s. 31. Drzewo trie z tabeli 1, przekształcone w „las”.
reprezentowane jako liczby ujemne w polu 0:2 słowa odpowiadającego węzłowi, r l l = P, rX = nie obejrzana część K. LDX K ENT1 ROOT SLAX 1 STA * + 1 (2 :2 ) ENT2 0 ,1 L D 1N 0,2 ( 0 : 2 ) J1P 2B LDA 0 ,2 CMPAK JE SUCCESS FAILURE EQU *
01 START 02 03 2H 04 05 06 07 08 09
10 11
1 T l . Inicjowanie. 1 P <— wskaźnik na korzeń drzewa trie. C T2 . Wybierz gałaź. C Weź następny znak k. c Q ^ P + k. C P = LINK(Q). c T3. Do przodu. Do T2, jeśli P jest dowiązaniem + A KEY(Q). 1 T4. Porównaj. rA 1 1 Zakończenie z sukcesem, jeśli rA = K. Zakończenie, gdy klucza nie ma w drzewie trie. |
Czas działania tego program u wynosi 8(7 + 8 jednostek, gdzie C jest liczbą obejrzanych znaków. Ponieważ C < 5, wyszukiwanie nigdy nie będzie trwało dłużej niż 48 jednostek czasu. Jeśli teraz porównamy efektywność tego programu (wykorzystującego drze wo trie z tabeli 1 ) z program em 6 .2 .2T (korzystającym z optymalnego drzewa wy szukiwań binarnych z rysunku 13), to możemy poczynić następujące obserwacje. 1. Drzewo trie wymaga dużo więcej pamięci; do reprezentacji 31 kluczy używamy 360 słów, podczas gdy drzewo wyszukiwań binarnych używa tylko 62 słów pamięci. (Jednakże w ćwiczeniu 4 pokazujemy, że przy pewnym wysiłku możemy tak naprawdę zmieścić drzewo trie z tabeli 1 w 49 słowach). 2 . W obu program ach wyszukiwanie zakończone sukcesem zabiera około 26 jednostek czasu. Jednak wyszukiwanie kończące się niepowodzeniem jest szybsze w drzewie trie. Dla tego zestawu danych wyszukiwanie kończące się niepowo dzeniem jest częstsze od wyszukiwania kończącego się sukcesem, tak więc pod względem szybkości, drzewo trie jest lepsze. 3. Jeśli zam iast 31 najbardziej popularnych słów z języka angielskiego roz ważymy przykład z indeksem KW IC z rysunku 15, przekonamy się, że drzewo trie traci swoją przewagę, co wynika z natury danych. Dla przykładu, drzewo trie wymaga 12 iteracji do rozróżnienia słów C0MPUTATI0N i C0MPUTATI0NS. W tym przypadku lepiej byłoby zbudować drzewo trie, w którym słowa są przeglądane od strony prawej.
6.3
WYSZUKIWANIE CYFROWE
2! O O H H H 2J O 35 H O S Œ SC O > a co w > H tn W o H tu
531
H oCi
h
a
Abstrakcyjne pojęcie drzewa trie, jako reprezentacji rodziny słów, wpro wadził Axel Thue w pracy o słowach, które nie zawierają dwóch sąsiednich, powtarzających się podsłów [Skrifter udgivne af Videnskabs-Selskabet i Chri stiania , M athematisk-Naturvidenskabelig Klasse (1912), No. 1; przedrukowano w pracach zebranych Thuego Selected M athematical Papers (Oslo: Universitetsforlaget, 1977), 413-477]. Sposób organizacji danych w drzewo trie, wygodny dla komputerowego wy szukiwania, został po raz pierwszy zarekomendowany przez René de ła Briandais’go [Proc. Western Joint Computer Conf. 15 (1959), 295-298]. Zauważył on, że możemy oszczędzić pamięć kosztem czasu działania, jeśli wektory w węzłach będziemy reprezentowali za pomocą list liniowych. Jest tak, ponieważ większość składowych wektorów jest zazwyczaj pusta. W wyniku zastosowania tego pomy słu drzewo trie z tabeli 1 zamienia się w las pokazany na rysunku 31. W yszu kiwanie w takim lesie rozpoczyna się od wyznaczenia korzenia odpowiadającego pierwszej literze. Następnie znajdujem y dziecko tego korzenia, które zgadza się z drugą literą itd. W opisanej przez siebie reprezentacji de la Briandais w rzeczywistości nie kończył budowy drzewa w sposób pokazany w tabeli 1 lub na rysunku 31; zamiast tego każdy klucz był reprezentowany, znak po znaku, aż do osiągnięcia znaku końca słowa. Tak więc w jego reprezentacji, w miejsce drzewa o korzeniu „H” z rysunku 31, pojawiłoby się drzewo
(i)
Taka reprezentacja wymaga więcej pamięci, ale czyni przetwarzanie danych o zmiennej długości wyjątkowo prostym zabiegiem. Jeśli na każdy znak prze znaczymy dwa pola na dowiązania, dynamiczne wstawianie i usuwanie można wykonywać niezmiernie łatwo.
532
WYSZUKIWANIE
6.3
Jeśli zastosujemy zwykły sposób reprezentacji drzew przez drzewa binarne, to wówczas drzewo z (i) zamienia się na drzewo binarne
(W reprezentacji pełnego lasu, rysunek 31, mielibyśmy także wskaźnik prowadzą cy od H do korzenia I z prawej strony). Wyszukiwanie w takim drzewie polega na porównywaniu znaku z argum entu wyszukiwania z kolejnymi znakami na ścieżce zbudowanej za pomocą dowiązań RLINK, aż do znalezienia pasującego znaku; wówczas przechodzimy po dowiązaniu LLINK i postępujemy tak samo z kolejnym znakiem z argum entu. M ając takie drzewo binarne, w zasadzie wykonujemy wyszukiwanie przez porównywanie, dokonując wyboru na podstawie wyniku równe-nierówne zamiast mniejsze-większe. Elem entarne wyniki z punktu 6 . 2.1 mówią nam, że wyróżnienie jednego klucza wśród N kluczy wymaga średnio co najmniej lgiV porównań; średnia liczba porównań w wyszukiwaniu w drzewie takim jak to z rysunku 31 musi wynosić co najmniej tyle, ile porównań jest wykonywanych za pomocą m etod wyszukiwania binarnego z podrozdziału 6 .2. Z drugiej strony, w każdym węźle drzewa trie z tabeli 1 możemy od ra zu dokonać wyboru jednej z M możliwości; przekonamy się, że dla dużych N wyszukiwanie dla losowych danych wejściowych wymaga średnio l°gM Af — \g N / lg M iteracji. Zobaczymy także, że „czyste” drzewo trie, takie jak to z algorytmu T, potrzebuje do rozróżnienia N losowych kluczy w przybliżeniu N / \ n M węzłów; zatem całkowity rozm iar potrzebnej pamięci jest proporcjonalny do M N / l n M . Na podstawie tych rozważań jest jasne, że drzewa trie sprawdzają się tylko na pierwszych kilku poziomach. Lepszą wydajność otrzym am y przez połączenie dwóch strategii, stosując drzewo trie dla pierwszych kilku znaków, a następnie wykorzystując jakąś inną metodę. Dla przykładu, E. H. Sussenguth, Jr. [CACM 6 (1963), 272-279] proponuje przeglądanie słów znak po znaku, aż dojdziemy do poddrzewa zawierającego tylko, powiedzmy, sześć lub mniej kluczy. Wówczas możemy te klucze przejrzeć sekwencyjnie. Zobaczymy, że ta mieszana strate gia pozwala zredukować liczbę węzłów w drzewie trie blisko sześciokrotnie, bez istotnej zmiany czasu działania. T. N. Turba [CACM 25 (1982), 522-526] zauważa, że czasami najwygodniej zorganizować wyszukiwanie kluczy o zmiennej długości w taki sposób, żeby dla każdej długości mieć jedno drzewo wyszukiwań lub drzewo trie.
6.3
WYSZUKIWANIE CYFROWE
533
P r z y p a d e k b in a rn y . Rozważmy teraz szczególny przypadek M = 2, w którym argument wyszukiwania jest przeglądany bit po bicie. Istnieją dwie interesujące metody, które wyjątkowo dobrze nadają się w takim przypadku. Pierwsza m etoda, którą nazwiemy wyszukiwaniem cyfrowym w drzewach, pochodzi od E. G. Coffmana i J. Eve’a [CACM 13 (1970), 427-432, 436]. Pomysł polega na pam iętaniu całych kluczy w węzłach, dokładnie tak jak to robiliśmy w algorytmach wyszukiwania z punktu 6 .2 .2 , ale z wykorzystywaniem w każdym kroku jednego bitu argum entu (zamiast wyników porównań) do wyboru lewej lub prawej krawędzi. Na rysunku 32 przedstawiono drzewo binarne zbudowane za pomocą tej metody, gdy do początkowo pustego drzewa wstawimy 31 najpopular niejszych słów angielskich, w kolejności malejących częstości. Żeby to zilustrować na danych binarnych, zakładamy że słowa są wyrażone w kodzie znaków maszyny MIX, a kody zostały przekształcone na 5-bitowe liczby binarne. Tak więc słowo WHICH jest reprezentowane przez ciąg bitów 1101001000010010001101000. Zeby odnaleźć słowo WHICH w drzewie z rysunku 32, porównujemy je n aj pierw ze słowem THE z korzenia drzewa. Ponieważ nie są to te same słowa i ponieważ pierwszym bitem w słowie WHICH jest 1, przechodzimy w prawo i porównujemy je z 0F. Ponieważ znowu nie m a zgodności i ponieważ drugim bitem w słowie WHICH jest 1, przechodzimy w prawo i porównujemy je z WITH i tak dalej. Porządek alfabetyczny kluczy w drzewie cyfrowym nie odpowiada dłużej porządkowi symetrycznemu węzłów.
R ys. 32. Drzewo wyszukiwań cyfrowych dla 31 najpopularniejszych słów angielskich, wstawionych w kolejności malejących częstości.
Interesujące jest to, żeby zauważyć różnicę między drzewem z rysunku 32 a drzewem z rysunku 12 z punktu 6 .2 .2 , ponieważ to ostatnie zostało zbudowane w ten sam sposób, ale przejścia w drzewie były sterowane wynikami porównań, a nie bitam i kluczy. Jeśli weźmiemy pod uwagę dane częstości, to drzewo wy szukiwań cyfrowych z rysunku 32 wymaga w przypadku sukcesu średnio 3.42
534
WYSZUKIWANIE
6.3
porównań; to jest trochę lepiej niż 4.04 porównań potrzebnych w drzewie z ry sunku 12 , chociaż oczywiście czas obliczeń na jedno porównanie będzie inny. A lg o r y tm D ( Wyszukiwanie i wstawianie do drzewa wyszukiwań cyfrowych). Dane są tablica rekordów, które są zorganizowane w drzewo binarne, takie jak opisano powyżej, oraz argum ent K. W tym algorytmie wyszukujemy z argumen tem K . Jeśli K nie ma w tablicy, we właściwe miejsce w drzewie wstawiamy węzeł zawierający klucz K . W tym algorytmie zakładamy, że drzewo jest niepuste, a jego węzły m ają pola KEY, LLINK i RLINK, dokładnie takie jak w algorytmie 6.2.2T. Czytelnik może sprawdzić, że tak naprawdę oba algorytmy są prawie takie same. D l . [Inicjowanie] P
ROOT, K f <— K.
D 2. [Porównywanie] Jeśli K — KEY(P), wyszukiwanie kończy się sukcesem. W przeciwnym razie przypisz na b pierwszy bit z K f i przesuń K f o jedno miejsce w lewo (usuwając tym samym ten bit i umieszczając 0 z prawej strony). Jeśli b — 0, przejdź do D3, w przeciwnym razie przejdź do D4. D 3 . [Przejście w lewo] Jeśli LLINK (P) ^ A, wykonaj P W przeciwnym razie przejdź do D5. D 4 . [Przejście w prawo] Jeśli RLINK(P) ^ A, wykonaj P D2.
LLINK(P) i wróć do D2. RLINK (P) i wróć do
D 5 . [Wstawienie do drzewa] W ykonaj Q <ś= AVAIL, KEY(Q) «— A, LLINK(Q) «— RLINK(Q) A. Jeśli b — 0, to LLINK(P) Q, w przeciwnym razie RLINK(P) <-Q. I Chociaż algorytm wyszukiwania 6.2.2T jest silnie binarny, nietrudno zoba czyć, że właśnie zaprezentowany algorytm można rozszerzyć do wyszukiwania cyfrowego rzędu M dla każdego M > 2 (zobacz ćwiczenie 13). Donald R. Morrison [JACM 15 (1968), 514-534] odkrył bardzo ładny spo sób tworzenia A-węzłowych drzew wyszukiwań, w których korzysta się z binar nych reprezentacji kluczy, ale nie pamięta się ich w węzłach drzewa. Zapropono wana przez niego m etoda o nazwie „Patricia” (Practical Algorithm To Retrieve Inform ation Coded In Alphanumeric - praktyczny algorytm wyszukiwania in formacji kodowanych alfanumerycznie) jest szczególnie przydatna, gdy mamy do czynienia z wyjątkowo długimi kluczami o zmiennej długości, takim i jak tytuły czy frazy, pam iętanym i w bardzo dużych plikach. Podobny algorytm został opu blikowany dokładnie w tym samym czasie w Niemczech przez G. Gwehenbergera, Elektronische Rechenanlagen 10 (1968), 223-226. Podstawowy pomysł w tej metodzie polega na zbudowaniu binarnego drzewa trie i uniknięciu pow stania węzłów o stopniu jeden (z jedną wychodzącą gałęzią). W tym celu w każdym węźle zapisuje się liczbę bitów, które należy przeskoczyć przed wykonaniem następnego testu. Istnieje kilka sposobów rozwinięcia tego po mysłu; pewnie najprostszy do wyjaśnienia jest zilustrowany na rysunku 33. Dana jest bitowa tablica TEXT, która zazwyczaj jest dość długa; może być przechowy wana w pliku zewnętrznym o dostępie swobodnym, ponieważ każde wyszukiwanie wymaga tylko jednego dostępu do tablicy TEXT. Każdy klucz przechowywany
WYSZUKIWANIE CYFROWE
6.3 T
H
I
S
u
I
S
u
T H E u H O U S E u T H A T u
535
J A C K u B U I L T ?
1011101Q0OD1U0] 101100000001001101100000010111010000010100000010001000011000I011U001U10U00010111010000000110111000000101100001000110110000000000101100001001011011011111111
Header
w naszej tablicy jest wyznaczony przez pozycję początkową w tekście TEXT i można przyjąć, że ciągnie się od tej pozycji aż do końca tekstu. (W metodzie Patricia nie szuka się równości między kluczem a argumentem; zam iast tego sprawdza się, czy istnieje klucz rozpoczynający się od danego argum entu). W sytuacji z rysunku 33 mamy siedem kluczy zaczynających się od poszcze gólnych słów, a mianowicie „THIS IS THE HOUSE THAT JACK BUILT?” i „IS THE HOUSE THAT JACK BUILT?” i . , . i „BUILT?” . Jest jedno ważne ograniczenie, które mówi, że żaden klucz nie może być prefiksem innego; taki warunek będzie zawsze spełniony, jeśli na końcu tekstu umieścimy jednoznaczny znak końca tekstu (w tym przypadku „?” ), nie występujący nigdzie indziej. Takie samo ograniczenie przyjęliśmy niejawnie w algorytmie T, gdzie znak „u” oznaczał koniec słowa. Drzewo używane w metodzie Patricia powinno znajdować się w pamięci o dostępie swobodnym lub powinno być rozmieszczone na stronach w sposób zaproponowany w punkcie 6.2.4. Takie drzewo składa się z nagłówka i iV - 1 węzłów, z których każdy zawiera kilka pól: KEY, wskaźnik do tekstu TEXT. Jeśli tekst zawiera C znaków, długość tego po la musi wynosić co najmniej lg C bitów. Na rysunku 33 słowa wewnątrz węzłów powinny być w rzeczywistości reprezentowane przez wskaźniki do tekstu; na przykład zamiast słowa „(JACK)” węzeł powinien zawierać liczbę 24 (która wskazuje na początkową pozycję klucza „JACK BUILT?” w tekście). LLINK i RLINK, wskaźniki wewnątrz drzewa. Te pola muszą mieć długość co najmniej lg N bitów.
536
WYSZUKIWANIE
6.3
LTAG i RTAG, pola jednobitowe, które mówią, czy LLINK i RLINK są odpowied nio wskaźnikami do dzieci lub do przodków węzła. Linie kropkowane na rysunku 33 odpow iadają wskaźnikom, dla których TAG ma wartość 1. SKIP, liczba mówiąca, ile bitów należy pominąć podczas wyszukiwania wyko nywanego w sposób opisany poniżej. To pole powinno być na tyle duże, żeby zmieścić największą liczbę fe, taką że wszystkie klucze o prefiksie a zgadzają się na kolejnych k bitach po <7, dla pewnego słowa a, które jest prefiksem co najmniej dwóch różnych kluczy; w praktyce zazwyczaj możemy założyć, że k nie jest zbyt duże, a w przypadku, gdy długość pola SKIP okazuje się za m ała, pojawia się informacja o błędzie. Na rysunku 33 pola SKIP są pokazane jako liczby wewnątrz węzłów różnych od nagłówka. Nagłówek zawiera tylko pola KEY, LLINK i LTAG. W yszukiwanie w drzewie Patricia jest wykonywane w następujący sposób. Przypuśćmy, że szukamy słowa THE (o reprezentacji bitowej 10111 01000 00101). Rozpoczynamy od spojrzenia na pole SKIP w korzeniu a , które mówi nam, żeby wziąć 1 -szy bit argum entu. Ponieważ tym bitem jest 1 , to idziemy w prawo. Pole SKIP w następnym węźle 7 mówi nam, że należy obejrzeć 1 + 11 = 12-ty bit argum entu. Ponieważ jest to 0, to idziemy w lewo. Pole SKIP w następnym węźle e mówi nam, że należy spojrzeć na bit o numerze (12 + 1 ), który w tym przypadku ma wartość 1; teraz widzimy, że RTAG = 1, więc wracamy do węzła 7 , w którym mamy wskaźnik do tablicy TEXT. Ścieżka, którą przebyliśmy podczas wyszuki wania, pojawi się dla każdego argum entu o wzorcu lxxxx xxxxx x 01 . .. i musimy sprawdzić, czy argum ent pasuje do jedynego klucza, którego początek odpowiada tem u wzorcowi, czyli do THE. Z drugiej strony przypuśćmy, że szukamy dowolnego (lub wszystkich) klu cza o początku TH. Proces wyszukiwania rozpoczyna się tak jak powyżej, ale w końcu następuje próba obejrzenia (nie istniejącego) 12-tego bitu w 10-bitowym argumencie. W tym miejscu porównujemy argument z tekstem TEXT od pozycji wyznaczonej przez bieżący węzeł (w tym przypadku węzeł 7 ). Jeśli argument nie zgadza się z tekstem , to nie może być początkiem żadnego klucza; jeśli jednak zgadza się z tekstem , to argum ent jest początkiem każdego klucza reprezento wanego przez linie kropkowane wychodzące z węzła 7 i jego następników (czyli THIS, THAT, THE). Proces wyszukiwania można opisać precyzyjniej w następujący sposób. A lg o r y tm P (Patricia). D ana jest tablica TEXT i drzewo z węzłami o polach KEY, LLINK, RLINK, LTAG, RTAG i SKIP opisanych powyżej. W tym algorytmie sprawdzamy, czy istnieje klucz w TEXT, który rozpoczyna się od podanego argu m entu K . (Jeśli istnieje r takich kluczy dla r > 1, to można później zlokalizować wszystkie z nich w 0 ( r ) krokach; zobacz ćwiczenie 14). Zakładamy, że dany jest co najm niej jeden klucz. P I . [Inicjowanie] W ykonaj P <— HEAD i j 0. (Zmienna P jest wskaźnikiem, za pom ocą którego posuwamy się w dół drzewa, natom iast j jest licznikiem pozycji w argumencie). W ykonaj n 4—liczba bitów w K.
6.3
WYSZUKIWANIE CYFROWE
537
P 2 . [Przejście w lewo] W ykonaj Q +— P i P <— LLINK(Q). Jeśli LTAG(Q) = 1, przejdź do P 6 . P 3 . [Pomijanie bitów] (W tym miejscu wiemy, że jeśli pierwsze j bitów z K zgadza się z jakimkolwiek kluczem, to zgadzają się one z kluczem, który rozpoczyna się w KEY(P)). W ykonaj j j + SKIP(P). Jeśli j > n, przejdź do P 6 . P 4 . [Test bitu] (W tym miejscu wiemy, że jeśli pierwsze j —1 bitów z K zgadza się z kluczem, to zgadzają się one z kluczem rozpoczynającym się od KEY(P)). Jeśli j -ty bit z K jest równy 0, przejdź do P 2 , w przeciwnym razie przejdź do P5. P 5 . [Przejście w prawo] W ykonaj Q przejdź do P3.
P i P
RLINK(Q). Jeśli RTAG(Q) = 0,
P 6 . [Porównywanie] (W tym miejscu wiemy, że jeśli K zgadza się z jakimkolwiek kluczem, to zgadza się z kluczem rozpoczynającym się od KEY ( P ) ). Porównaj K z kluczem, który zaczyna się w tablicy TEXT od pozycji KEY(P). Jeśli są równe (na n bitach, długość K) , algorytm kończy się sukcesem; jeśli się różnią, algorytm kończy się niepowodzeniem. | W ćwiczeniu 15 pokazujemy, w jaki sposób najpierw zbudować drzewo P a tricia. Możemy także rozszerzać tekst i wstawiać nowe klucze, pod warunkiem że nowy fragment tekstu zawsze kończy się jednoznacznym ogranicznikiem (dla przykładu, znakiem końca tekstu z kolejnym numerem). Patricia jest trochę skomplikowana i wymaga uważnego zbadania, zanim dostrzeżemy jej prawdziwe piękno. A n a liz a a lg o ry tm ó w . Ten podrozdział zakończymy zbadaniem własności drzew trie, drzew wyszukiwań cyfrowych i Patricii. Podsumowanie najważniejszych wyników naszej analizy znajduje się na samym końcu. Na początek rozważmy binarne drzewa trie, czyli drzewa z M = 2. Ry sunek 34 przedstawia binarne drzewo trie dla szesnastu kluczy z przykładów sortowania z rozdziału 5, traktowanych jako 10-bitowe liczby binarne. (Klucze zapisano ósemkowo, tak więc na przykład 11ĄĄ reprezentuje 10-bitową liczbę 612 = ( 1001100100) 2). Podobnie jak w algorytmie T drzewo trie wykorzystuje się do pam iętania informacji tylko o początkowych bitach każdego klucza aż do miejsca, w którym klucz jest już jednoznacznie identyfikowany; wówczas klucz zostaje zapamiętany w całości. Jeśli porównamy rysunek 34 z tabelą 5.2.2-3, odkryjemy zadziwiający zwią zek między drzewem trie a sortowaniem pozycyjnym przez zamienianie. (Być może teraz ten związek jest oczywisty). Dwadzieścia dwa węzły z rysunku 34 odpowiadają dokładnie 22 fazom podziału z tabeli 5.2.2-3, przy czym p-ty węzeł w porządku preorder odpowiada fazie p. Liczba bitów, które są przeglą dane w fazie podziału, jest równa liczbie kluczy w odpowiadającym tej fazie węźle i jego poddrzewach. Na podstawie tego możemy sformułować następujące twierdzenie.
538
WYSZUKIWANIE
6.3
R y s. 34. Przykład losowego binarnego drzewa trie.
T w ie rd z e n ie T . Jeśli N różnych liczb binarnych umieścimy w drzewie binar nym w sposób opisany powyżej, to wówczas: (i) liczba węzłów w drzewie trie je st równa liczbie faz podziału, które należy wykonać, gdy te liczby sortujemy algorytm em pozycyjnym przez zamienianie; (ii) średnia liczba oglądanych bitów potrzebnych do zlokalizowania klucza za pomocą algorytmu T wynosi 1 /N razy liczba obejrzanych bitów w algorytmie sortowania. | Na podstawie tego twierdzenia możemy zastosować cały aparat m atem a tyczny, który rozwinęliśmy w punkcie 5.2.2, przy okazji analizy sortowania po zycyjnego przez zamienianie. Dla przykładu, jeśli przyjmiemy, że nasze klu cze są losowymi liczbami o nieskończonej precyzji między 0 a 1 , o rozkładzie jednostajnym , to liczba przeglądanych bitów podczas wyszukiwania wyniesie l gN- \ -' y/ l n2- \ - l / 2 + S ( N ) - \ - 0 ( N ~ 1), a liczba węzłów w drzewie trie będzie równa N/ l n 2 - \ - Nó ( N) - \ - 0 ( l ) . T utaj S ( N ) i Ś( N) są skomplikowanymi funkcjami, które można pominąć, ponieważ ich wartości bezwględne są zawsze mniejsze od 10~6 (zobacz ćwiczenia 5.2.2-38 i 5.2.2-48). Oczywiście pozostaje jeszcze trochę pracy do wykonania, ponieważ musimy przejść z binarnych drzew trie do drzew o większym stopniu M . T utaj opiszemy tylko początek takiej analizy, pozostawiając pouczające szczegóły jako ćwiczenia. Niech Ajy będzie średnią liczbą węzłów wewnętrznych w losowym drzewie trie o stopniu M , zawierającym N kluczy. W tedy A q ~ A\ = 0, a dla N > 2 mamy A n —1+
fci+•
N\ M k i l . . . kM \
- N
(A kl H
b A k M),
(3)
ponieważ N \ M S / k \ ! . . . k_\j! jest prawdopodobieństwem tego, że k\ z kluczy znajduje się w pierwszym poddrzewie, . . . , k>M znajduje się w M -tym poddrzewie.
WYSZUKIWANIE CYFROWE
6.3
539
To równanie można przepisać do postaci An - 1 + M 1
( k!
n
k%H---'N' = l + M 1 ~N J 2 { Jl ) ( M - l )N~k A k k
dla iV > 2 ,
(4 )
wykorzystując symetrię i sumując po &2>*■*> &M* Podobnie, jeśli przez C n ozna czymy średnią, ogólną liczbę oglądanych cyfr potrzebnych do zlokalizowania wszystkich N kluczy w drzewie, mamy Co — Ci — 0 CN = N + M 1 - N Y ^ { Nk ) ( M - l ) N~kCk k
&\&N>2.
(5 )
W ćwiczeniu 17 pokazujemy, w jaki sposób radzić sobie z ogólnymi równaniami rekurencyjnymi tego typu, a w ćwiczeniach 1 8 -2 5 stosujemy uzyskane rezultaty do analizy losowych drzew trie. [Wielkość A ^ próbowali po raz pierwszy ana lizować z innego punktu widzenia Ł. R. Johnson i M. H. McAndrew, IB M J. Res. and Devel. 8 (1964), 189-193, w związku z równoważnym, zorientowanym sprzętowo algorytmem sortowania]. Jeśli teraz przejdziemy do badania drzew wyszukiwań cyfrowych, odkryjemy, że zachodzą podobne wzory, ale na tyle różne, że nie jest łatwo wywnioskować, jak zachowują się asymptotycznie. Dla przykładu, jeśli przez C n oznaczymy średnią, ogólną liczbę cyfr oglądanych podczas lokalizacji wszystkich N kluczy w drzewie wyszukiwania cyfrowego o stopniu M , nie jest tak trudno jak uprzednio zobaczyć, że Co = C i = 0 oraz C N + 1 = N + M 1 ~N J 2 ( Il ) ( M - 1)N~k ć k k
dla N > 0.
(6)
Ten wzór jest prawie identyczny z (5 ); jednak pojawienie się N 4- 1 zam iast A , z lewej strony tego równania, wystarcza do całkowitej zmiany charakteru takiego równania, tak że metody, które m iały zastosowanie do ( 5 ), tu już go nie mają. Rozważmy najpierw przypadek binarny. Na rysunku 35 pokazano drzewo wyszukiwań cyfrowych dla szesnastu przykładowych kluczy z rysunku 34 w sta wionych w kolejności z przykładów z rozdziału 5. Jeśli pragniemy wyznaczyć średnią liczbę bitów w losowym wyszukiwaniu zakończonym sukcesem, to wy starczy po prostu podzielić przez N długość ścieżki wewnętrznej w drzewie, ponieważ musimy obejrzeć l bitów, żeby znaleźć węzeł na poziomie L Zauważmy jednak, że średnia liczba oglądanych bitów w losowym wyszukiwaniu kończą cym się niepowodzeniem nie ma prostego związku z długością ścieżki zewnętrz nej w drzewie, ponieważ wyszukiwania kończące się niepowodzeniem w węzłach zewnętrznych położonych bliżej korzenia są bardziej prawdopodobne; prawdo podobieństwo dojścia do lewego poddrzewa węzła 0075 z rysunku 35 wynosi (przy założeniu, że klucze są nieskończonej precyzji), natom iast lewe poddrzewo
540
WYSZUKIWANIE
6.3
R y s. 35. Losowe drzewo wyszukiwań cyfrowych zbudowane za pomocą algorytmu D.
węzła 0232 jest osiągane z prawdopodobieństwem równym tylko Z tego powodu drzewa wyszukiwań cyfrowych zazwyczaj są bardziej zrównoważone niż drzewa wyszukiwań binarnych budowane za pomocą algorytmu 6.2.2T dla kluczy o rozkładzie jednostajnym. Drzewo wyszukiwań cyfrowych możemy scharakteryzować za pomocą funkcji tworzących. Załóżmy, że na poziomie l znajduje się a/ węzłów wewnętrznych. Rozważmy funkcję tworzącą a(z) = Yli aizl\ dla przykładu, funkcją tworzącą dla drzewa z rysunku 35 jest a(z) = 1 + 2z + 4z2 + 5z 3 + 4z4. Jeśli na poziomie l mamy bi węzłów zewnętrznych i jeśli b(z) = bizl, to na podstawie ćwiczenia 6.2.1-25 mamy b(z) = 1 + (2z - 1 )a(z) (7 ) Na przykład 1 + (2z — 1)(1 + 2z -h 4z 2 + 5z3 + 4z4) = 3z3 + 6z4 + 8z 5. Śred nia liczba oglądanych bitów w losowym wyszukiwaniu kończącym się sukcesem wynosi a '(l)/a (l), ponieważ a!( 1 ) jest długością ścieżki wewnętrznej w drzewie, natomiast a(l) jest liczbą węzłów wewnętrznych. Średnia liczba oglądanych bitów w losowym wyszukiwaniu kończącym się niepowodzeniem wynosi ^2ilb[2~l = — a (|), ponieważ do danego węzła zewnętrznego z poziomu l trafiamy z prawdopodobieństwem 2~l. Liczba porównań jest taka sama jak liczba obejrza nych bitów, plus jeden w przypadku wyszukiwania kończącego się sukcesem. Dla przykładu z rysunku 35 wyszukiwanie kończące się sukcesem wymaga przejrzenia średnio 2 — bitów i wykonania średnio 3 ^ porównań; w przypadku wyszukiwania kończącego się niepowodzeniem przeglądamy 3 | bitów i wykonujemy taką samą ilość porównań. Niech teraz gN(z ) będzie „średnią” funkcją a(z) dla drzew o N węzłach; innymi słowy, Qn (z ) jest sumą ^2 p t &t (z ) po wszystkich binarnych drzewach wyszukiwań cyfrowych T o N węzłach wewnętrznych, gdzie c l t { z ) jest funkcją tworzącą dla węzłów wewnętrznych drzewa T, a Pt jest prawdopodobieństwem otrzymania T w wyniku wstawienia N losowych liczb za pomocą algorytmu D.
6.3
WYSZUKIWANIE CYFROWE
541
Wówczas średnia liczba oglądanych bitów wynosi g Nf ( l ) / N w przypadku wyszu kiwania kończącego się sukcesem, a w przypadku niepowodzenia. Funkcję Qn {%) możemy policzyć, naśladując proces budowy drzewa. Niech a ( z ) będzie funkcją tworzącą dla drzewa 7V-węzłowego. Z takiego drzewa możemy utworzyć N + 1 drzew, zapełniając jeden z węzłów zewnętrznych. Dany węzeł zewnętrzny z poziomu l zostaje zapełniony z prawdopodobieństwem 2~l. Zatem suma funkcji tworzących dla takich N + 1 nowych drzew, pomnożonych przez prawdopodobieństwa ich pojawienia się, wynosi a ( z ) + b ^ z ) = a ( z ) + 1 + ( z — l) a ( ^ ) . Uśredniając po wszystkich drzewach o N węzłach, dostajemy, że 9 N + i( z )
=
g N (z)
+ 1 + 0
-
l ) g N {^z);
g 0 (z)
=
0.
( 8)
Trochę łatwiej poradzić sobie z odpowiednią funkcją dla węzłów zewnętrznych = 1 + ( 2z -
h N (z)
1) g N
(z),
ponieważ równanie (8) jest równoważne równaniu =
h N + i{z)
+
h N {z)
(2z -
l ) h N ( \ z ) \
=
h 0 (z)
l.
(9)
Stosując ten wzór wielokrotnie, dostajemy h N + 1 (z)
+ 2 (2 z -
l ) h N - i { \ z )
+
3(2 z -
l ) h N _ 2 ( \ z )
+ 3 (2 z -
=
h N ^ i ( z )
=
h N - 2 (z) +
+
(2z
-
1) ( z - 1)
{ \ z
-
(2z -
l ) ( z
1) { z
-
l ) h N - 1 ( \ z )
-
l ) h N ^ 2 ( \ z )
l ) h N - 2 (± z)
i tak dalej, tak że na koniec mamy A;—1 M * 0
=
j ( ^ )
Y k
I l ( 2 l~ ^
_
(10)
3= 0 k —l
9N(z) = J 2 ( kIl 1) l l ( 2~j z - 1)-
(11)
Na przykład g±{z) = 4 + 6 (z —1 ) + 4 (z —1 ) —l) + (z —1) [^z —l) [ jz —l). Te wzory pozwalają wyrazić poszukiwane przez nas wielkości jako sumy iloczynów: N
= aW(i) = i : ( fc + 2)
-
(12l
“ 1) = C n +i - C N .
( 13 )
j=l AT
9n (^) =
k
(fc + i ) I K ^
Wcale nie jest oczywiste, że ten wzór na C n spełnia (6)! Niestety te wyrażenia nie nadają się do obliczeń lub do asymptotycznego rozwijania, ponieważ — 1 jest ujemne; dostajemy duże wyrazy i mnóstwo
542
WYSZUKIWANIE
6.3
uproszczeń. Dużo bardziej przydatny wzór na C m można otrzymać, korzystając z tożsamości podziałowych z ćwiczenia 5.1.1-16. Mamy ć
» = ( n a
- 2 _ j > ) £ ( t + 2 ) ( “ i ) i n ( i - r ' - * - 1) - ' / k^o 1^0
= ( lid -
2-i)) •£ ( J l , ) ( - i ) ‘ £ /
k^O
(2 -* -‘r f t a - 2 - a - 1
m^zO
r —1
= £ 2m( E ( i ) ( - 2_m)fc- 1+ 2^ ) m^O
/
\ k
0 0 - n
( n
- l ) /
2-
= £ 2 m ( ( 1- 2 - m ) Ar- 1 + 2 -m j v ) £ ( - 2_m ~ 1)n — _---------------- . ( 14)
r/i aa
n^o
rU i(l
2
)
Na pierwszy rzut oka ten wzór może nie wydawać się lepszym od wzoru ( 1 2 ) , ale jego wielka przewaga polega na tym, że suma po m zbiega bardzo szybko do granicznej wartości dla każdego ustalonego n. Dokładnie analogiczna sytu acja pojawiła się w przypadku drzewa trie we wzorach 5.2.2-(38) i 5.2.2- ( 3g); w rzeczywistości, jeśli rozważymy tylko te wyrazy w ( 1 4 ) , dla których n = 0, dostaniemy w wyniku N —1 plus liczba przeglądanych bitów w binarnym drzewie trie. Żeby otrzymać asymptotyczną wartość, możemy teraz postąpić w zasadzie dokładnie tak samo jak poprzednio; zobacz ćwiczenie 27. [Powyższe wyprowadze nie jest w większości oparte na podejściu zaproponowanym przez A. J. Konheima i D. J. Newmana, Discrete Mathematics 4 (1973), 57-63]. Na koniec dokonajmy analizy metody Patricia. W tym przypadku drzewo binarne przypomina odpowiednie, ale zwarte, binarne drzewo trie (ponieważ pola S K I P eliminują węzły o stopniu 1), w którym mamy zawsze dokładnie N — 1 węzłów wewnętrznych i N węzłów zewnętrznych. Na rysunku 36 pokazano drzewo z metody Patricia odpowiadające drzewu trie z rysunku 34. Liczba pokazana w każdym węźle-rozgałęzieniu jest wartością S K I P ; klucze są przypisane do wę złów zewnętrznych, chociaż węzły zewnętrzne nie są tak naprawdę jawnie obecne (w rzeczywistości w miejscu węzła zewnętrznego mamy oznakowane dowiązanie do węzła wewnętrznego, w którym jest odwołanie do tablicy TEXT). Do celów analizy możemy przyjąć, że węzły zewnętrzne istnieją, tak jak pokazano na rysunku. Ponieważ udane wyszukiwania za pomocą algorytmu Patricia kończą się w węzłach zewnętrznych, średnia liczba przejrzanych bitów w losowym, zakoń czonym sukcesem wyszukiwaniu będzie równa długości ścieżki zewnętrznej po dzielonej przez N. Jeśli weźmiemy funkcję tworzącą b(z) dla węzłów zewnętrz nych, zdefiniowaną powyżej, to średnia liczba przejrzanych bitów będzie równa b'(l)/b(l). Nieudane wyszukiwanie w przypadku metody Patricia także kończy się w węźle zewnętrznym, ale z prawdopodobieństwem 2~l dla węzłów zewnętrz nych z poziomu Z, a co za tym idzie średnia liczba przeglądanych bitów wynosi \b f ( | ) . Dla przykładu z rysunku 36 mamy b(z) — 3z3 + Sz 4 + 3z 5 + 2z6; dlatego
WYSZUKIWANIE CYFROWE
6.3
6S O!
543
-0
R y s. 36. Zamiast drzewa z rysunku 34 Patricia zbuduje to drzewo.
przeglądamy średnio 4^ bitów w wyszukiwaniu udanym i 3 | | w wyszukiwaniu nieudanym. Niech hn(z) będzie „średnią” funkcją b(z) dla drzew z n węzłami zewnętrz nymi, konstruowanymi za pomocą algorytmu Patricia, przy założeniu o jedno stajnym rozkładzie kluczy. Okazuje się, że równanie rekurencyjne h n (z) = 21~n ' ^ ( ^ j h k( z)(z + Skn(l - z ) ) ,
h 0(z) = 0,
hi(z) = 1
( 15)
k
nie ma żadnego prostego rozwiązania. Szczęśliwie jednak, istnieje prosta zależ ność rekurencyjna dla średniej długości ścieżki zewnętrznej hfn ( 1 ), ponieważ
Km
+2 1-"
k
-w k
= n - 2 ' - nn + 2l- n ' £ ( n k )h>k(l).
(a6)
k
Ponieważ to równanie ma dokładnie taką samą postać jak (6), do jego rozwiąza nia możemy użyć poznanych już metod. Okazuje się, że liczba hfn {1) jest dokład nie o n mniejsza od odpowiedającej jej liczby przeglądanych bitów w losowym binarnym drzewie trie. Tak więc pola S K I P , przy losowych danych, pozwalają zaoszczędzić na oglądaniu jednego bitu na każde udane wyszukiwanie. (Zobacz ćwiczenie 31). Redundancja typowych rzeczywistych danych powinna prowadzić do większych oszczędności. Gdy próbujemy znaleźć średnią liczbę przeglądanych bitów, w losowym nieudanym wyszukiwaniu za pomocą algorytmu Patricia, dochodzimy do na
544
WYSZUKIWANIE
6.3
stępującego równania rekurencyjnego: an = 1 + U
2 Y .( l) * k
dian > 2;
a0 = ox = 0.
( 17 )
k
Tutaj an — . To równanie nie przypomina żadnego z dotychczas badanych ani nie daje się łatwo przekształcić do takiego znanego równania. Teoria transfor mat Mellina wprowadzona w punkcie 5.2.2, jak i prace tam cytowane, dostarczają ogólnych narzędzi, które pozwalają radzie sobie z równaniami takiego typu. Okazuje się, że w rozwiązaniu równania ( 17 ) pojawiają się liczby Bernoulliego: TKLn — 1
^ —"v /
T l\
B h
_ _ _ _ n + 2 = £ ( J ^ - r_
dla n > 2.
,
\
( 18)
k=2
Ten wzór jest prawdopodobnie najtrudniejszym asymptotycznym orzechem do zgryzienia, na jaki dotychczas natrafiliśmy; rozwiązanie z ćwiczenia 34 jest po uczającym przypomnieniem wielu rzeczy, które dotąd robiliśmy, z pewnymi nie wielkimi różnicami. Podsum owanie przeprowadzonych analiz. Do najbardziej zasługujących na uwagę faktów wynikających z tych skomplikowanych analiz należą: a) Liczba węzłów potrzebnych do zapamiętania N losowych kluczy w drze wie trie stopnia M, w którym rozgałęzianie kończy się dla podplików składają cych się z co najwyżej s kluczy, wynosi N /(sln M ). Ta przybliżona wielkość jest prawdziwa dla dużych 7V, małych s i małych M. Ponieważ w węźle drzewa trie musimy mieć pola na M dowiązań, zatem gdy weźmiemy s — M, łącznie takich pól będziemy potrzebowali tylko około N /ln M . b) We wszystkich rozważanych metodach liczba cyfr lub znaków przegląda nych podczas losowego wyszukiwania wynosi w przybliżeniu logM N. Dla M — 2, różne analizy dają nam dokładniejsze przybliżenia na liczbę przeglądanych bitów podczas wyszukiwania: Udane Nieudane Drzewo trie lg N + 1.33275 lg AT —0.10995 Drzewo cyfrowe lg N —1.71665 lgiV —0.27395 Patricia lg7V + 0.33275 lg AT - 0.31875 (Wszystkie te przybliżenia można wyrazić przy użyciu podstawowych stałych matematycznych; dla przykładu 0.31875 odpowiada (lnn —7 ) / ln2 —1 / 2). c) Tutaj „losowość” danych oznacza, że cyfry (M jest liczbą cyfr) w zapi sie kluczy pojawiają się z rozkładem jednostajnym, tak jak gdyby klucze były liczbami rzeczywistymi między 0 a 1 , zapisanymi w układzie pozycyjnym przy podstawie M. Metody wyszukiwania cyfrowego są nieczułe na kolejność wprowa dzania kluczy do pliku (wyjątkiem jest algorytm D, w którym tylko nieznacznie odczuwa się zmianę tej kolejności); jednak są one bardzo czułe na rozkład cyfr. Dla przykładu, jeśli bit 0 pojawia się dużo częściej od bitu 1, drzewa stają się dużo bardziej przechylone niż dla danych losowych rozważanych w naszych analizach.
WYSZUKIWANIE CYFROWE
6.3
545
Ćwiczenie 5.2.2-53 jest przykładem tego, co dzieje się, gdy dane są zaburzone w ten sposób. ĆWICZENIA 1. [00] Tylko dla znających angielski: If a tree has leaves, what does a trie have? 2. [20] Ułóż algorytm wstawiania nowego klucza do drzewa trie stopnia M przy ustaleniach dla algorytmu T. 3. [21] Ułóż algorytm usuwania klucza z drzewa trie stopnia M przy ustaleniach dla algorytmu T. 4. [21] Większość z 360 pozycji w tabeli 1 jest pusta (puste dowiązania). Tabelę 1 można skompresować do tabeli zawierającej tylko 49 pozycji. W tym celu dopuszczamy pokrywanie się pozycji pustych i zapełnionych i robimy co następuje: Pozycja
t -H
CMCO TT 10 co b- 00 Ci O t-H C MC Mco O lO CO t- 00 Ci 0MC 1— i i— \ C T — ł t-H t-H tH T-ł t-H ^H t-H C MCMCMCMCM ^
Zawartość
Pozycja
s
CO H < i
X
t—t i-H
H
co CM
^
Zawartość
s
O r—1
r CM
sb
b
03
00
CM
^
X O 0 X C H H C O w H uu X M X l-H X 0 PQ H x E* H
01
0
1—1 CM
CN)
co
co
co
>"
52S
s __s o d CO^
a
£14 PO M
CO CO
10 co
co
CO co
X O
a
Pi
s
H O
t-
s
)> co
s Pi w
X
^_^
00 O i
co
w
Pi
<
__%^ s W MCO OH 0 M X < POi C
Q < X
C M t-H X
O
r-H
CM
CO
10
CO
w >
^ v -
t -
00
O l
co
co l-H
E-* CO H M < <
__^ «
<
X
&
0
E*
(Węzły (1), (2), . . . , (12) z tabeli 1 rozpoczynają się w tabeli skompresowanej odpo wiednio od pozycji 20, 19, 3, 14, 1, 17, 1, 7, 3, 20, 18, 4). Pokaż, że jeśli w programie T tabelę 1 zastąpimy tabelą skompresowaną, nasz program będzie nadal działał poprawnie, ale nie tak szybko. 5. [M26] (Y. N. Patt) W każdym drzewie z rysunku 31 litery są rozmieszczone w po rządku alfabetycznym. Taki porządek nie jest konieczny. Jeśli przed skonstruowaniem drzew binarnych, reprezentujących wyjściowe drzewa takie jak (2 ), zmienimy kolejność węzłów w drzewach, to wyszukiwanie może być szybsze. Jakie rozmieszczenie węzłów z rysunku 31 jest optymalne pod tym względem? (Przyjmij założenie o częstościach z rysunku 32 i znajdź las, który minimalizuje czas udanego wyszukiwania, gdy las reprezentujemy w postaci drzewa binarnego). 6. [15] Jakie drzewo wyszukiwań cyfrowych otrzymamy, gdy za pomocą algorytmu D wstawimy w porządku rosnącym 4-bitowe klucze binarne 0001, 0010, 0 0 1 1 ,,,.,1 1 1 1 ? (Należy zacząć od 0001 w korzeniu, a następnie wykonać czternaście wstawień). 7. [M26] Różne kolejności wstawiania kluczy z ćwiczenia 6 mogą dawać różne drze wa. Wśród wszystkich 15! możliwych permutacji tych kluczy znajdź tę najgorszą, która daje drzewo o największej długości ścieżki wewnętrznej? 8. [20] Rozważmy następujące zmiany w algorytmie D, które pozwalają wyelimino wać zmienną K '. Zastępujemy „K/n przez „ /i” w obu miejscach w kroku D2, a następ nie usuwamy operację „K f <— K ” z kroku D l. Czy tak otrzymany algorytm jest nadal poprawnym algorytmem wyszukiwania i wstawiania? 9. [21] Napisz program na maszynę MIX, implemetujący algorytm D, i porównaj go z programem 6.2.2T. Możesz wykorzystywać operacje binarne takie jak SLB (przesuń
546
6.3
WYSZUKIWANIE
binarnie w lewo AX), JAE (skocz, jeśli A parzyste) itd.; możesz także skorzystać z po mysłu z ćwiczenia 8, jeśli jest to pomocne. 1 0 . [23] Dany jest plik, w którym wszystkie klucze są n-bitowymi liczbami binarnymi, oraz dany jest argument wyszukiwania K = b \ 62 - **b n , Przypuśćmy, że chcemy znaleźć maksymalną wartość k taką, że istnieje w pliku klucz zaczynający się od bitowego wzorca b \ 62 . . . b k - Jak można to zrobić efektywnie, gdy plik jest reprezentowany jako: a) drzewo wyszukiwań binarnych (algorytm 6.2.2T)? b) binarne drzewo trie (algorytm T)? c) binarne drzewo wyszukiwań cyfrowych (algorytm D)?
11. [21 ] Czy algorytm 6 .2 .2 D można zastosować bez zmian do usuwania węzła z drze wa wyszukiwań cyfrowych? 12. [25] Czy po usunięciu losowego elementu z losowego drzewa wyszukiwań cyfro wych zbudowanego za pomocą algorytmu D, otrzymane drzewo jest nadal losowe? (Zobacz ćwiczenie 11 i twierdzenie 6.2.2H). 13. [20] ( Wyszukiwanie cyfrowe stopnia M) Wyjaśnij, w jaki sposób można połączyć algorytmy T i D w celu uzyskania uogólnionego algorytmu, który w istocie jest taki sam jak algorytm D dla M — 2. Jakie zmiany zaszłyby w tabeli 1, jeśli zaproponowany przez Ciebie algorytm zostanie użyty dla M ~ 30? ►14. [25] Zaproponuj efektywny algorytm, który po zakończonym sukcesem wykonaniu algorytmu D znajdzie wszystkie miejsca wystąpienia klucza K w tablicy TEXT. 15. [28] Zaproponuj efektywny algorytm do budowania drzewa, z którego można korzystać w metodzie Patricia, jak i do wstawiania do istniejącego drzewa nowego odsyłacza do tekstu TEXT. Twój algorytm powinien odwoływać się do tablicy TEXT najwyżej dwukrotnie. 16. [22] Dlaczego w metodzie Patricia żąda się, żeby żaden klucz nie był prefiksem innego? 17. [M25] Wyraź rozwiązanie równania rekurencyjnego x Q = x i = 0,
x n = an + m 1" 71 ^
(m - l ) n~kx k,
n ^ 2,
k
za pomocą transformat dwumianowych, uogólniając metodę z ćwiczenia 5.2.2-36. 18. [M21] Wykorzystaj ćwiczenie 17 do znalezienia rozwiązań równań (4 ) i (5 ) wzglę dem funkcji Un i Vnj analogicznych do zdefiniowanych w ćwiczeniu 5.2.2-38. 19. [HM23] Znajdź z dokładnością do 0 (1 ) asymptotyczną wartość funkcji
- E 2 ( X ) ; £ £ t. gdy n —►00 , ustalone są s ^ 0 i m > 1. [Przypadek s — 0 został już rozwiązany w ćwiczeniu 5.2.2-50, a przypadek s = 1, m = 2 w ćwiczeniu 5.2.2-48]. ►20. [M30] Rozważmy drzewo trie o stopniu M , w którym wykonuje się przeszukiwanie liniowe dla podplików zawierających nie więcej niż s kluczy. (Algorytm T ma zastoso wanie w szczególnym przypadku s = 1). Wykorzystaj wyniki z poprzedniego ćwiczenia do analizy: a) średniej liczby węzłów w drzewie trie; b) średniej liczby cyfr lub liter oglądanych w wyszukiwaniu kończącym się sukcesem; c) średniej liczby porównań wykonywanych w wyszukiwaniu kończącym się sukcesem.
6.3
WYSZUKIWANIE CYFROWE
547
Przedstaw swoje odpowiedzi w postaci asymptotycznych wzorów przy iV —►oo i dla ustalonych M i s; odpowiedź dla (a) powinna być poprawna z dokładnością do 0 (1 ), natomiast odpowiedzi dla (b) i (c) powinny być poprawne z dokładnością do 0 ( N ~ 1). [Dla M = 2 taka analiza ma również zastosowanie do zmodyfikowanego sortowania pozycyjnego przez zamienianie, w którym podpliki o rozmiarach ^ s są sortowane przez wstawianie]. 2 1 . [M25] Dla ilu węzłów w losowym drzewie trie o stopniu M i zawierającym N
kluczy wskaźnik na pozycji O jest pusty? (Na przykład w tabeli 1, 9 z 12 węzłów ma pusty wskaźnik na pozycji „u”. „Losowość” w tym ćwiczeniu jak zwykle oznacza, że cyfry w kluczach są wybierane z rozkładem jednostajnym spośród liczb od O do M —1 ). 2 2 . [M25] Rozważmy losowe drzewo trie o stopniu M i N kluczach. Ile węzłów w drze wie znajduje się na poziomie l dla l = 0 , 1 , 2 , . . . ?
23. [M26] Ile średnio bitów jest przeglądanych w drzewie trie stopnia M , zawierają cym N losowych kluczy, podczas wyszukiwania kończącego się niepowodzeniem? 24. nek a) b)
[M30] Rozważmy drzewo trie stopnia M reprezentowane jako las (zobacz rysu 31). Podaj dokładne i asymptotyczne wyrażenia na: średnią liczbę węzłów w lesie; średnią liczbę przypisań „P <— RLINK(P)” wykonywanych w losowym wyszukiwaniu kończącym się sukcesem.
►25. [M2Ą] Metody matematyczne zastosowane w tym punkcie do wyprowadzenia war tości asymptotycznych są dość trudne i wymagają użycia teorii zmiennej zespolonej. Dzieje się tak dlatego, że jest pożądane, aby dostać coś więcej niż tylko najbardziej znaczący wyraz we wzorze asymptotycznym (a kolejny wyraz jest wewnętrznie złożony). Celem tego ćwiczenia jest pokazanie, że metody elementarne są wystarczająco dobre, żeby otrzymać niektóre z tych wyników w słabszej postaci. a) Udowodnij przez indukcję, że rozwiązanie równania (4 ) spełnia warunek A n ^ M ( N — 1 )/(M — 1). b) Niech D n = C n — N i f ^ - i / l n M , gdziej C n jest zdefiniowane przez równanie ( 5 ). Udowodnij, że D n = O ( N ) ; stąd C n = N l o g M N + O ( N ) . [Wskazówka: Wykorzystaj (a) i twierdzenie 1.2.7A]. 26. [23] Wyznacz wartość nieskończonego iloczynu
z dokładnością do pięciu miejsc po kropce dziesiętnej i wykonując wszystkie obliczenia ręcznie. [Wskazówka: Zobacz ćwiczenie 5.1.1-16]. 27. [HM31 j Znajdź z dokładnością do 0 (1 ) asymptotyczną wartość C n , zadaną tak jak w ( 14 )? 28. [HM26] Znajdź asymptotyczną wartość średniej liczby cyfr przeglądanych pod czas wyszukiwania cyfrowego, w losowym drzewie stopnia M dla dowolnego M 2. Rozważ oba przypadki: wyszukiwanie kończące się sukcesem i wyszukiwanie kończące się niepowodzeniem i podaj swoją odpowiedź z dokładnością do 0 ( N ~ 1). 29. [HM4 0 ] Ile wynosi asymptotycznie średnia liczba węzłów w drzewie wyszukiwań cyfrowych o stopniu M , w których wszystkie M dowiązań jest pustych? (Możemy oszczędzić pamięć, eleminując wszystkie takie węzły; zobacz ćwiczenie 13).
WYSZUKIWANIE
548
6.3
30. \M2Ą] Pokaż, że funkcję tworzącą hn(z), zdefiniowaną w ( 15 ) przy okazji analizy metody Patricia, można przedstawić w dość okropnej postaci n T z m(
T, 0, 1 , . . . , (2m,
(
U~ 1
W
1
[Tak więc, jeśli istnieje prosty wzór na hn (z), to bylibyśmy w stanie uprościć to mało zgrabne wyrażenie]. 31. [M21] Rozwiąż równanie rekurencyjne ( 16 ).
32. [M21] Ile wynosi średnio suma wartości wszystkich pól SKIP w losowym drzewie Patricia o N — 1 węzłach wewnętrznych? 33. [M30] Udowodnij, że ( 18 ) jest rozwiązaniem równania rekurencyjnego ( 17 ). [ Wska
zówka: Rozważ funkcję tworzącą A(z) =
anZn/rd].
34. [HMĄO] Celem tego ćwiczenia jest zbadanie asymptotycznego zachowania się ( 18 ).
a) Udowodnij, że dla n ^ 2 n—1 + i— 2„ - i + ... + - l ) n_1 2J 1 ( n ) _ Bk = y ( } : _____ z___ :_____ _xz___ —_______^ + ; n 2^fc
y .
b) Pokaż, że składniki z prawej sumy w (a) są w przybliżeniu równe l / ( e x — 1) — l / x + 1 / 2 , gdzie x = n / 2 J; otrzymywana w ten sposób suma jest równa sumie wyjściowej plus c) Pokaż, że
e
1 ----
i
1 1 1 1- - = - —: / C ( z ) T ( z ) x ~ zdz x z Z tx% j _ i _ j 00
dla liczby rzeczywistej x > 0.
d) Tak więc nasza suma równa się j _ f - - i* * ~ C 2ttí J -_ £i _íoo
^
oblicz tę całkę. ►35. [M20] Jakie jest prawdopodobieństwo, że drzewem Patricia dla pięciu kluczy będzie drzewo
w którym wartościami pól SKIP są a, 6 , c, d (jak pokazano na rysunku)? (Przyjmij, że klucze składają się z niezależnych losowych bitów i podaj swoją odpowiedź jako funkcję a, 6 , c i d). 36. [M25] Istnieje pięć drzew binarnych o trzech węzłach wewnętrznych. Jeśli roz patrzymy, jak często każde z nich pojawia się jako drzewo wyszukiwania w różnych
6.3
WYSZUKIWANIE CYFROWE
549
algorytmach, przy założeniu losowych danych, dostaniemy następujące, różne prawdo podobieństwa:
Wyszukiwanie drzewowe (Algorytm 6.2.2T)
1 6
Wyszukiwanie w drzewie cyfrowym (Algorytm D)
8
Patricia (Algorytm P)
7
1 1
1
1 6
1
6
1 3 1 2
1 8
1
8
3 7
1 7
1
7
1 1
6 8 7
(Zauważmy, że drzewo wyszukiwania cyfrowego jest częściej zrównoważone niż inne drzewa). W ćwiczeniu 6 . 2.2-5 pokazaliśmy, że prawdopodobieństwo wystąpienia danego drzewa w algorytmie wyszukiwania drzewowego jest równe ( V 5(x ))> gdzie iloczyn jest po wszystkich węzłach x, a s(x) jest liczbą węzłów wewnętrznych w poddrzewie o ko rzeniu x. Znajdź podobne wzory dla prawdopodobieństw w przypadkach (a) algorytmu D; (b) algorytmu P. ►37. [M22] Rozważmy drzewo binarne o bi węzłach zewnętrznych na poziomie L W głównym tekście zauważyliśmy, że czas wyszukiwania kończącego się niepowodze niem w drzewie wyszukiwań cyfrowych nie ma bezpośredniego związku z długością ścieżki zewnętrznej /fy, a^e jes^ w istocie proporcjonalny do zmodyfikowanej długości ścieżki zewnętrznej ^¿¿>¿2“ *. Udowodnij lub pokaż, że to nieprawda: zmodyfikowana długość ścieżki zewnętrznej w drzewie o N węzłach zewnętrznych jest najmniejsza, gdy wszystkie węzły zewnętrzne występują na dwóch sąsiednich poziomach. (Zobacz ćwiczenie 5,3.1-20). 38. [MĄO] Zaproponuj algorytm, który dla danych a i ¡3 znajdzie drzewo n-węzłowe z najmniejszą wartością a ■(długość ścieżki wewnętrznej) + ¡3 *(zmodyfikowana długość ścieżki zewnętrznej), zgodnie z definicją z ćwiczenia 37. 39. [MĄ3\ Ułóż algorytm znajdowania optymalnych drzew wyszukiwań cyfrowych analogicznych do optymalnych drzew wyszukiwań binarnych rozważanych w punkcie 6 .2 .2 . ►40. [25] Niech ao a\ a
550
WYSZUKIWANIE
6.3
Elementem odwrotnym dla a jest 6“ . . . a mnożenie dwóch słów polega na ich sklejeniu i usunięciu par sąsiednich elementów, które są do siebie odwrotne. Niech H będzie podgrupą G generowaną przez słowa {/3X, ... ,/3p}, czyli zbiorem wszystkich słów z G, które można przedstawić jako iloczyn słów (3 lub ich odwrotności. Zgodnie z dobrze znanym twierdzeniem Jakoba Nielsena (zobacz Marshall Hall, The Theory of Groups (New York: Macmillan, 1959), rozdział 7), zawsze można znaleźć generatory 0 i , . . . , Om podgrupy E , z m ^ p, o takiej własności, że środkowy symbol z 0* (lub co najmniej jeden z dwóch środkowych symboli z 0*, jeśli jego długość jest parzysta) nigdy nie upraszcza się w wyrażeniach 0^0| lub 0)0^, e = ±1, chyba że j = i i e = —1. Z tej własności wynika prosty algorytm na sprawdzanie, czy dany element z G należy do H: Zapamiętujemy 2m kluczy 0X, . . . , 0m, 0 f , . . . , 0“ w drzewie wyszukiwań ukierunkowa nych znakowo dla 2n symboli-znaków O i , . . . , a n, , . . . , a ~ . Niech a = b\ , . . br będzie danym elementem z G\ jeśli r = 0, to oczywiście a należy do H. W przeciwnym razie przeglądamy a, znajdując najdłuższy prefiks b i . . . bk , który pasuje do pewnego klucza. Jeśli więcej niż jeden klucz zaczyna się od b\ . . . bk , a nie należy do H\ w przeciwnym razie niech b\ . . . bkC\ . . . q = będzie jedynym takim kluczem i zastąpmy a przez 0 ^ ea = ć f . . . Ci bk^ i . . . br . Jeśli ta nowa wartość a jest dłuższa od starej (jeśli Z> fc), a nie należy do H ; w przeciwnym razie powtarzamy ten proces dla nowej wartości a. Z własności Nielsena wynika, że ten algorytm zawsze się zatrzyma. Jeśli w końcu a zredukuje się do słowa pustego, możemy odtworzyć początkowe a jako iloczyn słów 0. Dla przykładu niech { 0 i, 02 , 03 } = {bbb, b~a~ b~~, ba~ b} i a — bbabaab. Za pomocą lasu
i opisanego algorytmu możemy dostać, że a = 0X03 0 X03 02 ■ Zaimplementuj powyższy algorytm, przyjmując za wejście dla Twojego programu słowa 0. 42. [23] (Kompresja przednio-tylna) Gdy do podziału większego pliku używamy jako indeksu kluczy binarnych, nie musimy pamiętać ich w całości. Dla przykładu, gdy posługujemy się szesnastoma kluczami z rysunku 34, wówczas możemy obciąć je mak symalnie z prawej strony, pozostawiając tylko cyfry niezbędne do ich jednoznacznych identyfikacji: 0000, 0001, 00100, 00101, 010, . . . , 1110001. Takie obcięte klucze można wykorzystać do podziału pliku na siedemnaście kawałków, gdzie dla przykładu piąty kawałek zawiera wszystkie klucze rozpoczynające się od 0011 lub 010, natomiast ostatni kawałek zawiera wszystkie klucze zaczynające się od 111001, 11101 lub 1111. Obcięte klucze można reprezentować w bardziej zwarty sposób, usuwając z każdego klucza wszystkie początkowe bity pasujące do poprzedniego klucza: 0000, oool, 0 0 IOO, ooool, olO, . . . , ooooool. Następnym bitem po o jest zawsze 1, tak więc i ten bit można usunąć. W dużym pliku będzie wiele „diamencików” o i wystarczy tylko zapamiętać ich liczbę i wartości następujących po nich bitów. Pokaż, że łączna liczba bitów w skompresowanym pliku, nie licząc diamencików o i następujących bezpośrednio po nich bitów o wartości 1, jest zawsze równa liczbie węzłów w binarnym drzewie trie dla zadanych kluczy.
6.3
WYSZUKIWANIE CYFROWE
551
(W konsekwencji średnia liczba wszystkich takich bitów w całym indeksie wynosi około JV/ln2, tylko 1.44 bitu na klucz. O tej metodzie kompresji opowiedzieli autorowi A. Heller i R. L. Johnsen. Możliwa jest jeszcze dalsza kompresja, ponieważ musimy tylko umieć reprezentować drzewo trie; zobacz 2.3.1A). 43. [HMĄ2] Dokonaj analizy wysokości losowego drzewa trie o stopniu M i zawierają cego N kluczy, uwzględniając parametr odcięcia s, jak w ćwiczeniu 20. (Dla s — 1 jest to długość najdłuższego wspólnego prefiksu N długich losowych słów nad alfabetem Af-element owym). ►44. [30] (J. L. Bentley i R. Sedgewick) Zbadaj reprezentację drzew trie za pomo cą drzew trójkowych, w których lewe i prawe dowiązania odpowiadają krawędziom poziomym z rysunku ( 2 ), natomiast środkowe dowiązania odpowiadają krawędziom prowadzącym w dół. 45. [M25\ Jeśli 7 kluczy z rysunku 33 wstawiamy w losowej kolejności za pomocą algorytmu z ćwiczenia 15, to jakie jest prawdopodobieństwo otrzymania pokazanego drzewa?
552
WYSZUKIWANIE
6.4
6.4. HASZOWANIE
Do tej pory rozważaliśmy metody wyszukiwania oparte na porównywaniu danego parametru K z kluczami w tablicy lub na wykorzystaniu jego cyfr do zarządzania procesem wyboru ścieżki poszukiwań. Trzecia możliwość pozwala uniknąć całej tej grzebaniny przez wykonanie pewnych operacji arytmetycznych na K i obli czenie funkcji f ( K) , która określa położenie klucza K i stowarzyszonych z nim danych w tablicy. Rozważmy na przykład jeszcze raz zbiór 31 angielskich słów, za pomocą którego prezentowaliśmy rozmaite strategie wyszukiwania w punkcie 6.2.2 i pod rozdziale 6.3. Tabela 1 pokazuje krótki program w języku M IX, który przekształca jednoznacznie każdy z tych 31 kluczy w liczbę f ( K) z zakresu od —10 do 30. Jeśli porównamy tę metodę z programami w języku M IX realizującymi inne roz ważane przez nas metody (na przykład wyszukiwanie binarne, optymalne drzewa wyszukiwań, drzewa trie, wyszukiwanie w drzewach cyfrowych), to przekonamy się, że ma ona przewagę zarówno pod względem pamięci, jak i szybkości, z tym wyjątkiem, że wyszukiwanie binarne wymaga odrobinę mniej pamięci. W rzeczy wistości średni czas wyszukiwania zakończonego sukcesem za pomocą programu z tabeli 1 , przy częstości występowania danych z rysunku 12 , to zaledwie około 17.811, a do przechowania 31 kluczy potrzeba tylko 41 komórek w tablicy. Niestety, takie funkcje f ( K ) nie są zbyt łatwe do znalezienia. Jest 4131 « 105° możliwych funkcji ze zbioru 31-elementowego w zbiór 41-elementowy, a tylko 41 *40* ... - 1 1 = 4 1 ! / 10 ! ~ 1043 spośród nich dla każdego argumentu daje inną Tabela 1 JEDNOZNACZNE PRZEKSZTAŁCENIE ZBIORU KLUCZY W ADRESY
£ O ci tu,
ci o u*
a **
2 <
co <
-1 -1 6 6
-1 -1 10 10
- 1 - 1 - 2 - 2 —2 - 6 - 6 - 8 - 8 - 8 - 8 - 1 - 1 - 2 - 2 —2 - 6 - 6 - 8 - 8 - 8 - 8 14 18 13 14 - 5 2 5 - 1 5 - 1 5 -11 -1 1 14 18 13 14 - 5 2 5 - 1 5 - 1 5 -1 1 -1 1 2 10 10 16 2 13 14 16 14 18 2 5 2 10 10 2 2 5 2 10 10 2 13 14 16 14 18 - 7 - 7 -22 -1 9 -1 - 7 - 7 -2 2 -1 -1 9 23 20 - 7 35 23 20 - 7 35 23 20 - 7 35
H <
w 0Q
0Q
>< CQ
Q < £
<
w
g
Instrukcja LD1N LD2 INC1 J1P INC1
K ( 1 :1 ) K (2 :2 ) - 8,2
*+2
1 6 ,2 LD2 K ( 3 : 3) J2Z 9F INC1 - 2 8 ,2 9F J1P INC1 11,2 LDA K (4 :4 ) JAZ 9F DEC1 - 5 , 2 J1N INC1 9H LDA CMPA JNE
-1 -1 -9 -9 7 7 7
.
6 6 -1 8 -1 8 -3 -3 -3
.
10 10 -1 3 -1 3 3 3 3
.
,
■
9F
10 K TABLE,1 FAILURE
■
7 7 7
-3 -3 -3
3 3 3
13 13 13
14 14 14
16 16 16
9 9 9
18 18 18
23 23 23
.
9 9 19 19 19 19
-7 -7 -7
15 15 25 25 25 25
*
10 10 10
1 1 1
6.4
HASZOWANIE
553
a H
YOU
ei o
WITH
¡25 O
WHICH
Cxh O
WAS
H M
THIS
co H
THE
s M
THAT
M
NOT
HIS
wartość; tak więc zaledwie mniej więcej jedna na 10 milionów funkcji będzie się nadawać do naszych celów. Funkcje bez powtórzeń wartości są zaskakująco rzadkie, nawet w przypadku całkiem dużej tablicy. Słynny „paradoks dnia urodzin” mówi na przykład, że jeśli w pomieszczeniu znajduje się 23 lub więcej osób, to są spore szanse, że dwoje z nich będzie miało ten sam miesiąc i dzień urodzin! Inaczej mówiąc, jeśli wybierzemy losową funkcję odwzorowującą 23 klucze w tablicę rozmiaru 365, to prawdopodobieństwo tego, że żadne dwa klucze nie są odwzorowywane w to samo miejsce, wynosi tylko 0.4927 (mniej niż jedna druga). Sceptycy wątpiący w praw dziwość tego stwierdzenia powinni spróbować znaleźć takie pary o wspólnych urodzinach na najbliższym większym przyjęciu, w którym będą uczestniczyć. [Paradoks dnia urodzin w nieformalny sposób omawiali matematycy w latach trzydziestych, ale jego pochodzenie jest nieznane; zobacz I. J. Good, Probability and the Weighing of Evidence (Griffin, 1950), 38. Zobacz też R. von Mises, istanbul Üniversitesi Fen Fakültesi Mecmuasi 4 (1939), 145-163, i W. Feiler, Wstęp do rachunku prawdopodobieństwa (Warszawa. PWN, Tom I, 1980 rok), podrozdział 2.3]. Z drugiej strony, podejście zastosowane w tabeli 1 jest całkiem elastyczne [zobacz M. Greniewski i W. Turski, CACM 6 (1963), 322-323], a dla tablicy średniego rozmiaru odpowiednią funkcję można znaleźć po mniej więcej jednym dniu pracy. Tak naprawdę rozwiązywanie tego rodzaju łamigłówki dostarcza niezłej rozrywki. Stosowne techniki omawiało wielu badaczy, w tym na przykład R. Sprugnoli, CACM 20 (1977), 841-850, 22 (1979), 104, 553; R. J. Cichelli,
Zawartość rejestru r l l po wykonaniu instrukcji dla danego klucza K
-8 -8
-9 -9 -1 7
-7 - 7 -1 7 18 - 1 18 - 1 18 -1
-9 -9
- 9 - 9 -1 5 - 9 - 9 -1 5 -2 5 6 -7 -2 5 6 -7 29 25 29 5 6 25 29 5 6 25
12 12
-1 6 -1 6 -1 8 -1 8 4 4 4
-1 6 -1 6 -9 -9
22 22 22
-1 6 - -16 -5 -5 30 30 30
20 20
-2 3 -2 3 -2 3 -2 3
1 1 1 -2 6 -2 6 -1 4 -1 4 -1 4
-1 0 -10 12 12 12
-1 -1 -1
29 29 29
5 5 5
6 6 6
20 20 20
4 4 4
22 22 22
30 30 30
-1 0 -1 0 -1 0
-2 3 -2 3 -2 3 -2 3
-2 3 -2 3 -2 3 -2 3
1 1 1 1 1 1 -22 -1 8 -22 -1 8 2 -6 -6 2 2 -6 -2 -2 -6 -6 -6
-2 -2 -2
-2 3 -2 3 -1 5 -1 5 17 17
-2 6 -2 6 -3 3 -3 3 -1 6 -1 6
-2 6 -2 6
-2 6 -2 6
-2 8 -2 8
-2 6 -2 6
-2 5 -2 5
-2 0 -2 0
-2 -2 -2 17 - 1 6 -2 2 -21 -2 2 -21 11 -1 11 -1 11 -1
17 17 17
+
-5 -5
11 11 11
-5 -5 -5
0 0 0 -5 -5 29 29 29
11 11 21 21 21 21
12 12 12 8 8
8 8 8
554
WYSZUKIWANIE
6.4
CACM 23 (1980), 17-19; T. J. Sager, CACM 28 (1985), 523-532, 29 (1986), 557; B. S. Majewski, N. C. Wormald, G. Havas i Z. J. Czech, Comp. J. 39 (1996), 547-554; Czech, Havas i Majewski, Theoretical Comp. Sci. 182 (1997), 1-143. Teoretyczne ograniczenia doskonałych funkcji haszujących rozważają w swoim artykule J. Kórner i K. Marton [Europ. J. Combinatorics 9 (1988), 523-530]. Oczywiście ta metoda ma poważną wadę: zawartość tablicy musi być zna na z góry; dodanie jeszcze jednego klucza prawdopodobnie wszystko zepsuje, zmuszając nas do rozpoczęcia wszystkiego prawie od zera. Znacznie bardziej uniwersalną metodę możemy uzyskać, nie upierając się przy jednoznaczności: dopuszczając sytuacje, w których różne klucze dają tę samą wartość f ( K) , i stosując specjalną metodę rozstrzygania wszelkich niejednoznaczności po obli czeniu f ( K) . Takie rozważania przywodzą nas do popularnej klasy metod wyszukiwania powszechnie znanych jako techniki haszowania lub pamięci rozproszonej. Angiel ski czasownik „to hash” oznacza siekanie lub mieszanie czegoś; idea haszowania polega na „wyrwaniu” pewnych własności klucza i zastosowaniu tej częściowej informacji jako podstawy do wyszukiwania. Obliczamy adres haszowania h(K) i od tego miejsca zaczynamy wyszukiwanie. Paradoks dnia urodzin mówi nam, że prawdopodobnie będą istniały różne klucze Ki ^ K j , które są haszowane na tę samą wartość h(Ki) = h(Kj). Takie zdarzenie jest określane jako kolizja; wynaleziono kilka interesujących sposobów podejścia do rozwiązywania problemu kolizji. Żeby używać tablicy z haszowaniem, programiści muszą podjąć dwie niemal niezależne decyzje: wybrać funkcję haszującą h(K), a także wybrać metodę rozwiązywania kolizji. Przystąpimy teraz do omówienia po kolei tych dwóch aspektów naszego problemu. Funkcje haszujące. Żeby postawić sprawę jaśniej, w całym tym podrozdziale będziemy zakładać, że nasza funkcja haszująca h przyjmuje co najwyżej M różnych wartości i spełnia warunek 0 < h(K) < M
(i)
dla każdego klucza K. Klucze w rzeczywistych plikach występujących w praktyce zazwyczaj zawierają sporo redundancji; żeby zmniejszyć liczbę kolizji, musimy postarać się znaleźć funkcję haszującą, która rozbije grupy niemal identycznych kluczy. Teoretycznie niemożliwe jest zdefiniowanie funkcji haszującej, która wy twarza naprawdę losowe dane z danych nielosowych w rzeczywistych plikach. W praktyce jednak nie jest trudno wyprodukować całkiem niezłą imitację da nych losowych za pomocą prostych operacji arytmetycznych, co omawialiśmy w rozdziale 3. W rzeczywistości często możemy poradzić sobie jeszcze lepiej, wy korzystując nielosowe własności faktycznych danych do skonstruowania funkcji haszującej dającej mniej kolizji niż miałoby to miejsce w przypadku naprawdę losowych kluczy. Rozważmy na przykład przypadek kluczy 10-cyfrowych na komputerze dzie siętnym. Jednym z nasuwających się na myśl sposobów określenia funkcji ha szującej jest przyjęcie, powiedzmy, M = 1000 i wzięcie jako h(K) trzech cyfr
HASZOWANIE
6.4
555
wybranych gdzieś z okolicy środka 20-cyfrowego iloczynu K x K. Wydaje się to dawać dość dobre rozproszenie wartości w zakresie od 000 do 999, z małym prawdopodobieństwem kolizji. Eksperymenty z rzeczywistymi danymi faktycznie pokazują, że ta metoda „środka kwadratu” nie jest zła, o ile klucze nie mają wielu wiodących lub końcowych zer; okazuje się jednak, że istnieją bezpieczniejsze i roz sądniejsze sposoby postępowania, podobnie jak w rozdziale 3 stwierdziliśmy, że metoda środka kwadratu nie jest specjalnie dobrym generatorem liczb losowych. Szeroko zakrojone testy typowych plików pokazały, że całkiem dobrze spraw dzają się dwa główne typy funkcji haszujących. Jeden z nich jest oparty na dzieleniu, a drugi na mnożeniu. Metoda z dzieleniem jest szczególnie łatwa; po prostu korzystamy z reszty modulo M: h(K) = K mod M. (2) W tym przypadku niektóre wartości M są oczywiście o wiele lepsze niż inne. Jeśli na przykład M jest liczbą parzystą, to h(K) będzie zawsze parzyste dla parzy stego K i nieparzyste dla nieparzystego K , a to będzie prowadziło do znaczących wypaczeń w wielu plikach. Jeszcze gorzej byłoby przyjąć za M potęgę podsta wy architektury komputera, ponieważ wówczas wartość K mod M to po prostu najmniej znaczące cyfry klucza K (nie zależy od pozostałych cyfr). Podobnie możemy argumentować, że M zapewne nie powinno być wielokrotnością liczby 3; jeśli bowiem klucze są alfabetyczne, to dla dwóch kluczy różniących się tylko permutacją liter różnica ich wartości numerycznych byłaby wielokrotnością 3. (Tak się dzieje, ponieważ 22n mod3 = 1 i 10n mod 3 = 1). Ogólnie, chcemy unikać wartości M, które dzielą r k ± a, gdzie A: i a są małymi liczbami, r zaś jest podstawą zbioru znaków alfabetu (zazwyczaj r = 64, 256 lub 100), ponieważ reszta modulo taka wartość M w wielu przypadkach bywa prostą kombinacją cyfr klucza. Takie rozważania sugerują, żeby wybrać jako M taką liczbę pierwszą, że rk ^ ±a (modulo M ) dla małych k i a. Stwierdzono, że ten wybór jest w większości przypadków zupełnie satysfakcjonujący. Na przykład na komputerze maszyny MIX moglibyśmy wybrać M = 1009, obliczając h{K) za pomocą ciągu instrukcji K
r X <— K .
ENTA 0
r A «— 0.
D IV
rX <-
LDX
= 10 0 9 =
K
(3 ) m o d 1009.
Multiplikatywny schemat haszowania jest równie łatwy do zrealizowania, ale nieco trudniejszy do opisania, ponieważ musimy wyobrazić sobie, że operujemy ułamkami, a nie liczbami całkowitymi. Niech w będzie rozmiarem słowa ma szynowego, czyli zazwyczaj 1010 lub 230 w przypadku MIX; możemy traktować liczbę całkowitą A jako ułamek A /w , jeśli wyobrazimy sobie kropkę pozycyjną umieszczoną na lewo od słowa. Metoda polega na wybraniu pewnej całkowitej stałej A względnie pierwszej z w i wzięciu
556
WYSZUKIWANIE
6.4
W tym przypadku zwykle jako M bierzemy potęgę 2 na komputerze binarnym, więc h(K) składa się z wiodących bitów najmniej znaczącej połowy iloczynu AK. W kodzie MIX, jeśli przyjmiemy M = 2m i założymy użycie podstawy binarnej, to multiplikatywną funkcję haszującą oblicza ciąg instrukcji LDA MUL ENTA SLB
K rA <—K. A rAX <—AK. 0 rAX <- AK mod w. m Przesuń rAX o m bitów w lewo.
, ,
Teraz h(K) znajduje się w rejestrze A. Ponieważ na maszynie MIX instrukcje mnożenia i przesuwania działają dość wolno, wykonanie tego ciągu instrukcji zajmuje dokładnie tyle samo czasu co obliczenie (3); jednak na wielu maszynach mnożenie jest znacząco szybsze niż dzielenie. W pewnym sensie tę metodę można potraktować jako uogólnienie meto dy (3), ponieważ moglibyśmy na przykład jako A wziąć przybliżenie wartości n;/1009; mnożenieprzez odwrotność stałej jest często szybsze niżdzielenie przez tę stałą. Technika (5 ) to niemalże metoda„środka kwadratu”, ale jest jedna waż na różnica: zobaczymy, że mnożenie przez odpowiednią stałą ma dobre własności, które dają się udowodnić. Jedną z przyjemnych cech schematu multiplikatywnego jest to, że nie tra cimy żadnej informacji, wykonując obliczenia na rejestrze A w (5); moglibyśmy z powrotem wyznaczyć K , znając jedynie zawartość rAX po zakończeniu wyko nywania (5). Powodem jest to, że A jest względnie pierwsze z w, więc można użyć algorytmu Euklidesa do znalezienia stałej A! takiej, że AA! mod w = 1; stąd wynika, że K = (A'(AFf mod w)) mod w. Innymi słowy, jeśli f ( K ) oznacza zawartość rejestru X tuż przed wykonaniem instrukcji SLB w (5), to z tego, że
Ki ^ K 2
wynika, że
f { Ki ) ^ f ( K 2).
(6)
Oczywiście f ( K ) przyjmuje wartości z zakresu od 0 do w —1 , więc nie nadaje się na funkcję haszującą, ale może być bardzo pożyteczna jako funkcja rozrzucająca, czyli funkcja spełniająca warunek (6), która ma tendencję do losowego rozprasza nia kluczy. Taka funkcja może być bardzo przydatna w połączeniu z algorytmami przeszukiwania drzewa z punktu 6 .2.2, jeśli kolejność kluczy jest nieistotna, ponieważ eliminuje ona niebezpieczeństwo degeneracji drzewa przy wstawianiu kluczy w porządku rosnącym. (Zobacz ćwiczenie 6.2.2-10). Funkcja rozrzucają ca jest również użyteczna w połączeniu z algorytmem przeszukiwania drzewa cyfrowego z podrozdziału 6.3, jeśli bity kluczy przejawiają nierównomierności. Inną cechą multiplikatywnej metody haszowania jest to, że robi ona do bry użytek z nielosowości charakteryzującej wiele plików. Rzeczywiste zbiory kluczy często w większości składają się z postępów arytmetycznych, zawierając wszystkie elementy ciągu {K, K + d, K + 2d,..., K+ id}; rozważmy na przykład nazwy alfabetyczne takie jak {PARTI, PART2, PART3} czy {TYPEA, TYPEB, TYPEC}. Multiplikatywna metoda haszowania przekształca postęp arytmetyczny na przy bliżenie postępu arytmetycznego h(K), h( K + d), h( K + 2d), . . . , składające się z różnych wartości, co redukuje liczbę kolizji w stosunku do tego, czego
6.4
HASZOWANIE
557
1 •--------------------
{n *}
0 •0
1
2
3
4
5
6
7
8
9
10
11
12
13
n
R y s. 37. Haszowanie Fibonacciego.
moglibyśmy oczekiwać w sytuacji losowej. Metoda z dzieleniem ma tę samą własność. Na rysunku 37 jest pokazany ten aspekt haszowania multiplikatywnego w szczególnie interesującym przypadku. Przypuśćmy, że iloraz A / w jest w przy bliżeniu równy złotej proporcji -1}, {20 “1}, {3>-1}, . .. , gdzie {x} oznacza część ułamkową z x (czyli x — [x\ lub inaczej x mod 1). Jak pokazuje rysunek 37, zaznaczane punkty są dobrze oddzie lone od siebie nawzajem; w rzeczywistości każdy nowo dodany punkt wpada do któregoś z największych pozostających przedziałów i dzieli go w złotej proporcji! [Występowanie tego zjawiska jako pierwszy w formie hipotezy zasygnalizował J. Oderfeld, a udowodnił S. Świerczkowski, Fundamenta Math. 46 (1958), 187-189. W dowodzie ważną rolę odgrywają liczby Fibonacciego]. Ta ważna własność rozrzucania przejawiana przez złotą proporcję to w rze czywistości tylko szczególny przypadek bardzo ogólnego wyniku, który jako hi potezę podał Hugo Steinhaus, a jako pierwsza udowodniła Vera Turan Sos [Acta Math. Acad. Sci. Hung. 8 (1957), 461-471; Ann. Univ. Sci. Budapest. Eótvós Sect. Math. 1 (1958), 127-134]: Twierdzenie S. Niech 0 będzie dowolną liczbą niewymierną. Jeśli na odcinku [0 .. 1] umieścimy punkty { 0}, { 20}, . . . , {n0}7 t o n -hl powstałych odcinków ma co najwyżej trzy różne długości. Co więcej, następny punkt { ( n + 1)0} wpadnie do któregoś z największych istniejących odcinków. | Tak więc punkty {0}, {20},..., {n6} są rozproszone bardzo równomiernie między 0 a 1. Jeśli 0 jest liczbą wymierną, to zachodzi takie samo twierdzenie, o ile nadamy odpowiednią interpretację odcinkom długości 0, które pojawiają się dla n większego bądź równego mianownikowi ułamka 0. Dowód twierdzenia S, wraz ze szczegółową analizą struktury stanowiącej podstawę całej konstrukcji, znajduje się w ćwiczeniu 8; okazuje się, że odcinki danej długości powstają i znikają
558
6.4
WYSZUKIWANIE
zgodnie z zasadą „pierwszy na wejściu - pierwszy na wyjściu”. Oczywiście, niektóre wartości 9 są lepsze niż inne, ponieważ na przykład wartość bliska 0 lub 1 będzie na początku dawać wiele małych odcinków i jeden duży. Celem l 2 ćwiczenia 9 jest pokazanie, że dwie liczby 1 i 1 —~lw liczbę całkowitą względnie pierwszą z w. Gdyby na przykład MIX był komputerem dziesiętnym, to wzięlibyśmy —
A =
+
61 80 33 98 I 87 I .
(7)
Ten mnożnik będzie bardzo ładnie rozrzucał klucze alfabetyczne takie jak LIST1, LIST2, LIST3. Zobaczmy jednak, co się stanie, jeśli ciąg arytmetyczny występuje na czwartej pozycji, jak w przypadku kluczy SUM1U, SUM2U, SUM3U: efekt jest taki, jak gdybyśmy zastosowali twierdzenie S z wartością 6 = {lOTA/rc} = 0.80339887 zamiast z 9 — 0.6180339887 = A/w. Wynikowe zachowanie jest nadal przyzwoite, pomimo faktu, że ta wartość 9 nie jest tak dobra jak A2uuu> A3UUu, to efektywnie 9 jest równa 0.9887, a ta wartość jest zapewne zbyt bliska 1 . Z tego względu lepiej spisywałby się mnożnik taki jak A =
+
61 61 61 61 61
zamiast (7 ); taki mnożnik będzie separował ciągi kolejnych kluczy różniących się na dowolnej pozycji. Niestety, z takim wyborem wiąże się inny problem, analo giczny do trudności dzielenia przez r k ± 1. Występuje tendencja do haszowania kluczy takich jak XY i YX w to samo miejsce! Jednym ze sposobów uniknięcia tej trudności jest bliższe przyjrzenie się strukturze leżącej u podstaw twierdzenia S. Dla krótkich sekwencji kluczy znaczenie ma tylko kilka pierwszych ilorazów częściowych ułamka łańcuchowego reprezentującego #, przy czym małe ilorazy częściowe odpowiadają dobrym własnościom rozpraszania. Tak więc stwierdza my, że najlepsze wartości 9 leżą w zakresach
Można znaleźć wartość A taką, że każdy z jej bajtów leży w dobrym zakresie i nie jest zbyt bliski wartościom pozostałych bajtów ani ich dopełnieniom, na przykład A =
+
61 25 42 33 71 .
(8)
Taki mnożnik jest godny polecenia. (Powyższe idee dotyczące haszowania multiplikatywnego pochodzą w dużej mierze od R. W. Floyda). Dobra funkcja haszująca powinna spełniać dwa warunki: a) jej obliczanie powinno być bardzo szybkie, b) powinna minimalizować liczbę kolizji.
6.4
HASZOWANIE
559
Własność (a) jest zależna od maszyny, a własność (b) jest zależna od danych. Gdyby klucze były naprawdę losowe, wówczas moglibyśmy po prostu wydobywać z nich po kilka bitów i używać ich jako wartości funkcji haszującej; w praktyce, żeby spełniony był warunek (b), prawie zawsze musimy jednak stosować funkcję haszującą, której wartość zależy od wszystkich bitów klucza. Jak dotąd rozważaliśmy kwestię haszowania kluczy składających się z jed nego słowa. Z kluczami złożonymi z wielu słów lub z kluczami zmiennej długości można sobie radzić za pomocą rozszerzeń wielokrotnej precyzji przedstawionych wyżej metod, ale ogólnie rzecz biorąc sensowne jest przyspieszenie całej operacji polegające na sklejeniu ze sobą poszczególnych słów w pojedyncze słowo, a na stępnie wykonaniu jednego mnożenia lub dzielenia jak wyżej. Sklejenia można dokonać, stosując dodawanie mod w lub wyłączną alternatywę na komputerze binarnym; obydwie te operacje mają tę zaletę, że są odwracalne, czyli zależą od wszystkich bitów obydwu swoich argumentów, a wyłączna alternatywa stanowi niekiedy lepszy wybór, ponieważ pozwala uniknąć przepełnienia arytmetyczne go. Obydwie te operacje są jednak przemienne, zatem ( X, Y ) i (Y, X ) zostaną odwzorowane na ten sam adres; G. D. Knott zaproponował sposób wybrnięcia z tego problemu polegający na wykonaniu cyklicznego przesunięcia tuż przed zastosowaniem operacji dodawania lub wyłącznej alternatywy. Jeszcze lepszym sposobem haszowania kluczy K = X\X^ . -. xi składających się z l znaków, albo l słów, jest obliczenie h(K) = (hi(xi) + h2(x2) H
b hi{xij) mod M,
(9)
gdzie każde hj jest niezależną funkcją haszującą. Ta idea, wprowadzona przez J. L. Cartera i M. N. Wegmana w 1977 roku, jest szczególnie efektywna w przy padku, kiedy każde Xj jest pojedynczym znakiem, ponieważ możemy wówczas użyć wstępnie obliczonej tablicy dla każdego hj. Dzięki takim tablicom mnożenie staje się niepotrzebne; jeśli M jest potęgą 2, to możemy uniknąć dzielenia we wzorze (9), zastępując dodawanie wyłączną alternatywą. Tak więc funkcja (9) na pewno spełnia warunek (a). Co więcej, Carter i Wegman udowodnili, że jeśli funkcje hj są wybierane losowo, to własność (b) będzie zachodzić niezależnie od danych wejściowych. (Zobacz ćwiczenie 72). Zaproponowano o wiele więcej metod haszowania, ale nie wykazano przewagi żadnej z nich nad opisanymi wyżej prostymi metodami. Przegląd całego szeregu podejść do tego zagadnienia wraz ze szczegółowymi statystykami dotyczącymi ich wydajności dla rzeczywistych plików przedstawiają w swoim artykule V. Y. Lum, P. S. T. Yuen i M. Dodd, CACM 14 (1971), 228-239. Spośród wszystkich innych metod haszowania, których próbowano, zapewne najciekawsza jest technika oparta na algebraicznej teorii kodowania; jej idea jest analogiczna do opisanej wyżej metody z dzieleniem, z tym że dzielimy przez wielomian modulo 2 zamiast przez liczbę całkowitą. (Jak odnotowano w podroz dziale 4.6, ta operacja ma się tak do dzielenia, jak dodawanie ma się do wyłącznej alternatywy). W tej metodzie M powinno być potęgą 2, powiedzmy M — 2m, i korzystamy z wielomianu m-tego stopnia P(x) = x m + + ■• • + poBinarny klucz o n cyfrach K = (kn- i ... ki £0)2 traktujemy jako wielomian
560
6.4
WYSZUKIWANIE
K(x) = kn_ ix n-1 + ■• ■+ k\X + ko i obliczamy resztę K ( x ) m od P ( x ) = h rrl- i x rn~ 1 + • • - + h \ x + /io,
stosując arytmetykę wielomianów modulo 2; teraz h(K) = (hm- i • • *h\ ńo)2Jeśli wielomian P(x) jest odpowiednio dobrany, to można zagwarantować, że ta funkcja haszująca będzie unikała kolizji między prawie równymi kluczami. Jeśli na przykład n = 15, m — 10 i P(x) =
X 10
+ x8 + x5 + x 4 +
X2
+
X
+ 1,
(io)
to można pokazać, że h{K\) nie będzie równe ń(iU2), o ile tylko K\ i K 2 są różnymi kluczami, które różnią się na mniej niż siedmiu pozycjach bitowych. (W ćwiczeniu 7 można znaleźć dalsze informacje dotyczące tego schematu; oczy wiście lepiej nadaje się on do realizacji sprzętowej lub w formie mikroprogramu niż do zwykłego zaprogramowania). Często dogodnie jest stosować stałą funkcję haszującą h(K) = 0 podczas usuwania błędów z programu, ponieważ wszystkie klucze będą wówczas zgroma dzone razem; efektywną funkcję h(K) można wstawić później. Rozwiązywanie kolizji m etodą łańcuchową. Zauważyliśmy, że przy haszowaniu na niektóre adresy zostanie prawdopodobnie odwzorowanych więcej kluczy niż na nie przypada. Zapewne najbardziej oczywistym sposobem rozwiązania tego problemu jest utrzymywanie M list, po jednej na każdy możliwy wynik haszowania. Każdy rekord powinien zawierać pole L IN K , a dodatkowo powinno się przechowywać M wskaźników do początków list, ponumerowanych, powiedzmy, od 1 do M. Po obliczeniu wartości funkcji haszującej dla klucza wykonujemy po prostu sekwencyjne przeszukanie na liście o numerze h(K) + l. (Zobacz ćwiczenie 6.1-2. Ta sytuacja jest bardzo podobna do sortowania przez wstawianie na wiele list z programu 5.2.IM). Na rysunku 38 jest pokazany ten prosty schemat łańcuchowy z M = 9 dla ciągu siedmiu kluczy K
= EN , T O , T R E , F I R E , FEM , S E K S , S Y V
(n )
(liczebniki od 1 do 7 w języku norweskim) o wynikach haszowania, odpowiednio, h(K) + 1 = 3, 1 , 4, 1 , 5, 9, 2.
( 12)
Pierwsza lista ma dwa elementy, a trzy listy są puste. Metoda łańcuchowa jest całkiem szybka, ponieważ listy są krótkie. Jeśli 365 osób zbierze się razem w jednym pomieszczeniu, to prawdopodobnie będzie wiele par osób mających urodziny tego samego dnia, ale średnia liczba osób o dowolnym ustalonym dniu urodzin będzie równa tylko 1 ! Ogólnie, jeśli jest N kluczy i M list, to średnia długość listy wynosi N / M ; tak więc haszowanie zmniejsza średnią ilość pracy potrzebnej przy wyszukiwaniu sekwencyjnym z grubsza o czynnik M. (Dokładny wzór jest wyprowadzony w ćwiczeniu 34). Ta metoda stanowi prostą kombinację omawianych wcześniej technik, więc nie ma potrzeby formułowania szczegółowego algorytmu dla tablic z haszowaniem
6.4
HASZOWANIE
HEAD [ 1 ] :
TO
HEAD [2 ]:
SYV
A
HEAD [3 ]:
EN
A
HEAD[4 ]:
TRE
A
HEAD [5 ]:
FEM
A
SEKS
A
HEAD [6 ]:
A
HEAD [7 ]:
A
HEAD [8 ]:
A
HEAD [9 ]:
>
>
FIRE
561
A
R y s. 38. Metoda łańcuchowa z osobnymi listami.
łańcuchowym. Często dobrym pomysłem jest przechowywanie poszczególnych list uporządkowanych względem wartości klucza, co przyspiesza wstawianie i wy szukiwanie zakończone niepowodzeniem. Jeśli zatem zdecydujemy się na listy w porządku rosnącym, to węzły TO i FIRE na rysunku 38 zamieniłyby się miej scami, a wszystkie dowiązania A zostałyby zastąpione przez wskaźniki do sztucz nego rekordu, którego kluczem jest oc. (Zobacz algorytm 6 .1 T). Alternatywnie moglibyśmy skorzystać z idei „samoorganizacji”, omówionej w podrozdziale 6 .1 ; zamiast przechowywać listy uporządkowane względem wartości kluczy, można ustawiać klucze w kolejności czasu ostatniego odwołania do klucza. Ze względu na szybkość działania chcielibyśmy, żeby wartość M była dość duża. Jeśli jednak M jest duże, to wiele list będzie pustych i duża część pamięci przeznaczonej na M początków list będzie się marnować. To sugeruje inne po dejście w przypadku, kiedy rekordy są małe. Możemy nałożyć na siebie pamięć rekordów i początki list, czyniąc miejsce łącznie na M rekordów i M dowiązań zamiast na N rekordów i M + N dowiązań. Niekiedy można wykonać jeden przebieg przez wszystkie dane, żeby stwierdzić, których początków list użyjemy, a następnie wykonać drugi przebieg, wstawiając wszystkie „nadmiarowe” rekordy w puste miejsca. Często jednak jest to niepraktyczne lub niemożliwe; chcie libyśmy raczej dysponować techniką, która pozwala przetwarzać każdy rekord tylko raz, kiedy po raz pierwszy wchodzi on do systemu. Poniższy algorytm, autorstwa F. A. Williamsa [CACM 2,6 (June 1959), 21-24], stanowi dogodny sposób rozwiązania tego problemu. Algorytm C (Wyszukiwanie i wstawianie do tablicy z haszowaniem łańcucho wym). Ten algorytm szuka danego klucza K w tablicy M-elementowej. Jeśli klucza K nie ma w tablicy, a nie jest ona pełna, to klucz K jest wstawiany. Elementy tablicy są oznaczane jako TABLE[z] dla 0 < i < M; są one dwóch odróżnialnych typów: pusty i zajęty. Element zajęty zawiera pole z kluczem KEY[i] i pole z dowiązaniem LINK [z] oraz być może inne pola.
562
6.4
WYSZUKIWANIE
> C l. Haszowanie
(^C2. Czy istnieje lista?
Nie
Tak V
(^C3. P o ró w n aj^" K
= KEY [i]
Y SUKCES
C4. Przejdź do następnego Koniec listy
C5. Znajdź pusty element
R^O Y
C6. Wstaw nowy klucz
v
PRZEPEŁNIENIE
R y s. 39. Wyszukiwanie i wstawianie do tablicy z haszowaniem łańcuchowym.
Algorytm korzysta z funkcji haszującej h(K). Wykorzystywana jest również pomocnicza zmienna i?, przydatna przy znajdowaniu pustych miejsc; jeśli tablica jest pusta, to mamy R — M + 1, a przy wykonywaniu wstawień zawsze będzie spełniony warunek mówiący, że element TABLE[j] jest zajęty dla każdego j z zakresu R < j < M. Zgodnie z przyjętą konwencją element TABLE[0] zawsze będzie pusty. C l. [Haszowanie] Przyjmij i <—h(K) + 1 . (Teraz 1 < i < M). C2. [Czy istnieje lista?] Jeśli element TABLE[z] jest pusty, to idź do kroku C6. (W przeciwnym razie element TABLE[z] jest zajęty; będziemy przeszukiwać listę zajętych elementów zaczynającą się w tym miejscu). C3. [Porównywanie] Jeśli K = KEY[ż], to algorytm kończy działanie z sukcesem. C4. [Przejście do następnego] Jeśli LINK [z] ^ 0, to przyjmij i do kroku C3.
LINK [ż] i wróć
C5. [Znalezienie pustego elementu] (Przeszukiwanie zakończyło się niepowodze niem i chcemy znaleźć pustą pozycję w tablicy). Zmniejsz R raz lub więcej razy, do momentu znalezienia takiej wartości, że element TABLE[R] jest pusty. Jeśli R = 0, to algorytm kończy działanie, sygnalizując przepełnienie (nie ma już pustych miejsc); w przeciwnym razie przyjmij LINK [z] R, i <— R. C 6 . [Wstawianie nowego klucza] Zaznacz element TABLE [z] jako zajęty, z KEY[ż] <—K oraz LINK [ż] <—0. | Ten algorytm umożliwia sklejanie się wielu list, więc po wstawieniu rekordów do tablicy nie trzeba ich przesuwać. Zobacz na przykład rysunek 40, gdzie klucz SEKS znajduje się na liście zawierającej TO i FIRE, ponieważ ten ostatni klucz został już wcześniej wstawiony na pozycji 9. Żeby zobaczyć, jak zachowuje się algorytm C w porównaniu z innymi meto dami z tego rozdziału, 'możemy napisać program na maszynę MIX. Przedstawiona poniżej analiza wskazuje, że listy zajętych komórek zazwyczaj bywają krótkie, a ten program został zaprojektowany z uwzględnieniem tego faktu.
HASZOWANIE
6.4 TABLE[ 1 ]
TO
•—
TABLE[2]
SYV
A
TABLE[3]
EN
A
TABLE[4]
TRE
A
TABLE[5]
FEM
A
TABLE[8]
SEKS
A
TABLE[9]
FIRE
•—
563
TABLE[6] TABLE[7]
R y s. 40. Metoda łańcuchowa ze sklejaniem list.
Program C (Wyszukiwanie i wstawianie do tablicy z haszowaniem łańcucho wym). Dla wygody zakładamy, że klucze mają tylko po trzy bajty długości, a elementy są reprezentowane następująco: element pusty element zajęty
—
1
+
LINK
0
1
0
0
0
1 ! KEY 1 i
( 13)
Zakładamy, że rozmiar tablicy M jest liczbą pierwszą; wartość TABLE[z] jest przechowywana pod adresem TABLE + ż. rll = ż, rA = K ; rI2 = LINK [z] i/lub R . 01 KEY EQU 3 :5 02 LINK EQU 0 :2 03 START LDX K 1 Cl. Haszowanie. ENTAO 1 04 DIV =M= 1 05 06 STX * + 1 (0 :2 ) 1 07 ENT1 * 1 i <- h( K ). 08 INCH 1 + 1. LDA K 1 09 LD2 TABLE,!(LINK) 1 C2. Czy istnieje lista? 10 11 J2N 6 F 1 Do C6 , jeśli TABLE[z] pusty. CMPATABLE, 1 (KEY) A C3. Porównaj. 12 A JE SUCCESS Wyjście, jeśli K = KEY [ż] . 13 J2Z 5F A - S l Do C5, jeśli LINK [z] = 0. 14 15 4H ENT10 ,2 C - 1 C4. Przejdź do następnego. CMPATABLE, 1 (KEY) 16 C - 1 C3. Porówna j. 17 JE SUCCESS c - 1 Wyjście, jeśli K = KEY[ż] . 18 LD2 TABLE,1 (LINK) C —1—S2 C —1—S2 Przesuń, jeśli LINK [z] 7^ 0. 19 J2NZ4B 20 5H C5. Znajdź pusty element. LD2 R A -S DEC21 T R ^R -1. 21 LDX TABLE,2 T 22 JXNN+-2 T Powtarzaj dotąd, aż TABLE [ 23 J2Z OVERFLOW Wyjście, jeśli nie ma już pust A S 24 25 ST2 TABLE,1 (LINK) LINK [z] <- R. A S
564
WYSZUKIWANIE
26 21 28 6H 29
6.4
ENT10 ,2 ST2 R STZ TABLE,1 (LINK) STA TABLE, l(KEY)
A -S A~S 1 -5 1 -5
i *- R. Uaktualnij R w pamięci. C6. Wstaw nowy klucz. LINK [i] < -0 . K E Y [ż]^ iY |
Czas działania tego programu zależy od następujących wielkości: C = liczba elementów tablicy odwiedzonych przy przeszukiwaniu; A = [początkowa wartość znaleziona w zajętym elemencie]; 5 = [przeszukiwanie zakończyło się sukcesem]; T = liczba elementów tablicy odwiedzonych podczas szukania wolnego miejsca. Przyjmijmy tu 5 = 51 + S 2, gdzie 51 = 1, jeśli sukces został uzyskany w pierw szej próbie. Łączny czas działania fazy przeszukiwania w programie C jest równy (7C + 4^4 + 17 —35 + 251)u, a wstawienie nowego klucza, jeśli 5 = 0, zajmuje dodatkowo czas (SA + 4T + 4) u. Przypuśćmy, że na początku działania tego programu w tablicy jest N kluczy i niech a = N / M = współczynnik wypełnienia tablicy. ( 14) Wówczas średnia wartość A w przypadku wyszukiwania zakończonego niepo wodzeniem to oczywiście a, jeśli funkcja haszująca jest losowa; w ćwiczeniu 39 dowodzi się, że średnia wartość C w przypadku wyszukiwania zakończonego niepowodzeniem jest równa i
2 \N
M/
2N \
e2a —1 —2a - ' - M J “ 1 + ------- 4 • 1
i
<‘5>
Tak więc jeśli tablica jest wypełniona do połowy, to średnia liczba prób podczas wyszukiwania zakończonego niepowodzeniem wynosi około \(e + 2) ~ 1.18; ale nawet w sytuacji, kiedy tablica zostaje całkowicie wypełniona, średnia liczba prób wykonanych tuż przed wstawieniem ostatniego klucza wyniesie tylko około ~(e2 + 1) « 2.10. Jak pokazuje ćwiczenie 40, odchylenie standardowe jest rów nież małe. Te statystyki dowodzą, że listy pozostają krótkie, pomimo tego, że algorytm niekiedy pozwala im się sklejać, o ile funkcja haszująca jest losowa. Oczywiście C może osiągać nawet wartość N, jeśli funkcja haszująca jest zła lub jeśli mamy niesłychanego pecha. W przypadku wyszukiwania zakończonego sukcesem zawsze mamy ^4 = 1 . Średnią liczbę prób w trakcie wyszukiwania zakończonego sukcesem można ob liczyć, sumując wielkość C + A po pierwszych N wyszukiwaniach zakończonych niepowodzeniem i dzieląc wynik przez N, jeśli założymy, że każdy klucz jest jednakowo prawdopodobny. Jako średnią liczbę prób w wyszukiwaniu losowego klucza zakończonym sukcesem dostajemy zatem
0^ k < N
X e2a — 1 — 2 a
a
HASZOWANIE
6.4
565
Znalezienie klucza nawet w pełnej tablicy będzie wymagało średnio zaledwie około 1.80 prób! Podobnie (zobacz ćwiczenie 42), średnią wartością 51 okazuje się być 51jv = 1 —±((N - 1)/ M) « 1 - \a. ( 17 ) Na pierwszy rzut oka może się wydawać, że krok C5 jest nieefektywny, po nieważ odbywa się w nim sekwencyjne szukanie pustej pozycji. Faktycznie jednak łączna liczba odwołań do tablicy wykonywanych w kroku C5 podczas jej rozbudo wywania nigdy nie przekroczy liczby kluczy w tablicy; średnio wykonujemy więc co najwyżej jedno takie odwołanie na każde wstawienie. W ćwiczeniu 41 dowodzi się, że w przypadku wyszukiwania zakończonego sukcesem T jest w przybliżeniu równe aea. Można by tak zmodyfikować algorytm C, żeby żadne dwie listy się nie sklejały, ale wówczas konieczne stałoby się przesuwanie rekordów. Rozważmy na przykład sytuację z rysunku 40, tuż przed naszą próbą wstawienia klucza SEKS na pozycję 9; żeby listy pozostały osobne, trzeba by przesunąć klucz FIRE, a w tym celu konieczne stałoby się odkrycie, który element zawiera wskaźnik do FIRE. Moglibyśmy rozwiązać ten problem bez wprowadzania wskaźników w obie strony, haszując FIRE i przeszukując jego listę zgodnie z sugestią D. E. Fergusona, ponieważ listy są krótkie. Ćwiczenie 34 pokazuje, że średnia liczba prób w przypadku, kiedy nie sklejamy list, zmniejsza się do CfN = H CjV = l +
N(N-l) a2 ——g— ~ 1 + t t £i±Vl
—
¿a
£
£¿1 + ^ £
(wyszukiwanie zakończone niepowodzeniem); ( 18) (wyszukiwanie zakończone sukcesem).
( 19 )
To nie jest wystarczające ulepszenie w stosunku do wielkości ( 15 ) i ( 16 ), żeby uzasadniało zmianę algorytmu. Z drugiej strony, Butler Lampson zauważył, że w metodzie łańcuchowej więk szą część pamięci potrzebnej na dowiązania można w rzeczywistości zaoszczędzić, jeśli unikamy sklejania list. To prowadzi do interesującego algorytmu omówionego w ćwiczeniu 13. W metodzie Lampsona wprowadzony jest bit znacznikowy w każ dym elemencie, a średnia liczba prób koniecznych w przypadku wyszukiwania zakończonego niepowodzeniem nieznacznie się zmniejsza, z ( 18) do 1 \N N 1 - —- ) + — ~ e
a + a.
( i 8 7)
M) M v 7 Metodę łańcuchową z osobnymi listami, jakna rysunku 38, można stosować, kiedy N > M, więc w tym przypadkuprzepełnienie nie stanowi poważnego problemu. Kiedy listy sklejają się jak na rysunku 40 i w algorytmie C, możemy umieszczać dodatkowe klucze w pomocniczym obszarze pamięci; L. Guibas udo wodnił, że średnia liczba prób przy wstawianiu (M + L + l)-go klucza wynosi wówczas (L/ 2M + !) ((l + 2/ M) M- l ) Zazwyczaj lepiej jest jednak stosować alternatywny schemat, zgodnie z którym umieszczamy pierwsze kolidujące ele menty w pomocniczym obszarze pamięci, pozwalając na sklejanie się list dopiero wtedy, kiedy ten pomocniczy obszar się zapełni; zobacz ćwiczenie 43.
566
WYSZUKIWANIE
6.4
Rozwiązywanie kolizji przez „adresowanie otwarte” . Inny sposób roz wiązywania problemu kolizji, pozwalający obywać się zupełnie bez dowiązań, polega po prostu na przeglądaniu elementów tablicy jeden po drugim aż do znalezienia klucza K albo pustej pozycji. Idea polega na sformułowaniu pewnej reguły, zgodnie z którą każdy klucz K określa „ciąg prób”, czyli ciąg pozycji w tablicy, które należy sprawdzić przy wstawianiu lub szukaniu klucza K . Jeśli podczas szukania klucza K z użyciem ciągu prób określonego przez K natrafimy na pustą pozycję, to wnioskujemy, że klucza K nie ma w tablicy, ponieważ za każdym razem przy przetwarzaniu K będzie wykonywany taki sam ciąg prób. Tej ogólnej klasie metod nazwę adresowanie otwarte nadał W. W. Peterson [IBM J. Research & Development 1 (1957), 130-146]. W najprostszym schemacie adresowania otwartego, znanym jako próbkowa nie liniowe, stosowany jest cykliczny ciąg prób h(K), h{K) - 1, . . . , 0, M - 1, M - 2, . . . , h(K) + 1 ,
(20)
jak w poniższym algorytmie. A lgorytm L (.Próbkowanie liniowe i wstawianie). Ten algorytm przegląda M-elementową tablicę, szukając danego klucza K. Jeśli klucza K nie ma w ta blicy, a nie jest ona pełna, to K jest do niej wstawiany. Elementy tablicy są oznaczane jako TABLE [z] dla 0 < i < M; są one dwóch odróżnialnych typów: pusty i zajęty. Element zajęty zawiera klucz zwany KEY[i] oraz być może inne pola. Zmienna pomocnicza N służy do zapamiętania liczby zajętych elementów; ta zmienna jest traktowana jako część tablicy i zwiększa się o 1 przy każdym wstawieniu nowego klucza. Ten algorytm korzysta z funkcji haszującej h(K), a do adresowania tablicy używa ciągu prób (20). Modyfikacje tego ciągu są omówione poniżej. LI. [Haszowanie] Przyjmij i <— h{K). (Teraz 0 < i < M). L2. [Porównywanie] Jeśli element TABLE[z] jest pusty, to idź do kroku L4. W prze ciwnym razie, jeśli KEY[z] = A, to algorytm kończy działanie z sukcesem. L3. [Przejście do następnego] Przyjmij i <— i —1 ; jeśli teraz i < 0, to przyjmij i i + M. Wróć do kroku L2. L4. [Wstawianie] (Poszukiwanie zakończyło się niepowodzeniem). Jeśli N = M — 1, to algorytm kończy działanie, sygnalizując przepełnienie. (Ten algorytm traktuje tablicę jako pełną, kiedy N — M —1, a nie kiedy N = M; zobacz ćwiczenie 15). W przeciwnym razie przyjmij N N + 1 , zaznacz element TABLE [i] jako zajęty i przyjmij KEY[z] <—K. | Na rysunku 41 pokazano, co się dzieje, kiedy siedem kluczy z przykładu ( 1 1 ) zostaje wstawionych przez algorytm L, z wartościami funkcji haszującej, odpowiednio, 2, 7, 1, 8, 2, 8, 1: Trzy ostatnie klucze, FEM, SEKS i SYV zostały przemieszczone ze swoich początkowych położeń h(K). Program L (Próbkowanie liniowe i wstawianie). Ten program obsługuje klucze rozmiaru całego słowa; klucz równy 0 jest jednak niedopuszczalny, ponieważ
6.4
HASZOWANIE
0
FEM
1
TRE
2
EN
567
3 4 5
SYV
6
SEKS
7
TO
8
FIRE
R y s. 41. Adresowanie liniowe otwarte.
wartość 0 jest wykorzystywana do sygnalizowania pustej pozycji w tablicy. (Al ternatywnie moglibyśmy zażądać, żeby klucze były nieujemne, przyjmując, że puste pozycje zawierają wartość —1). Zakładamy, że rozmiar tablicy M jest liczbą pierwszą, a element TABLE [z] jest przechowywany pod adresem TABLE + i dla 0 < i < M . Ze względu na szybkość wewnętrznej pętli zakładamy, że komórka TABLE —1 zawiera wartość 0. Zakładamy, że komórka VACANCIES zawiera wartość M —1 — N oraz rA = X , rll = i. Żeby przyspieszyć wewnętrzną pętlę w tym programie, sprawdzenie „z < 0” zostało usunięte z pętli, w której pozostały tylko najistotniejsze części kroków L2 i L3. Łączny czas działania fazy wyszukiwania sięga wielkości (7C + 9E + 21 —45)u, a wstawienie po niepomyślnie zakończonym wyszukiwaniu to dodat kowe Su. 01 02 03 04 05 06 07 08 09 10 11 12 13
H 15 16 17 18 19
START LDX ENTA DIV STX ENT1 LDA JMP 8H INC1 3H DEC1 2H CMPA JE LDX JXNZ J1N 4H LDX JXZ DECX STX STA
K 1 0 1 1 =M= * + 1 (0 :2 ) 1 * 1 K 1 2F 1 M+1 E C + E -l 1 TABLE,1 C+E SUCCESS C+E TABLE,1 C + E -S 3B C + E -S 8B E + l-S VACANCIES 1- 5 OVERFLOW 1 -s 1 1 -s VACANCIES 1 -5 TABLE,1 1 -5
LI. Haszowanie.
i <— h(K ).
L3. Przejdź do następnego. i 4— i —1 . L2. Porównaj. Wyjście, jeśli K = KEY[ż] . Do L3, jeśli TABLE[i] niepuste. Do L3 z i
Tak jak w programie C zmienna C oznacza liczbę prób, 5 zaś mówi, czy przeszu kiwanie zakończyło się sukcesem, czy nie. Możemy pominąć zmienną E równą 1
568
6.4
WYSZUKIWANIE
tylko wtedy, kiedy nastąpiło sięgnięcie do sztucznego klucza TABLE[—1], ponie waż jej średnia wartość to (C —1)/M. Doświadczenie w stosowaniu próbkowania liniowego pokazuje, że ten algo rytm sprawuje się nieźle do czasu, kiedy tablica zaczyna się wypełniać; w końcu jednak cały proces się spowalnia i coraz częściej pojawiają się długo trwają ce wyszukiwania. Przyczynę takiego zachowania można zrozumieć, rozważając poniższą hipotetyczną tablicę z haszowaniem, w której M = 19 i N = 9: 0
1 |
2 [: :;1
3
4 j
5 h :y|;-..
7
6 |
8 |
|
9 10 11 12 13 14 15 16 17 18 |
I
1
|
|
1
]
| 1
|
(21)
Zacieniowane kwadraty reprezentują zajęte pozycje. Następny wstawiany do tablicy klucz K powędruje na jedno z dziesięciu pustych miejsc, ale nie są one jednakowo prawdopodobne; w rzeczywistości klucz K zostanie wstawiony na pozycję 11, jeśli 11 < h(K) < 15, podczas gdy na pozycji 8 znajdzie się on tylko w przypadku, kiedy h(K) = 8. Tak więc pozycja 11 jest pięć razy bardziej prawdopodobna niż pozycja 8; długie listy robią się jeszcze dłuższe. Samo to zjawisko nie wystarcza do wyjaśnienia stosunkowo kiepskiego zacho wania próbkowania liniowego, ponieważ coś podobnego występuje i w algorytmie C. (Lista długości 4 w algorytmie C ma czterokrotnie większe szanse na wydłu żenie niż lista długości 1 ). Prawdziwy problem pojawia się, kiedy zajęta zostaje komórka taka jak 4 lub 16 w przykładzie (21 ); dochodzi wówczas do sklejenia dwóch osobnych list, podczas gdy listy w algorytmie C nigdy nie zwiększają się na raz więcej niż o jeden element. Z tego powodu wydajność próbkowania liniowego gwałtownie spada, kiedy N zbliża się do M. W dalszej części tego podrozdziału udowodnimy, że średnia liczba prób potrzebnych w algorytmie L wynosi w przybliżeniu CfN ~ ^ ^1 4C n « - ^1 4- y ~~— ^
^
(wyszukiwanie zakończone niepowodzeniem);
(22)
(wyszukiwanie zakończone sukcesem),
(23)
gdzie a = N / M to współczynnik wypełnienia tablicy. Tak więc program L jest prawie równie szybki jak program C, kiedy tablica jest wypełniona w mniej niż 75 procentach, mimo faktu, że program C obsługuje nierealistycznie krótkie klucze. Z drugiej strony, przy a dążącym do 1 , najlepsze, co możemy powiedzieć o programie L, to to, że działa poprawnie - wolno, ale niezawodnie. W rzeczy wistości dla N = M —1 jest tylko jedno wolne miejsce w tablicy, więc średnia liczba prób przy wyszukiwaniu zakończonym niepowodzeniem wynosi (M + 1 ) / 2; udowodnimy również, że dla całkowicie wypełnionej tablicy średnia liczba prób przy wyszukiwaniu zakończonym sukcesem to w przybliżeniu y j t t M / S . To zjawisko grupowania, czyniące próbkowanie liniowe kosztownym w nie mal całkowicie wypełnionej tablicy, pogłębia jeszcze stosowanie haszowania z dzieleniem, jeśli są duże szanse na występowanie kolejnych wartości kluczy {7Ć, K + 1, K- H2, ...}, ponieważ dla tych kluczy funkcja haszująca będzie przyj
6.4
HASZOWANIE
569
mowała kolejne wartości. Haszowanie multiplikatywne będzie rozbijało takie grupki w zadowalający sposób. Innym sposobem zabezpieczenia się przed problemem kolejnych wartości funkcji haszującej jest przyjęcie i i —c w kroku L3 zamiast i <—i —1 . Nadaje się do tego dowolna dodatnia wartość c, o ile jest ona względnie pierwsza z M, ponieważ w tym przypadku ciąg prób nadal będzie obejmował każdą pozycję w tablicy. Taka zmiana nieco spowolniłaby program L, ze względu na sprawdze nie czy i < 0. Zmniejszanie indeksu o c zamiast o 1 nie wpływa na zjawisko grupowania, ponieważ nadal będą się tworzyć grupy rekordów odległych o c pozycji; równania (22) i (23) pozostają w mocy. Występowanie kolejnych kluczy {K, K-\-1, K + 2, . . . } teraz będzie jednak pomocą, a nie utrapieniem. Chociaż ustalona wartość c nie redukuje zjawiska grupowania, możemy znacznie poprawić sytuację, biorąc wartości c zależne od K . Ta idea prowadzi do ważnej modyfikacji algorytmu L, którą jako pierwszy wprowadził Guy de Balbinę [praca doktorska, Calif. Inst. of Technology (1968), 149 -150]: Algorytm D (.Adresowanie otwarte z haszowaniem podwójnym). Ten algorytm jest prawie identyczny z algorytmem L, ale przegląda on tablicę w nieco inny sposób, z wykorzystaniem dwóch funkcji haszujących h\ (K) i h,2 (K). Tak jak zwykle, h\{K) daje wartości z zakresu od 0 do M —1 włącznie, natomiast h,2 (K) musi dawać wartość z zakresu od 1 do M —1 , która jest względnie pierwsza z M. (Jeśli na przykład M jest liczbą pierwszą, to /^(A) może być dowolną wartością z zakresu od 1 do M —1 włącznie; jeśli M = 2m, to h,2 (K) może być dowolną nieparzystą wartością z zakresu od 1 do 2m —1 ). D l. [Pierwsze haszowanie] Przyjmij i <—h\{K). D2. [Pierwsza próba] Jeśli element TABLEfż] jest pusty, to idź do kroku D6 . W przeciwnym razie, jeśli KEY[i] = K : to algorytm kończy działanie z suk cesem. D3. [Drugie haszowanie] Przyjmij c <—h,2 (K). D4. [Przejście do następnego] Przyjmij i <— i —c; jeśli teraz i < 0, to przyjmij i <—i + M. D5. [Porównywanie] Jeśli element TABLED] jest pusty, to idź do kroku D6 . W przeciwnym razie, jeśli KEYD] = A, to algorytm kończy działanie z suk cesem. W przeciwnym razie wróć do kroku D4. D 6 . [Wstawianie] Jeśli N = M — 1, to algorytm kończy działanie, sygnalizując przepełnienie. W przeciwnym razie przyjmij N N + 1 , zaznacz element TABLEfż] jako zajęty i przyjmij KEYD] K. | Zaproponowano kilka sposobów obliczania h,2 (K). Jeśli M jest liczbą pierw szą i h\{K) = K mod M, to moglibyśmy przyjąć h,2 (K) = 1-1- (K mod (M.—1)); jednak ponieważ liczba M — 1 jest parzysta, lepiej byłoby przyjąć h,2 (K) = 1 + (K mod (M — 2)). To sugeruje wybranie M tak, żeby M i M — 2 były „bliźniaczymi liczbami pierwszymi”, jak 1021 i 1019. Alternatywnie moglibyśmy przyjąć h,2 (K) = 1 4- ( [K/ M\ mod (M —2)), ponieważ iloraz |_K / M \ mógłby być dostępny w rejestrze jako produkt uboczny obliczania h\{K).
570
WYSZUKIWANIE
6.4
Jeśli M = 2m i stosujemy haszowanie multipłikatywne, to h,2 (K) można obli czać, po prostu przesuwając w lewo jeszcze o m bitów i biorąc bitową alternatywę z 1 : po ciągu instrukcji (5 ) następowałoby ENTA 0 SLB m 0R = 1=
wyzerowanie rA; przesunięcie rAX o m bitów w lewo; rA +— rA V 1.
(2 4 )
Jest to szybsze niż metoda z dzieleniem. W każdej z zaproponowanych powyżej technik h\(K) i h,2 {K) są w zasadzie niezależne, w tym sensie, że różne klucze będą dawały takiesame wartości zarówno h\, jak i /12, z prawdopodobieństwem w przybliżeniu proporcjonalnym do 1 /M 2, a nie do 1 /M . Testy empiryczne pokazują, że zachowanie algorytmu D z niezależnymi funkcjami haszującymi jest zasadniczo nieodróżnialne od sy tuacji, w której liczymy próby wymagane przy losowym wstawianiu kluczy do tablicy; praktycznie nie występują zjawiska „wydłużania list” ani „grupowania” jak w algorytmie L. Można również wziąć funkcję h,2 (K) zależną od hi(K), co zaproponował Gary Knott w 1968 roku; jeśli na przykład M jest liczbą pierwszą, to moglibyśmy przyjąć , jeśli h-i(K) = 0; , . ’ \ M — h\(K), jeśli hi(K) > 0. ^ 5' Byłoby to szybsze niż wykonywanie kolejnego dzielenia, ale zobaczymy, że powo duje to w pewnym stopniu grupowanie wtórne, nieco zwiększając liczbę potrzeb nych prób ze względu na zwiększone szanse trafienia dwóch lub więcej kluczy na tę samą ścieżkę. Wyprowadzonych poniżej wzorów można użyć do stwierdzenia, czy zysk w czasie haszowania przeważy stratę w czasie próbkowania. Algorytmy L i D są bardzo podobne, ale różnic jest na tyle dużo, że po uczające jest porównanie czasów działania odpowiadających im programów na maszynę MIX. Program D (Adresowanie otwarte z haszowaniem podwójnym). Ponieważ ten program jest bardzo podobny do programu L, jest on przedstawiony bez komen tarzy. rI2 = c —1 . 01 02 03 04 05 06 07 08 09 10 11 12 13 14
START LDX ENTA DIV STX ENT1 LDX CMPX JE JXZ SRAX DIV STX ENT2 LDA
K
1 1 1 1 1 1 1 1
0
*+ 1 ( 0 : 2 ) * TABLE,1 K SUCCESS 4F 5 =M-2= *+ 1 ( 0 : 2 ) * K
1 -5 1
A A A A A
-5 1 -5 1 -5 1 -5 1 -5 1
15 16 17 18 19 20 21 22 23 24 25 26 27
3H DEC1 J1NN INC1 CMPA JE LDX JXNZ 4H LDX JXZ DECX STX LDA STA
1 ,2 *+ 2
M TABLE,1 SUCCESS TABLE,1 3B VACANCIES OVERFLOW 1
VACANCIES K TABLE,1
C - 1 (7-1 B C - 1 C - 1 (7-1-52 C - 1 - 52 1 -5 1 -5 1 -5 1 -5 1 -5 1 -5 |
6.4
HASZOWANIE
571
Liczniki częstości A, C, SI, 52 w tym programie mają interpretację podobną do interpretacji ich odpowiedników w zamieszczonym wyżej programie C. Po została zmienna B będzie średnio równa mniej więcej (C — l)/2. (Gdybyśmy ograniczyli zakres h,2 (K) do 1 < h,2 (K) < M/2, to wartość B wynosiłaby tylko około (C — l)/4; to zwiększenie szybkości prawdopodobnie nie wynagrodziłoby zauważalnego wzrostu liczby prób). Jeśli w tablicy jest N = a M kluczy, to średnią wartością A jest oczywiście a w przypadku wyszukiwania zakończonego niepowodzeniem, zaś A = 1 przy wyszukiwaniu zakończonym sukcesem. Tak jak w algorytmie C, średnia wartość SI przy wyszukiwaniu zakończonym sukcesem to 1 - I ( ( A T - 1 ) / M ) « 1 — \a . Trudno jest określić dokładnie średnią liczbę prób, ale testy empiryczne wykazują dobrą zgodność z wyprowadzonymi poniżej wzorami dla „próbkowania jednostajnego”, czyli n t __
M +l
N~
M +l-N
Cn = —
.
. x
~ ^ ~°^ (wyszukiwanie zakończone niepowodzeniem),
(26)
(LTm +i-^m +i-a) ~ -o T 1 l n ( l - a ) (wyszukiwanie zakończone sukcesem),
(27)
kiedy h\(K) i h,2 (K) są niezależne. Jeśli h,2 (K) jest zależne od h\(K) jak we wzorze (25), to grupowanie wtórne powoduje zwiększenie wartości (26) i (27) do poziomu C" = M X - n ~ W n +HM+1~ HM+1~N + 0 { M ~l) « (1 —a )-1 —ai —ln(l —a);
(28)
Cn = 1+H m +i —H m +i - n — « 1 —ln(l —a) —\ a.
(29)
(Zobacz ćwiczenie 44). Zauważmy, że kiedy tablica się wypełnia, powyższe warto ści Cn zbliżają się odpowiednio do H m +1 —1 i H m +i ~ \ dla N ~ M; to o wiele lepiej niż w algorytmie L, ale nie tak dobrze jak w metodach łańcuchowych. Ponieważ w algorytmie L każda próba zajmuje nieco mniej czasu, haszowanie podwójne ma przewagę dopiero wtedy, kiedy tablica się wypełnia. Na rysunku 42 jest przedstawione porównanie średnich czasów działania programu L, programu D oraz zmodyfikowanego programu D, w którym występuje grupowanie wtórne, spowodowane zastąpieniem dość powolnego obliczania h,2 (K) w wierszach 10-13 następującymi trzema instrukcjami: ENN2 1-M, 1 J1NZ *+2 ENT2 0
c
M — i.
(30) Jeśli i —0, to c
1.
Wykonanie programu D zajmuje łącznie SC + 19A + B + 26 — 135 — 1751 jednostek czasu; modyfikacja (30) pozwala zaoszczędzić około 15(A — 51) ~
572
WYSZUKIWANIE
6.4
R y s. 42. Czas wyszukiwania zakończonego sukcesem dla trzech schematów adresowa nia otwartego.
7.5a jednostek przy wyszukiwaniu zakończonym sukcesem. W tym przypadku grupowanie wtórne jest korzystniejsze od haszowania podwójnego z niezależnymi funkcjami. Na komputerze binarnym moglibyśmy przyspieszyć obliczanie h,2 {K) w inny sposób, jeśli M jest liczbą pierwszą większą niż, powiedzmy, 512, zastępując wiersze 10-13 przez AND =511= STA * + 1 ( 0 :2 ) ENT2 *
rA +—rA mod 512. (3 1 )
c<-rA+l. Ten pomysł (zaproponowany przez Bella i Kamana, CACM 13 (1970), 675-677, którzy niezależnie odkryli algorytm D) pozwala uniknąć grupowania wtórnego bez płacenia za to kolejnym dzieleniem. W ramach ulepszania algorytmu L zaproponowano wiele innych ciągów prób, ale żaden z nich nie wydaje się przewyższać algorytmu D, z wyjątkiem może metody opisanej w ćwiczeniu 20. Wykorzystując uporządkowanie kluczy, możemy zredukować średni czas wy szukiwań zakończonych niepowodzeniem w algorytmach L lub D do średniego czasu wyszukiwania zakończonego sukcesem; zobacz ćwiczenie 66. Ta technika może mieć duże znaczenie w zastosowaniach, w których wyszukiwania zakończo ne niepowodzeniem zdarzają się często; taki algorytm jest na przykład stoso wany w systemie T^X przy poszukiwaniu wyjątków od jego reguł przenoszenia wyrazów. Wariant Brenta. Richard P. Brent odkrył sposób zmodyfikowania algoryt mu D, dzięki któremu średni czas wyszukiwania zakończonego sukcesem pozosta je ograniczony, kiedy tablica się wypełnia. Jego metoda [CACM 16 (1973), 105-109] jest oparta na fakcie, że w wielu zastosowaniach wyszukiwania zakończone
HASZOWANIE
6.4
co
co co
c
o
P i
o i
(X)
573
R y s. 43. Liczba wykonywanych przez kompilator poszukiwań nazw zmiennych w ty powym przypadku. Nazwy są wymienione od strony lewej do prawej w kolejności ich pierwszego wystąpienia.
sukcesem są znacznie częstsze niż wstawienia; proponuje on zatem wykonanie przy wstawianiu elementu większej pracy, polegającej na przestawianiu rekordów w celu zmniejszenia oczekiwanego czasu wyszukiwania. Przykładowo, na rysunku 43 przedstawiono faktyczną liczbę wystąpień każ dego identyfikatora w typowej procedurze w języku PL/I. Te dane wskazują, że kompilator języka PL/I wykorzystujący tablicę z haszowaniem do zarządzania nazwami zmiennych będzie szukał wielu nazw pięć lub więcej razy, ale będzie je wstawiał tylko jeden raz. Podobnie, Bell i Kaman stwierdzili, że podczas kompilacji pewnego programu kompilator języka COBOL skorzystał ze swojego algorytmu obsługi tablicy symboli 10988 razy, ale wykonał zaledwie 735 wstawień do tej tablicy; średnio jest to około 14 wyszukiwań zakończonych sukcesem na każde wyszukiwanie zakończone niepowodzeniem. Niekiedy tablica jest w rzeczy wistości tworzona tylko raz (na przykład tablica symbolicznych kodów operacji w asemblerze), a później jest używana wyłącznie do odczytu. Pomysł Brenta polega na modyfikacji procesu wstawiania w algorytmie D w następujący sposób. Przypuśćmy, że podczas wyszukiwania zakończonego niepowodzeniem zostały odwiedzone pozycje po, Ph **■? P t- 15 Pt, gdzie pj = ( j i i ( K ) —jh, 2 ( K ) ) mod M i element TABLE [pt] jest pusty. Jeśli £ < 1, to wstawia my K na pozycji pt tak jak zwykle; jeśli jednak £ > 2, to obliczamy Cq = h 2 (Ko), gdzie K o = KEY[po], i patrzymy, czy element TABLE [(p 0 —Co) mod M] jest pusty. Jeśli jest, to przenosimy tam TABLE [p0] , a następnie wstawiamy K na pozycji po- To zwiększa czas potrzebny do znalezienia K q o jeden krok, ale zmniejsza czas potrzebny do znalezienia K o £ > 2 kroków, więc daje pewien zysk netto. Podobnie, jeśli element TABLE [(po —cq) mod M] jest zajęty i £ > 3, to próbujemy element TABLE [(po —2cq) mod M ]; jeśli także i on jest zajęty, to
574
WYSZUKIWANIE
6.4
obliczamy c\ — /^(KEYfpi]) i próbujemy TABLE[(po —Ci) mod M ]; i tak dalej. Ogólnie, niech Cj = ^(KEYtp^]) i p j^ — (pj —kej) mod M; jeśli stwierdziliśmy, że elementy TABLE [p ^ ] są zajęte dla wszystkich indeksów j i k takich, że j + k < r, i jeśli £ > r + 1, to patrzymy na TABLE[po,r3> TABLE[pi,r- i] > . . . , TABLE [pr_ i ;i ] . Jeśli pierwsze puste miejsce występuje na pozycji to kładziemy TABLELpj}r-j1 TABLE [pj] i wstawiamy K na pozycji pj. Analiza Brenta wskazuje, że średnia liczba prób przypadająca na wyszuki wanie zakończone sukcesem zmniejsza się do poziomu przedstawionego na rysun ku 44, strona 588, z maksymalną wartością około 2.49. Liczba £ + 1 prób przy wyszukiwaniu zakończonym niepowodzeniem nie zmniejsza się w wariancie Brenta; pozostaje ona na poziomie wskazanym w rów naniu (26), zbiegając do \ { M + 1 ) w miarę jak tablica się wypełnia. Zgodnie z analizą Brenta, funkcję /12 przy każdym wstawianiu trzeba obliczać średnio a2+ ab+ |a 6H razy, co zbiega ostatecznie do Q(y/M)\ liczba dodatkowych pozycji w tablicy odwiedzonych w trakcie podejmowania decyzji o tym, jak dokonać wstawienia, wynosi około a 2 + a 4 + | a 5 + a 6 + ■• *. E. G. Mailach [Comp. J. 20 (1977), 137-140] eksperymentował z udosko naleniami wariantu Brenta, a dalsze wyniki uzyskali Gaston H. Gonnet i J. łan Munro [SICOMP 8 (1979), 463-478]. Usuwanie. Wielu programistów przejawia bezgraniczną wiarę w algorytmy i ze zdumieniem stwierdza, że oczywisty sposób usuwania rekordów z tablicy z haszowaniem nie działa poprawnie. Jeśli na przykład próbujemy usunąć klucz EN z rysunku 41, to nie możemy po prostu oznaczyć tej pozycji w tablicy ja ko pustej, ponieważ stracilibyśmy wówczas inny klucz FEM! (Przypomnijmy, że zarówno EN jak i FEM były odwzorowane przez funkcję haszującą na tę samą pozycję. Szukając FEM, znaleźlibyśmy puste miejsce, co oznacza, że wyszukiwa nie kończy się niepowodzeniem). Podobny problem powstaje w algorytmie C z uwagi na sklejanie się list; wyobraźmy sobie usunięcie zarówno TO , jak i F I R E z rysunku 40. W ogólnym przypadku możemy realizować usunięcia, umieszczając specjalną wartość kodową w odpowiedniej komórce, czyli przyjmując, że są trzy rodzaje elementów tablicy: puste, zajęte i usunięte. Podczas szukania klucza powinniśmy przechodzić przez usunięte komórki, tak jakby były zajęte. Jeśli poszukiwanie zakończyło się niepowodzeniem, to klucz można wstawić w miejsce pierwszej napotkanej pozycji usuniętej lub pustej. Ten pomysł sprawdza się jednak tylko w sytuacji, kiedy usuwanie zdarza się bardzo rzadko, ponieważ elementy tablicy nigdy nie stają się znowu puste po tym, jak raz zostały zajęte. Po wykonaniu długiego ciągu powtarzających się wstawień i usunięć wszystkie puste miejsca w końcu znikną, a każde wyszuki wanie zakończone niepowodzeniem będzie wymagało M prób! W dodatku czas przypadający na każdą próbę wzrośnie, ponieważ będziemy musieli sprawdzać w kroku D4, czy indeks i powrócił do swojej początkowej wartości, zaś liczba prób podczas wyszukiwania zakończonego sukcesem będzie się zwiększać od CN do C'N .
6.4
HASZOWANIE
575
Jeśli stosujemy próbkowanie liniowe (algorytm L), to możemy wykonywać usunięcia w sposób, który pozwala uniknąć tego nieprzyjemnego stanu rzeczy za cenę pewnej dodatkowej pracy przy usuwaniu. Algorytm R (Usuwanie przy próbkowaniu liniowym). Przy założeniu, że tablica z haszowaniem otwartym została skonstruowana algorytmem L, ten algorytm usuwa rekord z podanej pozycji TABLEU ]. R l. [Opróżnianie komórki] Oznacz element TABLE [¿] jako pusty i przyjmij j <—i. R 2 . [Zmniejszanie i] Przyjmij i i 4—i + M.
i — 1 ; jeśli i stało się ujemne, to przyjmij
R3. [Zbadanie TABLE [i]] Jeśli element TABLE [i] jest pusty, to algorytm kończy działanie. W przeciwnym przypadku przyjmij r ń(KEY[ż]) - oryginalny adres haszowania dla klucza znajdującego się obecnie na pozycji i. Jeśli i < r < j lub r < j < i, lub j < i < r (innymi słowy, jeśli r leży cyklicznie między i aj), to wróć do kroku R2. R4. [Przesuwanie rekordu] Przyjmij TABLE[j]
TABLE[z] i wróć do kroku Rl. |
Celem ćwiczenia 22 jest pokazanie, że ten algorytm nie powoduje żadnego spadku wydajności; inaczej mówiąc, średnia liczba prób przewidziana w równa niach (22) i (23) pozostanie bez zmiany. (Słabszy wynik dotyczący wstawiania do drzewa został udowodniony w twierdzeniu 6.2.2H). Poprawność algorytmu R jest jednak mocno uzależniona od faktu zastosowania próbkowania liniowego i nie jest możliwa analogiczna procedura usuwania do użycia wraz z algorytmem D. Średni czas działania algorytmu R jest analizowany w ćwiczeniu 64. Przy stosowaniu metody łańuchowej z osobnymi listami dla każdej możliwej wartości funkcji haszującej usuwanie nie stwarza oczywiście żadnych problemów, ponieważ polega po prostu na usunięciu elementu z listy. Usuwanie w kontekście algorytmu C jest omówione w ćwiczeniu 23. Algorytm R może przesuwać niektóre elementy tablicy, co bywa niepożąda ne, jeśli istnieją do nich odwołania z zewnątrz. Możliwe jest inne podejście do kwestii usuwania, polegające na zaadaptowaniu pewnych rozwiązań stosowanych przy odśmiecaniu (zobacz punkt 2.3.5): Moglibyśmy utrzymywać wraz z każdym kluczem licznik odwołań mówiący, ile innych kluczy jest z nim w kolizji; wów czas jest możliwa zmiana statusu niezajętych komórek na puste, kiedy wartość ich licznika spada do zera. Alternatywnie moglibyśmy przebiegać całą tablicę, kiedy nazbiera się za dużo elementów usuniętych, i zamieniać wszystkie pozycje niezajęte na puste, a następnie sprawdzać wszystkie pozostałe klucze w celu określenia, które niezajęte pozycje nadal wymagają pozostawienia statusu „usu nięta”. Te procedury pozwalające uniknąć przemieszczania rekordów i opierania się na jakiejkolwiek konkretnej technice haszowania jako pierwsi zaproponowali T. Gunji i E. Goto [J. Information Proc. 3 (1980), 1-12]. *Analiza algorytmów. Szczególnie istotna jest znajomość przeciętnego zacho wania się danej metody, ponieważ przy haszowaniu jesteśmy zdani na wiarę
576
WYSZUKIWANIE
6.4
w prawa rachunku prawdopodobieństwa. Najgorszy przypadek dla tych algoryt mów jest prawie niewyobrażalnie zły, więc musimy upewnić się, że ich przeciętne zachowanie jest bardzo dobre. Zanim przejdziemy do analizy próbkowania liniowego i innych metod, roz ważmy przybliżony model sytuacji, zwany próbkowaniem jednostajnym. W tym modelu, zaproponowanym przez W. W. Petersona [IBM J. .Research & De velopment 1 (1957), 135-136], zakładamy, że każdy klucz jest umieszczany w całkowicie losowym miejscu w tablicy, czyli że każda spośród (^) możliwych konfiguracji N komórek zajętych i M — N komórek pustych jest jednakowo prawdopodobna. W tym modelu pomijane są wszelkie efekty grupowania pier wotnego czy wtórnego; to, czy dana komórka w tablicy jest zajęta, jest w zasadzie niezależne od stanu wszystkich pozostałych. Wówczas prawdopodobieństwo tego, że do wstawienia (N + l)-go elementu potrzeba dokładnie r prób, jest równe liczbie konfiguracji, w których r —1 danych komórek jest zajętych, a kolejna jest pusta, podzielonej przez (^ ), czyli Pr=( M ~ r r \N -r+ l tak więc średnia liczba prób przy próbkowaniu jednostajnym wynosi M
M
C'N = Y , r P r = M + 1 r=l
+ 1 - r)P\ r=l /
M
= M + l-]T (M + l-r ) i r= 1 x M
,
nr — 1
'
M ' M + 1 —r = M + l - J 2 ( M - N) (x M - N r=l x = M + 1 — (M — N) ( M + 1 y J\ M - N + 1 = A i + 1 _ („ _ K) _ £ ± i i = 1r ± r
dlal< N < M .
(33)
(Rozwiązaliśmy już z grubsza ten sam problem w kontekście próbkowania loso wego w ćwiczeniu 3.4.2-5). Kładąc a ~ N / M , widzimy, że wartość C'N określona tym dokładnym wzorem jest w przybliżeniu równa 1 —a
= l + a + a 2 + a 3 -\------.
(33)
Można podać pewną zgrubną intuicyjną interpretację tego szeregu: z prawdopo dobieństwem a potrzebujemy więcej niż jednej próby, z prawdopodobieństwem a 2 potrzebujemy więcej niż dwie itd. Średnia liczba prób w przypadku wyszuki wania zakończonego sukcesem to, odpowiednio,
6.4
HASZOWANIE
C
N
=
1
^ k~0
' =
k
—
N
i - i — + - +
\M + 1
M +1 / 77— ( H m jv
= —
i
M
1
M -N + 2
x l +i - H
m
-
n
577
1
+ i ) ~ “ ln i
a
1 —a
.
■
.
( 34 )
Jak wzmiankowano wyżej, szeroko zakrojone testy pokazują, że algorytm D z dwiema niezależnymi funkcjami haszującymi pod względem praktycznym za chowuje się z grubsza tak samo jak próbkowanie jednostajne. W rzeczywistości haszowanie podwójne jest asymptotycznie równoważne próbkowaniu jednostaj nemu w granicy przy M —>00 (zobacz ćwiczenie 70). To kończy naszą analizę próbkowania jednostajnego. Żeby badać próbkowa nie liniowe i inne strategie rozwiązywania kolizji, musimy ująć całą teorię w inny, bardziej realistyczny sposób. W modelu probabilistycznym, którego użyjemy do tego celu, zakłada się, że każdy spośród M N możliwych „ciągów haszowania” ai a2 .. ,aN ,
0 < o,* < M,
(35)
jest jednakowo prawdopodobny, gdzie aj oznacza początkowy adres wyznaczony przez funkcję haszującą dla j-tego klucza wstawianego do tablicy. Średnia liczba prób przy wyszukiwaniu zakończonym sukcesem, dla dowolnego konkretnego algorytmu wyszukiwania, będzie, tak jak przedtem, oznaczana przez (7/v; przyj muje się, że jest to średnia liczba prób potrzebnych do znalezienia &-tego klucza, z uśrednianiem po 1 < k < N, gdzie każdy klucz jest jednakowo prawdopodobny, i z uśrednianiem po wszystkich ciągach haszowania (35), gdzie każdy ciąg jest jednakowo prawdopodobny. Analogicznie, średnia liczba prób potrzebnych przy wstawianiu AT-tego klucza, przy założeniu, że wszystkie ciągi (35 ) są jednako wo prawdopodobne, będzie oznaczana przez CfN _ x\ jest to średnia liczba prób przy wyszukiwaniu zakończonym niepowodzeniem w tablicy zawierającej N — 1 elementów. Jeśli stosujemy adresowanie otwarte, to c * = jj E
c '^
(36)
fc—o
więc możemy wywieść jedną wielkość na podstawie drugiej, tak jak to uczynili śmy, wyprowadzając wzór (34). Ściśle rzecz biorąc, ten wierniejszy model ma dwa słabe punkty. Po pierwsze, różne ciągi haszowania nie są jednakowo prawdopodobne, ponieważ same klucze są różne. To powoduje, iż prawdopodobieństwo tego, że a\ = jest nieco mniejsze niż 1 /M; jednak różnica jest zazwyczaj zaniedbywalna, bowiem zbiór wszystkich możliwych kluczy w typowej sytuacji jest bardzo duży w porównaniu z M. (Zobacz ćwiczenie 24). W dodatku dobra funkcja haszująca będzie robiła użytek z nielosowości typowych danych, jeszcze bardziej zmniejszając szansę na to, że ai = a2 ] w efekcie nasze oszacowania liczby koniecznych prób będą pesymi styczne. Inna niedokładność ukryta w tym modelu jest wskazana na rysunku 43: Klucze, które pojawiają się wcześniej, są (z pewnymi wyjątkami) częściej wyszu kiwane niż te, które pojawiają się później. Dlatego nasze oszacowanie wielkości
578
WYSZUKIWANIE
6.4
C n jest podwójnie pesymistyczne, a algorytmy powinny w praktyce działać nieco lepiej niż przewiduje to nasza analiza. M ając to wszystko na uwadze, jesteśmy gotowi do przeprowadzenia „do kładnej” analizy próbkowania liniowego*. Niech f ( M , N ) będzie liczbą ciągów haszowania (35 ) takich, że po wstawieniu kluczy algorytmem L pozycja 0 w tablicy będzie pusta. Z cyklicznej symetrii próbkowania liniowegowynika, że pozycja 0 jest pusta dokładnie tak samo często jak dowolna inna pozycja, więc dzieje się tak z prawdopodobieństwem 1 —N / M ; innymi słowy, f ( M , N ) = ( l - ^ / ) M N.
( 37 )
Przyjm ijm y również konwencję, że /(0 ,0 ) = 1. Niech teraz g( M, N, k ) będzie liczbą ciągów haszowania (35) takich, że nasz algorytm pozostawia pozycję 0 pustą, pozycje od 1 do A; zajęte i pozycję k -j- 1 pustą. Mamy g{M ,N ,k)=^f{k+l,k)f(M -k-l,N -k),
(38)
ponieważ wszystkie takie ciągi haszowania składają się z dwóch podciągów: jednego (zawierającego k elementów < k), który pozostawia pozycję 0 pustą, a pozycje od 1 do k zajęte, i drugiego (zawierającego N —k elementów aj > k + 1), który pozostawia pozycję fc + 1 pustą; jest /(fc + l, k) podciągów pierwszego typu i f ( M —k —1, N —k) podciągów drugiego typu oraz (^ ) sposobów przeplecenia dwóch takich podciągów. Niech wreszcie Pk będzie prawdopodobieństwem tego, że przy wstawianiu ( N -f l)-go klucza potrzebnych będzie dokładnie k -f 1 prób; mamy (zobacz ćwiczenie 25) P k = M ~ n (g ( M, N, k) + g(M, N, k+1 ) + ■ ■ ■+ g(M, N, N) ) .
(39)
Teraz C N f = Yl k =o + 1 ) ^ ! to równanie wraz z równaniami (36) ” (39) po uproszczeniach daje następujący wynik. T w ie rd z e n ie K . Średnia liczba prób potrzebnych w algorytmie L przy zało żeniu, że wszystkich M N ciągów haszowania (35 ) jest jednakowo prawdopodob nych, wynosi Cjsf = | ( l + Q q( M , N —1 )) (wyszukiwanie zakończone sukcesem),
(40)
C'N = | ( l + Q i(M , N) )
(41 )
(wyszukiwanie zakończone niepowodzeniem),
gdzie ^ /,, f r\ fr + l \ N /r + 2 \ N ( N - l ) Qr ( « , J V ) = ( 0 ) + ( ; ) - + ( 2 ) - V * i + f r + k\ N N — 1
N —k + 1
0 * Autor nie może się powstrzymać od wstawienia w tym miejscu notki biograficznej. Po niższe wyprowadzenie sformułowałem w 1962 roku, krótko po rozpoczęciu pracy nad Sztuką programowania. Ponieważ był to pierwszy nietrywialny algorytm przeanalizowany przeze mnie w satysfakcjonujący sposób, wywarł on silny wpływ na strukturę tych książek. Od tego dnia analiza algorytmów stała się tak naprawdę jednym z głównych nurtów mojego życia.
6.4
HASZOWANIE
579
Dowód. Szczegóły obliczenia są przedstawione w ćwiczeniu 27. (Kwestii wariancji dotyczą ćwiczenia 28, 67 i 68). | Z dość dziwnie wyglądającą funkcją Qr ( M, N), która pojawia się w tym twierdzeniu, w rzeczywistości nietrudno sobie poradzić. Mamy Nk -
< N ( N - l ) . . . ( N - k + l ) < N k;
zatem jeśli N / M = a, to
N k~(SD7^
1)
iM k**
^
J2(r~ tk)N k /M k’
to znaczy (1 - a )r+1 ~ m {
2
) (1 - a )r+3 **
a M ^ ^ (1 - a)r+1'
Ta zależność daje nam dobre oszacowanie Qr (M, N) w przypadku, kiedy M jest duże i a nie jest zbyt bliskie 1. (Dolne ograniczenie jest lepszym przybliżeniem niż górne). Kiedy a zbliża się do 1, powyższe wzory stają się bezużyteczne, ale na szczęście Q q(M, M —1 ) to funkcja Q(M), której asymptotyczne zacho wanie badaliśmy bardzo szczegółowo w punkcie 1.2.11.3, zaś Qi(M, M —1) jest po prostu równe M (zobacz ćwiczenie 50). Zgodnie ze standardową nota cją dla funkcji hipergeometrycznych (równanie 1.2.6-39), mamy Qr(M, N) = F{r + 1, —N ;; —1/M) = F ( r+1'~N'1 \ - £ ) . Inne podejście do analizy próbkowania liniowego zastosowali wcześniej G. Schay, Jr. i W. G. Spruth [CACM 5 (1962), 459-462]. Chociaż ich metoda dawała tylko przybliżenie dokładnych wzorów z twierdzenia K, to rzuca ona więcej światła na sam algorytm, więc pokrótce ją tu naszkicujemy. Rozważmy najpierw zaskakującą własność próbkowania liniowego, którą jako pierwszy za uważył W. W. Peterson w 1957 roku. Twierdzenie P. Średnia liczba prób w zakończonym sukcesem wyszukiwaniu realizowanym algorytmem L jest niezależna od kolejności, w jakiej klucze były wstawiane; zależy ona tylko od liczby kluczy odwzorowywanych przez funkcję haszującą na każdy adres. Inaczej mówiąc, dowolne przestawienie ciągu haszowania a ia 2 ...aAr daje ciąg haszowania z takim samym średnim przemieszczeniem kluczy od ich ad resu wyznaczonego przez funkcję haszującą. (Tak jak wcześniej, zakładamy, że wszystkie klucze w tabeli mają jednakową wagę. Jeśli odwołania do niektórych kluczy następują częściej niż do innych, to dowód można rozszerzyć pokazując, że optymalna kolejność polega na wstawianiu kluczy w porządku malejących częstości, z zastosowaniem metody z twierdzenia 6 .1 S).
580
WYSZUKIWANIE
6.4
Dowód. Wystarczy pokazać, że łączna liczba prób potrzebnych do wstawie nia kluczy dla ciągu haszowania a\a,2 *- - cln jest taka sama jak dla ciągu a \ . , . d i - 1 di+i di di + 2 ■• - dpj, 1 < i < N. Jest jasne, że nie ma żadnej różnicy aż do chwili, kiedy (i + l)-szy klucz w drugim ciągu wpada na pozycję zajętą przez ¿-ty w pierwszym ciągu. Jednak wówczas klucze z-ty oraz (i + l)-szy po prostu zamieniają się miejscami, więc liczba prób dla (i + l)-go klucza zmniejsza się 0 tyle samo, o ile wzrasta liczba prób dla i-tego klucza. | Twierdzenie P mówi nam, że średnią długość wyszukiwania dla ciągu haszo wania a \d 2 •.. dw można wyznaczyć na podstawie wielkości 6o b i... &m-i , gdzie bj jest liczbą tych a, które są równe j . Na podstawie tego ciągu możemy określić „ciąg przeniesień” co C\ ... c m -i, gdzie Cj jest liczbą kluczy, dla których podczas wstawiania jest odwiedzana zarówno pozycja j, jak i j — 1. Ten ostatni ciąg jest zadany regułą ci =
f jeśli bj mod m i . . [b3 + C(j+ 1) mod M - 1 ? w przeciwnym razie.
0)
i
/
.
(44)
Niech na przykład M = 10, N = 8 oraz 60 ... 69 = 0 3 2 0 1 0 0 0 0 2; wówczas Co -.. C9 = 2 3 1 0 0 0 0 1 2 3, ponieważ jeden klucz wymaga „przeniesienia” z pozycji 2 na pozycję 1 , trzy klucze z pozycji 1 na pozycję 0, dwa z pozycji 0 na pozycję 9 itd. Mamy 60 +61 + *• ■+ 6m - 1 = N, a średnia liczba prób potrzebnych do znalezienia któregoś spośród N kluczy wynosi 1 + (co -f ci 4- *• • + cm - \ ) / N .
(45)
Wzór (44) wydaje się definiować wielkości c cyklicznie na podstawie nich samych, jednak faktycznie istnieje jednoznaczne rozwiązanie tych równań, o ile tylko N < M (zobacz ćwiczenie 32). Schay i Spruth zastosowali ten pomysł do wyznaczenia prawdopodobień stwa że Cj = A;, w zależności od prawdopodobieństwa p*., że bj = k. (Te prawdopodobieństwa są niezależne od j ) . Tak więc Qo =PoQo+Piqo+Poqii qi = P2 qo + p m + Poq2 , <72 =P3<70 +P2qi +Pl<72 +Poq3,
(46)
1 tak dalej, ponieważ, przykładowo, prawdopodobieństwo, że r, = 2, jest równe prawdopodobieństwu, że bj + C(y+1) mocj m = 3. Niech B(z) = YjPk%k i C(z) = 'Y^qkZh będą funkcjami tworzącymi tych rozkładów prawdopodobieństwa; rów nania (46) są równoważne zależności B(z)C(z) = p 0<7o + (?o ~Poqo)z + qiz2 H---- = p 0g0(l - z)+ zC(z). Ponieważ B( 1) = 1,możemy napisać B(z) = 1 + (z — l)D(z), astądwynika, że niy\ ^ }
Poq° 1 -D (z)
1 " U 1) l-D (z)’
(47)
6.4
HASZOWANIE
581
gdyż C(l) = 1 . Średnia liczba prób potrzebnych do znalezienia klucza w myśl wzoru (45) wyniesie zatem 1+
*LC ' m = N
^
1+
M D'{1) = N I — D(l)
1+
M
B"W
2 N 1 - B !(1)'
Ponieważ zakładamy, że każdy ciąg haszowania a\ . .. dopodobny, mamy
(ar) ^
jest jednakowo praw
pk — Pr (dokładnie k spośród ai jest równych j dla ustalonego j) k )\M ) V
(49)
M)
zatem B W - ( 1+
w
. »
,
( 5„,
więc zgodnie z (48) średnia liczba prób wyniesie cv = 7 i + ^ 7 ) .
(5 1 )
2\ M —N Czy Czytelnik potrafi dostrzec nieścisłość w rozumowaniu, która spowodowała, że ta wielkość różni się od prawidłowego wyniku z twierdzenia K? (Zobacz ćwiczenie 33). *Rozważania o optymalności. Zobaczyliśmy kilka przykładów ciągów prób dla adresowania otwartego, co nasuwa naturalne pytanie o ciąg, o którym można udowodnić, że jest najlepszy możliwy według jakiegoś sensownego kryterium. J. D. Ullman postawił ten problem w następujący ciekawy sposób [JACM 19 (1972), 569-575]: Zamiast obliczać adres haszowania h(K), odwzorowujemy każdy klucz K na całą permutację zbioru {0,1, . . . , M —1}, reprezentującą ciąg prób dla K. Każdej spośród M! permutacji jest przypisane pewne prawdopodo bieństwo, a uogólniona funkcja haszująca ma wybierać każdą permutację z takim właśnie prawdopodobieństwem. Pytanie, jakie stawiamy, brzmi: „Jakie przypi sanie prawdopodobieństw permutacjom daje najlepszą wydajność, w tym sensie, że odpowiadająca mu średnia liczba prób CN lub C(N jest najmniejsza?”. Jeśli na przykład każdej permutacji przypiszemy prawdopodobieństwo 1/M!, to łatwo zobaczyć, że mamy wówczas do czynienia z niczym innym jak z próbko waniem jednostajnym, które przeanalizowaliśmy wyżej w (32) i (34). Ullman znalazł jednak przykład dla M = 4 i JV = 2, w którym CfN jest mniejsze niż wartość | otrzymana dla próbkowania jednostajnego. W jego konstrukcji prawdopodobieństwo zerowe jest przypisane wszystkim oprócz poniższych sze ściu permutacji: Permutacja Prawdopodobieństwo 0 12 3 (1 + 2e)/6 2 0 13 (1 - e)/6 3 0 12 (1 - e)/6
Permutacja Prawdopodobieństwo 1 032 (1 + 2e)/6 / n 2 10 3 (1 - e)/6 1 J 3 10 2 (1 —e)/6
582
WYSZUKIWANIE
6.4
Z grubsza biorąc, pierwszą próbą bywa najczęściej 2 lub 3, ale drugą próbą jest zawsze 0 lub 1 . Średnią liczbą prób C% potrzebnych do wstawienia trzeciego elementu okazuje się być | — + 0(e2), więc możemy zyskać przewagę nad próbkowaniem jednostajnym, biorąc jako e jakąś małą dodatnią wartość. Odpowiednia wartość C[ dla powyższych prawdopodobieństw wynosi jednak | | + O(e), czyli więcej niż | (wartość dla próbkowania jednostajnego). Ullman udowodnił, że dla dowolnego sposobu przypisania prawdopodobieństw takiego, że CfN < (M + 1)/(M+1 —N) dla pewnego N, zawsze jest Cfn > (M + 1)/(M + 1 —n) dla pewnego n < N ; nie można cały czas wygrywać z próbkowaniem jednostajnym. W rzeczywistości liczba prób Cjv przy wyszukiwaniu zakończonym sukcesem jest lepszą miarą niż C*N . Permutacje (52) nie poprawiają wartości Cpj dla żadne go N, Ullman zaś postawił wręcz hipotezę, że żaden sposób przypisania prawdo podobieństw nie da C n mniejszego od wartości ((M + 1) / N) (H m +i ~ Pm+i-tv) dla próbkowania jednostajnego. Andrew Yao udowodnił asymptotyczną postać tei hipotezy, pokazując, że graniczny koszt dla N = a M i M —►00 jest zawsze > ¿ l n y ^ [JACM 32 (1985), 687-693]. Udowodnienie silnej postaci hipotezy Ullmana wydaje się bardzo trudne, zwłaszcza że istnieje wiele sposobów przypisania prawdopodobieństw tak, by uzy skać efekt próbkowania jednostajnego; nie musimy przypisywać wartości 1 /M! każdej permutacji. Przykładowo, następujące przypisanie dla M — 4 jest równo ważne próbkowaniu jednostajnemu (pozostałym 16 permutacjom przypisujemy prawdopodobieństwo zerowe): Permutacja Prawdopodobieństwo 012 3 1/6 1 23 0 1/6 230 1 1/6 301 2 1/6
Permutacja Prawdopodobieństwo 0 21 3 1/12 1 32 0 1/12 (53) 2 03 1 1/12 3 10 2 1/12
Poniższe twierdzenie daje charakterystykę wszystkich przypisań dających efekt próbkowania jednostajnego. Twierdzenie U. Przypisanie prawdopodobieństw permutacjom uczyni każdą spośród (^) konfiguracji komórek pustych i zajętych jednakowo prawdopodobną po N wstawieniach, dla 0 < N < M, wtedy i tylko wtedy; gdy suma prawdopo dobieństw przypisanych wszystkim permutacjom, których N elementów tworzy dany zbiór N-elementowy, jest równa 1 / (^) dla każdego N i dla każdego zbioru N-elementowego. Na przykład suma prawdopodobieństw przypisanych każdej z 3!(M —3)! permutacji, zaczynających się od liczb { 0, 1 , 2} w pewnej kolejności, musi być równa l / ( ^ ) = 3!(M — 3)!/M!. Zauważmy, że warunek z tego twierdzenia zachodzi dla przypisania (53), ponieważ 1/6 + 1/12 = 1/4. Dowód. Niech A C { 0, 1 , . . . , M —l } i niech II (A) będzie zbiorem wszystkich per mutacji, których pierwszych \A\ elementów należy do A; dalej, niech S(A) będzie sumą prawdopodobieństw przypisanych tym permutacjom. Niech P/e (A) będzie prawdopodobieństwem tego, że pierwszych \A\ wstawień wykonanych zgodnie
6.4
HASZOWANIE
583
z procedurą adresowania otwartego spowodowało zajęcie pozycji określonych przez A oraz że ostatnie wstawienie wymagało dokładnie k prób. Na koniec, niech P(A) — P\{A) + PiiA) + **■. Dowód przebiega przez indukcję względem N > 1 , przy założeniu, że P(A) = S(A) = l / Q dla wszystkich zbiorów A takich, że \A\ = n < N. Niech B będzie dowolnym zbiorem Af-elementowym. Wówczas
X
P k(B )=
P r(7r)-p (B \ { 7rfc})>
A C B 7reII(A) \ A\ ~k
gdzie Pr(7r) jest prawdopodobieństwem przypisanym permutacji 7r, 7r* zaś jest jej fc-tym elementem. Z założenia indukcyjnego *«») =
E ACB \N ~ l) \A\ = k
E Prw 7ren(A )
Wartością tego wyrażenia jest ’N \ ii M
\ (M'
zatem
a ta wielkość może być równa l / ( ^ ) wtedy i tylko wtedy, gdy S(B) ma właściwą wartość. | W yszukiwanie zewnętrzne. Techniki haszowania nieźle nadają się do wyszu kiwania zewnętrznego stosowanego do pamięci o dostępie bezpośrednim, takich jak dyski czy bębny. W takich zastosowaniach, tak jak w punkcie 6.2.4, chcemy minimalizować liczbę dostępów do pliku, a to ma dwojaki wpływ na wybór algorytmów. 1 ) Rozsądną rzeczą jest spędzić więcej czasu na obliczaniu funkcji haszującej, ponieważ kara za złe haszowanie jest znacznie większa niż koszt dodatkowego czasu potrzebnego do starannego wykonania zadania. 2) Rekordy są zazwyczaj zgrupowane w strony lub kubełki, wskutek czego za każdym razem z pamięci zewnętrznej pobieranych jest wiele rekordów. Plik jest podzielony na M kubełków, z których każdy zawiera po b rekor dów. Kolizje nie stanowią teraz żadnego problemu dopóty, dopóki więcej niż b kluczy nie otrzyma tego samego adresu. Następujące trzy sposoby podejścia do rozwiązywania kolizji wydają się najlepsze. A) Metoda łańcuchowa z osobnymi listami. Jeśli więcej niż b rekordów wpada do tego samego kubełka, to na końcu pierwszego kubełka można wstawić dowiązanie
584
WYSZUKIWANIE
6.4
do rekordu powodującego przepełnienie. Te nadmiarowe rekordy są przechowy wane w specjalnym obszarze nadmiarowym. Tworzenie kubełków w obszarze nadmiarowym nie przysparza zazwyczaj żadnych korzyści, ponieważ występuje stosunkowo niewiele przepełnień; dodatkowe rekordy powiązuje się więc zwykle ze sobą tak, że sięgnięcie do ( b + fc)-tego rekordu na liście wymaga 1 + k dostę pów do pamięci. Zazwyczaj dobrym pomysłem jest pozostawienie nieco miejsca na przepełnienia w każdym cylindrze pliku dyskowego, dzięki czemu większość odwołań dotyczy tego samego cylindra. Chociaż ta metoda obsługi przepełnień wydaje się nieefektywna, to liczba przepełnień jest statystycznie rzecz biorąc na tyle mała, że średni czas wyszu kiwania jest bardzo dobry. W tabelach 2 i 3 jest przedstawiona średnia liczba wymaganych odwołań jako funkcja współczynnika wypełnienia a = N/ Mb,
(54)
dla ustalonego a przy M, N —» oo. Co ciekawe, dla a — 1 asymptotyczna liczba odwołań dla wyszukiwania zakończonego niepowodzeniem rośnie wraz ze wzrostem wartości 5. Tabela 2 ŚREDNIA LICZBA DOSTĘPÓW PRZY ZAKOŃCZONYM NIEPOWODZENIEM WYSZUKIWANIU METODĄ ŁAŃCUCHOWĄ Z OSOBNYMI LISTAMI
Rozmiar kubełka b
10%
20%
30%
1 2 3 4 5 10 20 50
1.0048 1.0012 1.0003 1.0001 1.0000 1.0000 1.0000 1.0000
1.0187 1.0088 1.0038 1.0016 1.0007 1.0000 1.0000 1.0000
1.0408 1.0269 1.0162 1.0095 1.0056 1.0004 1.0000 1.0000
Współczynnik wypełnienia a 40% 50% 60% 70% 80% 90% 95% 1.0703 1.0581 1.0433 1.0314 1.0225 1.0041 1.0001 1.0000
1.1065 1.1036 1.0898 1.0751 1.0619 1.0222 1.0028 1.0000
1.1488 1.1638 1.1588 1.1476 1.1346 1.0773 1.0234 1.0007
1.197 1.238 1.252 1.253 1.249 1.201 1.113 1.018
1.249 1.327 1.369 1.394 1.410 1.426 1.367 1.182
1.307 1.428 1.509 1.571 1.620 1.773 1.898 1.920
1.34 1.48 1.59 1.67 1.74 2.00 2.29 2.70
Tabela 3 ŚREDNIA LICZBA DOSTĘPÓW PRZY ZAKOŃCZONYM SUKCESEM WYSZUKIWANIU METODĄ ŁAŃCUCHOWĄ Z OSOBNYMI LISTAMI
Rozmiar >ełka b
10%
20%
30%
1 2 3 4 5 10 20 50
1.0500 1.0063 1.0010 1.0002 1.0000 1.0000 1.0000 1.0000
1.1000 1.0242 1.0071 1.0023 1.0008 1.0000 1.0000 1.0000
1.1500 1.0520 1.0215 1.0097 1.0046 1.0002 1.0000 1.0000
Współczynnik wypełnienia a 40% 50% 60% 70% 80% 90% 95% 1.2000 1.0883 1.0458 1.0257 1.0151 1.0015 1.0000 1.0000
1.2500 1.1321 1.0806 1.0527 1.0358 1.0070 1.0005 1.0000
1.3000 1.1823 1.1259 1.0922 1.0699 1.0226 1.0038 1.0000
1.350 1.238 1.181 1.145 1.119 1.056 1.018 1.001
1.400 1.299 1.246 1.211 1.186 1.115 1.059 1.015
1.450 1.364 1.319 1.290 1.268 1.206 1.150 1.083
1.48 1.40 1.36 1.33 1.32 1.27 1.22 1.16
HASZOWANIE
6.4
585
B) Metoda łańcuchowa ze sklejaniem list. Zamiast udostępniać osobny obszar nadmiarowy, możemy zaadaptować algorytm C do plików przechowywanych w pamięci zewnętrznej. Dla każdego cylindra można utrzymywać listę dwukie runkową wolnych miejsc, wiążącą ze sobą wszystkie kubełki, które nie są jeszcze całkowicie zapełnione. Zgodnie z tym schematem każdy kubełek zawiera licznik informujący o tym, ile miejsc na rekordy jest pustych, a kubełek jest usuwany z listy dwukierunkowej dopiero wtedy, kiedy wartość jego licznika spada do zera. Do rozpraszania nadmiarowych rekordów można zastosować „wędrujący wskaźnik” (zobacz ćwiczenie 2.5-6), dzięki czemu różne łańcuchy mają tendencję do wpadania do różnych kubełków nadmiarowych. Ta metoda nie doczekała się dotąd analizy, ale może się okazać całkiem użyteczna. C) Adresowanie otwarte. Możemy również obyć się bez dowiązań, stosując me todę „otwartą”. Próbkowanie liniowe jest zapewne lepsze niż losowe w kon tekście wyszukiwania zewnętrznego, ponieważ często możemy dobrać krok c tak, żeby zminimalizować opóźnienia między kolejnymi dostępami do pamięci. Przedstawiony wcześniej przybliżony model teoretyczny próbkowania liniowego można uogólnić tak, by uwzględniał wpływ obecności kubełków; pokazuje on wówczas, że próbkowanie liniowe rzeczywiście sprawuje się zadowalająco, o ile tablica nie jest bardzo zapełniona. Zerknijmy na przykład do tabeli 4; jeśli współczynnik wypełnienia wynosi 90 procent, a kubełek ma rozmiar 50, to średnia liczba dostępów w wyszukiwaniu zakończonym sukcesem wynosi zaledwie 1.04. To faktycznie lepiej niż 1.08 dostępów wymaganych w przypadku metody łańcuchowej (A) z takim samym rozmiarem kubełka! Tabela 4 ŚREDNIA LICZBA DOSTĘPÓW PRZY ZAKOŃCZONYM SUKCESEM WYSZUKIWANIU METODĄ PRÓBKOWANIA LINIOWEGO
Rozmiar kubełka b 10% 1 2 3 4 5 10 20 50
1.0556 1.0062 1.0009 1.0001 1.0000 1.0000 1.0000 1.0000
20%
30%
1.1250 1.0242 1.0066 1.0021 1.0007 1.0000 1.0000 1.0000
1.2143 1.0553 1.0201 1.0085 1.0039 1.0001 1.0000 1.0000
Współczynnik wypełnienia a 40% 50% 60% 70% 80% 90% 95% 1.3333 1.1033 1.0450 1.0227 1.0124 1.0011 1.0000 1.0000
1.5000 1.1767 1.0872 1.0497 1.0307 1.0047 1.0003 1.0000
1.7500 1.2930 1.1584 1.0984 1.0661 1.0154 1.0020 1.0000
2.167 1.494 1.286 1.190 1.136 1.042 1.010 1.001
3.000 1.903 1.554 1.386 1.289 1.110 1.036 1.005
5.500 10.50 3.147 5.64 2.378 4.04 2.000 3.24 1.777 2.77 1.345 1.84 1.144 1.39 1.040 1.13
Analiza metod (A) i (C) obejmuje pewne bardzo ciekawe rozumowania ma tematyczne; w tym miejscu jedynie podsumujemy jej wyniki, ponieważ szczegóły są tematem ćwiczeń 49 i 55. We wzorach występują dwie funkcje silnie związane z funkcjami Q z twierdzenia K, a mianowicie
586
WYSZUKIWANIE
6.4
oraz ,„ ( a ) = e - n . ( p a L + 2
(n + 1)!
+ 3 f e .r ;
(n + 2)!
+
(n + 3)!
e nanna n (l - (1 - a)R(a, n)). (56) n\ Wyrażona przez te funkcje średnia liczba dostępów w przypadku metody łańcu chowej (A) dla wyszukiwania zakończonego niepowodzeniem wynosi C'N = l + abtb(a) + O ( ¿ )
(57 )
przy M, N —►oo, liczba zaś dostępów dla wyszukiwania zakończonego sukcesem to, odpowiednio, CN = H
p
b(~* h b r x b
—
/
1 \
(2 + ( a - l ) 6 + ( a 2 + ( a - l ) 2(6 - l ) ) i i ( a , 6 ) ) + 0 ^ — J. (58)
Wartości graniczne tych wzorów to wielkości zamieszczone w tabelach 2 i 3. Ponieważ metoda łańcuchowa (A) wymaga osobnego obszaru nadmiarowego, musimy oszacować, ile razy może nastąpić przepełnienie kubełka. Średnia liczba przepełnień będzie równa M{ CfN —1 ) = N t b(a), ponieważ CfN —1 jest średnią liczbą przepełnień na dowolnej ustalonej liście. Tak więc do wywnioskowania ilo ści miejsca potrzebnego na obszar nadmiarowy można skorzystać z tabeli 2. Dla ustalonego a odchylenie standardowe łącznej liczby przepełnień będzie z grubsza proporcjonalne do V M przy M —+ oo. Asymptotyczne wartości CfN i C n można znaleźć w ćwiczeniu 53, jednak te przybliżenia nie są zbyt dobre, kiedy b jest małe lub a jest duże; na szczęście szereg R(a, n) jest dość szybko zbieżny nawet dla dużych a, więc bez wielkiego trudu można wyznaczyć wartości tych wzorów z dowolną żądaną dokładnością. Wartości maksymalne, osiągane dla a = 1, to p
— bub+l
maxC'N = 1 + — P~bkb
m a x = 1+
^
j
L
\ ^¡r + 1 + ° ( b~ 5
)>
(59)
+ 0(b Ł),
(60)
r——
(R(b) + l) = - 4- y
przy b —►00, na mocy przybliżenia Stirlinga i analizy funkcji R(n) = R(l, n) —1 z podrozdziału 1.2.11.3. Średnia liczba dostępów do pamięci przy zakończonym sukcesem wyszuki waniu zewnętrznym metodą próbkowania liniowego jest opisana zadziwiająco prostym wyrażeniem CN w 1 + tb(a) + *26(a) + *36(a) H
,
(61 )
które można zinterpretować następująco: Średnia łączna liczba dostępów po trzebnych do wyszukania wszystkich N kluczy wynosi NCn, a ta wielkość jest równa N + Ti + T 2 + • • •, gdzie Tk to średnia liczba kluczy wymagających więcej niż k dostępów. Twierdzenie P mówi, że możemy wprowadzać klucze
6.4
HASZOWANIE
587
w dowolnej kolejności bez wpływu na wartość CV, a stąd wynika, że T& jest średnią liczbą rekordów nadmiarowych, które pojawiłyby się w metodzie łańcu chowej, gdybyśmy użyli M /k kubełków rozmiaru kb, czyli, zgodnie z tym, co powiedzieliśmy wcześniej, JVifcb(a). Dalsze uzasadnienie równania (61 ) można znaleźć w ćwiczeniu 55. Doskonałe wstępne omówienie kwestii praktycznych związanych z projek towaniem tablic z haszowaniem zewnętrznym podał Charles A. Olson, Proc. ACM Nat. Conf. 24 (1969), 539-549. W swoim artykule zamieścił on szereg opracowanych przykładów i wskazał, że liczba rekordów nadmiarowych znacząco wzrośnie, jeśli na pliku będą często wykonywane operacje wstawiania/usuwania bez przemieszczania rekordów. Przedstawił on również analizę tej sytuacji, uzy skaną we współpracy z J. A. de Peysterem. Porównanie m etod. Poznaliśmy rozliczne techniki wyszukiwania; jak teraz wybrać tę właściwą do konkretnego zastosowania? Trudno jest w kilku słowach podsumować wszystkie istotne szczegóły kompromisów związanych z wyborem metody wyszukiwania, ale wymienione poniżej kwestie wydają się najważniejsze z punktu widzenia szybkości wyszukiwania i wymagań pamięciowych. Na rysunku 44 przedstawione jest podsumowanie analiz zamieszczonych w tym podrozdziale, ukazujące fakt, że poszczególne metody rozwiązywania kolizji prowadzą do różnej liczby prób. Zliczanie prób nie daje nam jednak pełnego obrazu sytuacji, ponieważ czas wykonania jednej próby jest różny dla różnych metod, a to ma zauważalny wpływ na czas działania całej operacji (co widzieliśmy na rysunku 42). Próbkowanie liniowe wymaga częstszego sięgania do tablicy niż inne metody pokazane na rysunku 44, ale jego zaletą jest pro stota. W dodatku próbkowanie liniowe wcale nie jest takie fatalne: dla tablicy wypełnionej w 90 procentach algorytm L wymaga średnio mniej niż 5.5 prób do znalezienia losowego elementu znajdującego się w tablicy. (Tablica wypełnio na w 90 procentach wymaga jednak około 50.5 prób na każdy nowy element wstawiany algorytmem L). Rysunek 44 pokazuje, że metody łańcuchowe są dość ekonomiczne pod wzglę dem liczby wykonywanych prób, jednak dodatkowa pamięć potrzebna na pola z dowiązaniami niekiedy czyni adresowanie otwarte bardziej atrakcyjnym w przy padku małych rekordów. Jeśli na przykład mamy wybierać między tablicą z ha szowaniem łańcuchowym o pojemności 500 elementów a tablicą z haszowaniem otwartym o pojemności 1000, to jest jasne, że lepiej wybrać tę drugą możliwość, ponieważ pozwala ona na efektywne wyszukiwanie wśród 500 rekordów i jest w stanie objąć dwa razy więcej danych. Z drugiej strony, rozmiar i format rekor du pozwalają czasami uzyskać miejsce na dowiązania praktycznie bez żadnego dodatkowego kosztu. (Zobacz ćwiczenie 65). Jak wypadają metody oparte na haszowaniu w porównaniu z innymi stra tegiami wyszukiwania, którymi zajmowaliśmy się w tym rozdziale? Rozpatrując tę kwestię pod względem szybkości działania, możemy argumentować, że są one lepsze w sytuacji, kiedy liczba rekordów jest duża, ponieważ średni czas wyszuki wania dla dowolnej metody haszowania pozostaje ograniczony przy N —* 00, jeśli
588
WYSZUKIWANIE
6.4
O & -o Oh flS N O
‘S
Ti s 'CO
Współczynnik wypełnienia a = N/ M (a) Wyszukiwanie zakończone niepowodzeniem
* O 'O $-4 a «3 N .y
— próbkowanie liniowe == algorytm L | = próbkowanie losowe z grupowaniem wtórnym — haszowanie jednostajne « algorytm D = wariant Brenta algorytmu D = metoda łańcuchowa ze sklejaniem list = algorytm C S = metoda łańcuchowa z osobnymi listami S O = metoda łańcuchowa z osobnymi listami uporządkowanymi
L U2 U 3 - - B C
*3 Ta3> tH
'CO
0.2
0.3 0.4 0.5 0.6 0.7 0.8 Współczynnik wypełnienia a = N/ M (b) Wyszukiwanie zakończone sukcesem
0.9
1.0
Rys. 44. Porównanie metod rozwiązywania kolizji: wartości graniczne średniej liczby prób przy M —► oo. przyjmiemy zastrzeżenie, że tablica nigdy zbytnio się nie wypełnia. W programie L wyszukiwanie zakończone sukcesem zajmie na przykład tylko około 55 jedno stek czasu dla tablicy wypełnionej w 90 procentach; to lepiej niż najszybsza za pisana w języku MIX procedura wyszukiwania binarnego, jaką dotąd widzieliśmy (ćwiczenie 6.2.1-24) dla N większego niż mniej więcej 600, a płacimy za to tylko dodatkowymi 11 procentami zajmowanej pamięci. W dodatku wyszukiwanie binarne nadaje się tylko do tablic o ustalonej zawartości, podczas gdy tablica z haszowaniem umożliwia efektywne wstawienia.
6.4
HASZOWANIE
589
Możemy również porównać program L z drzewiastymi metodami wyszukiwa nia, dopuszczającymi dynamiczne wstawienia. Program L z tablicą wypełnioną w 90 procentach jest szybszy niż program 6.2.2T, począwszy mniej więcej od N równego 90, i szybszy niż program 6.3D (ćwiczenie 6.3-9), począwszy mniej więcej od N równego 75. Tylko jedna metoda wyszukiwania przedstawiona w tym rozdziale zapewnia efektywność wyszukiwania kończącego się sukcesem praktycznie bez żadnego narzutu pamięciowego: jest to wariant Brenta algorytmu D. Ta metoda pozwala nam umieścić N rekordów w tablicy rozmiaru M —N + 1 i znajdować dowolny rekord za pomocą średnio 2.5 prób. Nie wymaga ona żadnej dodatkowej pamię ci na pola z dowiązaniami lub na bity znacznikowe; wyszukiwanie zakończone niepowodzeniem potrwa jednak wówczas bardzo długo: będzie wymagało około N /2 prób. Haszowanie ma zatem wiele zalet. Jednakże, wyszukiwanie w tablicy z haszowaniem jest pod trzema ważnymi względami gorsze od innych metod: a) Po wyszukiwaniu zakończonym niepowodzeniem w tablicy z haszowaniem wiemy tylko tyle, że podanego klucza nie ma. Metody wyszukiwania oparte na porównaniach zawsze dają więcej informacji; umożliwiają znalezienie naj większego klucza < K i/lub najmniejszego klucza > K . Ma to duże znaczenie w wielu zastosowaniach; umożliwia na przykład interpolowanie wartości funkcji na podstawie wartości przechowywanych w tablicy. Algorytmów opartych na porównaniach możemy również użyć do znajdowania wszystkich kluczy leżących między dwiema danymi wartościami K i K'. Prócz tego, algorytmy przeszukiwa nia drzew z podrozdziału 6.2 umożliwiają łatwe przeglądanie zawartości tablicy w porządku rosnącym, bez jej osobnego sortowania. b) Przydzielanie pamięci dla tablic z haszowaniem jest często dosyć trudne; musimy zarezerwować pewien obszar pamięci na tablicę, a wcale nie musi być oczywiste, ile pamięci powinno się na to przeznaczyć. Jeśli zadeklarujemy na ten cel zbyt dużo pamięci, to będziemy ją marnować kosztem innych struktur lub pozostałych użytkowników komputera; jeśli jednak nie zapewnimy dostatecznej ilości miejsca, to tablica będzie się przepełniać. Dla kontrastu, w operujących na drzewach algorytmach wyszukiwania i wstawiania, drzewa nigdy nie są większe niż to konieczne. W środowisku z pamięcią wirtualną możemy zachować lokalność odwołań do pamięci, stosując wyszukiwanie drzewowe lub wyszukiwanie w drzewie cyfrowym, zamiast tworzyć dużą tablicę z haszowaniem, która przy prawie każdym haszowaniu klucza zmusza system operacyjny do sięgania do nowej strony. c) Wreszcie po trzecie, stosując metody oparte na haszowaniu, musimy pokładać głęboką wiarę w rachunek prawdopodobieństwa, ponieważ metody te są efektywne tylko w przypadku średnim, a ich zachowanie pesymistyczne jest fatalne! Tak jak w przypadku generatorów liczb losowych, nigdy nie możemy uzyskać całkowitej pewności, że funkcja haszująca będzie działała przyzwoicie w zastosowaniu do nowego zestawu danych. Z tego powodu tablice z haszowaniem nie nadają się do pewnych zastosowań czasu rzeczywistego, takich jak kontro
590
WYSZUKIWANIE
6.4
la ruchu powietrznego, gdzie na szali jest ludzkie życie; algorytmy dla drzew zrównoważonych z punktów 6.2.3 i 6.2.4 są znacznie bezpieczniejsze, ponieważ gwarantują górne ograniczenie czasu wyszukiwania. Historia. Ideę haszowania, jak się wydaje, urzeczywistnił H. P. Luhn, który w styczniu 1953 napisał notatkę na wewnętrzny użytek IBM, sugerującą sto sowanie metody łańcuchowej; jego propozycja była w rzeczywistości jednym z pierwszych zastosowań list z dowiązaniami. Wskazał on też celowość wyko rzystywania kubełków zawierających więcej niż jeden element w przypadku wy szukiwania zewnętrznego. Wkrótce potem A. D. Lin rozwinął analizę Luhna i zaproponował technikę obsługi przepełnień, korzystającą z „adresów zdegenerowanych”; na przykład przepełnienia z głównego kubełka 2748 były umieszczane w podrzędnym kubełku 274; przepełnienia z tego kubełka wędrowały do kubełka trzeciego rzędu 27 i tak dalej, przy założeniu, że jest 10000 głównych kubełków, 1000 kubełków podrzędnych, 100 kubełków trzeciego rzędu itd. Funkcje haszujące pierwotnie zaproponowane przez Luhna miały naturę cyfrową; łączył on na przykład sąsiednie pary cyfr klucza, dodając je mod 10, tak więc liczbę 31415 926 ścisnąłby do 4548. Mniej więcej w tym samym czasie na pomysł haszowania wpadła niezależnie inna grupa pracowników IBM: Gene M. Amdahl, Elaine M. Boehme, N. Ro chester i Arthur L. Samuel, którzy tworzyli program assemblera na maszynę IBM 701. Dla rozwiązania problemu kolizji Amdahl wprowadził adresowanie otwarte z próbkowaniem liniowym. W powszechnie dostępnej literaturze haszowanie jako pierwszy opisał Arnold I. Dumey, Computers and Automation 5,12 (December 1956), 6-9. To on jako pierwszy napomknął o koncepcji dzielenia przez liczbę pierwszą i użycia reszty jako adresu haszowania. W swoim interesującym artykule Dumey wspomina o metodzie łańcuchowej, ale nie o adresowaniu otwartym. Rosjanin A. P. Jerszow niezależnie odkrył adresowanie liniowe otwarte w 1957 roku [Dokłady Akad. Nauk SSSR 118 (1958), 427-430]; opublikował on wyniki empiryczne dotyczące liczby prób, stawiając prawdziwą, jak się okazało, hipotezę, że średnia liczba prób przypadających na każde wyszukiwanie zakończone sukcesem jest < 2, jeśli N /M < 2/3. Klasyczny artykuł W. W. Petersona, IBM J. Research & Development 1 (1957), 130-146, był pierwszą znaczącą pracą dotyczącą problemu wyszuki wania w dużych plikach. Peterson zdefiniował adresowanie otwarte w ogólnym przypadku, przeanalizował wydajność próbkowania jednostajnego i podał liczne empiryczne dane statystyczne związane z zachowaniem adresowania liniowego otwartego przy różnych rozmiarach kubełków, odnotowując spadek wydajności występujący przy usuwaniu elementów. Inną wyczerpującą pracę przeglądową dotyczącą tego zagadnienia opublikował sześć lat później Werner Buchholz [IBM Systems J. 2 (1963), 86 - 111 ], który szczególnie dobrze omówił funkcje haszujące. Poprawne analizy algorytmu L jako pierwsi opublikowali A. G. Konheim i B. We iss, SIAM J. Appl. Math. 14 (1966), 1266-1274; V. Podderjugin, Wissenscha ftliche Zeitschrift der Technischen Universität Dresden 17 (1968), 1087-1089.
6.4
HASZOWANIE
591
Do tego czasu próbkowanie liniowe było jedynym typem schematu adreso wania otwartego, który występował w literaturze, jednak wiele osób niezależ nie opracowało inny schemat oparty na wielokrotnym próbkowaniu losowym za pomocą niezależnych funkcji haszujących (zobacz ćwiczenie 48). W ciągu następnych kilku lat haszowanie zaczęto bardzo powszechnie stosować, ale pra wie nic nowego na jego temat nie publikowano. Dopiero Robert Morris napisał bardzo ważną pracę stanowiącą przegląd tematyki [CACM 1 1 (1968), 38-44], w której wprowadził pojęcie próbkowania losowego z grupowaniem wtórnym. Praca Morrisa rozpętała całą lawinę działań, której punktem kulminacyjnym był algorytm D i jego ulepszenia. Ciekawą rzeczą będzie zwrócić uwagę na to, że słowo „haszowanie”, jak się wydaje, nigdy nie pojawiło się w druku w swoim obecnym znaczeniu aż do końca lat sześćdziesiątych, chociaż stanowiło już wówczas popularny żargon w wielu częściach świata. Wygląda na to, że pierwszą publikacją zawierającą to słowo była książka H. Hellermana Digital Computer System Principles (New York: McGraw-Hill, 1967), 152; jedyne wcześniejsze wystąpienie tego słowa, wśród mniej więcej 60 dotyczących tej tematyki dokumentów zbadanych przez autora przy pisaniu tego podrozdziału, znalazło się w nieopublikowanym memorandum napisanym przez W. W. Petersona w 1961 roku. Wyszło jakoś tak, że angielski czasownik „to hash” w magiczny sposób osiągnął status standardowej termino logii oznaczającej przekształcanie klucza w połowie lat sześćdziesiątych, ale nikt nie miał śmiałości użyć tak niewykwintnego słowa w druku aż do 1967 roku! Późniejsze osiągnięcia. Od czasu, kiedy autor po raz pierwszy przygotowywał ten rozdział w 1972 roku, poczyniono znaczne postępy w zakresie teorii i praktyki haszowania, chociaż omówione wyżej podstawowe idee nadal są użyteczne w zwy kłych zastosowaniach. Jako przykład można tu wymienić książkę J. S. Vit tera i W.-C. Chena Design and Analysis of Coalesced Hashing (New York: Oxford Univ. Press, 1987), zawierającą omówienie i analizę całego szeregu pouczających wariantów algorytmu C. Pod względem praktycznym najważniejszą techniką haszowania wynalezioną pod koniec lat siedemdziesiątych jest zapewne metoda nazwana przez Witolda Lipskiego haszowaniem liniowym [Proc. 6th International Conf. on Very Large Databases (1980), 212-223]. W haszowaniu liniowym - tak się składa, że nie ma ono nic wspólnego z klasyczną techniką próbkowania liniowego - dopuszcza się, by liczba adresów haszowania rosła i/lub malała wraz ze wstawianiem i/lub usuwaniem elementów. Doskonałe omówienie haszowania liniowego, włączając w to porównanie z innymi metodami wyszukiwania wewnętrznego, podał Per-Âke Larson w pracy CACM 31 (1988), 446-457; ulepszenia w sytuacji, kiedy mamy jednocześnie wiele dużych i/lub małych tablic, omawiają W. G. Griswold i G. M. Townsend, Software Practice & Exp. 23 (1993), 351-367. Haszowanie liniowe można również stosować do ogromnych baz danych rozproszonych między wiele różnych miejsc w sieci [zobacz Litwin, Neimat i Schneider, ACM Trans. Database Syst. 21 (1996), 480-525]. Alternatywny schemat zwany haszowaniem rozsze rzalnym, który ma tę własność, że do odczytania dowolnego rekordu potrzeba co
592
6.4
WYSZUKIWANIE
najwyżej dwóch odwołań do stron zewnętrznych, zaproponowali mniej więcej w tym samym czasie R. Fagin, J. Nievergelt, N. Pippenger i H. R. Strong [ACM Trans. Database Syst. 4 (1979), 315-344]. Zarówno haszowanie liniowe, jak i rozszerzalne są lepsze niż R-drzewa z punktu 6.2.4, jeśli kolejność kluczy jest nieistotna. Jeśli chodzi o nurt teoretyczny, to wynaleziono bardziej skomplikowane me tody, które gwarantują maksymalny czas dostępu 0(1) z zachowaniem średniego amortyzowanego czasu 0 ( 1 ) na każde wstawienie i usunięcie, niezależnie od badanych kluczy; co więcej, łączna pamięć wykorzystywana w dowolnym momen cie jest ograniczona przez pewną stałą razy liczba aktualnie przechowywanych elementów, plus dodatkowa stała. Autorami tego wyniku, opartego na pomysłach Predmana, Komlósa i Szemerediego [JACM 31 (1984), 538-544], są Dietzfelbinger, Karlin, Mehlhorn, Meyer auf der Heide, Rohnert i Tarjan [SICOMP 23 (1994), 738-761]. ĆWICZENIA 1. [20] Ile co najmniej i co najwyżej może wynosić zawartość rejestru rll w chwili osiągnięcia instrukcji 9H w tabeli 1, przy założeniu, że każdy z bajtów 1, 2, 3 klucza K zawiera kod znaku alfanumerycznego mniejszy niż 30? 2. [20] Znajdź w miarę znane angielskie słowo spoza tabeli 1 , które można by dodać do tej tabeli bez zmieniania programu. 3. [23] Wyjaśnij, dlaczego żadnego programu zaczynającego się od pięciu instrukcji LD1 LD2 INC1 LD2 J2Z
K(1:1) K(2:2) a ,2 K(3:3) 9F
lub lub
LD1N K( l : l ) LD2N K(2:2)
nie można by użyć zamiast bardziej skomplikowanego programu z tabeli 1 dla żadnej stałej a, ponieważ dla danych kluczy nie uzyskalibyśmy jednoznacznych adresów. 4. [M30] Ile osób należy zaprosić na przyjęcie, żeby prawdopodobna była obecność trzech osób obchodzących urodziny tego samego dnia? 5. [15] Pan R. S. Tępak pisał kompilator języka FORTRAN na maszynie dziesiętnej MIX i potrzebował tablicy symboli do przechowywania nazw zmiennych kompilowanego programu. Długość tych nazw była ograniczona do co najwyżej dziesięciu znaków. Zdecydował się on zastosować tablicę z haszowaniem rozmiaru M = 100 i użyć szybkiej funkcji haszującej h ( K ) = pierwszy z lewej strony bajt K. Czy był to dobry pomysł?
6 . [15] Czy roztropnie byłoby zamienić dwie pierwsze instrukcje w (3 ) na LDA K; ENTX 0? 7. [HM30] (Haszowanie wielomianowe) Tematem tego ćwiczenia jest konstrukcja wielomianów P ( x ) takich jak ( 10 ), które przekształcają n-bitowe klucze w ra-bitowe adresy w taki sposób, że rozmaite klucze, które różnią się na co najwyżej t bitach, zostaną odwzorowane na różne adresy. Dla danych n i t ^ n oraz liczby całkowitej k takiej, że n dzieli 2k — 1 , skonstruujemy wielomian, którego stopień m jest funkcją n, t i k . (Zwykle n zwiększa się, jeśli trzeba, więc można wybrać w miarę małe k).
6.4
HASZOWANIE
593
Niech S będzie najmniejszym zbiorem liczb całkowitych, takim że {1, 2 , . . . , C5 oraz (2j ) mod n € S dla każdego j € 5. Jeśli na przykład n = 15,& = 4 i t = 6, t o mamy 5 = {1, 2, 3, 4, 5, 6, 8, 10, 12, 9}. Teraz definiujemy wielomian P( x) — “ a-0> gdzie a jest elementem rzędu n w ciele skończonym GF(2fc), a współczynniki P( x) są obliczane w tym ciele. Stopień m wielomianu P(x) jest równy liczbie elementów zbioru 5. Z tego, że a 2j jest pierwiastkiem P(x) , o ile tylko a j jest pierwiastkiem, wynika, że współczynniki pj wielomianu P ( x ) spełniają warunek p2 = p*, więc są równe 0 lub 1. Udowodnij, że jeśli R(x) = rn_ ix n_1 + ■• ■+ n x 4- ro jest dowolnym niezerowym wielomianem modulo 2 o co najwyżej t niezerowych współczynnikach, to R( x) nie jest wielokrotnością P( x) modulo 2. [Stąd wynika, że odpowiednia funkcja haszująca zachowuje się zgodnie z zapowiedzią]. 8. [M3Ą] (Twierdzenie o trzech odległościach) Niech 0 będzie liczbą niewymierną z zakresu od 0 do 1, której reprezentacją w formie regularnego ułamka łańcuchowego przy oznaczeniach z punktu 4.5.3 jest 6 = / / a i , 0 2 , 03 , • -. //• Niech qo = 0, po = 1, qi = 1, Pi = 0 oraz qk+i = + qk~ 1, Pfc+i = GfcPfc + Pfc-i dla ^ 1. Niech {x} oznacza xm od 1 = x — |_xj i niech { x } + oznacza x — [x] 4* 1. Odcinki powsta jące podczas wstawiania kolejnych punktów {0}, {20}, { 30} , . . . do przedziału [0 .. 1] ponumerujmy tak, żeby pierwszy odcinek danej długości miał numer 0, drugi - numer 1 itd. Udowodnij, że wszystkie poniższe stwierdzenia są prawdziwe: Lewym końcem przedziału numer s długości {¿0}, gdzie t = rqk + qk~i, 0 ^ r < ak , k jest parzyste i 0 ^ s < qr/e, jest {s0}, a prawym końcem jest {(s + ¿)#}+ * Lewym końcem przedziału numer s długości 1 — {t0}, gdzie t = rqk + qk- 1, 0 ^ r < ak , k jest nieparzyste i 0 ^ s < qk, jest {($ + £)#}, a prawym końcem jest {s0 }+ . Każdą dodatnią liczbę całkowitą n można jednoznacznie reprezentować jako n = rqk + qk~ 1 + s dla pewnych k ^ 1, 1 ^ r ^ ak i 0 ^ s < qk . W kontekście tej reprezentacji, n odcinków istniejących tuż przed wstawieniem punktu {n0} to pierwszych s odcinków (o numerach 0, . . . , s — 1) długości { (—l ) k(rqk + #fc-i)0}; pierwszych n — qk odcinków (o numerach 0, n —qk ~ 1) długości { ( —l ) kqk0}; ostatnich qk—s odcinków (o numerach s, . . . , qk —1) długości {( —l ) fc((r—l)qk-\~qk-i) 0}. Operacja wstawienia punktu {n0} powoduje usunięcie odcinka numer s trzeciego typu i zamienienie go na odcinek numer s pierwszego typu i odcinek numer n — qk drugiego typu. 9. [M30] Twierdzenie S mówi, że jeśli po kolei wstawiamy punkty { 0}, { 20}, . . . do odcinka [0.. 1], to każdy nowy punkt zawsze rozbija jeden z największych pozostałych odcinków. Sytuację polegającą na rozbiciu w ten sposób odcinka [a., c] na dwie części [a.. fe], [6.. c] nazwiemy złym podziałem, jeśli jedna z tych części jest ponad dwukrotnie dłuższa niż druga, czyli jeśli b — a > 2(c —b) lub c —b > 2(b — a). Udowodnij, że złe podziały będą się zdarzały dla pewnych {n0 }, chyba że 0 mod 1 = (p~l lub te ostatnie wartości 0 nigdy nie dają złych podziałów. 10. [M38] (R. L. Graham) Udowodnij, że jeśli 0, a ą , . . . , są liczbami rzeczywistymi, przy czym a i — 0, zaś m , . . . , są dodatnimi liczbami całkowitymi, i jeśli punkty {n0 + a j } wstawiamy do odcinka [0.. 1] dla 0 ^ n < nj i 1 ^ j ^ d, to otrzymanych ni + **■+ nd (być może pustych) odcinków ma co najwyżej 3d różnych długości. 11. [16] W wielu przypadkach wyszukiwanie kończące się sukcesem jest częstsze niż kończące się niepowodzeniem. Czy w takim razie dobrym pomysłem byłaby zamiana wierszy 1 2 -1 3 w programie C z wierszami 10 -1 1 ?
594
6.4
WYSZUKIWANIE
►12. [21 ] Pokaż, jak zapisać program C w taki sposób, żeby była tylko jedna instrukcja warunkowego skoku w wewnętrznej pętli. Porównaj czas działania zmodyfikowanego programu z oryginalnym. ►13. [24] (Skrócone klucze) Niech h ( K ) będzie funkcją haszującą i niech q(K) będzie taką funkcją K , że mając dane h ( K ) i q(K) można wyznaczyć klucz K . W przy padku haszowania przez dzielenie możemy na przykład przyjąć h ( K ) = K mod M i q( K) = [ K / M J; dla haszowania przez mnożenie jako h{K ) możemy wziąć wiodące bity ( A K / w ) mod 1 , zaś jako q(K) - pozostałe bity. Pokaż, że stosując metodę łańcuchową bez nakładania się list, możemy przecho wywać tylko q(K) zamiast K w każdym rekordzie. (To pozwala zaoszczędzić prawie całą pamięć potrzebną na pola z dowiązaniami). Zmodyfikuj algorytm C tak, żeby dopuszczał takie skrócone klucze, unikając nakładania się list, ale bez użycia żadnych obszarów pomocniczych na nadmiarowe rekordy. 14. [24] (E. W. Elcock) Pokaż, że duża tablica z haszowaniem może korzystać z pa mięci wspólnie z dowolną liczbą innych list. Niech każde słowo z obszaru listy zawiera 2-bitowe pole TAG i dwa pola z dowiązaniami, zwane LINK i AUX, o następującej inter pretacji: TAG(P) = 0 oznacza słowo na liście wolnych miejsc; LINK(P) wskazuje na następny element na tej liście, a pole AUX(P) jest nieużywane, TAG(P) = 1 oznacza słowo w użyciu, gdzie P nie jest adresem haszowania żadnego klucza w tablicy z haszowaniem; pozostałe pola słowa na pozycji P mogą mieć dowolny wymagany format. TAG(P) = 2 oznacza, że P jest adresem haszowania przynajmniej jednego klu cza; AUX(P) wskazuje na listę określającą wszystkie takie klucze, a LINK(P) wskazuje na inne słowo na liście. Kiedy przetwarzając jakąś listę, trafiamy na słowo z TAG(P) — 2, wtedy powtarzamy operację P <— LINK(P) aż do osiągnięcia słowa z TAG(P) ^ 1. (Dla zwiększenia efektywności moglibyśmy wówczas zmieniać również wcześniejsze dowiązania, żeby nie trzeba było za każdym razem od nowa przeskakiwać tych samych elementów). Zdefiniuj stosowne algorytmy wstawiania i wyszukiwania kluczy w takiej tablicy z ha szowaniem. 15. [16] Dlaczego dobrym pomysłem w algorytmie L i w algorytmie D jest sygnalizo wanie przepełnienia dla N = M — 1 zamiast dla N = M l
16.
[10] W opisie programu L stwierdza się, że K nie powinno być zerem. Czy jednak rzeczywiście nie działa on dla K równego zeru?
17. [15] Dlaczego nie zdefiniować po prostu h,2 ( K ) = h \ ( K ) w (25), jeśli h i ( K ) ^ 0 ? ►18. [21] Czy kod (31 ) jest lepszy, czy gorszy niż ( 30 ), jeśli wstawimy go zamiast wierszy 1 0 -1 3 w programie D? Podaj swoją odpowiedź na podstawie średnich wartości A, 51 i C.
19. [40] Sprawdź empirycznie efekt ograniczenia zakresu h,2 (K ) w algorytmie D: (a) 1 ^ h2( K ) ^ r dla r = 1 , 2 , 3 , . . . , 10; (b) 1 ^ h 2(K ) ^ p M dla p =
...,
20. [M25] (R. Krutar) Zmień algorytm D w następujący sposób, pozbywając się funkcji haszującej /i2 (K). W kroku D3 przyjmij c *— 0, a na początku kroku D4 przyjmij c<—c + 1 . Udowodnij, że jeśli M — 2 m, to odpowiedni ciąg prób h \ ( K ) , ( h i ( K ) — l) mod M , . . . , ( h i ( K ) — (^ )) mod M będzie dowolną permutacją zbioru
HASZOWANIE
6.4
595
{ 0 , 1 , . . . , M ~ 1}. Jak wypada ta metoda „próbkowania kwadratowego” zaprogramo wana na maszynie MIX w porównaniu z trzema programami rozważanymi na rysun ku 42, zakładając, że algorytm zachowuje się jak próbkowanie losowe z grupowaniem wtórnym? ►21. [20] Przypuśćmy, że chcemy usunąć rekord z tablicy skonstruowanej algorytmem D, oznaczając go jako „skasowany”, jak zasugerowano w tekście podrozdziału. Czy powinniśmy również zmniejszyć wartość zmiennej N wykorzystywanej do sterowania algorytmem D? 22. [27] Udowodnij, że algorytm R pozostawia tablicę dokładnie taką samą, jaka byłaby, gdyby klucza KEY[z] nigdy do niej wcześniej nie wstawiono. ►23. [33] Zaprojektuj analogiczny do algorytmu R algorytm usuwania elementów z ta blicy z haszowaniem łańcuchowym skonstruowanej algorytmem C. 24. [M20] Przypuśćmy, że zbiór wszystkich możliwych kluczy ma M P elementów, przy czym na dowolny ustalony adres jest haszowanych dokładnie P kluczy. (W prak tycznych przypadkach P jest bardzo duże; jeśli na przykład klucze są dowolnymi liczbami 10-cyfrowymi i M — 103, to mamy P — 107). Załóżmy, że M ^ 7 i iV = 7. Jeśli ze zbioru wszystkich możliwych kluczy wybierzemy losowo siedem różnych kluczy, to ile dokładnie wynosi prawdopodobieństwo tego, że otrzymamy ciąg haszowania 1 2 6 2 16 1 (czyli że h ( K i) = 1 , h { K 2 ) = 2, . . . , h(Kr) = 1), jako funkcja M i P? 25. [Ml9] Wyjaśnij, dlaczego równanie (39 ) jest prawdziwe. 26. [M20] Ile ciągów haszowania ai a% . . . ag daje układ zajętych komórek (21), jeśli stosujemy próbkowanie liniowe? 27. [M27] Dokończ dowód twierdzenia K. [Wskazówka: Niech s ( n , x , y ) = J Z ( f c ) ( x + k )k+1(y ~ k )n~k~1(y ~ n ); k
zastosuj twierdzenie Abela o dwumianie, równanie 1.2.6-(i6), do udowodnienia, że s { n , x )y) = x ( x - \ - y ) n + n s ( n - l , £ + 1 , y - l ) ] . 28. [M30] W dawnych czasach, kiedy komputery były znacznie wolniejsze niż teraz, obserwując migające lampki można było zobaczyć, jak szybko działał algorytm L. Kiedy tablica zaczynała się wypełniać, niektóre elementy były przetwarzane bardzo szybko, podczas gdy inne zabierały dużo czasu. To doświadczenie sugeruje, że odchylenie standardowe liczby prób w wyszukiwaniu zakończonym niepowodzeniem jest dość wysokie, jeśli stosujemy próbkowanie liniowe. Znajdź wzór wyrażający wariancję przez funkcje Q r , zdefiniowane w twierdzeniu K, i oszacuj wariancję dla N = a M przy M 00. 29. [M21] (Problem parkowania) Na pewnej ulicy jednokierunkowej jest m umiesz czonych jedno za drugim miejsc parkingowych, ponumerowanych od 1 do m. Ulicą przejeżdża samochód prowadzony przez męża, obok którego drzemie żona. Zona nagle się budzi i każe mężowi natychmiast zaparkować. Ten posłusznie parkuje na pierwszym wolnym miejscu; jeśli jednak nie ma już żadnych miejsc, do których można się dostać bez cofania (to znaczy, jeśli żona obudziła się, kiedy samochód dojeżdżał do miejsca fc, ale wszystkie miejsca /c, k + 1 , . . . , m są zajęte), to mąż wyraża ubolewanie i odjeżdża. Przypuśćmy, że to wszystko powtarza się z n różnymi samochodami, przy czym j -ta żona budzi się w momencie, w którym można jeszcze próbować zaparkować na
596
WYSZUKIWANIE
6.4
miejscu aj. Dla ilu ciągów a \ . . . a n wszystkie samochody bezpiecznie zaparkują, za kładając, że ulica jest na początku pusta i że nikt nie odjeżdża po zaparkowaniu? Na przykład dla m = n — 9 i a i . . . ag = 3 1 4 1 5 9 2 6 5 samochody zaparkują następująco:
[ Wskazówka: Zastosuj analizę próbkowania liniowego].
30. [M38] Pokaż, że jeśli n — m w problemie z ćwiczenia 29, to wszystkie samochody zostaną zaparkowane wtedy i tylko wtedy, gdy istnieje permutacja pi p 2 .. . pn zbioru { 1 , 2 , . . . , n}, taka że aj ^ pj dla każdego j.
31. [MĄO] Jeśli n = m w problemie parkowania z ćwiczenia 29, to okazuje się, że liczba rozwiązań jest równa (ra + 1 ) 71-1; z ćwiczenia 2.3.4.4-22 wiemy, że to jest to samo co liczba wolnych drzew n a n + 1 etykietowanych wierzchołkach! Znajdź interesujący związek między ciągami parkowań a drzewami. 32. [M27] Udowodnij, że układ równań (4 4 ) ma jednoznaczne rozwiązanie (co, c i , . . . , c m- i ) , jeśli tylko bo, 61, , &m-i są nieujemnymi liczbami całkowitymi o sumie mniej szej niż M. Zaprojektuj algorytm znajdowania tego rozwiązania. ►33. [M23] Wyjaśnij, dlaczego (51) jest jedynie przybliżeniem prawdziwej średniej liczby prób wykonywanej w algorytmie L. Co w wyprowadzeniu wzoru ( 51 ) nie było zupełnie ścisłe? ►34. [M23] Celem tego ćwiczenia jest zbadanie średniej liczby prób w tablicy z haszowaniem łańcuchowym z osobnymi listami, jak na rysunku 38. a) Ile wynosi P/vfc, czyli prawdopodobieństwo, że dana lista ma długość k , jeśli wszys tkie M n ciągów haszowania (35 ) jest jednakowo prawdopodobnych? b) Znajdź funkcję tworzącą Pn (z) = o p NkZk . c) Wyraź średnią liczbę prób w wyszukiwaniu zakończonym sukcesem przez tę funkcję tworzącą. d) Wywnioskuj, jaka jest średnia liczba prób w wyszukiwaniu zakończonym nie powodzeniem, rozważając warianty tej struktury danych, w których stosuje się następujące konwencje: (i) element jest haszowany zawsze na początek listy (zobacz rysunek 38); (ii) element jest haszowany na pewną pozycję w tablicy (zobacz rysunek 40), ale wszystkie klucze oprócz pierwszego na liście wędrują do osobnego obszaru nadmiarowego; (iii) element jest haszowany na pewną pozycję w tablicy i wszystkie elementy znajdują się w tablicy z haszowaniem.
35. [M24] Kontynuując ćwiczenie 34, jaka jest średnia liczba prób w przypadku wy szukiwania zakończonego niepowodzeniem, jeśli poszczególne listy są przechowywane w kolejności wartości ich kluczy? Rozważ struktury danych (i), (ii) oraz (iii).
36. [M23] Kontynując ćwiczenie 34(d), znajdź wariancję liczby prób w przypadku, kiedy wyszukiwanie kończy się niepowodzeniem dla struktur danych (i) oraz (ii). ►37. [M29] Równanie (19) podaje średnią liczbę prób w metodzie łańcuchowej z osob nymi listami dla wyszukiwania zakończonego sukcesem; jaka jest wariancja tej liczby prób?
38. [M32] (.Haszowanie drzewowe) Sprytny programista mógłby spróbować zastoso wać drzewa poszukiwań binarnych zamiast list w metodzie łańcuchowej, łącząc w ten sposób algorytm 6.2.2T z haszowaniem. Przeprowadź analizę średniej liczby prób wyma ganych w tym złożonym algorytmie zarówno w przypadku wyszukiwania zakończonego sukcesem, jak i niepowodzeniem. [Wskazówka: Zobacz równanie 5 .2 . 1- ( i 5 )].
6.4
HASZOWANIE
597
39. [M28] Niech c/v(&) będzie łączną liczbą list długości k utworzonych w wyniku zastosowania algorytmu C do wszystkich M N ciągów haszowania ( 35 ). Znajdź zależność rekurencyjną wiążącą liczby cjv(A;), która umożliwia wyprowadzenie prostego wzoru na sumę
Sn =
5Z(2)CJV^*
Jaki jest związek wielkości S n z liczbą prób przy wyszukiwaniu zakończonym niepo wodzeniem w algorytmie C? 40. [M33] Równanie (15) określa średnią liczbę prób wykonywanych w algorytmie C przy wyszukiwaniu zakończonym niepowodzeniem; jaka jest wariancja tej liczby prób? 41. [MĄO] Dokonaj analizy wielkości T/v, mówiącej, ile razy średnio był zmniejszany 0 1 indeks R przy wstawianiu ( N + l)-go elementu algorytmem C. ►42. [M20] Wyprowadź wzór ( 17 ) na prawdopodobieństwo tego, że algorytm C od razu zakończy działanie sukcesem. 43. [HM44] Przeprowadź analizę zmodyfikowanej wersji algorytmu C, w której stosuje się tablicę rozmiaru M ' ^ M . Do haszowania używa się tylko pierwszych M komórek, więc pierwszych M ł —M pustych miejsc znajdowanych w kroku C5 będzie wśród tych dodatkowych pozycji w tablicy. W jaki sposób dla ustalonego M f wybierać M z zakresu 1 ^ M ^ M \ żeby uzyskać najlepszą wydajność? 44. [MĄ3] (Próbkowanie losowe z grupowaniem wtórnym) Celem tego ćwiczenia jest wyznaczenie oczekiwanej liczby prób w schemacie adresowania otwartego z ciągiem prób h(K)y
(h ( K ) + p i ) mod M,
(h (K ) 4- P 2 ) mod M,
(h (K ) +
...,
P
m
-
i
)
mod M,
gdzie pi P 2 .. •P m - 1 jest wybraną losowo permutacją elementów zbioru { 1, 2, . . . , M —1}, zależną od h( K ). Innymi słowy, dla wszystkich kluczy o takiej samej wartości h ( K ) ciągi prób są jednakowe, a wszystkich (M — 1 ).,M możliwych sposobów wyboru M ciągów prób o tej własności jest jednakowo prawdopodobnych. Tę sytuację dokładnie modeluje następująca procedura doświadczalna, wykony wana na początkowo pustej tablicy rozmiaru m. Podane niżej operacje wykonujemy n razy. „Z prawdopodobieństwem p zajmij pierwszą pustą pozycję z lewej strony. W przeciwnym razie (to znaczy z prawdopodobieństwem q = 1 —p) wybierz dowolną pozycję w tablicy oprócz pierwszej z lewej strony, przy czym wybór każdej z tych m — 1 pozycji jest jednakowo prawdopodobny. Jeśli wybrana pozycja jest pusta, to zajmij ją; w przeciwnym razie spośród wszystkich pustych pozycji (włączając w to pierwszą z lewej strony) wybierz jedną i zajmij ją, traktując każdą z pustych pozycji jako jednakowo prawdopodobną”. Jeśli na przykład m = 5 i n = 3, to konfiguracją tablicy po takim eksperymencie będzie układ (zajęta, zajęta, pusta, zajęta, pusta) z prawdopodobieństwem 152 999 + \pqq
+ \qpq + u M P
+ 3^9 + 3
^
+ 3 ®?P-
(Ta procedura odpowiada próbkowaniu losowemu z grupowaniem wtórnym, jeśli p = 1/m , ponieważ możemy przenumerować elementy tablicy tak, żeby pewien konkretny ciąg prób był równy 0 , 1 , 2 , . . . , a wszystkie pozostałe były losowe). Znajdź wzór na średnią liczbę zajętych pozycji z lewej strony tablicy (2 w po wyższym przykładzie). Znajdź również asymptotyczne zachowanie tej wielkości dla p = l/m , n — a ( m + 1 ) przy m —►oo.
598
WYSZUKIWANIE
6.4
45. [MĄ 3] Rozwiąż odpowiednik problemu z ćwiczenia 44 dla grupowania trzeciego rzędu, jeśli ciąg prób zaczyna się od h i ( K ) , (h ± ( K ) + h,2 (K )) mod M, a kolejne pozycje prób są wybierane losowo tylko na podstawie wartości h \ ( K ) i h,2 (K). (Zatem trak tujemy wszystkie ( M — 2 )!M(M_1) możliwe sposoby wyboru M ( M — 1 ) ciągów prób jako jednakowo prawdopodobne). Czy ta procedura jest asymptotycznie równoważna próbkowaniu jednostajnemu? 46. [MĄ2] Wyznacz C N f i C N dla metody adresowania otwartego z użyciem ciągu prób h ( K ) , 0, 1 ,
h ( K ) - l , h ( K ) + l, . . . , M — 1.
47. [M25] Znajdź średnią liczbę prób potrzebnych w adresowaniu otwartym, jeśli ciągiem prób jest h ( K ), h ( K ) ~ 1, ń(PQ + l, h ( K ) ~ 2, h ( K ) + 2, . . . . Ten ciąg prób został kiedyś zaproponowany ze względu na to, że dla parzystego M wszystkie odległości między dwiema kolejnymi próbami są różne. [ Wskazówka: Znajdź właściwy trik, a problem okaże się łatwy]. ►48. [M21] Przeanalizuj metodę adresowania otwartego, w której sprawdzane są po zycje h \ { K ) , /i2 (/ć), h ^ K ) , d l a pewnego nieskończonego ciągu parami niezależ nych losowych funkcji haszujących (hn (K)). W tym schemacie możliwe jest dwukrotne sprawdzanie tej samej pozycji, jeśli na przykład h i ( K ) = h,2 ( K ), jednak takie zbiegi okoliczności są raczej mało prawdopodobne dopóty, dopóki tablica się nie wypełni. 49. [HM2Ą] Uogólniając ćwiczenie 34 na przypadek b rekordów przypadających na każdy kubełek, wyznacz średnią liczbę prób (dostępów do pamięci zewnętrznej) C ^ i C fN dla metody łańcuchowej z osobnymi listami, przy założeniu, że wyszukiwanie zakończone niepowodzeniem na liście zawierającej k elementów wymaga m ax(l, k —6+ 1) prób. Zamiast stosować dokładny wzór na prawdopodobieństwo PW jak w ćwicze niu 34, skorzystaj z przybliżenia Poissona /n \ / 1 y / U J U J l
i y * -* _ N N ~ 1 m ) ~ m m
= ^ ( 1
N —k + 1 / m V
1 yV m
)
V
1 y k 1
MJ
k\
+ 0(k2/M)),
prawdziwego dla N = p M i k ^ \[ M przy M —►oo; wyprowadź wzory ( 57 ) i ( 58 ). 50. [M20] Pokaż, że Q i ( M , N ) = M — (M — N — 1 ) Q q( M , JV), przy oznaczeniach ze wzoru (4 2 ). [Wskazówka: Udowodnij najpierw, że Q i ( M t N ) = ( N + l ) Q o ( M , N ) — N Q o(M ,N -l)]. 51. [HM17] Wyraź funkcję i?(a, n) zdefiniowaną wzorem ( 55 ) za pomocą funkcji Qo zdefiniowanej wzorem (4 2 ). 52. [HM20\ Udowodnij, że Qo(M, N ) = / 0°° e_ t (l + t / M ) N dt. 53. [HM20] Udowodnij, że funkcję i?(a, n) można wyrazić za pomocą niepełnej funkcji gamma, i skorzystaj z wyniku ćwiczenia 1.2.11.3-9 do znalezienia asymptotycznej wartości i?(a, n) z dokładnością do 0 (n “ 2), przy n —>0 0 , dla ustalonego a < 1 . 54. [HM28] Pokaż, że dla 6 = 1 wzór (61 ) jest równoważny wzorowi ( 23 ). Wskazówka: Mamy t ^ r ______
t (a) - ( ~ 1)n~ 1 y m>n
v
' v
'
6.4
HASZOWANIE
599
55. [HMĄ3] Uogólnij model Schaya-Sprutha, omówiony po twierdzeniu P, na przypa dek M kubełków rozmiaru b. Udowodnij, że C(z) jest równe Q ( z ) / ( B ( z ) — z6), gdzie Q(z) jest wielomianem stopnia b i Q (l) = 0. Pokaż, że średnia liczba prób wynosi
1I M
c'(l)
1 ,U
1 l
i
1
lB"{l)-b(b-l)\
gdzie qi, . . . , qb~i są pierwiastkami wielomianu Q ( z ) j ( z — 1 ). Zastępując dwumiano wy rozkład prawdopodobieństwa B ( z) przybliżeniem Poissona P ( z ) = gdzie a ~ N / M b , i korzystając ze wzoru inwersyjnego Lagrange’a (zobacz równanie 2 .3.4.4(21) i ćwiczenie 4.7-8), uprość swoją odpowiedź do postaci z równania ( 6 i).
56. [HMĄ3] Uogólniając twierdzenie K, przeprowadź dokładną analizę próbkowania liniowego z kubełkami rozmiaru b. Jaka jest asymptotyczna liczba prób przy wyszuki waniu zakończonym sukcesem, kiedy tablica jest pełna ( N = Mb)?
57. [MĄ7] Czy przypisanie jednakowych prawdopodobieństw ciągom prób daje naj mniejszą wartość C n spośród wszystkich metod adresowania otwartego?
58. [M21] (S. C. Johnson) Znajdź dziesięć permutacji zbioru { 0 , 1 , 2 , 3,4 }, które są równoważne próbkowaniu jednostajnemu w sensie twierdzenia U.
59. [M25] Udowodnij, że jeśli przypisanie prawdopodobieństw permutacjom jest rów noważne próbkowaniu jednostajnemu, w sensie twierdzenia U, to liczba permutacji o niezerowych prawdopodobieństwach przekracza M a dla dowolnego ustalonego wy kładnika a, o ile M jest dostatecznie duże.
60. [MĄ7] Powiemy, że schemat adresowania otwartego jest oparty na haszowaniu pojedynczym, jeśli korzysta się w nim z dokładnie M ciągów prób, po jednym zaczyna jącym się od każdej możliwej wartości h ( K ), z których każdy występuje z prawdopo dobieństwem l / M . Czy najlepsze schematy haszowania pojedynczego (w sensie minimalizacji C n ) są asymptotycznie lepsze niż losowe o zachowaniu opisanym wzorem ( 29 )? W szczególno ści, czy Ca.M ^ 1 + \ot + ~ a 2 4- 0 ( a 3), przy M —>00 ?
61. [MĄ6] Czy metoda analizowana w ćwiczeniu 46 jest najgorszym możliwym sche matem haszowania pojedynczego w sensie ćwiczenia 60? 62. [M49] Schemat haszowania pojedynczego jest nazywany cyklicznym, jeśli kroki pi p 2 .. ■Pm-~i j przy oznaczeniach z ćwiczenia 44, są ustalone dla każdego K. (Przykłady takich metod to próbkowanie liniowe oraz ciągi rozważane w ćwiczeniach 20 i 47). Optymalny schemat haszowania pojedynczego to taki, dla którego Cm jest najmniejsze spośród wszystkich (M —1 )!M schematów haszowania pojedynczego dla ustalonego M. Dla M ^ 5 najlepsze schematy haszowania pojedynczego są cykliczne. Czy jest tak dla każdego M?
63. [M25] Jeśli wielokrotnie wykonujemy losowe wstawienia i usunięcia z tablicy z haszowaniem, to ile średnio potrzeba niezależnych wstawień, żeby każda z M komórek była w jakiejś chwili zajęta? (Jest to średni czas, po jakim przestaje funkcjonować metoda usuwania polegająca po prostu na oznaczaniu komórek jako „skasowane”). 64. [MĄ1] Przeanalizuj oczekiwane zachowanie algorytmu R (usuwanie przy próbko waniu liniowym). Ile razy średnio będzie wykonywany krok R4? ►65. [20] (Klucze o zmiennej długości) W wielu zastosowaniach tablic z haszowaniem występują klucze, które mogą się składać z dowolnie wielu znaków. W takich przypad kach nie możemy po prostu umieszczać klucza w tablicy, jak w programach przedsta
600
WYSZUKIWANIE
6.4
wionych w tym podrozdziale. Znajdź dobry sposób obsługi kluczy o zmiennej długości w tablicy z haszowaniem na komputerze MIX. ►66 . [25] (Ole Amble, 1973) Czy możliwe jest wstawianie kluczy do tablicy z haszo waniem otwartym z wykorzystaniem ich numerycznego lub alfabetycznego uporząd kowania, tak żeby było wiadomo, iż wyszukiwanie algorytmem L lub algorytmem D zakończyło się niepowodzeniem w chwili napotkania klucza mniejszego niż szukany?
67. [MĄ1] Przypuśćmy, że algorytmem L wstawiamy N kluczy o adresach haszowania, odpowiednio, a\ a
69. [M25] (Andrew Yao) Udowodnij, że dla wszystkich cyklicznych schematów ha szowania pojedynczego, w sensie ćwiczenia 62, jest spełniona nierówność C^m ^ | ( l + 1 /(1 — a)). [Wskazówka: Pokaż, że wyszukiwanie zakończone niepowodzeniem wymaga dokładnie k prób z prawdopodobieństwem pk ^ ( M — N ) /M ] . 70. [HMĄ3] Udowodnij, że przy haszowaniu podwójnym oczekiwana liczba prób po trzebnych do wstawienia ( a M + l)-ego elementu nie przekracza oczekiwanej liczby prób potrzebnych do wstawienia ( a M + y j <9(logM ) / M )-ego elementu przy próbkowaniu jednostajnym.
71. [40] Zbadaj eksperymentalnie zachowanie algorytmu C przystosowanego do wy szukiwania zewnętrznego zgodnie z opisem w tekście podrozdziału. ►72. [M28] (Haszowanie uniwersalne) Wyobraźmy sobie gigantyczną macierz H za wierającą po jednej kolumnie na każdy możliwy klucz K. Elementami H są liczby z zakresu od 0 do M — 1; wiersze H reprezentują funkcje haszujące. Mówimy, że H definiuje uniwersalną rodzinę funkcji haszujących, jeśli dowolne dwie kolumny zgadzają się w co najwyżej R / M wierszach, gdzie R to łączna liczba wierszy. a) Udowodnij, że jeśli macierz H jest uniwersalna w tym sensie i jeśli ustalimy funkcję haszującą ń, wybierając losowo pewien wiersz z i i , to oczekiwany rozmiar listy zawierającej dowolny zadany klucz K w metodzie łańcuchowej z osobnymi listami (rysunek 38) wyniesie 1 + N / M po wstawieniu dowolnego zbioru N różnych kluczy K i, K 2 , • - •, K n > b) Przypuśćmy, że każda funkcja hj w (9 ) jest losowo wybranym odwzorowaniem ze zbioru wszystkich znaków w zbiór { 0 , 1 , . . . , M — 1}. Pokaż, że odpowiada to uniwersalnej rodzinie funkcji haszujących. c) Czy wynik z części (b) byłby nadal prawdziwy, gdyby było hj (0) = 0 dla każdego j , ale wartość hj(x ) była losowa dla x / 0 ?
6.4
HASZOWANIE
601
73. [M26\ (Carter i Wegman) Pokaż, że część (b) z poprzedniego ćwiczenia zachodzi nawet wtedy, kiedy hj nie są funkcjami zupełnie losowymi, lecz mają jedną z poniższych szczególnych postaci: (i) Niech Xj będzie liczbą binarną (bj(n^ i ) . . . 1^ 0 ) 2 • Wówczas h j ( x j ) = (aJ(n_ 1) 6j(n_i) + **• + ajibji -f ajobjo) mod M, gdzie każde ajk jest wybrane losowo modulo M. (ii) Niech M będzie liczbą pierwszą i załóżmy, że 0 ^ xj < M. Wówczas h j ( x j ) = (ajXj + bj) mod M , gdzie aj i bj są wybrane losowo modulo M . 7 4. [M29\ Niech H definiuje uniwersalną rodzinę funkcji haszujących. Udowodnij lub obal: dla dowolnych wybranych losowo N różnych kolumn i jednego wiersza oczekiwana liczba zer w tych kolumnach wynosi 0 (1 ) + 0 ( N / M ) . [Zatem każda lista w metodzie łańcuchowej z osobnymi listami będzie miała taki właśnie oczekiwany rozmiar]. 7 5. [M26] Udowodnij lub obal poniższe stwierdzenia dotyczące funkcji haszującej h
określonej wzorem (9 ), jeśli hj są niezależnymi funkcjami losowymi: a) Prawdopodobieństwo tego, że h ( K ) = m wynosi 1/M dla każdego 0 ^ m < M. b) Jeśli K ^ K \ to prawdopodobieństwo tego, że h ( K ) = m i h ( K f) = vn! , wynosi 1 /M 2 dla wszystkich 0 ^ m, m' < M. c) Jeśli K, K f i K " są różne, to prawdopodobieństwo tego, że h ( K ) = m, h ( K f) = m / i h ( K " ) = m/;, wynosi 1/M 3 dla wszystkich 0 ^ m, m', m ff < M. d) Jeśli K , K \ K tf i K ttf są różne, to prawdopodobieństwo tego, że h ( K ) = m, h ( K f) = m ' , h ( K f/) = m f/ i h { K ,,f) — m "', wynosi 1 /M 4 dla wszystkich 0 ^ m, m/, m ' \ m n < M. ►76. [M21 ] Zaproponuj sposób przystosowania wzoru (9 ) do przypadku kluczy o zmien nej długości, z zachowaniem własności haszowania uniwersalnego. 77. [M22] Niech H definiuje uniwersalną rodzinę funkcji haszujących ze zbioru kluczy 32-bitowych w zbiór kluczy 16-bitowych. (Tak więc H ma 232 kolumn i M = 216, przy oznaczeniach z ćwiczenia 72). Klucz 256-bitowy można traktować jako konkatenację ośmiu 32-bitowych części 0:10:2^3X4X5^ 62:7^ 8 ; możemy odwzorować go na adres 16-bitowy za pomocą funkcji haszującej
h4{h3(h2{hi (xi )hi (x2))h2( hi ( x3) hi ( x 4) ) ) h3( h2( hi (x5) hi ( x6) ) h2(hi (x7)hi ( x8) ))), gdzie hi, fe , i /14 to losowo i niezależnie wybrane wiersze H . (Wtedy, przykładowo, h i ( x i ) h i ( x 2 ) oznacza liczbę 32-bitowąotrzymaną przez sklejenie ń i(x i) z ń i(x 2 )). Udo wodnij, że prawdopodobieństwo odwzorowania dwóch różnych kluczy na ten sam adres jest mniejsze niż 2~ 14. [Ten schemat postępowania wymaga znacznie mniej losowych wyborów niż ( 9 )].
She made a hash o f the proper names, to be sure. — G R A N T A LLE N ( Th e Tents o f Shem, 1889) HASH, x. Brak definicji tego słowa nikt nie wie, co ono znaczy. — A M B R O S E B IE R C E (T h e Devil's D ictionary, 1906)
602
WYSZUKIWANIE
6.5
6.5. W Y S ZU K IW A N IE W ZGLĘDEM KLUCZY W TÓ R N YC H
Zakończyliśmy już nasze rozważania dotyczące wyszukiwania kluczy głównych, czyli tych, które jednoznacznie określają rekord w pliku. Niekiedy jednak koniecz ne jest przeprowadzenie wyszukiwania na podstawie wartości innych niż klucz główny pól w rekordach; te pozostałe pola nazywa się często kluczami wtórnymi lub atrybutami rekordu. Przykładowo, może wystąpić potrzeba wyszukania w pli ku rejestrowym, zawierającym informacje o studentach pewnego uniwersytetu, wszystkich studentów drugiego roku z Ohio, których głównym kierunkiem nie jest m atem atyka ani statystyka; albo też trzeba będzie wyszukać wszystkie władające językiem francuskim studentki z licencjatem itd. W ogólności zakładamy, że każdy rekord zawiera kilka atrybutów i że chcemy znaleźć wszystkie rekordy zawierające określone wartości niektórych atrybutów. Wyszczególnienie żądanych rekordów jest nazywane zapytaniem. Zapytania są zazwyczaj ograniczone do co najwyżej trzech wymienionych poniżej typów: a) Zapytanie proste, podające określoną wartość konkretnego atrybutu; na przykład „ G Ł K I E R = M A TEM ATYK A” lub „ M IE J S C E Z A M . S T A N = O H IO ” . b) Zapytanie zakresowe, podające określony zakres wartości konkretnego atry butu; na przykład „K O S Z T < $ 1 8 . 0 0 ” lub „ 2 1 < W IE K < 2 3 ” . c) Zapytanie boolowskie, które składa się z zapytań podanych wyżej typów, połączonych za pomocą operacji A N D , 0 R , N O T ; na przykład „ (R O K S T U D IÓ W = D R U G I )
AND (M I E J S C E Z A M .S T A N = O H IO )
A N D N O T ( ( G Ł K I E R = M A TEM A TY K A ) 0 R
(G Ł K I E R = S T A T Y S T Y K A ) ) ” .
Problem znajdowania efektywnych technik wyszukiwania dla tych trzech typów zapytań jest już wystarczająco trudny, dlatego zazwyczaj nie rozważa się bardziej skomplikowanych typów zapytań. Towarzystwo linii kolejowych mogło by na przykład dysponować informacją o aktualnej sytuacji wszystkich swoich wagonów towarowych; zadanie w jawnej postaci zapytania w rodzaju „znajdź wszystkie puste wagony-chłodnie w promieniu 5 0 0 mil od Seattłe” nie byłoby dopuszczalne, chyba że „odległość od Seattle” byłaby atrybutem przechowywa nym w każdym rekordzie, a nie skomplikowaną funkcją obliczaną na podstawie innych atrybutów . Dołożenie kwantyfikatorów logicznych do operacji A N D , 0 R i N O T wprowadziłoby dalsze komplikacje ograniczone jedynie wyobraźnią autora zapytania; m ając dany zestaw statystyk bejsbolowych, moglibyśmy na przykład zapytać o najdłuższą serię kolejnych trafień w jednej grze. Te przykłady są skomplikowane, ale nadal można sobie z nimi poradzić, wykonując jeden przebieg przez odpowiednio przygotowany plik. Inne zapytania są jeszcze trudniejsze - na przykład zapytanie o wszystkie pary rekordów z tymi samymi wartościami pięciu lub większej liczby atrybutów (bez wyszczególniania, na których atrybutach ma być zgodność). Takie zapytania można traktow ać jako ogólne zadania programi styczne, przekraczające zakres tego omówienia, chociaż często można je rozbić na podproblem y rozważanych tu ta j postaci. Zanim zaczniemy badać rozm aite techniki wyszukiwania względem kluczy wtórnych, istotne będzie umieszczenie tego zagadnienia w odpowiednim kontek
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
603
ście ekonomicznym. Chociaż ogromna liczba zastosowań pasuje do naszkicowa nego powyżej ogólnego schem atu trzech typów zapytań, to tylko do niewielu spośród tych zastosowań naprawdę nadają się wyrafinowane techniki, którym i będziemy się zajmować, a w niektórych przypadkach lepiej jest wykonać pra cę ręcznie niż maszynowo! Ludzie w spinają się na Mt. Everest „ponieważ on tam jest” i ponieważ zostały stworzone narzędzia, które czynią tę wspinaczkę możliwą; podobnie, stojąc twarzą w twarz z górą danych, ludzie czują pokusę używania kom putera do znajdowania odpowiedzi na najtrudniejsze zapytania, jakie potrafią sobie wymyślić na bieżąco, w systemie czasu rzeczywistego, bez właściwego zestawienia kosztów. W ymagane obliczenia są możliwe, ale nie m ają racji bytu we wszystkich zastosowaniach. Rozważmy na przykład następujące proste podejście do zagadnienia wy szukiwania względem kluczy wtórnych. Po zgrupowaniu pewnej liczby zapytań możemy wykonać sekwencyjne przeszukanie całego pliku, znajdując wszystkie interesujące nas rekordy. („Zgrupowanie” oznacza zgromadzenie pewnej liczby zapytań przed rozpoczęciem jakiegokolwiek ich przetwarzania). Ta m etoda jest całkiem satysfakcjonująca, jeśli plik z danymi nie jest zbyt wielki, a zapytań nie trzeba obsługiwać natychm iast. Można ją stosować nawet do plików na taśmach; angażuje ona kom puter tylko od czasu do czasu, więc jest bardzo ekonomiczna pod względem kosztów sprzętowych. Co więcej, pozwala ona nawet obsługiwać zapytania obliczeniowe w rodzaju wspomnianej wyżej „odległości od Seattle” . Innym prostym sposobem ułatwienia wyszukiwania względem kluczy w tór nych jest umożliwienie przerzucenia części pracy na ludzi przez dostarczenie im wydruków odpowiednich indeksów do zbioru informacji. Ta m etoda jest często najrozsądniejszym i najbardziej ekonomicznym sposobem postępowania (o ile, oczywiście, stare wersje wędrują na m akulaturę, kiedy drukowany jest nowy indeks), zwłaszcza że ludzie m ający dogodny dostęp do danych często potrafią zauważyć w nich interesujące regularności. Do zastosowań, w których nie w ystarczają podane wyżej proste schematy, należą bardzo duże pliki, dla których istotne są szybkie reakcje na zapytania. Taka sytuacja występuje na przykład w przypadku jednoczesnego zadawania zapytań przez wielu użytkowników lub w przypadku zapytań generowanych m a szynowo, a nie przez ludzi. Naszym celem w tym podrozdziale będzie określe nie, na ile potrafimy sobie radzić z wyszukiwaniem względem kluczy wtórnych na konwencjonalnych komputerach, przy rozmaitych założeniach odnośnie do struktury pliku z danymi. Na szczęście metody, które będziemy omawiać, są coraz łatwiejsze do zrealizowania w praktyce, w miarę gwałtownego obniżania się kosztów obliczeń. Opracowano wiele koncepcji radzenia sobie z omawianym tu problemem, jednak (jak można się domyślić ze wszystkich tych wstępnych uwag) algorytmy w żadnym razie nie są tak dobre jak te służące do wyszukiwania względem klucza głównego. Ze względu na dużą zmienność zbiorów danych i zastosowań nie będziemy w stanie podać pełnego omówienia wszystkich rozważanych w litera turze możliwości ani przeanalizować zachowania każdego algorytm u w typowych okolicznościach. W pozostałej części tego podrozdziału przedstawiam y podsta
604
WYSZUKIWANIE
6.5
wowe podejścia, a decyzję, jakie połączenie technik jest najwłaściwsze w każdym konkretnym przypadku, pozostawiamy wyobraźni Czytelnika. P lik i o d w r o tn e . Pierwsza ważna klasa technik wyszukiwania względem kluczy wtórnych jest o parta na koncepcji pliku odwrotnego. Nie oznacza to obrócenia pli ku do góry nogami, ale zamienienie rolami rekordów i atrybutów. Zamiast wykazu atrybutów danego rekordu tworzymy listę rekordów m ających dany atrybut. Z plikami odwrotnym i (ukrytym i pod innymi nazwami) dość często mamy do czynienia w życiu codziennym. Przykładowo, plikiem odwrotnym odpowia dającym słownikowi rosyjsko-angielskiemu jest słownik angielsko-rosyjski. Pli kiem odwrotnym odpowiadającym tej książce jest zamieszczony na jej końcu skorowidz. Księgowi tradycyjnie stosują „księgowanie dwustronne” , polegające na tym , że wszystkie transakcje są wprowadzane zarówno na konto kasowe, jak i na rachunek klienta, dzięki czemu jest zapewniony łatwy dostęp zarówno do aktualnej pozycji obrachunkowej, jak i do płatności aktualnego klienta. Ogólnie rzecz biorąc, plik odwrotny zazwyczaj nie jest przydatny samo dzielnie; wykorzystuje się go razem z oryginalnym plikiem danych. Daje on powieloną, nadmiarową informację umożliwiającą przyspieszenie wyszukiwania względem kluczy wtórnych. Części składowe pliku odwrotnego, nazywane listami odwrotnymi, są listami wszystkich rekordów m ających daną wartość pewnego atrybutu. Tak jak wszystkie listy, listy odwrotne można reprezentować w komputerze na wiele sposobów, a w różnych sytuacjach są odpowiednie różne rodzaje repre zentacji. Niektóre pola kluczy wtórnych mogą zawierać tylko dwie wartości (na przykład „ P Ł E Ć ” ) , a odpowiadające im listy odwrotne są dość długie; inne pola w typowych przypadkach przyjm ują bardzo wiele różnych wartości z nielicznymi powtórzeniami (na przykład „ N U M E R T E L E F O N U ” ) . W yobraźmy sobie, że chcemy przechowywać informacje w komputerowej książce telefonicznej w taki sposób, żeby każdy zapis można było znaleźć na pod stawie nazwiska, num eru telefonu lub miejsca zamieszkania. Jedno z rozwiązań polega po prostu na sporządzeniu trzech osobnych plików przeznaczonych do wy szukiwania poszczególnych typów kluczy. Innym pomysłem jest połączenie tych plików, na przykład przez utworzenie trzech tablic z haszowaniem, służących jako początki list w metodzie łańcuchowej. W tym ostatnim schemacie każdy rekord z pliku byłby elementem trzech list, więc zawierałby trzy pola z dowiązaniami; jest to tak zwana m etoda multilist, zilustrowana na rysunku 13 w punkcie 2.2.6 i szerzej omówiona poniżej. Trzecią możliwością jest połączenie trzech plików w jeden plik nadrzędny, przez analogię z katalogami bibliotecznymi, w których karty według autorów, tytułów i słów kluczowych są łącznie uporządkowane alfabetycznie. Rozważenie form atu zastosowanego w skorowidzu do tej książki prowadzi do dalszych koncepcji reprezentacji listy odwrotnej. Dla pól kluczy wtórnych, dla których w typowym przypadku przypada mniej więcej po pięć elementów na każdą wartość atrybutu, możemy po prostu stworzyć krótkie sekwencyjne listy położeń rekordów (przez analogię do numerów stron w skorowidzu książki),
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
605
następujące po wartości klucza. Jeśli stosowne rekordy bywają zgrupowane se riami, to przydatny jest kod określenia zakresu (na przykład strony 5 5 9 - 5 8 2 ) . Jeśli rekordy w pliku mogą często zmieniać położenie, to w pliku odwrotnym lepsze może okazać się użycie kluczy głównych zamiast położeń rekordów, dzięki czemu nie trzeba nic uaktualniać przy zmianie położeń; na przykład odnośniki do cytatów z Biblii podaje się zawsze w postaci numeru rozdziału i wiersza, a skorowidze w niektórych książkach są oparte na numerach paragrafów, a nie na numerach stron. Żadna z tych koncepcji nie nadaje się zbytnio do przypadku atrybutów dwuwartościowych, takich jak „ P Ł E Ć ” . Wówczas potrzebna jest oczywiście tylko jedna lista odwrotna, ponieważ nie-mężczyźni to kobiety i na odwrót. Jeśli każda wartość atrybutu dotyczy około połowy rekordów w pliku, to listy odwrotne będą potwornie długie, możemy jednak dosyć zgrabnie rozwiązać nasz problem na komputerze binarnym, stosując reprezentację w postaci ciągu bitów, gdzie każdy bit określa wartość w konkretnym rekordzie. Tak więc ciąg bitów 01001011101... mógłby oznaczać, że pierwszy rekord w pliku dotyczy mężczyzny, drugi - kobiety, dwa następne - mężczyzn itd. Takie m etody pozwalają radzić sobie z prostymi zapytaniam i o konkretne wartości atrybutu. Drobne rozszerzenie umożliwia obsługę zapytań zakresowych, z tym, że zamiast haszowania trzeba zastosować schemat wyszukiwania oparty na porównaniach (podrozdział 6 .2). W celu obsłużenia zapytań boolowskich takich jak „ ( G Ł K I E R - M A TEM A TY K A ) AND (M I E J S C E Z A M .S T A N = O H I O ) ” , musimy znaleźć część wspólną dwóch list odwrotnych. Można tego dokonać na wiele sposobów; jeśli na przykład obydwie listy są uporządkowane, to wykonując jeden przebieg przez każdą z nich, znaj dziemy wszystkie wspólne elementy. Alternatywnym rozwiązaniem jest wybranie najkrótszej listy i przejrzenie wszystkich jej rekordów ze sprawdzeniem pozosta łych atrybutów; ta m etoda działa jednak tylko dla spójników A N D , nie dla 0 R , i jest nieatrakcyjna w przypadku plików zewnętrznych, ponieważ wymaga wielu dostępów do rekordów, które nie będą spełniały zapytania. Te same rozważania pokazują, że opisana powyżej organizacja danych w for mie multilisty jest nieefektywna w kontekście zapytań boolowskich kierowanych do pliku zewnętrznego, ponieważ wymusza ona wiele zbędnych dostępów. W y obraźmy sobie na przykład, co by było, gdyby skorowidz do tej książki był zorga nizowany jako multilista. Każdy element skorowidza odnosiłby się tylko do o stat niej strony, na której ta konkretna kwestia była wzmiankowana; następnie na każdej stronie dła każdego poruszanego na niej zagadnienia zamieszczony byłby dalszy odnośnik do jego poprzedniego wystąpienia. W celu znalezienia wszystkich stron dotyczących tem atyki „[analiza algorytmów] i [(sortowanie zewnętrzne) lub (wyszukiwanie zewnętrzne)]” , musielibyśmy przewrócić wiele kartek. Z drugiej strony, odpowiedź na to samo zapytanie można znaleźć, zaglądając tylko na dwie strony w prawdziwym skorowidzu i wykonując proste operacje na listach odwrotnych w celu znalezienia małego podzbioru stron spełniających zapytanie. Jeśli lista odw rotna jest reprezentowana jako ciąg bitów, to boolowskie kombinacje prostych zapytań wykonuje się, oczywiście, z łatwością, ponieważ
606
WYSZUKIWANIE
6.5
kom putery potrafią względnie szybko manipulować ciągami bitów. W przypad ku zapytań mieszanych, w których niektóre atrybuty są reprezentowane jako sekwencyjne listy numerów rekordów, podczas gdy inne atrybuty są reprezento wane jako ciągi bitów, nietrudno przekształcić listy sekwencyjne na ciągi bitów, a następnie wykonać na nich odpowiednie operacje boolowskie. W tym miejscu pomocnym może się okazać przykład o charakterze ilościo wym. Załóżmy, że mamy 1 000 000 rekordów po 40 znaków każdy i że nasze dane są przechowywane na dyskach MIXTEC, opisanych w punkcie 5.4.9. Same dane w ypełniają zatem dwa dyski, zaś listy odwrotne wypełnią zapewne jeszcze kilka. K ażda ścieżka zawiera 5000 znaków = 30000 bitów, więc lista odwrotna dla konkretnego atry b u tu zajmie co najwyżej 34 ścieżki. (Z tą maksymalną liczbą ścieżek mamy do czynienia w przypadku najkrótszej możliwej reprezen tacji w formie ciągu bitów). Przypuśćmy, że mamy przetworzyć dość złożone zapytanie, wymagające wyznaczenia kombinacji boolowskiej 10 list odwrotnych; w najgorszym przypadku będziemy musieli odczytać 340 ścieżek informacji z pliku odwrotnego, co daje łączny czas odczytu równy 340 x 25 ms = 8.5 s. Średnie opóźnienie związane z bezwładnością obrotową dysku wyniesie około połowy czasu odczytu, jednak starannie programując, możemy być w stanie wyeliminować to opóźnienie. Przechowując pierwszą ścieżkę każdej listy z cią giem bitów w jednym cylindrze, drugą ścieżkę każdej listy w następnym itd., wyeliminujemy większą część czasu szukania, możemy więc oszacować mak symalny czas szukania jako mniej więcej 34 x 26 ms « 0.9 s (lub dwa razy tyle, jeśli odwołujemy się do dwóch niezależnych dysków). Na koniec, jeś li zapytanie spełnia q rekordów, to będziemy potrzebowali dodatkowo około ą x (60 ms (szukanie) -f 12.5 ms (bezwładność) + 0.2 ms (odczyt)) na ściągnięcie każdego z nich do późniejszego przetwarzania. Tak więc optymistyczne oszaco wanie łącznego oczekiwanego czasu przetwarzania tego dość skomplikowanego zapytania to w przybliżeniu (104-0.073ę) sekund. Można to zestawić z około 210 sekundam i potrzebnym i do przejrzenia całego pliku z największą szybkością przy tych samych założeniach, bez użycia żadnych list odwrotnych. Ten przykład pokazuje, że optymalizacja rozmieszczenia jest ściśle związana z optym alizacją czasu działania w przypadku pamięci dyskowej; czas przetwa rzania list odwrotnych to z grubsza czas potrzebny do ich wyszukania na dysku i odczytu. W powyższych rozważaniach w większym lub mniejszym stopniu zakłada liśmy, że podczas zadawania zapytań plik nie rośnie, ani się nie zmniejsza; co powinniśmy zrobić, jeśli konieczne są częste uaktualnienia? W wielu zastoso waniach wystarczy grupować żądania uaktualnienia i zajmować się nimi w mo m entach przestojów, kiedy nie trzeba odpowiadać na żadne zapytania. Kiedy uaktualnianie pliku m a wysoki priorytet, wtedy atrakcyjna jest m etoda B -drzew (punkt 6.2.4). Cały zbiór list odwrotnych można przechowywać w jednym ogrom nym 5-drzew ie, z zastosowaniem specjalnych konwencji dla liści polegających na tym, że węzły wewnętrzne zawierają wartości kluczy, podczas gdy liście zawierają zarówno klucze, jak i listy wskaźników rekordów. Z uaktualnianiem plików można również radzić sobie innymi m etodam i, które omówimy niżej.
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
607
D a n e g e o m e try c z n e . W wielu zastosowaniach mamy do czynienia z punktam i, liniami i figurami w przestrzeniach o dwóch lub większej liczbie wymiarów. Jed nym z pierwszych sposobów podejścia do zapytań o charakterze odległościowym było „drzewo pocztowe” , zaproponowane w 1972 roku przez Bruce’a M cN utta. Przypuśćmy na przykład, że chcemy przetwarzać zapytania takie jak „które miasto jest najbliżej punktu x?” dla danej wartości x. Każdy węzeł drzewa M cN utta odpowiada m iastu y i „promieniowi testowemu” r; lewe poddrzewo tego węzła odpowiada wszystkim m iastom z wprowadzonym później do tej części drzewa i takim, że odległość od y do z jest < r + ó; podobnie, prawe poddrzewo jest dla odległości > r —<5. W artość 5 jest tu ta j zadanym poziomem tolerancji; m iasta leżące w odległości między r —J a r + J o d y trzeba wprowadzić do obydwu poddrzew. Poszukiwanie w takim drzewie umożliwia zlokalizowanie wszystkich miast w promieniu S od danego punktu. (Zobacz rysunek 45).
Rys. 45. Górne poziomy przykładowego „drzewa pocztowego” . Żeby wyszukać wszyst kie miasta leżące blisko danego punktu x, zaczynamy od korzenia. Jeśli x jest w promie niu 1800 mil od Las Vegas, to idziemy w lewo, w przeciwnym razie idziemy w prawo; następnie powtarzamy ten proces aż do napotkania węzła końcowego. Metoda kon strukcji drzewa zapewnia, że w czasie tych poszukiwań napotkamy wszystkie miasta leżące w promieniu 20 mil od x.
Szereg eksperymentów opierających się na tej koncepcji przeprowadzili M cNutt i Edward Pring, wykorzystując jako przykładową bazę danych 231 najliczniej zaludnionych m iast w kontynentalnej części Stanów Zjednoczonych, podanych w kolejności losowej. Promienie testowe zmniejszali w sposób regular ny, zastępując r przez 0.67r przy zejściu w lewo, zaś przez 0.57r przy zejściu w prawo, z tym, że wartość r pozostawała nie zmieniona przy drugim z dwóch kolejnych zejść w prawo. Okazało się, że potrzebnych było 610 węzłów w drzewie dla <5 = 20 mil oraz 1600 węzłów dla S = 35 mil. Górne poziomy ich mniejszego drzewa są pokazane na rysunku 45. (Na pozostałych poziomach tego drzewa Orlando FL występuje zarówno poniżej Jacksonville, jak i poniżej Miami. Nie które m iasta występują dosyć często; Brockton MA ma na przykład 17 węzłów!). Szybki wzrost rozmiaru pliku wraz ze zwiększaniem się wartości 5 wskazuje zapewne ograniczoną użyteczność drzew pocztowych. Możemy radzić sobie lepiej, operując bezpośrednio współrzędnymi każdego punktu i traktując współrzędne jako atrybuty, czyli klucze wtórne; możemy wówczas zadawać zapytania boolowskie, opierając się na zakresach kluczy. Przypuśćmy na przykład, że rekordy
608
WYSZUKIWANIE
6.5
w pliku dotyczą m iast Ameryki Północnej i że zapytanie dotyczy wszystkich m iast, dla których (21.49° < SZ E R G E O G R < 37.41°)
O RAZ
(70.34° < DŁU G G EO G R < 75.72°).
R z u t o k a n a m a p ę w y k a ż e , ż e w i e l e m i a s t n a l e ż y d o z a k r e s u SZ E R G E O G R i w i e l e n a le ż y d o z a k r e s u DŁUGGEOGR, a le p r a w ie ż a d n e z n ic h n ie le ż ą w o b y d w u z a k r e s a c h . J e d n y m z e s p o s o b ó w p o d e jś c ia d o te g o ty p u
ortogonalnych zapytań zakresowych
j e s t d o ś ć d r o b n e p o d z ie le n ie z b io r u w s z y s tk ic h m o ż liw y c h w a r to ś ć a tr y b u tó w SZ E R G E O G R i D Ł U G G E O G R , t a k b y n a k a ż d y a t r y b u t p r z y p a d a ł o t y l k o k i l k a k l a s ( n a p r z y k ła d p r z e z o b c ię c ie d o n a jb liż s z e j m n ie js z e j w ie lo k r o t n o ś c i 5 ° ) i s tw o r z e n ie j e d n e j l i s t y o d w r o t n e j d l a k a ż d e j k l a s y z ł o ż o n e j (S Z E R G E O G R , D Ł U G G E O G R ). T o t a k ja k b y m ie ć m a p y z j e d n ą s tr o n ą n a k a ż d y lo k a ln y o b s z a r . P r z y p o d z ia le
0 gęstości 5° podane wyżej zapytanie wymagałoby odwołania się do ośmiu stron, a mianowicie (20°, 70°), (25°, 70°), . . . , (35°, 75°). Pytanie zakresowe trzeba przetwarzać dla każdej z tych stron, albo przechodząc do drobniejszego podziału w obrębie strony, albo sięgając bezpośrednio do samych rekordów, w zależności od liczby rekordów odpowiadających tej stronie. W pewnym sensie jest to struk tu ra drzewiasta z dwuwymiarowym rozgałęzieniem w każdym węźle wewnętrz nym. Znaczący wkład w opracowanie tej koncepcji, zwanej plikiem siatkowym, wnieśli J. Nievergelt, H. Hinterberger i K. C. Sevcik [ACM Trans. Database System s 9 (1984), 38-71]. Jeśli każdy punkt x ma k współrzędnych ( x i , ... ,#&), to dzielą oni wartości ¿-tej współrzędnej na zakresy -0 0 =
g
i0
<
g n
<
■■■ <
g in
= +00
( 1)
1 lokalizują x, wyznaczając indeksy ( ji , . . . , j^ ), takie że o
< j i < r i ,
g iji
<
Xi
<
5 i(ji+ 1 )
d la 1 <
i
<
k.
( 2)
W szystkie punkty o ustalonej wartości (ji, ■■■,jk) tworzą komórkę. Rekordy reprezentujące punkty z tej samej komórki są przechowywane w tym samym kubełku w pamięci zewnętrznej. Kubełki mogą również zawierać punkty z kil ku sąsiednich komórek, o ile tylko każdy kubełek odpowiada fc-wymiarowemu obszarowi prostokątnem u, czyli „superkomórce” . Możliwe są rozmaite strategie uaktualniania brzegowych wartości siatki oraz rozbijania i łączenia kubełków; zobacz na przykład K. Hinrichs, B IT 25 (1985), 569-592. Zachowanie plików siatkowych dla danych losowych analizowali M. Regnier, B IT 25 (1985), 335 -3 5 7 ; P. Flajolet i C. Puech, JA C M 33 (1986), 371-407, §4.2. Prostszy sposób obsługi ortogonalnych zapytań zakresowych z wykorzysta niem stru k tu r zwanych drzewami ćwiartek (quadtrees) opracowali J. L. Bentley i R. A. Finkel [Acta Informática 4 (1974), 1 -9 ]. W ich konstrukcji w przypadku dwuwymiarowym każdy węzeł takiego drzewa reprezentuje pewien prostokąt i zawiera także jeden z leżących w nim punktów; cztery poddrzewa odpowiadają czterem kwadrantom tego prostokąta względem współrzędnych danego punktu. Podobnie, w trzech wymiarach mamy rozgałęzienie rzędu osiem, a takie drzewa
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
609
nazywa się niekiedy drzewami ósemkowymi ( octrees). W fc-wymiarowym drzewie ćwiartek rozgałęzienia są rzędu 2 k. M atem atyczna analiza losowych drzew ćwiartek jest dość trudna, ale w 1988 roku dwie pracujące niezależnie grupy badaczy wyznaczyły asym ptotyczną po stać oczekiwanego czasu wstawiania 7V-tego węzła do losowego fc-wymiarowego drzewa ćwiartek: |lnAT + 0 ( l ) ;
(3)
zobacz L. Devroye i L. Laforest, SICO M P 19 (1990), 821-832; P. Flajolet, G. Gonnet, C. Puech i J. M. Robson, Algorithmica 10 (1993), 473-500. Za uważmy, że w przypadku k — 1 ten wynik zgadza się z dobrze znanym wzorem dla wstawiania do drzewa poszukiwań binarnych, równanie 6 .2 .2- ( 5 ). Efektem dalszych prac P. Flajolet a, G. Labelle’a, L. Laforesta i B. Salvy’ego było poka zanie, że w rzeczywistości średnią wewnętrzną długość ścieżek można wyrazić w zaskakująco eleganckiej postaci
co umożliwiło kontynuowanie analizy losowych drzew ćwiartek za pom ocą funk cji hipergeometrycznych [zobacz Random Structures and A lgońthm s 7 (1995), 117-144]. Bentley poszedł jeszcze dalej w upraszczaniu reprezentacji drzewa ćwiartek, wprowadzając „fc-d drzewa” , które w każdym węźle m ają tylko rozgałęzienie rzę du dwa [C ACM 18 (1975), 509-517; IE E E Transactions S E -5 (1979), 333-340]. 1 -d drzewo to po prostu zwykłe drzewo poszukiwań binarnych jak w punkcie 6 .2 .2 ; 2-d drzewo ma podobną strukturę, ale przy schodzeniu w dół drzewa w węzłach na parzystych poziomach porównuje się współrzędne zaś w węzłach na poziomach nieparzystych - współrzędne y. Ogólnie, k-d drzewo ma węzły zawierające k współrzędnych, a decyzję o wyborze rozgałęzienia na każdym poziomie podejmuje się na podstawie tylko jednej ze współrzędnych; możemy na przykład na poziomie l wybierać rozgałęzienie na podstawie współrzędnej numer (fcmodZ) + 1 . Żeby zagwarantować, że wartości żadnych dwóch rekor dów nie zgadzają się na żadnej współrzędnej, możemy rozstrzygać remisy na podstawie numeru seryjnego rekordu lub jego położenia w pamięci. Okazuje się, że otrzymywane w wyniku losowych wstawień 'k-d drzewa m ają dokładnie taką samą średnią długość ścieżki i kształt jak zwykłe drzewa poszukiwań binarnych, ponieważ założenia dotyczące ich rozbudowywania są takie same jak w przypad ku jednowymiarowym (zobacz ćwiczenie 6 .2 .2- 6 ). Jeśli dane nie zmieniają się w sposób dynamiczny, to możemy zrównoważyć dowolne ^-elem entowe A;-d drzewo tak, żeby jego wysokość była as lg7V, jako klucz decydujący o wyborze rozgałęzienia, przyjmując w każdym węźle medianę wartości, które będą się znajdowały w jego poddrzewie. Możemy mieć wówczas pewność, że cały szereg podstawowych typów zapytań będzie obsługiwanych w sposób efektywny. Bentley udowodnił na przykład, że możemy zidentyfikować
610
WYSZUKIWANIE
6.5
wszystkie rekordy m ające t określonych wartości współrzędnych w 0 ( N 1~t^k) krokach. Możemy również znaleźć wszystkie rekordy leżące w zadanym prosto kątnym obszarze w co najwyżej 0 { t N l ~ x^k + q) krokach, jeśli t spośród współ rzędnych jest ograniczonych do podzakresów, a w sumie jest q takich rekordów [D. T. Lee i C. K. Wong, A cta Inform atics 23 (1977), 23-29]. W rzeczywistości Friedman, Bentley i Finkel [ACM Trans. M ath. Software 3 (1977), 209-226] pokazali, że jeśli zadany obszar jest prawie sześcienny, wartość q jest mała, a w każdym węźle współrzędna, na podstawie której decyduje się o wyborze rozgałęzienia, przyjmuje najwięcej wartości atrybutu, to średni czas obsługi ta kiego zapytania zakresowego wyniesie zaledwie O (log W + q). Ten sam wzór ma zastosowanie w przypadku wyszukiwania w takich A;-d drzewach najbliższego sąsiada danego punktu w przestrzeni k~wymiarowej. Jeśli &-d drzewa są losowe, a nie doskonale zrównoważone, to średni czas czę ściowego dopasowania t określonych współrzędnych nieco w zrasta - do poziomu 0 (7V1“ i/ fc+/(i/* 0); funkcja / jest tu ta j określona niejawnie równaniem (.f ( x ) + 3 - x Y { f ( x ) + 2 - Xy - x = 2
(5)
i przyjmuje dość małe wartości. Mamy 0 < f ( x ) < 0.063293388123738 85718140112779733590 58170-,
(6 )
a maksimum funkcji jest przyjmowane dla x bliskiego 0.585. [Zobacz P. Flajolet i C. Puech, JA C M 33 (1986), 371-407, §3]. Ze względu na walory estetyczne i wielkie znaczenie algorytmów geometrycz nych, zachodzi olbrzymi postęp w zakresie technik rozwiązywania problemów wyszukiwania w wyższych wymiarach i najrozmaitszych zagadnień pokrewnych. Od lat siedemdziesiątych następuje gwałtowny rozwój nowej dziedziny m atem a tyki i informatyki, zwanej geometrią obliczeniową. Książka Handbook o f Discrete and Com putational G eom etry, eds. J. E. Goodman i J. O ’Rourke (Boca Raton, Florida: CRC Press, 1997), stanowi wyborny punkt odniesienia do stanu wiedzy na tym polu na 1997 rok. W yczerpujący przegląd stru k tu r danych i algorytmów w ważnych przy padkach szczególnych obiektów dwu- i trójwymiarowych zawarł Hanan Samet w dwóch uzupełniających się książkach: The Design and Analysis o f Spatial D ata Structures oraz Applications o f Spatial Data Structures (Addison-Wesley, 1990). Samet wskazuje, że oryginalne drzewa ćwiartek Bentleya i Finkela nazywa się teraz poprawniej „punktowymi drzewami ćwiartek” ; samo określenie „drzewo ćwiartek” stało się ogólnym term inem odnoszącym się do dowolnej hierarchicznej dekompozycji danych geometrycznych. A t r y b u t y z ło ż o n e . Dwa lub więcej atrybutów można połączyć w jeden superatrybut. Można by na przykład stworzyć „atrybut (G R U P A , G Ł K I E R )” , łącząc pola G R U P A i G Ł K IE R w pliku z danymi o studentach uniwersytetu. W ten sposób często można realizować zapytania, biorąc sumę krótkich list rozłącznych zamiast przecięcia dłuższych list. Koncepcję łączenia atrybutów rozwinął dalej V. Y. Lum [CACM 13 (1970), 660-665], który zaproponował uporządkowanie leksykograficzne list odwrotnych
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
611
połączonych atrybutów od lewej do prawej strony i sporządzenie wielu kopii ze sprytnym poprzestawianiem poszczególnych atrybutów . Przypuśćm y na przy kład, że mamy trzy atrybuty A, B i C; możemy utworzyć trzy atrybuty złożone (A,B,C),
(B,C,A),
(C, A, B)
(7 )
i skonstruować uporządkowane listy odwrotne dla każdego z nich. (Tak więc na pierwszej liście rekordy występują w kolejności ich wartości A, przy czym wszystkie rekordy z taką sam ą wartością A są ustawione w kolejności w arto ści B, a następnie C). Ta organizacja umożliwia realizowanie zapytań opartych na dowolnej kombinacji tych trzech atrybutów; na przykład wszystkie rekordy o określonych wartościach atrybutów A i C będą występowały po kolei na trzeciej liście. Podobnie, dla czterech atrybutów A, B, C, D możemy utworzyć sześć atrybu tów złożonych (A, B, C, D), (B, C, D, A), (B,D,A,C), (C,A,D,B), (C,D,A,B), (D,A,B,C),
(8)
które wystarczają, by odpowiadać na wszystkie kombinacje zapytań prostych odnoszących się jednocześnie do wartości jednego, dwóch, trzech lub czterech atrybutów. Istnieje ogólna procedura konstruowania (£) atrybutów złożonych z n atrybutów, gdzie A; < tak że wszystkie rekordy zawierające określone kom binacje wartości co najwyżej k lub co najmniej n —k spośród tych atrybutów będą występować po kolei na jednej z list atrybutów złożonych (zobacz ćwiczenie 1 ). Alternatywnie, możemy obyć się za pom ocą mniejszej liczby kombinacji, jeśli niektóre atrybuty przyjm ują ograniczoną liczbę wartości. Jeśli na przykład D jest po prostu atrybutem dwuwartościowym, to trzy kombinacje (D, A, B, C),
(D,B,C,A),
(D,C,A,B),
(9)
otrzymane przez umieszczenie D na początku w ( 7 ), będą prawie równie dobre jak (8), wprowadzając przy tym o połowę mniejszą redundancję, ponieważ zapy tania, które nie zależą od D, można realizować, zaglądając tylko w dwa miejsca na jednej z list. A tr y b u ty b in a rn e . Pouczające jest rozważenie szczególnego przypadku, w któ rym wszystkie atrybuty są dwuwartościowe. W pewnym sensie jest to przeci wieństwo łączenia atrybutów , ponieważ możemy reprezentować dowolną wartość jako liczbę binarną i traktować poszczególne bity tej liczby jako osobne atrybu ty. W tabeli 1 jest przedstawiony typowy plik z atrybutam i „tak-nie” ; w tym przypadku rekordy odpowiadają wybranym przepisom na ciastka, atrybuty zaś określają zastosowane składniki. Przykładowo, wafelki migdałowe są zrobione z masła, mąki, mleka, orzechów i cukru kryształu. Jeśli pomyślimy o tabeli 1 jako o macierzy zer i jedynek, to macierz transponowana stanowi plik odwrotny w postaci ciągu bitów. O statnia z prawej strony kolumna w tabeli 1 jest wykorzystywana do wska zywania specjalnych, rzadko występujących składników. Można je zakodować w bardziej efektywny sposób niż przez poświęcenie na każdy całej kolumny;
Tabela 1
•N & I cd fH c a Gd N cd
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0
cd ’n T3 i— i G G d
52 T^3
tUSl
£ cd o cd o cd ’ TJ M Ti cd N 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1
0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
£O G
e? ć?
i
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
G cd 'ćn Gd
O
- — i *i—>
i 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
i
>>
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1
J5£ Gd o co 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 1 I
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
Źródło: M cC a ll’s Cook Book (New York: Random House, 1963), Rozdział 9.
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
£0 G >> 1 TN J cd1 O '
cd
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
n ^ a^ ‘5 * ^ O IcSoJ■£ B ao N cd1 TS cd to
cd
23 23
G Gd
’n m ^■NG9d Oo 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
cd
0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Si
Si
G
£
^Si cd£G .2 S^ Gd Gd ^ O£ G G ÖO Ü
0 0 1 1 1 0 1 1 1 1 1 0 1 0 X 0 1 0 1 X 1 X 1 1 1 0 1 1 0 X 0 1
Gd
0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 1 0 X 0 0 0 1 1 0
1 1 1 1 1 1 0 1 0 1 1 0 0 0 X 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 1
0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0
0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1
—
Przecier jabłkowy Banany -
Serek kremowy Pomarańcze, śliwki suszone _ — —
Aromat migdałowy Ocet Morele Galaretka porzeczkowa Olej sałatkowy -
Miód Wiśnie kandyzowane —
Kwaśna śm ietana Masło fistaszkowe -
Cytron, muszkat, pieprz — — — — — —
WYSZUKIWANIE
G
Wafelki migdałowe Kwadraciki z jabłkami Ciastka bananowo-owsiane Chipsy czekoladowe Makaroniki kokosowe Serniczki Pyszne batoniki śliwkowe Kropelki czekoladowe Batoniki wyśnione Ciastka nadziewane Fińska Kakor Lukrowane przekąski imbirowe Pustelniczki Klejnociki Dżamble Krzysiowe kręgielki Kuleczki Lebkuchen Bezy Ciasteczka morawskie Paluszki owsiano-daktylowe Cukrowe ciasteczka Babuni Obwarzanki fistaszkowe Słodkie krągłości Pierniczki Szkockie owsiane kruche ciastka Gwiazdki z kruchego ciasta Skoczki Ciastka z formy Szwedzkie Kringlery Szwajcarskie chrupki cynamonowe Paluszki toffi Mrożone ciastka waniliowo-orzechowe
cd G
cd G O tsa o N «3
0N3
612
PLIK Z ATRYBUTAMI BINARNYMI cd G G
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
613
podobnie można potraktować kolumnę „Mąka kukurydziana” . Dualnie, moglibyśmy znaleźć efektywniejszy sposób zakodowania kolumny „Mąka” , ponieważ mąka występuje w każdym przepisie oprócz beżów. Na razie jednak odłóżmy te rozważania na bok i po prostu pomińmy kolumnę „Składniki specjalne” . Zdefiniujmy zapytanie podstawowe w pliku z atrybutam i binarnym i jako żądanie wyznaczenia wszystkich rekordów zawierających wartość 0 w pewnych określonych kolumnach, 1 w pewnych innych kolumnach i dowolne wartości w pozostałych kolumnach. Przyjmując, że oznacza dowolną wartość, mo żemy reprezentować dowolne zapytanie podstawowe jako ciąg symboli 0, 1 i *. Rozważmy na przykład osobę, która ma ochotę na ciastka kokosowe, ale m a alergię na czekoladę, nie cierpi anyżku i skończył się jej arom at waniliowy; może ona sformułować zapytanie
Tabela 1 powie nam teraz, że pyszne batoniki śliwkowe to właśnie to, o co chodzi. Zanim rozważymy ogólny problem przygotowania pliku do zapytań podsta wowych, ważną rzeczą będzie przyjrzeć się szczególnemu przypadkowi, w którym nie są wyspecyfikowane żadne wartości 0, lecz jedynie l i * . Można to nazwać zapytaniem o zawieranie, ponieważ dotyczy ono wszystkich rekordów, które za wierają pewien zbiór atrybutów , jeśli założymy, że 1 oznacza obecność atrybutu, 0 zaś oznacza brak atrybutu. Przykładowo, przepisy w tabeli 1, które wym agają zarówno proszku do pieczenia, jak i sody oczyszczonej, to lukrowane przekąski imbirowe i cukrowe ciasteczka Babuni. W niektórych zastosowaniach wystarczy ograniczyć się do szczególnego przy padku zapytań o zawieranie. Tak jest na przykład w przypadku wielu tworzonych ręcznie kartotek, takich jak systemy „kart z nacinanym brzegiem” lub „kart cech” . W systemie kart z nacinanym brzegiem odpowiadającym tabeli 1 mieli byśmy po jednej karcie na każdy przepis, z wycięciem na każdy składnik (zobacz rysunek 46). W celu obsłużenia zapytania o zawieranie, zbiór kart starannie się ó~o o o i
o o \ / o ~ c \ y o o o o oY a ^
N S §a i
u x < ¡¡j rv I
O
O C?L
£n
og O
2
°
|
o >
O
§ i
|
9 * ? o
g I I
/ o o oY / o
^
i
5 1 I S
>
5 O “
-N
*
W
o\ t v v
o oo
5
/ oo o o o o o \
2
N g | 5
^
y
m
u * R 9 3
U
K
^^
W
“■ SZWAJCARSKIE CHRUPKI CYNAMONOWE
O O O o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
R y s. 46. Karta z nacinanym brzegiem.
614
WYSZUKIWANIE
6.5
układa i wsuwa się pręty na pozycji każdej kolumny odpowiadającej atrybutowi, który ma być obecny. Po uniesieniu prętów wypadną wszystkie karty mające odpowiednie atrybuty. System kart cech działa w podobny sposób na pliku odwrotnym. W tym przypadku mamy po jednej karcie na każdy atrybut, a na powierzchni karty są w odpowiednich miejscach wycinane dziurki dla każdego rekordu posiadającego ten atry but. Zwykła 80-kolumnowa karta może zatem posłużyć do określenia, które spośród 12 x 80 — 960 rekordów m ają dany atrybut. Żeby obsłużyć zapy tanie o zawieranie, wybiera się karty cech dla podanych atrybutów i składa je razem; wówczas patrząc pod światło, zobaczymy wszystkie pozycje odpowiada jące szukanym rekordom. Ta operacja jest analogiczna do obsłużenia zapytania boolowskiego przez przecięcie opisanych wyżej odwrotnych ciągów bitów. K o d o w a n ie n a k ła d k o w e . Powodem, dla którego te obsługiwane ręcznie kar toteki są dla nas szczególnie interesujące, jest to, że wynaleziono pomysłowe schematy oszczędzania miejsca na kartach z nacinanym brzegiem; te same za sady można zastosować do reprezentacji w komputerowych zbiorach danych. Kodowanie nakładkowe jest techniką podobną do haszowania i faktycznie zo stało wynalezione kilka lat przed odkryciem samego haszowania. Pomysł polega na odwzorowaniu atrybutów w kod złożony z k losowych bitów na n-bitowym polu i nakładaniu kodów dla każdego atry b u tu obecnego w rekordzie. Zapytanie o zawieranie dla jakiegoś zbioru atrybutów można przekształcić na zapytanie o zawieranie dla odpowiadających im nałożeniowych kodów bitowych. To zapy tanie może spełniać kilka dodatkowych rekordów, ale liczbę takich „fałszywych alarmów” można kontrolować ze statystycznego punktu widzenia. [Zobacz Calvin N. Mooers, Amer. Chem. Soc. M eeting 112 (September 1947), 14E -15E ; American D ocumentation 2 (1951), 20-32]. Jako przykład kodowania nakładkowego rozważmy ponownie tabelę 1, ale ograniczoną tylko do składników smakowych, bez podstawowych składników takich jak proszek do pieczenia, m argaryna, jaja i mąka. Tabela 2 pokazuje, co się stanie, jeśli każdemu z atrybutów odpowiadających składnikom smako wym przypiszemy 2 losowe bity na 10-bitowym polu i nałożymy te kodowania. Na przykład, wartość dla chipsów czekoladowych otrzymuje się przez nałożenie kodów dla czekolady, orzechów i wanilii: 0010001000 V 0000100100 V 0000001001 = 0010101101. W wyniku nałożenia tych kodów dostaniemy również kilka pozornych atrybutów, w tym przypadku przyprawę korzenną, kandyzowane wiśnie, galaretkę porzecz kową, masło fistaszkowe i pieprz; będą one powodować występowanie fałszywych alarmów dla niektórych zapytań (i sugerują stworzenie nowego przepisu na cia steczka fałszywego alarmu!). Kodowanie nakładkowe w rzeczywistości nie działa zbyt dobrze w tabe li 2 , ponieważ stanowi ona m ały przykład z dużą liczbą atrybutów . Kwadraciki z jabłkam i tak naprawdę znajdą się w odpowiedzi na każde zapytanie, ponieważ wartość dla nich otrzymaliśmy przez nałożenie siedmiu kodów, które pokrywają
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
615
Tabela 2 PRZYKŁAD KODOWANIA NAKŁADKOWEGO
Kody poszczególnych składników smakowych Aromat migdałowy Przyprawa korzenna Ziarna anyżku Przecier jabłkowy Morele Banany Wiśnie kandyzowane Kardamon Czekolada Cynamon Cytron Goździki Kokos Kawa Galaretka porzeczkowa
0100000001 0000100001 0000011000 0010010000 1000010000 0000100010 0000101000 1000000001 0010001000 1000000010 0100000010 0001100000 0001010000 0001000100 0010000001
Daktyle Imbir Miód Sok cytrynowy Skórka cytrynowa Muszkat Melasa Gałka muszkatołowa Orzechy Pomarańcze Masło fistaszkowe Pieprz Śliwki suszone Rodzynki Aromat waniliowy
1000000100 0000110000 0000000011 1000100000 0011000000 0000010100 1001000000 0000010010 0000100100 0100000100 0000000101 0010000100 0010000010 0101000000 0000001001
Kody nakładkowe Wafelki migdałowe Kwadraciki z jabłkami Ciastka bananowo-owsiane Chipsy czekoladowe Makaroniki kokosowe Serniczki Pyszne batoniki śliwkowe Kropelki czekoladowe Batoniki wyśnione Ciastka nadziewane Fińska Kakor Lukrowane przekąski imbirowe Pustełniczki Klejnociki Dżamble Krzysiowe kręgielki
0000100100 1111111111 1000111111 0010101101 0001111101 0010001001 0111110110 0010101100 0001111101 1011101101 0100100101 1001110010 1101010110 0010101101 1000001011 1011100101
Kuleczki Lebkuchen Bezy Ciasteczka morawskie Paluszki owsiano-daktylowe Cukrowe ciasteczka Babuni Obwarzanki fistaszkowe Słodkie krągłości Pierniczki Szkockie owsiane kruche ciastka Gwiazdki z kruchego ciasta Skoczki Ciastka z formy Szwedzkie Kringlery Szwajcarskie chrupki cynamonowe Paluszki toffi Mrożone ciastka waniliowo-orzechowe
1011110111 1000101100 1001110011 1000100100 0000011011 0010001101 0000001001 1111111111 0000001001 0000000000 0011011000 0000001001 0000000000 1000000010 0010101101 0000101101
wszystkie dziesięć pozycji; z pierniczkami jest jeszcze gorzej, bo tam nakłada się dwanaście kodów. Z drugiej strony, tabela 2 czasami spisuje się zadziwiająco dobrze; jeśli na przykład zadamy zapytanie o „aromat waniliowy” , to fałszywym alarmem będzie tylko jeden rekord z przepisem na pierniczki. Z bardziej stosownym przykładem kodowania nakładkowego mamy do czy nienia dla pola na przykład 32-bitowego i zbioru (332) = 4960 różnych atrybutów , gdzie każdy rekord może mieć do sześciu atrybutów, a każdy a try b u t jest zako dowany przez wybranie 3 spośród 32 bitów. W tej sytuacji, jeśli założymy, że każdy rekord ma sześć losowo wybranych atrybutów , to prawdopodobieństwo
616
WYSZUKIWANIE
6.5
fałszywego alarm u w przypadku zapytania o zawieranie dla dla dla dla dla dla
jednego atry b u tu wynosi dwóch atrybutów wynosi trzech atrybutów wynosi czterech atrybutów wynosi pięciu atrybutów wynosi sześciu atrybutów wynosi
0.07948358 0.00708659 0.00067094 0.00006786 0.00000728 0.00000082
(ii)
Tak więc jeśli jest M rekordów, które faktycznie nie spełniają dwuatrybutowego zapytania, to około 0.007M z nich będzie miało kod nakładkowy omyłkowo zgodny ze wszystkimi bitam i kodów tych dwóch podanych atrybutów . (Powyższe prawdopodobieństwa są obliczone w ćwiczeniu 4). Łączna liczba bitów potrzeb nych w pliku odwrotnym to tylko 32 razy liczba rekordów, czyli mniej niż połowa liczby bitów potrzebnych do określenia samych atrybutów w oryginalnym pliku. Jeśli zastosuje się starannie dobrane nielosowe kody, to można całko wicie uniknąć fałszywych alarmów w kodowaniu nakładkowym, co pokazali W. H. K autz i R. C. Singleton, IE E E Trans. IT -1 0 (1964), 363-377; jedna z ich konstrukcji pojawia się w ćwiczeniu 16. Malcolm C. Harrison [CACM 1 4 (1971), 777-779] zauważył, że kodowanie nakładkowe można zastosować do przyspieszenia przeszukiwania tekstu. Przy puśćmy, że chcemy znaleźć wszystkie wystąpienia konkretnego ciągu znaków w długim tekście, bez budowania wielkiej tablicy jak w algorytmie 6.3P; za łóżmy, na przykład, że tekst jest podzielony na wiersze C1 C2 . . . C50 po 50 znaków w każdym. Harrison proponuje zakodowanie każdej z 49 par c xC2 , C2C3 , . . . , C49C50 przez odwzorowanie ich za pomocą funkcji haszującej na liczby z zakresu od 0 do 127; wówczas „sygnaturą” wiersza cxc 2 .. . C50 jest ciąg 128 bitów b0b i .. . 6127, gdzie bi — 1 w tedy i tylko wtedy, gdy h(c.jCj+1 ) = i dla pewnego j. Jeśli teraz chcemy znaleźć wszystkie wystąpienia słowa NEEDLE w dużym pliku tekstowym o nazwie HAYSTACK, to po prostu szukamy wszystkich wierszy, których sygnatura zawiera jedynki na pozycjach /¿(NE), h ( EE), h ( ED), /¿(DL) oraz h ( LE). Przy założeniu, że funkcja haszująca jest losowa, prawdopodobieństwo tego, że losowy wiersz zawiera wszystkie te bity w swojej sygnaturze, to zaledwie 0.00341 (zobacz ćwiczenie 4); zatem przecięcie pięciu stanowiących listy odwrotne ciągów bitów pozwoli błyskawicznie zidentyfikować wszystkie wiersze zawierające słowo NEEDLE, wraz z kilkoma innymi, stanowiącymi fałszywy alarm. Założenie o losowości nie daje się tak naprawdę obronić w tym zastosowaniu, ponieważ typowy tekst m a w sobie wiele redundancji; rozkład par sąsiednich liter w słowach z języka angielskiego jest daleki od jednostajnego. Zapewne bardzo po mocne będzie na przykład odrzucenie wszystkich par CjCj^i zawierających spa cję, ponieważ spacje są zazwyczaj znacznie częstsze niż jakikolwiek inny symbol. Inne ciekawe zastosowanie kodowania nakładkowego w problemach wyszuki wania zasugerował B urton H. Bloom [CACM 13 (1970), 422-426]; jego m etoda w rzeczywistości stosuje się do wyszukiwania klucza głównego, chociaż najodpo wiedniejszym dla nas miejscem do jej omówienia jest właśnie ten podrozdział. W yobraźmy sobie problem wyszukiwania w dużej bazie danych, w którym nie
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
617
trzeba wykonywać żadnych obliczeń, jeśli wyszukiwanie zakończyło się niepo wodzeniem. Moglibyśmy na przykład chcieć sprawdzić czyjąś ocenę zdolności kredytowej lub numer paszportu, a jeśli w płiku brak rekordu dla tej osoby, to nie musimy niczego więcej szukać. Podobnie, w zastosowaniu do składu kom pute rowego moglibyśmy dysponować prostym algorytmem przenoszenia, który działa poprawnie dla większości słów, ale nie radzi sobie z jakimiś 50000 wyjątków; jeśli nie znajdziemy słowa w pliku z wyjątkami, to możemy śmiało zastosować prosty algorytm. W takich sytuacjach można utrzymywać w pamięci wewnętrznej tablicę bitową, która dla większości kluczy spoza pliku pozwoli rozpoznać ich brak bez wykonywania żadnych odwołań do pamięci zewnętrznej. Oto jak można tego dokonać. Niech tablicą bitową w pamięci wewnętrznej będzie 6061 . . . 6m - i , gdzie M jest dość duże. Dla każdego klucza K j w pliku obliczamy k niezależnych funkcji haszujących h i ( K j ) , . . . , hk{Kj ) i przypisujemy odpowiadającym im k elementom b wartość 1. (Tych k pozycji nie musi być różnych). Tak więc bi = 1 wtedy i tylko wtedy, gdy hi (Kj ) = i dla pewnych j oraz 1. Teraz w celu okre ślenia, czy szukany element K jest w pliku w pamięci zewnętrznej, najpierw sprawdzamy, czy bhl^Kj = 1 dla 1 < l < fc; jeśli nie, to nie m a potrzeby sięgania do pamięci zewnętrznej; jeśli tak, to konwencjonalne przeszukanie prawdopo dobnie doprowadzi do znalezienia K , o ile A; i M zostały odpowiednio dobrane. Szansa na fałszywy alarm w przypadku, kiedy w pliku jest N rekordów, wynosi w przybliżeniu ( l ~ e ~ kN/ M)k, W pewnym sensie w metodzie Blooma trak tu je się cały plik jak jeden rekord, z kluczami głównymi jako atrybutam i i z kodowaniem nakładkowym w olbrzymim M -bit owym polu. Jeszcze inny wariant kodowania nakładkowego stworzył Richard A. Gustafson [praca doktorska (Univ. South Carolina, 1969)]. Przypuśćmy, że mamy N rekordów i że każdy rekord zawiera sześć atrybutów wybranych ze zbioru 10 000 możliwości. Rekordy mogą na przykład reprezentować prace naukowe, a atrybuty mogą być słowami kluczowymi opisującymi dany artykuł. Niech h będzie funkcją haszującą, która odwzorowuje każdy a try b u t na liczbę z zakresu od 0 do 15. Gustafson sugeruje odwzorowanie rekordu zawierającego atrybuty a i, ¿ 2, . . . , na 16-bitową liczbę b ^ b i. . . 615, gdzie bi = 1 wtedy i tylko wtedy, gdy h(dj) = i dla pewnego j \ ponadto, jeśli w wyniku tej m etody dostaniemy tylko k jedynek spośród bitów b dla k < 6 , to kolejnych 6 — k jedynek dodaje się jakimś losowym sposobem (niekoniecznie zależnym od samego rekordu). Jest (g6) = 8008 szesnastobitowych kodów, w których występuje dokładnie sześć bitów 1 i przy odrobinie szczęścia na każdą wartość odwzorowanych będzie około N / 8008 rekordów. Możemy przechowywać 8008 list rekordów, bezpośrednio obliczając adres odpowiadający ciągowi bob\ . . . 615 przy użyciu odpowiedniego wzoru. W rzeczywistości, jeśli jedynki występują na pozycjach 0 < pi < P2 < *** < pe» f° funkcja
przekształci jednoznacznie każdy ciąg ¿>0^1 ■*•¿>15 na liczbę z zakresu od 0 do 8007, co widzieliśmy w ćwiczeniach 1.2.6-56 i 2.2.6-7.
618
WYSZUKIWANIE
6.5
Jeśli teraz chcemy znaleźć wszystkie rekordy zawierające trzy określone atry b u ty A 3, to obliczamy ft(Ai), /¿(A2), h ( A 3); zakładając, że te trzy wartości są różne, musimy przyglądać się jedynie rekordom znajdującym się na (g3) — 286 listach, których kod bitowy 60&i • • ■&15 zawiera jedynki na tych trzech pozycjach. Innymi słowy, podczas przeszukiwania trzeba zbadać 286/8008 ~ 3.5 procent rekordów. A rtykuł C. S. R obertsa, Proc. IE E E 67 (1979), 1624-1642, zawiera do skonałe omówienie kodowania nakładkowego wraz z zastosowaniem do dużej bazy danych książek telefonicznych. Zastosowanie w programach sprawdzających pisownię om awiają J. K. Mullin i D. J. Margoliash, Software Practice &; Exper. 20 (1990), 625-630. H a sz o w a n ie k o m b in a to ry c z n e . Koncepcja stanowiąca podstawę właśnie opi sanej m etody Gustafsona polega na znalezieniu jakiegoś sposobu odwzorowania rekordów na adresy w pamięci, tak żeby stosunkowo niewiele adresów było zna czących dla konkretnego zapytania. Jego m etoda ma jednak zastosowanie tylko do zapytań o zawieranie w sytuacji, kiedy poszczególne rekordy zawierają mało atrybutów . Inny typ odwzorowania, umożliwiający obsługę dowolnych zapytań podstawowych takich jak ( 10), składających się z symboli 0, 1 oraz *, odkrył Ronald L. Rivest w 1971 roku. [Zobacz SIC O M P 5 (1976), 19-50]. Przypuśćm y najpierw, że chcemy skonstruować słownik krzyżówkowicza dla wszystkich sześcioliterowych słów angielskich; w typowym zapytaniu chcemy wyznaczyć wszystkie słowa postaci, powiedzmy, N**D*E i dostajemy odpowiedź {NEEDLE, NIDDLE, N0DDLE, N00DLE, NUDDLE}. Możemy zgrabnie rozwiązać ten pro blem, przechowując 2 12 list i umieszczając słowo NEEDLE na liście numer h{ N) h(E) h( E) h(D) h( L) h( E). Symbol h oznacza tu funkcję haszującą przeprowadzającą każdą literę na war tość 2-bitową; łącząc ze sobą tych sześć par bitów, uzyskujemy 12 -bitowy adres listy. Na zapytanie N**D*E można wówczas odpowiedzieć, przeglądając tylko 64 spośród 4096 list. Podobnie, przypuśćmy, że mamy 1000 000 rekordów, z których każdy zawiera 10 kluczy wtórnych, a każdy klucz wtórny przyjmuje sporą liczbę możliwych wartości. Możemy odwzorować rekord o kluczach wtórnych K 2, . . . , Kio) na liczbę 20-bitową / > ( # ! ) . . . h ( K 10), ( 12 ) gdzie h jest funkcją haszującą przekształcającą każdy klucz wtórny na wartość 2-bitową, ( 12 ) zaś oznacza konkatenację tych dziesięciu par bitów. Ten schemat odwzorowuje 1000 000 rekordów na 220 = 1048 576 możliwych wartości i możemy potraktow ać całe odwzorowanie jako funkcję haszującą z M — 220; do rozwiązy wania kolizji można użyć m etody łańcuchowej. Jeśli chcemy wyznaczyć wszystkie rekordy zawierające określone wartości dowolnych pięciu kluczy wtórnych, to musimy zajrzeć tylko na 210 list odpowiadających pięciu nie wyspecyfikowanym parom bitów w ( 12 ); tak więc średnio trzeba zbadać tylko około 1000 = \Z/V re kordów. (Podobne podejście zaproponowali M. Arisawa, J. Inf. Proc. Soc. Japan
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
619
12 (1971), 163-167 oraz B. Dwyer (praca nieopublikowana). Dwyer zasugerował użycie odwzorowania bardziej elastycznego niż ( 12 ), a mianowicie ( M ^ i ) + h 2 { K2) + • • • + h w ( K w )) m o d M, gdzie M jest dowolną dogodną liczbą, hi zaś to dowolne funkcje haszujące, być może postaci WiKi dla „losowych” Wi). Rivest rozwinął tę koncepcję dalej, dzięki czemu w wielu przypadkach m a my do czynienia z następującą sytuacją. Załóżmy, że jest N « 2n rekordów, z których każdy ma po m kluczy wtórnych. Każdy rekord jest odwzorowywany na n-bitowy adres haszowania w taki sposób, że zapytanie pozostawiające nie wyszczególnione wartości k kluczy odpowiada w przybliżeniu N k/ m adresom haszowania. W szystkie inne m etody omówione przez nas w tym podrozdziale (oprócz m etody Gustafsona) wym agają do wyszukania rekordów liczby kroków rzędu chociaż stały współczynnik proporcjonalności jest mały; dla dostatecz nie dużych N m etoda Rivesta będzie szybsza i nie wymaga ona użycia żadnych plików odwrotnych. Przed zastosowaniem tej techniki musimy jednak zdefiniować odpowiednie odwzorowanie. Oto przykład z m ałymi wartościami param etrów w przypadku, kiedy m — 4 i n ~ 3, a wszystkie klucze wtórne przyjm ują wartości binarne; możemy odwzorowć 4-bitowe rekordy na osiem adresów w następujący sposób: * 0 0 1 ^ 0 0 * 00 1 1 0 *0 —> 2 1 1 0* —> 3
* 1
11 0 *1 1 0 1 * 1 0 01*
—► 4 —► 5
/
\
—> 6
—> 7
Przyglądając się tej tabeli, widzimy, że wszystkie rekordy odpowiadające zapyta niu 0 * * * są odwzorowywane na pozycje 0, 1, 4, 6 i 7; podobnie, dowolne zapy tanie podstawowe z trzem a symbolami * odpowiada dokładnie pięciu pozycjom. Każde zapytanie podstawowe z dwoma symbolami * odpowiada trzem pozycjom; zapytanie podstawowe z jedną * odpowiada jednej albo dwóm pozycjom, średnio (8 x 1 + 24 x 2)/32 = 1.75. Mamy zatem Liczba nie wyspecyfikowanych bitów w zapytaniu
Liczba adresów do przeszukania
4 3 2 1
8 = 84/4 5 « 83/ 4 3 w 82/ 4 1.75 « 81/ 4 1 = 8°/4
0
( 14 )
Oczywiście, jest to tak mały przykład, że łatwiej byśmy sobie z nim poradzili m etodą siłową. Prowadzi on jednak do nietrywialnych zastosowań, ponieważ możemy skorzystać z tego rozwiązania również dla m = 4r oraz n = 3r, odwzo rowując 4r-bitowe rekordy na 23r « N pozycji przez podzielenie kluczy wtórnych na r grup po 4 bity każda i zastosowanie przekształcenia ( 13 ) w każdej grupie. Wynikowe odwzorowanie m a żądaną własność: zapytanie nie wyspecyfikowujące
620
WYSZUKIWANIE
6.5
wartości k spośród m bitów będzie odpowiadało w przybliżeniu N k^ n pozycjom. (Zobacz ćwiczenie 6 ). W 1997 roku A. E. Brouwer [SICOMP 28 (1999), 1970-1971] znalazł atrak cyjny sposób zmniejszenia liczby bitów z 8 do 5 za pomocą odwzorowania ana logicznego do ( 13 ). Każdy 8-bitowy b ajt należy do dokładnie jednej spośród poniższych 32 klas: 0 * 0 0 0 * 0 *
0 1 * 0**11
0 0 * 1 1 * * 1
* 1 1 * * 1 0 1
1 * 0 0 0 * 0 *
1 1 * 0 * * 1 1
1 0 * 1 1 * * 1
* 1 1 * * 0 1 0
0 * 0 1 0 * 0 *
0 1 * 1**11
00* 0 * 01*
* 1 0 * 0 * 1 0
1 0 * 0 * 0 1 *
* 1 0 * 1 * 0 1
0*
1 1 * 1 * * 1 1
0 * 1 0 *
1 * 0
0 * 1 * 0 0 0 *
* 0 1 * 0 1 * 1
* 0 * 1 0 0 1 *
1 * 1 0 *
1 * 0
1 * 1 * 0 0 0 *
* 1 0 * 1 0 * 0
* 0 * 0 1 0 0 *
0 * 1 1 *
1 * 0
0 * 0 * 1 1 * 0
* 0 0 * 0 1 1 *
* 0 * 0 1 1 * 1
1 * 1 1 * 1 * 0
1 * 0 * 1 1 * 0
* 11 * 1 0 0 *
* 0 * 1 1 0 * 0
1 * 0 1 0 *
Symbole * w tej konfiguracji są ułożone tak, że występują po 3 w każdym wierszu i po 12 w każdej kolumnie. Ćwiczenie 18 wyjaśnia, jak otrzymać podobne sche maty, które pozwolą skompresować rekordy zawierające na przykład po m — 4r bitów w adresy zawierające po n = 3r bitów. W praktyce użylibyśmy kubełków rozm iaru b i wzięlibyśmy N « 2n6; w powyższym omówieniu przyjęliśmy 6 = 1 dla prostoty wykładu. Rivest zaproponował również inny prosty sposób obsługi zapytań podsta wowych. Przypuśćmy, że mamy N ^ 210 rekordów po 30 bitów każdy i chcemy odpowiadać na dowolne 30-bitowe zapytania podstawowe takie jak ( 10). Możemy wówczas po prostu podzielić 30 bitów na trzy 10-bitowe pola i utrzymywać trzy oddzielne tablice z haszowaniem rozm iaru M = 2 10. Każdy rekord jest przechowywany w trzech miejscach, na listach odpowiadających jego konfigu racjom bitów na tych trzech polach. Przy spełnieniu odpowiednich warunków każda lista będzie zawierała mniej więcej jeden element. Dla danego zapytania podstawowego z k nie wyspecyfikowanymi bitam i przynajmniej w jednym z pól będzie [k/3\ lub mniej nie wyspecyfikowanych bitów; musimy zatem przejrzeć co najwyżej 2 Lfc/ 3J ~ list, żeby znaleźć wszystkie odpowiedzi na to za pytanie. Moglibyśmy również użyć jakiejkolwiek innej techniki obsługi zapytań podstawowych na wybranych polach. U o g ó ln io n e d rz e w a tr ie . Rivest poszedł dalej, proponując jeszcze inne po dejście oparte na strukturze danych podobnej do drzew trie z podrozdziału 6.3. Każdy węzeł wewnętrzny w uogólnionym binarnym drzewie trie może określać, który bit rekordu on właśnie reprezentuje. W przypadku danych z tabeli 1 moglibyśmy na przykład przyjąć, że korzeń drzewa trie reprezentuje arom at waniliowy; wówczas lewe poddrzewo odpowiadałoby tym 16 przepisom, w któ rych nie używa się arom atu waniliowego, podczas gdy w prawym poddrzewie znajdowałoby się 15 przepisów, w których się go używa. To rozbicie 1 6 -1 5 dobrze rozdziela plik na dwoje; podobnie możemy postąpić z każdym jego fragmentem. Kiedy fragment staje się dostatecznie mały, reprezentujemy go za pomocą węzła końcowego.
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
621
Żeby obsłużyć zapytanie podstawowe, zaczynamy od korzenia drzewa trie. Przeszukując uogólnione drzewo trie o korzeniu określającym atry b u t, dla któ rego zapytanie zawiera 0 lub 1 , przeszukujemy odpowiednio lewe lub prawe poddrzewo; jeśli zapytanie zawiera * na tej pozycji, to przeszukujemy obydwa poddrzewa. Przypuśćmy, że atrybuty nie są binarne, ale są reprezentowane w notacji binarnej. Możemy zbudować drzewo trie, patrząc najpierw na pierwszy bit a try butu 1 , następnie na pierwszy bit atry b u tu 2 , . . . , na pierwszy bit atry b u tu m, potem na drugi bit atry b u tu 1 itd. Taką strukturę określa się jako „m-d trie” , przez analogię do m-d drzew (w których decyzję o wyborze rozgałęzienia podej muje się na podstawie porównania, a nie zbadania wartości bitu). P. Flajolet i C. Puech pokazali, że średni czas odpowiedzi na zapytanie o częściowe dopa sowanie w losowym drzewie m-d trie o N węzłach wynosi Q ( N k/ m ), jeśli nie wyspecyfikowana jest frakcja k / m atrybutów [JACM 33 (1986), 371-407, §4.1]; wariancję obliczył W. Schachinger, Random Structures and A lgorithm s 7 (1995), 8 1 -9 5 . Podobne algorytmy można opracować dla m-wymiarowych wersji drzew poszukiwań pozycyjnych i drzew Patricia z podrozdziału 6.3. Te struktury, które często bywają nieco lepiej zrównoważone niż m -d trie, przeanalizowali P. Kirschenhofer i H. Prodinger, Random Structures and Algorithm s 5 (1994), 123-134. * S c h e m a ty z ró w n o w a żo n e g o w y p e łn ia n ia . Badane było również inne kombinatoryczne podejście do wyszukiwania informacji, oparte na zrównoważonych niepełnych konfiguracjach kombinatorycznych. Chociaż sam a koncepcja jest cał kiem interesująca z matematycznego punktu widzenia, jak dotąd niestety nie udowodniono jej przewagi nad innymi opisanymi wyżej m etodam i. Przedstawim y tu krótkie wprowadzenie do tej teorii w celu zilustrowania jej ducha i w nadziei, że Czytelnicy wymyślą dobre sposoby wdrożenia tych idei do praktycznego użycia. System trójek Steinera to ustawienie v obiektów w nieuporządkowane trójki w taki sposób, żeby każda para obiektów występowała w dokładnie jednej trójce. Na przykład dla v — 7 istnieje tak naprawdę tylko jeden system trójek Steinera, a mianowicie Trójka Zawarte w niej pary {1,2,4} {2,3,5} {3,4,6} {4,5,0} {5,6,1} {6 , 0 , 2 } {0,1,3}
{1,2}, {2,3}, {3,4}, {0,4}, {1,5}, {0, 2 }, {0,1},
{1,4}, {2,5}, {3,6}, {0,5}, {1,6}, {0, 6 }, {0,3},
{2,4} {3,5} {4,6} {4,5} {5,6} {2 , 6 } {1,3}
(l6)
Ponieważ jest ^v ( v — 1) par obiektów, a w każdej trójce w ystępują trzy pary, w sumie musi być | u ( v — 1 ) trójek; ponadto, ponieważ każdy obiekt musi być sparowany z v —1 innymi, każdy obiekt musi występować w dokładnie |( u — 1 ) trójkach. Z tych warunków wynika, iż aby system trójek Steinera mógł istnieć,
622
WYSZUKIWANIE
6.5
wielkości —1) i — 1 ) muszą być liczbami całkowitymi, a to jest rów noważne warunkowi, że v jest nieparzyste i nie przystaje do 2 modulo 3 ; tak więc v mod 6 = 1 lub 3.
( 17 )
Także odwrotnie, T. P. Kirkm an udowodnił w 1847 roku, że systemy trójek Steinera rzeczywiście istnieją dla wszystkich v > 1 spełniających warunek ( 17 ). Jego interesująca konstrukcja jest podana w ćwiczeniu 10. Systemów trójek Steinera można użyć do zmniejszenia redundancji w zło żonych plikach odwrotnych. Rozważmy na przykład jeszcze raz plik przepisów na ciasteczka z tabeli 1 i przekształćm y ostatnią z prawej strony kolumnę na 31-szy atrybut, przyjm ujący wartość 1, jeśli konieczne są jakiekolwiek specjalne składniki, a 0 w przeciwnym razie. Załóżmy, że chcemy odpowiadać na wszystkie zapytania o zawieranie dla par atrybutów , takie jak „w których przepisach używa się jednocześnie kokosów i rodzynków?” . Moglibyśmy sporządzić listę odwrotną dla każdego spośród = 465 możliwych zapytań. Okazałoby się jednak, że wymaga to sporo miejsca, ponieważ pierniczki (na przykład) występowałyby na (g7) = 136 listach, a rekord zawierający wszystkich 31 atrybutów występowałby na każdej liście! Można nieco polepszyć sytuację, korzystając z systemu trójek Steinera. Istnieje system trójek Steinera dla 31 obiektów złożony z 155 trójek, a każda para obiektów występuje w dokładnie jednej z tych trójek. Z każdą trójką {a, 6, c} możemy związać cztery listy: jedna lista dla wszystkich rekordów o atrybutach a, 6, ć (to znaczy a i 6, ale nie c); inna dla a, 6, c; jeszcze inna dla a, 6, c i ostatnia dla rekordów zawierających wszystkie trzy atrybuty a, fc, c. To gwarantuje, że żaden rekord nie znajdzie się na więcej niż 155 listach odwrotnych, i daje oszczędność miejsca, jeśli tylko rekord m a trzy atrybuty, które odpow iadają trójce z systemu. Systemy trójek to szczególny przypadek konfiguracji kombinatorycznych składających się z bloków po trzy lub więcej obiektów. Istnieje na przykład spo sób ustawienia 31 obiektów w szóstki, tak żeby każda para obiektów występowała w dokładnie jednej szóstce: {0,4,16,21,22,24}, {1,5,17,22,23,25}, . . . , {30,3,15,20,21,23}
( 18)
(Tę konfigurację tworzy się z pierwszego bloku przez dodawanie mod 31. Aby sprawdzić, że m a ona podaną własność, zauważmy, iż 30 wartości (a*—aj) mod 31 dla i 7^ j , gdzie (ai, a 2, . . . , a^) = (0,4,16, 21,22, 24), jest różnych. Aby znaleźć szóstkę zawierającą parę (x, y), wybierzmy tak i oraz j , żeby a,i — aj = x —y (modulo 31); teraz jeśli k = (x — a*) mod 31, to mamy (a* + k) mod 31 = x oraz (aj + k) mod 31 = y). Powyższą konfigurację możemy wykorzystać do przechowywania list odwrot nych w taki sposób, żeby żaden rekord nie mógł wystąpić więcej niż 31 razy. Z każdą szóstką {a, 5, c, d, e, / } jest związanych 57 list odpowiadających rozma itym możliwym rekordom o dwóch lub większej liczbie atrybutów a, &, c, d, e, / , a mianowicie (a, 6, ć, d, e, / ) , (a, 5, c, d, e, / ) , . . . , (a, 6, c, d, e, / ) ; odpowiedzią na każde 2-atrybutow e zapytanie o zawieranie jest suma rozłączna 16 odpowiednich
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
623
list z odpowiedniej szóstki. Przy użyciu tej konfiguracji przepis na pierniczki byłby przechowywany w 29 spośród 31 bloków, ponieważ ten rekord zawie ra dwa z sześciu atrybutów we wszystkich blokach oprócz {19,23,4,9,10,12} i {13,17,29,3,4,6}, jeśli ponumerujemy kolumny od 0 do 30. Szczegółowe przedstawienie teorii konfiguracji kombinatorycznych i pokrew nych zagadnień zawarł Marshall Hall, Jr. w książce Combinatorial Theory (Wal tham , Mass.: Blaisdell, 1967). Chociaż takie konstrukcje urzekają swoim pięk nem, ich główne zastosowanie w problemach wyszukiwania informacji jak dotąd polegało jedynie na zmniejszeniu redundancji związanej ze stosowaniem złożo nych list odwrotnych, a David K. Chow [Information and Control 15 (1969), 377-396] zauważył, że to samo można osiągnąć także i bez stosowania konfigu racji kombinatorycznych. K r ó tk i ry s h is to ry c z n y i b ib lio g ra fia . Pierwszą publikacją dotyczącą techni ki wyszukiwania względem klucza wtórnego był artykuł L. R. Johnsona [CACM 4 (1961), 218-222]. System m ultilist mniej więcej w tym samym czasie opra cowali niezależnie Noah S. Prywes, H. J. Gray, W. I. Landauer, D. Lefkowitz oraz S. Litwin; zobacz IE E E Trans, on Communication and Electronics 82 (1963), 488-492. A utoram i innej dość wczesnej publikacji, która m iała wpływ na późniejsze prace, byli D. R. Davis i A. D. Lin, CACM 8 (1965), 243-246. Od tam tych czasów zaczęła się gwałtownie rozrastać obszerna literatura w obrębie tej tem atyki, jednak dotyczyła ona głównie interfejsu użytkownika i rozważań związanych z językami programowania, które nie mieszczą się w za kresie tej książki. Oprócz już zacytowanych prac następujące artykuły okazały się najbardziej pomocne przy pisaniu tego podrozdziału w 1972 roku: Jack Minker i Jerome Sable, Ann. Rev. o f Information Science and Technology 2 (1967), 123-160; Robert E. Bleier, Proc. A C M Nat. Conf. 22 (1967), 4 1 -4 9 ; Jerome A. Feldman i Paul D. Rovner, C AC M 12 (1969), 439-449; B urton H. Bloom, Proc. A C M Nat. Conf. 24 (1969), 83 -9 5 ; H. S. Heaps i L. H. Thiel, Information Storage and Retrieval 6 (1970), 137-153; Vincent Y. Lum i Huei Ling, Proc. A C M Nat. Conf. 26 (1971), 349-356. Dobry przegląd systemów ręcznych kartotek przedsta wił C. P. Bourne w książce M ethods o f Information Handling (New York: Wiley, 1963), rozdział 5. Na pomysł schematów zrównoważonego w ypełniania wpadli C. T. Abraham, S. P. Ghosh i D. K. Ray-Chaudhuri w 1965 roku; zobacz artykuł R. C. Bose’a i G ary’ego G. Kocha, S IA M J. A p p l M ath. 17 (1969), 1203-1214. /&\ Większość klasycznych algorytmów dla danych wieloatry but owych, o któJL rych wiadomo, że m ają znaczenie praktyczne, została omówiona pow yżej; w następnym wydaniu tej książki planowane je st poruszenie jeszcze kilku zagad nień, w tym następujących: • E. M. McCreight wprowadził drzewa poszukiwań priorytetowych [SICOMP 14 (1985), 257-276], które są specjalnie zaprojektowane do reprezentowania przecięć zmieniających się dynamicznie rodzin przedziałów i do obsługi za pytań zakresowych postaci „znajdź wszystkie rekordy takie, że xq < x < x \ oraz y < y f \ (Zauważmy, że dolnym ograniczeniem dla y musi być —oo, ale x może być ograniczone z obu stron).
624
WYSZUKIWANIE
6.5
• M. L. Fredm an udowodnił kilka fundamentalnych dolnych ograniczeń, po kazujących, że ciąg N przemieszanych wstawień, usunięć i fc-wymiarowych zapytań zakresowych musi obejmować ii(iV(log N ) k) operacji w najgorszym przypadku, bez względu na zastosowaną strukturę danych. Zob. JA C M 28 (1981), 696-705; SICO M P 10 (1981), 1 -1 0 ; J. A lgorithm s 1 (1981), 77-87. Podstawowe algorytm y dopasowywania wzorca i przybliżonego dopasowywania wzorca w tekstach będą omówione w rozdziale 9. Ciekawą uwagą jest to, że ludzki mózg radzi sobie znacznie lepiej niż kom putery z wyszukiwaniem względem kluczy wtórnych; faktycznie, dla ludzi raczej łatwe jest rozpoznawanie twarzy czy melodii na podstawie jedynie fragmenta rycznej informacji, podczas gdy kom putery prawie wcale tego nie potrafią. Jest więc niewykluczone, że któregoś dnia zostanie odkryte zupełnie nowe podejście do kwestii projektowania maszyn, które pozwoli raz na zawsze rozwiązać problem wyszukiwania względem kluczy wtórnych i zdezaktualizuje cały ten podrozdział. ĆWICZENIA ► 1. [M27] Niech 0 ^ k ^ n / 2 . Udowodnij, że poniższa konstrukcja daje (£) permutacji zbioru { 1 , 2 , . . . , n}, takich że każdy ¿-elementowy podzbiór zbioru { 1 , 2 , . . . , n} w ystępuje jako pierwszych t elementów w co najmniej jednej perm utacji dla t ^ k lub t ^ n — k . Rozważmy ścieżkę na płaszczyźnie od punktu (0,0) do ( n , r ) , gdzie r ^ n —2 k , której i -ty fragment biegnie od punktu (i —1, j ) do (i, j+ 1 ) lub do (¿, j — 1); ta o statnia możliwość jest dopuszczalna tylko wtedy, kiedy j ^ 1, tak że ścieżka nigdy nie schodzi poniżej osi x . Jest dokładnie (£) takich ścieżek. Dla każdej ścieżki tego rodzaju konstruujem y perm utację w następujący sposób, korzystając z trzech początkowo pustych list: Dla i — 1, 2 , . . . , n, jeśli i -ty fragment ścieżki prowadzi w górę, to umieszczamy liczbę i na liście B ; jeśli ten fragment prowadzi w dół, to umieszczamy i na liście A i przemieszczamy aktualnie największy element listy B na listę C . Na wynikową perm utację składa się ostateczna zawartość listy A , następnie listy E?, a na koniec listy C, przy czym każdą z list bierzemy w kolejności rosnącej. N a przykład dla n = 4 i k = 2 sześcioma ścieżkami i per m utacjam i zdefiniowanymi przez tę procedurę są
1 2 3 4j
2 13 4|1
2 4||1 3
3|1 4|2
3 4||1 2
4|1 2|3
(Pionowe kreski oznaczają granice między listami A, B i C. Tych sześć permutacji odpowiada atrybutom złożonym w (8)). Wskazówka: Każdy ¿-elementowy podzbiór S możemy reprezentować jako ścieżkę prowadzącą od punktu (0,0) do (n, n —2t), której ¿-ty fragment biegnie od ( i —1, j ) do (¿, J + 1), jeśli i ^ S, albo do (¿, j —1), jeśli i € 5. Każdą taką ścieżkę przekształcamy na odpowiednią ścieżkę opisanej wyżej specjalnej postaci. 2. [M2 5 ] (Sakti P. Ghosh) Znajdź najmniejszą możliwą długość / listy n r 2 . . . n odnośników do rekordów, takiej że zbiór wszystkich odpowiedzi na dowolne z zapytań o zawieranie **1, *1*, 1**, *11, 1*1, 11*, 111 dla trzech dwuwartościowych kluczy wtórnych będzie występował na kolejnych pozycjach T i .. .rj.
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
625
3. [19] Jakie zapytania o zawieranie dla tabeli 2 spowodują wystąpienie: (a) cukro wych ciasteczek Babuni, (b) paluszków owsiano-daktylowych jako fałszywego alarmu? 4. [M30] Znajdź dokładne wzory na prawdopodobieństwa ( n ) , przy założeniu, że każdy rekord zawiera r różnych atrybutów wybranych losowo spośród (”) /c-bitowych kodów na n-bitowym polu oraz że zapytanie dotyczy q różnych, ale poza tym losowych atrybutów. (Nie przejmuj się, jeśli wzory nie będą miały prostej postaci).
5. [4 0 ] Poeksperymentuj z rozmaitymi sposobami unikania redundancji w tekście przy stosowaniu techniki Harrisona wyszukiwania podsłów. ► 6. [M20] Łączna liczba m-bitowych zapytań podstawowych z t wyspecyfikowanymi bitami wynosi s = (7)2*. Jeśli funkcja haszowania kombinatorycznego taka jak ( 13 ) odwzorowuje te zapytania na odpowiednio Zi, Z2 , . . . , ls adresów, to L(t) = (h + h + ••• jest średnią liczbą adresów przypadających na jedno zapytanie. [Na przykład w ( 13 ) mamy L(3) = 1.75]. Rozważmy teraz złożoną funkcję haszującą na polu (mi + m 2 )-bitowym, utworzoną przez odwzorowanie najpierw m i bitów za pomocą jednej funkcji haszującej, a następnie pozostałych m-2 za pomocą drugiej, gdzie L\{t) i L,2 (t) to odpowiadające im średnie liczby adresów przypadające na jedno zapytanie. Znajdź wzór wyrażający L(t) dla funkcji złożonej przy zastosowaniu Li i L 2 . [M2Ą\ (R. L. Rivest) Znajdź funkcje L(t) zdefiniowane w poprzednim ćwiczeniu dla następujących funkcji haszowania kombinatorycznego:
7.
(b) m = 4, n — 2
(a) m — 3, n = 2 0 0 * —» 0
0 0 * * —►0
1 * 0 -+ 1 * 1 1 —> 2
* 1 * 0-► 1 * 1 1 1 —» 2
1 0 1 —> 3 010^ 3
10 1 * -> 2 * 1 0 1 -> 3 10 0 * ^ 3
[M32] (R. L. Rivest) Rozważmy zbiór Qt,m wszystkich 2* ( 7 ) podstawowych m-bitowych zapytań takich jak ( 1 0 ), w których wyspecyfikowanych jest dokładnie t bitów. Dla danego zbioru 5 rekordów m-bitowych, niech f t ( S ) oznacza liczbę zapytań w zbiorze Qt,m, dla których odpowiedź zawiera element z 5; niech f t ( s , m ) będzie zdefiniowane jako minimum wartości f t (S ) po wszystkich takich zbiorach S mających s elementów dla 0 ^ s ^ 2 m. Przyjmijmy też konwencję, że f t (0,0) = 0 i f t ( 1,0) = óto. a) Udowodnij, że dla wszystkich i ^ 1 i m ^ 1 oraz dla 0 ^ s ^ 2 m, 8.
= f t ( \ s / 2 ] , m — 1) +
- 1) + f t - i ( [ s / 2 \ , m - 1).
b) Rozważmy dowolną funkcję haszowania kombinatorycznego h ze zbioru 2m możli wych rekordów w zbiór 2 n list, przy czym każda lista odpowiada 2 m“ n rekordom. Jeśli każde z zapytań w zbiorze Qt ym jest jednakowo prawdopodobne, to średnia liczba list do zbadania przypadająca na jedno zapytanie jest równa 1 / 2 *(7 ) razy Y , (listy zbadane dla Q) = ^ Qe Qt , m
(zapytania z Qt,m dotyczące S) ^ 2 n/ t ( 2 m_n, m).
listy s
Pokaż, że funkcja h jest optymalna w tym sensie, że to dolne ograniczenie jest osiągane, jeśli każda z list jest „podkostką”; inaczej mówiąc, pokaż, że równość
626
WYSZUKIWANIE
6.5
zachodzi wtedy, kiedy każda lista odpowiada zbiorowi rekordów spełniających pewne zapytanie podstawowe o dokładnie n wyspecyfikowanych bitach. 9. [M20] Udowodnij, że jeśli v — 3n, to zbiór wszystkich trójek postaci { ( a i . . . a k - i O b i . . . bn- k ) 3, (ai . . . d k - i 1 c\ . . . cn- k ) 3, (ai .. . dk~i 2d\ ... dn~k) 3 }, 1 ^ k ^ n, stanowi system trójek Steinera, gdzie a, b, c i d przebiegają wszystkie kombinacje wartości 0, 1 i 2s, takie że bj + ej + dj = 0 (modulo 3) dla 1 ^ j ^ n - k. 10. [M32] (Thomas P. Kirkman, Cambridge and Dublin M ath. Journal 2(1847), 191-204) System em trójek K irkm ana rzędu v nazwiemy takie rozmieszczenie v + 1 obiektów {a?o, x i , . . . , x v } w trójkach, że każda para { x i 7Xj} dla i 7^ j występuje w do kładnie jednej trójce, z wyjątkiem v par {xi, X(*+i) mod v}> które nigdy nie występują w tej samej trójce dla 0 ^ i < v. Przykładowo, {¿TO}^2 j *^4} j {¿Cl, XSi ^ 4 } jest systemem trójek Kirkmana rzędu 4. a) Udowodnij, że system trójek Kirkmana może istnieć tylko dla v mod 6 — 0 lub 4. b) Udowodnij, że dla danego systemu trójek Steinera S dla v obiektów { ^ i ,. . . , x v ] następująca konstrukcja daje inny system Steinera S' dla 2v + l obiektów i system trójek Kirkmana K ' rzędu 2v — 2: Trójki z S f to te z 5 plus i)
{x iy Vji Vk},
gdzie j + k = i (modulo u) oraz j < fc, 1 $ i , j , k ^ v ;
ii)
{xi,yj,z},
gdzie 2j =
i
(modulo v), 1 ^
^ v.
Trójki z K ' to te z S f minus wszystkie trójki zawierające y\ i/lub yv . c) Udowodnij, że dla danego systemu trójek Kirkmana K dla {xo, x i , . . . , x v}, gdzie v = 2 u, następująca konstrukcja daje system trójek Steinera S / dla 2 u-ł-l obiektów i system trójek Kirkmana K ’ rzędu 2v — 2: Trójki z S ( to te z K plus 1)
{ * £ ¿ » * £ (¿ + 1 ) m o d v > 2 / i + 1 } ) 0 ^
ii) iii) {xi,
i ^
j + A; = 2i + 1 (modulo
1), 1 ^ j < k - 1 ^ v - 2, 1 ^ i ^ v - 2 ;
2 j = 2 i + 1 (modulo v - l ) , l ^ j ^ u - 1 , l ^ ż ^ u - 2 ;
iv) {ico, 2/2j , 3/2j+i},
dla 1 ^ j < u;
v) {xv,yu,yv}Trójki z K f to te z S' minus wszystkie trójki zawierające y\ i/lub yv-id) Korzystając z wcześniej uzyskanych wyników, udowodnij, że dla wszystkich v ^ 0 postaci 6 fc lub 6k + 4 istnieją systemy trójek Kirkmana i dla wszystkich v ^ 1 postaci 6 &+ 1 lub 6 fc + 3 istnieją systemy trójek Steinera dla v obiektów. 1 1 . [M25] W tekście podrozdziału jest opisane zastosowanie systemów trójek Steinera w związku z zapytaniami o zawieranie; żeby rozszerzyć je na wszystkie zapytania podstawowe, naturalnie będzie zdefiniować następujące pojęcie. Dopełnieniowy system trójek rzędu v to takie rozmieszczenie 2v obiektów { x i , . . . , x v , £ 1, . . . , x v } w trójkach, że każda para obiektów występuje w dokładnie jednej trójce, z wyjątkiem dopełniają cych się par {xi, Xi}, które nigdy nie występują razem. Przykładowo,
, X2>^ 3 }? {*£l) ^ 21 «^3} j
j $2 5*^3} i
) ^2 ) ^3 }
stanowi dopełnieniowy system trójek rzędu trzy. Udowodnij, że dopełnieniowe systemy trójek rzędu v istnieją dla wszystkich v ^ 0, które nie są postaci 3k + 2 .
6.5
WYSZUKIWANIE WZGLĘDEM KLUCZY WTÓRNYCH
627
12. [M 23] Kontynuując ćwiczenie 11, skonstruuj dopełnieniowy system czwórek rzę du 7. 13. [M25] Skonstruuj systemy czwórek o v = 4n elementach, analogiczne do systemu trójek z ćwiczenia 9. 14. [28] Omów problem usuwania węzłów z drzew ćwiartek, k-d drzew i drzew pocz towych takich jak na rysunku 45. 15. [HM30] (P. Elias) Przypuśćmy, że mając dany duży zbiór m-bitowych rekordów, chcemy znaleźć rekord najbliższy określonemu argumentowi procedury wyszukiwania w sensie zgodności na największej liczbie bitów. Zaprojektuj algorytm efektywnego rozwiązywania tego problemu, przy założeniu, że dany jest ra-bitowy kod korygujący t błędów dla 2 n elementów i że każdy rekord został odwzorowany przez funkcjęhaszującą na jedną z 2 n list odpowiadających najbliższemu podsłowu. ►16. [25] (W. H. Kautz i R. C. Singleton) Pokaż, że systemu trójek Steinera rzędu v można użyć do skonstruowania v( v — l ) / 6 słów kodowych po v bitów każde, tak żeby żadne słowo kodowe nie zawierało się w nałożeniu na siebie żadnych dwóch innych. ►17. [M30] Rozważmy następujący sposób zredukowania (2n + 1 )-bitowych kluczy a - n . . . a o . . . a n do (n + l)-bitowych adresów kubełków bo . . . bn: bo «— ao\ jeśli bk~i = 0 , to bk <— a_fc, w przeciwnym razie bk
akdla 1 ^ k ^ n.
a) Opisz klucze, które występują w kubełku bo .. .bn. b) Jaka jest największa liczba kubełków, które trzeba zbadać, odpowiadając na za pytanie podstawowe z t wyspecyfikowanymi bitami? ►18. [M35] (Łączne konfiguracje kombinatoryczne) Zbiór m-tek taki jak ( 13 ), z dokład nie m — n symbolami * w każdym z 2n wierszy, nazywamy systemem ABD(m, n) (od associative block design), jeśli każda kolumna zawiera taką samą liczbę symboli * oraz każda para wierszy ma „niezgodność” (0 kontra 1) w pewnej kolumnie. Każda m-bitowa liczba binarna będzie wówczas pasować do dokładnie jednego wiersza. Na przykład ( 13 ) to A B D (4,3). a) Udowodnij, że system ABD(m, n) nie może istnieć, chyba że m jest dzielnikiem 2 n-1n oraz n 2 ^ 2 m (l - 2 “ n). b) Mówimy, że wiersz systemu ABD jest nieparzysty, jeśli zawiera nieparzystą liczbę jedynek. Pokaż, że dla każdego wyboru m — n kolumn z systemu ABD(m, n) liczba wierszy nieparzystych z * w tych kolumnach jest równa liczbie wierszy parzystych. W szczególności, każdy układ gwiazdek musi występować w parzystej liczbie wierszy. c) Znajdź system A B D (4,3), którego nie można otrzymać z ( 13 ) przez permutowanie i/lub branie dopełnienia kolumn. d) Skonstruuj A B D (16,9). e) Skonstruuj A B D (16,10). Zacznij od A B D (16,9) z części (d), a nie od A BD( 8 , 5) Z ( 15 )19. [M22] Przeanalizuj system A BD (8,5) z ( 15 ), tak jak system ( 13 ) został prze analizowany w ( 14 ). Ile spośród 32 pozycji trzeba średnio przeszukać dla zapytania o k niewyspecyfikowanych bitach? Ile trzeba przeszukać w najgorszym przypadku? 20. [MĄ7] Znajdź wszystkie systemy ABD(m, n) dla n — 5 lub n = 6 .
628
WYSZUKIWANIE
6.5
/t f \ W następnym wydaniu tej książki je st planowany now y podrozdział 6.6 poświęcony JL „trw ałym strukturom d a n y c h T r w a ł e stru k tu ry danych umożliwiają reprezento wanie zmieniającej się informacji w taki sposób, że daje się efektyw nie zrekonstruować je j wcześniejszy stan. Innym i słowy, m oglibyśm y wykonać wiele wstawień i usunięć, ale nadal potrańlibyśm y tak prowadzić wyszukiwanie, ja k b y od pewnego m om entu uaktu alnienia nie b yły wykonywane. W śród wcześniejszych odnośników do tego zagadnienia znajdują się następujące prace: J. K. Mullin, Comp. J. 24 (1981), 367-373; M. H. Overmars, Lecture N otes in Comp. Sci. 156 (1983), rozdział 9; E. W. Myers, A C M Sym p. Principles o f Prog. Lang. 11 (1984), 66-75; B. Chazełle, Inform ation and Control 63 (1985), 77-99; D. Dobkin i J. I. Munro, J. Algorithm s 6 (1985), 455-465; R. Cole, J. A lgorithm s 7 (1986), 202-220; D. Field, Inform ation Processing Letters 24 (1987), 9 5-96; C. W. Fraser i E. W. Myers, A C M Trans. Prog. Lang. and System s 9 (1987), 277-295; • J. R. Driscoll, N. Sarnak, D. D. Sleator i R. E. Tarjan, J. Comp. Syst. Sci. 38 (1989), 86-124; • R. B. Dannenberg, Software Practice Sc Experience 20 (1990), 109-132; • J. R. Driscoll, D. D. K. Sleator i R. E. Tarjan, JA C M 41 (1994), 943-959.
• • • • • • • •
Tablice instrukcji [programy] będą musieli sporządzać m atem atycy z doświadczeniem w obliczeniach i zapewne jakąś umiejętnością rozwiązywania łamigłówek. Prawdopodobnie będzie do wykonania mnóstwo pracy tego rodzaju, bowiem każdy znany proces trzeba na pewnym etapie przetłum aczyć na tablicę instrukcji. . . . Ten proces konstruowania tablic instrukcji powinien być niesłychanie fascynujący. Nie ma obawy; że kiedykolwiek stanie się on nużący; bowiem wszelkie procesy natury mechanicznej można przerzucić na samą maszynę.
— ALA N M. TU RING (1945)
ODPOWIEDZI DO ĆWICZEŃ „Odpowiedziałem na trzy pytania i wystarczy” , powiedział ojciec, „nie m ądrzyj się! Myślisz, że można tego słuchać cały dzień? Zm ykaj stąd, albo zrzucę cię ze schodów” . — LE W IS C A R R O L L , Alice's Adventures Under Ground (1 8 6 4 )
UWAGI DO ĆWICZEŃ 1. Średnio trudny problem dla Czytelnika zainteresowanego matematyką* 3. Zobacz W. J. LeVeque, Topics in N um ber Theory 2 (Reading, Mass.: Addison-Wes ley, 1956), rozdział 3; P. Ribenboim, 13 Lectures on Ferm at's Last Theorem (Nowy Jork: Springer-Verlag, 1979); A. Wiles, Armais o f M athem atics 141 (1995), 44 3 -5 5 1 .
5 1. Niech p( 1). . .p(n) i q( 1 ) . . . q(n) będą różnymi permutacjami spełniającymi wa runki zadania i niech i będzie najmniejsze takie, że p(i) ^ q(i). Wówczas p(i) — q{j), dla pewnego j > i, oraz q(i) = p(k), dla pewnego k > i. Ponieważ K p(¿) ^ K p^k) — K q(i) ^ Kq(j) = zatem mamy K p^ = K q^y, ze stabilności otrzymujemy więc p(i) < p(k) = q(i) < q(j) — p(i)j czyli sprzeczność. 2. Tak, jeśli wszystkie sortowania były stabilne. (Jeśli nie, to nie możemy tak twier dzić). Alicja i Cezary na pewno dostaną ten sam wynik; dotyczy to też Bolesława, ponieważ ze stabilności wynika, że takie same klucze są uporządkowane niemalejąco względem stowarzyszonych z nimi kluczy wtórnych. Żeby wykazać to formalnie, załóżmy, że Bolesław w wyniku posortowania kluczy wtórnych otrzymuje Rp(n) .. . R p(n) = R[ ■• ■R'mi a następnie po posortowaniu kluczy głównych R q{1). . . R q(N) = Rp(q W) ■■■R P(q(N))- Chcemy pokazać, że (Kp(q(i)) , kp(q(i)) ) i; (-i^p(9(i:+l)) ! ^p(
K P(vd)) = ^p(9«+i)). to K d ) = K d + i y st^d «(*) < «(* + : ) oraz Kd) ^ Kd+i d czyu kp(q(i)) ^ ^p(q(i+l))-
3. Zawsze możemy zgromadzić razem wszystkie rekordy o tych samych kluczach, zachowując ich względny porządek, a następnie potraktować w dalszych operacjach grupy takich rekordów jako pojedyncze rekordy. Tak więc możemy założyć, że wszystkie klucze są różne. Niech a < b < c < a; wówczas możemy nasze obiekty rozmieścić tak, że pierwszymi trzema kluczami są a£>c, bca lub cab. Teraz, jeśli N — 1 różnych kluczy można posortować na trzy sposoby, to N także. Wynika to stąd, że jeśli K \ < • ■• < K m - i > K m , to zawsze albo K i~ \ < K m < K i dla pewnego i, albo K m < K i . 629
630
ODPOWIEDZI DO ĆWICZEŃ
5
4. Najpierw porównujemy słowa, nie rozróżniając wielkich i małych liter, a następnie wykorzystujemy podział na wielkie i małe litery do rozróżnienia takich samych słów. Dokładniej, zamieniamy każde słowo a przez parę słów (o/, a ), gdzie a ' otrzymujemy z a, odwzorowując A —>a, . . . , Z —» z; otrzymane pary sortujemy następnie leksykograficznie. Dla przykładu, w wyniku działania tej procedury otrzymamy tex < Tex < TeX < TEX < text. W słownikach musimy też uwzględnić litery z akcentami, przedrostki, przyrostki i skróty; na przykład a < A < Ä < a - < a . < - a < A - < A . < a a < a.a. < äa < ää < AA < A.A. < AAA < • • • < zz < Zz. < ZZ < zzz < ZZZ. W tej ogólniejszej sytuacji ol otrzymuje się za pomocą odwzorowania ä —>a, Ä —>a itd., opuszczając łączniki i kropki. 5. Niech p(0) = 0, p ( ( la ) 2 ) = lp(|a:|)a; tutaj ( l a )2 oznacza binarną reprezentację pewnej dodatniej liczby całkowitej, a \a\ jest długością słowa a. Mamy p(l) = 10, p(2) - 1100, p(3) - 1101, p(4) = 1110000, . . . , p(1009) = 111101001111110001, . . . , p(65536) = 15024, . . . , p(265536) = 16065560 itd. Długością p(n) jest |p(n)| = A(n) + A(A(n)) + A(A(A(n))) H h lg* n + 1, gdzie A(0) = 0, A(n) = [lg n\ dla n ^ 1, a lg* n jest najmniejszą liczbą całkowitą m ^ 0 taką, że A ^(rc) = 0. [Ta konstrukcja pochodzi od W. J. Lewienszteina, Problemy K ibiernietiki 20 (1968), 173-179; zobacz też D. E. Knutha w The M athematical Gardner, pod redakcją D. A. Klarnera (Belmont, California: Wadsworth International, 1981), 310-325]. 6. Możliwe jest przepełnienie, co może spowodować, że zajdzie „fałszywa” równość. Powinien napisać „LDA A; CMPA B” i sprawdzić, jaki jest wynik porównania. (Nie możność porównywania całych słów za pomocą odejmowania jest problemem w za sadzie na wszystkich komputerach; to było głównym powodem włączenia instrukcji CMPA,. . . , CMPX do repertuaru instrukcji maszyny MIX). 7. COMPARE STJ 9F DEC1 1 1H LDX A, 1 J1P IB CMPX B,1 9H JMP * | JNE 9F 8. Rozwiązania 1, wykorzystujące tożsamość m in(a,6) — LDA A SRAX 1 SRAX 5 ADD ABI DIV - 2 ENTX 1 STA A1 SLAX 5 a = 2 a \ 4- a 2 STX A2 \ a 2 1^ 1 MUL AB2 LDA B STX AB3 SRAX 5 LDA A2 DIV -2= ADD B2 STA BI b = 2 b i -h b 2 SUB AB3 STX B2 SRAX 5 IM ^ i LDA Al DIV = 2 SUB BI przepełnienie ADD A1 nie jest możliwe ADD Bl STA AB1 a i - b i LDA A2 SUB ABI(1:5) SUB B2 STA c I STA AB2 a 2 — b 2
+ b — \a — b|):
(a2 - b2) sign(a - b)
przepełnienie nie jest możliwe
ODPOWIEDZI DO ĆWICZEŃ
5
631
Rozwiązania 2, wykorzystujące fakt, że za pomocą indeksowania można w sprytny sposób dokonywać zamian: S0L2 LDA STA STA LDA STA
A C TA B TB
Teraz poniższy kod kopiujemy k razy, gdzie 2k > 1010: LDA SRAX DIV STX LD1 STA
TA 5 2 TEMP TEMP TA -
LDA SRAX DIV STX LD2 STA
-
TB 5 =2= TEMP TEMP TB
INC1 0 ,2 INC1 0 ,2 INC1 0 ,2 LD3 TMIN,1 LDA 0 ,3 STA C
(W ten sposób przeglądamy binarne reprezentacje a i b z lewa na prawo, zachowując ich znaki). Program kończymy następująco: HLT CON CON CON CON TMIN CON CON CON CON CON
C B B A C B A A C
-1 0 +1 -1 0 1
-1 -1 -1 0 0 0 -1 1 0 1 1 1
|
Y lj (r+j-_1) (~ 1 )J (r-+j)a;r+^i z zasa Ki, zwiększ i o 1 i powtórz ten krok. b) Jeśli K < K i lub jeśli K = K i i odpowiednia informacja nie znalazła swojego odzwierciedlenia w zeznaniu podatkowym Ri, zasygnalizuj wystąpienie błędu. Staraj się przeprowadzić ten proces tak, żeby nie marnować pieniędzy podatników. 12. Jeden sposób polega na związaniu z każdym elementem macierzy a i j klucza (j, i), a następnie posortowaniu elementów macierzy w porządku leksykograficznym i pomi nięciu na końcu kluczy. (Podobny pomysł można zastosować do otrzymania każdego
632
ODPOWIEDZI DO ĆWICZEŃ
5
żądanego uporządkowania informacji, gdy tylko istnieje prosta reguła na takie upo rządkowanie) . W tym szczególnym przypadku można zastosować metodę sortowania przez „zrów noważone scalanie dwuwejściowe”, gdzie to klucze są przetwarzane w tak prosty sposób, że nie ma potrzeby zapisywania jawnie na taśmach jakichkolwiek kluczy. Dla danej macierzy n x n możemy postąpić jak następuje. Najpierw na taśmie 1 umieszczamy wiersze o numerach nieparzystych, następnie wiersze na taśmie 2 o numerach parzy stych, otrzymując w ten sposób konfigurację taśma 1: a n a i 2 . . . «in «31 «32 -. • « 3n «51 a 52 ■• • «5n • • • taśma 2: «21 «22 • ■■« 2n «41 <242 - *• «4rt «61 «62 • • • «6n • • • Następnie przewijamy obie taśmy i przetwarzamy je synchronicznie w celu uzyskania konfiguracji taśma 3: «11 a 2 i 0-12 «22 • ■• a \n « 2n «51 ctei ^52 «62 ■• ■«5n «6n taśma 4: «31 041 «32 « 4 2 • • • «3rt « 4 «71 «81 «72 «82 * ■ • «7n «8n ti
... ■
■•
Przewijamy teraz te taśmy, a następnie przetwarzamy je synchronicznie w celu uzyska nia konfiguracji ta śm a
1: «11
«21 «31 «41 «12
■ ■ ■
«42
■ ■ •
« 4n
«
9,1
* * •
t a ś m a 2 : «51 «61 «71 a g i «52 • • • «82 • • • « 8n «13,1 • * *
Postępujemy tak dalej, aż po [lgn] + 1 przebiegach dostaniemy macierz transponowaną.
13.
Jeden ze sposobów polega na przypisaniu elementom pliku losowych kluczy, po sortowaniu pliku i na koniec odrzuceniu kluczy. (Zobacz ćwiczenie 12; podobna metoda generowania losowej próbki była omawiana w punkcie 3.4.2). Inna metoda, wymagająca tyle samo pracy, ale nie tak wielkiej dokładności generatora liczb losowych, polega na związaniu z Ri liczby całkowitej z przedziału 0 ^ K i ^ N — i, a następnie wykonaniu sortowania za pomocą jednego z algorytmów z ćwiczenia 5.1.1-5.
14.
Mając daną tablicę konwersji znaków, można napisać podprogram porównywania leksykograficznego, który symuluje porządek używany na drugiej maszynie. Alterna tywnie można stworzyć sztuczne klucze różne od rzeczywistych znaków i określić na nich żądany porządek. Ta druga metoda ma tę zaletę, że wystarczy jej użyć tylko raz. Potrzebuje jednak większej pamięci i wymaga konwersji całych kluczy. W metodzie pierwszej można często określić wynik porównania, dokonując konwersji tylko jednej lub dwóch liter w każdym kluczu. Jednakże w końcowej fazie sortowania porównania są wykonywane między prawie takimi samymi kluczami i może się okazać, że w tej drugiej metodzie opłaca się sprawdzać równość liter przed ich konwersją.
15.
Wystarczy z każdym stanem związać licznik (około 50 liczników), a następnie tylko raz przejrzeć cały plik. Jeśli jednak zamiast stanów rozważymy miasta i jeśli łączna liczba miast jest bardzo duża, dobrym pomysłem może być sortowanie według nazw miast.
16.
Podobnie jak w ćwiczeniu 15, wszystko zależy od rozmiaru problemu. Jeśli łączna liczba wystąpień interesujących nas elementów mieści się w szybkiej pamięci wewnętrz nej, najlepszym sposobem jest prawdopodobnie użycie tablicy symboli (rozdział 6), w której z każdym identyfikatorem trzymamy listę jego wystąpień. W przypadku pro blemu o większym rozmiarze należy stworzyć plik rekordów, jeden rekord dla każdego wystąpienia interesującego nas elementu, i posortować go.
17.
Przypisujemy kartom „niewidoczne klucze”, które posortowane leksykograficznie w zwykły sposób zdefiniują żądany porządek. Takie klucze powinny być nadawane przez
ODPOWIEDZI DO ĆWICZEŃ
5
633
personel biblioteczny i dołączane do danych katalogowych, gdy tylko jakiś element po raz pierwszy trafia do systemu. Klucze te nie są widoczne dla zwykłych użytkowników. W możliwych postaciach takich kluczy używa się dwuznakowych kodów do rozdzielania słów: koniec klucza; ,0 koniec odsyłacza; ,1 koniec nazwiska; ,2 łącznik nazwiska wieloczłonowego; ,3 koniec nazwiska autora; ,4 koniec nazwy miejscowości; i5 koniec nazwy tematu; ,6 koniec tytułu książki; ,7 odstęp między słowami. ,8 Dla naszego przykładu dostalibyśmy co następuje (pokazano tylko pierwsze 25 znaków): ACCADEMIAU8NA2I0NALEU8DEI ACHTZEHNHUNDERTZWOLFu 8EIN BIBLIOTHEQUEU8DU8HISTOIRE BIBLI0THEQUEU8DESU8CURI0S BROWNu 2 J u 8CR0 SBYU4U0 BROWNu 2JOHNu 4 uO BR0WNU2J0HNU4MATHEMATICIA BR0WNu2J0HNu40Fu8B0ST0Nu 0 BR0WNU2J0HNU41715U0 BR0WNU2J0HNU41715U6U0 BR0WNU2J0HNU41761U0 BR0WNU2J0HNU41810U0 BR0WNU3WILLIAMSU2REGINALD BR0WNu 8AMERICAu 7u0 BR0WNU8ANDU8DALLIS0NSU8NE BROWNJ0HNu2ALANu4 u 0 DENU2VLADIMIRU8EDUARD0VIC DENU7U0 DENU8LIEBENU8LANGENU8TAG DIXu 2MORGANu 41827u O DIXu8HUITu 8CENTu 8D0UZEu 80 DIXU8NEUVIEMEU8SIECLEU8FR EIGHTEENu8F0RTYu 8SEVENu 8 I EIGHTEENU8TWELVEU80VERTUR Iu8AMu 8Au 8MATHEMATICIANu 7 I u 8Bu 8Mu8J0URNALu80Fu 8RES
I U8HAU8EHADU7 U0 IAu 8Au8L0VEu 8ST0RYu7u0 INTERNATI0NALU8BUSINESSU8 KHUWARIZMIy 2MUHAMMADU8IBN LAB0Ru 7Au 8MAGAZINEu 8F0R u 8 LAB0Ru 8RESEARCHu 8ASS0CIAT LABOURuluO MACCALLSu 8C00KB00Ku 7u 0 MACCARTHYu 2J0HNu 41927u 0 MACHINEu 8 1NDEPENDENTu 8C0M MACMAH0NU2PERCYU8ALEXANDE MISTRESSU8DALL0WAYU7U0 MISTRESSu80Fu 8MISTRESSESu R0YALU8S0CIETYU80FU8L0ND0 SAINTU8PETERSBURGERU8ZEIT SAINTU8SAENSU2CAMILLEU418 SAINTEu 8MARIEu 2GAST0Nu 8Pu SEMINUMERICALU8ALG0RITHMS UNCLEu 8T0MSu 8CABINu 7uO UNITEDU8STATESU8BUREAUU80 VANDERM0NDEU2ALEXANDERU8T VANVALKENBURGU2MACU8ELWYN V0NNEUMANNU2J0HNU4 1903U0 WH0LEU8ARTU80FU8LEGERDEMA WH0SU8AFRAIDU80FU8VIRGINI WIJNGAARDENU2ADRIAANU8VAN
Za takim pomocniczym kluczem powinny następować dane z karty tak, żeby różne karty, ale z tym samy kluczem pomocniczym, można było prawidłowo rozróżnić (np. Sir John = John). Zwróćmy uwagę, że w nazwisku „Saint-Saens” mamy łącznik, ale nie jest to nazwisko wieloczłonowe. Rok urodzenia al-Khuwarizml powinien zostać podany na przykład jako u40779, z zerem na początku. (Ten schemat będzie działał aż do 9999 roku, po którym świat stanie przed wielkim kryzysem związanym z oprogramowaniem). Uważne prześledzenie tego przykładu pozwoli radzić sobie z wieloma innymi nie zwykłymi porządkami, które pojawiają się przy wykorzystywaniu komputerów.
634
ODPOWIEDZI DO ĆWICZEŃ
5
1 8 . M o ż e m y d l a p r z y k ł a d u u t w o r z y ć d w a p l i k i z a w i e r a j ą c e w a r t o ś c i (w 6 - |-ti6 - h w 6 ) m o d m i (z 6 — x 6 — y6) m o d m d l a u ^ v ^ w, x ^ y ^ z, g d z i e m j e s t r o z m i a r e m s ł o w a w n a s z y m k o m p u te r z e . S o r tu je m y j e i s z u k a m y p o w tó r z e ń , a n a s tę p n ie p o w tó r z e n ia p o d d a j e m y d a l s z y m t e s t o m . ( D o n a r z u c e n i a d a l s z y c h o g r a n i c z e ń n a u , v, w , x , y , z m o ż n a w y k o r z y s t a ć p e w n e k o n g r u e n c je m o d u lo m a łe lic z b y p ie r w s z e ).
19. W o g ó l n o ś c i , ż e b y z n a l e ź ć w s z y s t k i e p a r y l i c z b ( x i , X j ) , t a k i e ż e Xi + xj = c d l a d a n e g o c, n a le ż y w y k o n a ć , c o n a s t ę p u j e . P o s o r t u j p lik t a k , ż e X \ < X 2 < •• < xnW y k o n a j i <— 1 , j <— TV, a n a s t ę p n i e p o w t a r z a j p o n i ż s z ą o p e r a c j ę a ż j ^ i . J e ś li J e ś li J e ś li
Xi Xi xi
+ + +
Xj
=
xj
< >
Xj
c, w y p is z { x i , X c , i <— i + 1. c, j j — 1.
j} 7
w ykonaj
¿+
1 , j < — j — 1.
W k o ń c u , j e ś li j = i o r a z 2 x t = c, w y p is z (x * , x * ). T e n p r o c e s j e s t p o d o b n y d o ty c h z ć w i c z e ń 1 8 i 1 9 : T w o r z y m y w i s t o c i e d w a p o s o r t o w a n e p l i k i , j e d e n z a w i e r a j ą c y x i , . . . , xn i d r u g i z a w i e r a j ą c y c—xn, • • *j c —x i , a n a s t ę p n i e s p r a w d z a m y , c z y s ą p o w t ó r z e n i a . J e d n a k w t y m p r z y p a d k u d r u g i z p lik ó w n ie m u s i b y ć e x p lic it e b u d o w a n y . J e ś li c je s t n i e p a r z y s t e , t o m o ż n a p o s t ą p i ć j e s z c z e i n a c z e j , s o r t u j ą c p o k l u c z a c h (x n i e p a r z y s t e =>■ x , x p a r z y s t e => c — x ) . P o d o b n y a lg o r y tm m o ż n a z a s to s o w a ć d o z n a jd o w a n ia m a x { x i + X j | Xi + l u b d o z n a j d o w a n i a , p o w i e d z m y , m i n { x t + y3 \ x %+ y3 > t } . m a j ą c d a n e p o s o r t o w a n e p lik i x i ^ ^ x m , yi ^ ^ yn .
Xj t
^ c} i dw a
20.
O t o k i l k a a l t e r n a t y w n y c h r o z w i ą z a ń : ( a ) D l a k a ż d e j z 4 9 9 5 0 0 p a r ż, j , p r z y 1 ^ ^ 1 0 0 0 , w y k o n a j y1 x t © X j , y2 +- y i A (yi - 1 ) , y3 <- V 2 A (y2 - 1 ); n a s t ę p n i e w y p is z w t e d y i t y l k o w t e d y , g d y y $ = 0 . T u t a j ® o z n a c z a „ r ó ż n ic ę s y m e t r y c z n ą ” , n a t o m i a s t A o z n a c z a „ b i t o w e i” , ( b ) U t w ó r z p l i k z ł o ż o n y z 3 1 0 0 0 e l e m e n t ó w , t w o r z ą c 3 1 e l e m e n t ó w d l a k a ż d e g o p o c z ą t k o w e g o s ł o w a xi p r z e z w ł ą c z a n i e d o p l i k u Xi i 3 0 s łó w , k tó r e r ó ż n ią s ię z X i n a je d n e j p o z y c ji. P o s o r tu j t e n p lik i p o s z u k a j p o w tó r z e ń , (c ) P r z e p r o w a d ź t e s t a n a lo g ic z n y d o (a ) d la i <
i) i i)
j
w s z y s t k ic h p a r s łó w , k tó r e z g a d z a j ą s ię n a p ie r w s z y c h 1 0 b ita c h ; w s z y s t k ic h p a r s łó w , k tó r e z g a d z a j ą s ię n a ś r o d k o w y c h 1 0 b it a c h , a le n ie z g a d z a j ą s ię n a p ie r w s z y c h 10;
i ii ) w s z y s t k i c h p a r s ł ó w , k t ó r e z g a d z a j ą s i ę n a o s t a t n i c h 1 0 b i t a c h , a l e a n i n a p i e r w sz y c h 10, a n i n a śro d k o w y ch 10. W y m a g a t o tr z e c h s o r to w a ń d a n y c h , z a k a ż d y m r a z e m p o k lu c z a c h 1 0 -b ito w y c h . O c z e k i w a n a l i c z b a p a r w k a ż d y m z t r z e c h p r z y p a d k ó w w y n o s i c o n a j w y ż e j 4 9 9 5 0 0 / 2 10 , c z y l i m n ie j n iż 5 0 0 , j e ś li t y lk o r o z k ła d s łó w w e jś c io w y c h j e s t lo so w y .
21. N a j p i e r w n a l e ż y p r z y g o t o w a ć p l i k z a w i e r a j ą c y w s z y s t k i e p i ę c i o l i t e r o w e s ł o w a w j ę z y k u a n g ie ls k im . ( N a le ż y s ię u p e w n ić , ż e d o k r ó ts z y c h s łó w s ą d o d a n e p r z y r o s tk i t a k i e j a k -ED, -ER, -ERS, -S). T e r a z l i t e r y k a ż d e g o p i ę c i o l i t e r o w e g o s ł o w a a s o r t u j e m y n i e m a ł e j ą c o , o t r z y m u j ą c w t e n s p o s ó b p i ę c i o l i t e r o w y c i ą g a '. N a k o n i e c s o r t u j e m y w s z y s tk ie p a r y ( a ', a ) , g r u p u ją c w s z y s tk ie a n a g r a m y ra zem . E k s p e r y m e n t y p r z e p r o w a d z o n e p r z e z K im a D . G ib s o n a w 1 9 6 7 r o k u p o k a z a ły , ż e d r u g i c o d o w ie lk o ś c i z b ió r p o w s z e c h n ie z n a n y c h p ię c io lite r o w y c h a n a g r a m ó w s k ła d a s i ę z e s ł ó w LEAST, SLATE, STALE, STEAL, TAELS, TALES, TEALS. J e ś l i j e d n a k G i b s o n m ó g łb y s k o r z y s t a ć z w ię k s z y c h s ło w n ik ó w , b y łb y w s t a n ie w y w in d o w a ć t e n z b ió r n a p i e r w s z e m i e j s c e , d o d a j ą c s ł o w a ALETS ( s t a l o w e n a r a m i e n n i k i ) , ASTEL ( d r z a z g a ) , ATLES
5
ODPOWIEDZI DO ĆWICZEŃ
635
(intencje), LAETS (osoby o statusie między niewolnikami a ludźmi wolnymi), LASET (gronostaj), LATES (okoń z Nilu), LEATS (strumienie, potoki, rzeki, kanały), SALET (średniowieczny hełm), SETAL (odnosi się do szczeciny), SLEAT (podburzać), STELA (kolumna) oraz TESLA (jednostka miary indukcji magnetycznej). Razem z dawną pisow nią SATEL, TASEL i TASLE słów „settle” i „teasel”, otrzymujemy 22 słowa-permutacje złożone z tych samych liter. Żadne z nich nie wymaga w swoim zapisie wielkiej litery. Gdybyśmy byli odrobinę bardziej odważni, wówczas moglibyśmy jeszcze dodać staroangielskie t&sl, niemieckie altes, jak i Madame de Stael! Także zbiór {LAPSE, LEAPS, PALES, PEALS, PLEAS, SALEP, SEPAL} można by rozszerzyć do co najmniej 14 słów, gdyby sięgnąć do pełnych słowników. [Zobacz H. E. Dudeney, 300 B est Word Puzzles, pod redakcją Martina Gardnera (New York: Chas. Scribner’s Sons, 1968), łamigłówki 190 i 194; Ross Eckler, M aking the A lphabet Dance (N.Y.: St. Martin’s Griffin, 1997), Fig. 46c]. Zbiorami (pierwszym i ostatnim) pięcioliterowych anagramów w języku angielskim są {ALBAS, BALAS, BALSA, BASAL} i {STRUT, STURT, TRUST}, jeśli nie uwzględniać prawi dłowych nazwisk. Jeśli jednak odrzucimy to ograniczenie, to Alban, Balan, Laban i Nabal tworzą wcześniejszy zbiór {ALBAN, BALAN, BANAL, LABAN, NABAL, NABLA}. Najbar dziej uderzającym przykładem dłuższych anagramów w potocznym języku angielskim jest pewnie zadziwiający zbiór słów matematycznych {ALERTING, ALTERING, INTEGRAL, RELATING,TRIANGLE}. Szybszy sposób znajdowania anagramów polega na policzeniu wartości funkcji f ( a ) = (h(ai) + h(a 2) + *• * + ń(a5)) m odm , gdzie 01 , . . . ,a 5 są kodami liczbowymi liter w a, a (/i(l), /i(2 ),. . . ) są 26 losowo wybranymi stałymi; tutaj m jest rozmiarem słowa maszyny. Sortując plik ( /( a ) , a ) zgromadzimy anagramy obok siebie; należy tylko upewnić się, że gdy f ( a ) = /(/?), wówczas rzeczywiście mamy prawdziwy anagram z a* = ¡3*. Wartości f ( a ) można liczyć dużo szybciej niż a', a w tej metodzie unikamy wyznaczania a f dla większości słów z pliku. Uwaga: Podobną metodę można zastosować do grupowania rekordów o takich samych kluczach złożonych z wielu słów ( a i , . . . , a n). Załóżmy, że nie interesuje nas porządek w pliku poza tym, żeby rekordy o tych samych kluczach były zgrupowane ra zem. Czasami jest szybciej sortować według jednosłowowych kluczy (a ix 71-1 + a 2 Xn~2 + • • ■+ an) m odm , gdzie x jest dowolną ustaloną wartością, niż według oryginalnych kluczy złożonych z wielu słów. 22. Należy znaleźć niezmienniki izomorfizmu danych grafów (funkcje, które przyjmują takie same wartości na grafach izomorficznych) i wykonać sortowania ze względu na te niezmienniki. W ten sposób odseparujemy od siebie grafy „ewidentnie nieizomorficzne”. Oto przykłady niezmienników izomorfizmu: (a) Reprezentujemy każdy wierzchołek Vi przez (a*, b*), gdzie a* jest jego stopniem wejściowym, a h jest jego stopniem wyjścio wym; następnie sortujemy pary (ot,bi) w porządku leksykograficznym. Plik wyniko wy jest niezmiennikiem izomorfizmu, (b) Reprezentujemy krawędź od Vi do vj przez (a*, bit aj, bj) i sortujemy takie czwórki w porządku leksykograficznym. (c) Dzielimy graf zorientowany na spójne składowe (zobacz algorytm 2.3.3E), określamy niezmienniki dla składowych, a następnie sortujemy składowe ze względu na ich niezmienniki. Zobacz także dyskusję w ćwiczeniu 21. Po posortowaniu grafów ze względu na niezmienniki nadal jest konieczne wykona nie dodatkowych testów, żeby sprawdzić, czy grafy o tych samych niezmiennikach są rzeczywiście izomorficzne. Niezmienniki są pomocne także w przeprowadzeniu takich testów. W przypadku drzew wolnych można znaleźć „charakterystyki” lub niezmienniki „kanoniczne”, które dokładnie charakteryzują drzewo, tak że dodatkowe testy nie są
636
ODPOWIEDZI DO ĆWICZEŃ
5
już potrzebne. [Zobacz J. Hopcroft i R. E. Tarjan, w C om plexity o f Com puter Compu tations (New York: Plenum, 1972), 140-142]. 23. Jeden ze sposobów polega na utworzeniu pliku zawierającego wszystkie trzyosobo we kliki, a następnie przekształceniu go w plik ze wszystkimi klikami czteroosobowymi itd. Jeśli kliki są niewielkich rozmiarów, to ta metoda sprawuje się całkiem dobrze. (Z drugiej strony, jeśli istnieje klika rozmiaru n, to istnieje także co najmniej (™) klik rozmiaru k, tak więc w tym przypadku liczba generowanych klik rosłaby niesłychanie szybko, nawet gdyby n było równe tylko 25). Mając plik, który zawiera wszystkie (k —l)-osobowe kliki w postaci ( a i , .. . ,Ofc_i), gdzie ai < *• • < Ofc_i, możemy znaleźć kliki fc-osobowe jak następuje: (i) dla każdej pa ry klik (fc —1)-osobowych o postaciach ( a i , . . . , au~ 2 , b), ( a i , . . . , ajt- 2 , c) z b < c tworzy my nowy plik o elementach (6, c, 0 1 , . . . , a*,-2 ); (ii) sortujemy ten plik według pierwszych dwóch składowych; (iii) dla każdego wektora (6, c, a i , . . . , a k - 2 ) z tego nowego pliku, takiego że (a, b) jest parą znajomych, wypisujemy fc-osobową klikę ( a i , . . . , a ^ - 2 , b, c). 24. (Rozwiązanie zaproponowane przez Normana Hardy’ego, około 1967 roku) Two rzymy dodatkową kopię pliku wejściowego. Sortujemy jedną kopię względem pierwszych składowych, a pozostałą względem drugich. Przeglądając kolejno oba pliki, jesteśmy w stanie utworzyć nowy plik zawierający wszystkie pary (xi,Xi+ 2 ) dla 1 ^ i ^ N — 2 i zidentyfikować (x n - i , x n )- Pary ( N —1, x n - i ) i (iV,xjv) należy zapisać do jeszcze jednego pliku. Dalej postępujemy indukcyjnie. Przyjmijmy, że plik F zawiera w dowolnym po rządku wszystkie pary (a;*, Xi+t) dla 1 ^ i ^ IV —i, natomiast plik G zawiera wszystkie pary (i,Xi) dla N — t < i ^ JV, uporządkowane według drugiej składowej. Niech H będzie kopią pliku F i posortujmy H według pierwszej składowej, natomiast F względem drugiej. Teraz przeglądamy F, G i H, tworząc dwa nowe pliki F 1 i G', jak następuje. Jeśli aktualnie oglądanymi rekordami z plików F, G, H są, odpowiednio, ( x , x f), (z, z'), to mamy: i) Jeśli x = z, zapisz (x ,z ;) do F ' i przejdź do następnych rekordów w plikach F i H. ii) Jeśli x f = y\ zapisz {y —t, x) do G f i przejdź dalej do następnych rekordów w plikach F i G. iii) Jeśli x > y \ przejdź do następnego rekordu w pliku G. iv) Jeśli x f > z, przejdź do następnego rekordu w H. Po wyczerpaniu pliku F posortuj G' względem drugich składowych i scal go z G; następnie zamień t przez 2i, F przez F \ G przez G;. Zatem t przyjmuje wartości 2,4, 8 , . . . , a dla ustalonego t wykonujemy 0(lo g N) przebiegów przez dane w celu ich posortowania. Stąd łączna liczba przebiegów wynosi 0 ((lo g iV )2). Na końcu t ^ JV, co oznacza, że F jest pusty. Wówczas po prostu sortujemy G według pierwszych składowych. 25. (Pomysł rozwiązania pochodzi od D. Shanksa) Przygotuj dwa pliki, jeden zawie rający amn modp, a drugi ba~n m odp, dla 0 ^ n < m . Posortuj oba pliki i znajdź wspólne elementy. Uwaga: W ten sposób pesymistyczny czas działania zostaje zredukowany z 0(p) do 0 ( y/p log p ). Często możliwe są dalsze znaczące usprawnienia. Możemy na przykład łatwo stwierdzić w logp krokach, czy n jest parzyste, czy nieparzyste, sprawdzając, czy m odp = 1, czy też (p — 1). W ogólności, jeśli / jest dowolnym dzielnikiem p — 1, a d jest dowolnym dzielnikiem gcd( /, n), możemy w podobny sposób wyznaczyć
ODPOWIEDZI DO ĆWICZEŃ
5.1.1
637
(n/d) mod / , poszukując wartości b^p~1^ ^ w tablicy o długości f /d. Jeśli w rozkładzie p — 1 na czynniki pierwsze mamy q\ ^ ^ ^ qt i jeśli qt jest małe, to możemy wówczas szybko obliczyć liczbę n, znajdując jej kolejne cyfry od strony prawej do lewej, w mieszanej reprezentacji pozycyjnej o podstawach qi, . . . , qt . (Ten pomysł pochodzi od R. L. Silvera, 1964; zobacz także S. C. Pohłig i M. Hellman, IEEE Transactions IT -24 (1978), 106-110). John M. Pollard odkrył elegancki sposób obliczania logarytmów dyskretnych z wy korzystaniem teorii odwzorowań losowych. W zaproponowanej metodzie jestwykony wanych O (y/p) operacji mod p, a wymagania pamięciowe są niezwykle małe. Zobacz Math. Comp. 32 (1978), 918-924, gdzie Pollard proponuje inną metodę, w ykorzystu jącą liczby n j = modp, które mają małe czynniki pierwsze. Metody szybsze asymptotycznie są omawiane w ćwiczeniu 4.5.4-46.
5.1.1 1. 2 0 5 2 2 3 0 0 0 ; 2 7 3 5 4 1 8 6 . 2 . bi — (m — 1 ) mod n;
= (bj + m — 1 ) mod (n —j) .
3. d j = an+i_j („odbicie” permutacji). Ten pomysł wykorzystał O. Terąuem [Journ. de Math. 3 (1838), 559 - 560] w dowodzie, że średnia liczba inwersji w losowej permutacji wynosi ¿ ( 2 ). 4. C l. xo <— 0. (W kolejnych krokach można założyć, że x j współdzieli pamięć z bj dla 1 ^ j ^ n). C 2. Dla k — n, n —1 , . . . , 1 (w tym porządku) wykonuj, co następuje: j powtórz dokładnie bk razy j Xj\ na koniec Xk <— Xj i Xj <— k .
0;
C 3. j <- 0. C 4. Dla k = 1 ,2 ,... ,n (w tym porządku) wykonuj, co następuje: następnie j Xj. |
<— Xj\
Zobacz ćwiczenie 5.2-12, żeby przekonać się, w jaki sposób oszczędzić pamięć. 5. Niech a będzie słowem [m i,ni] . . . [mk^nk] zbudowanym z uporządkowanych par nieujemnych liczb całkowitych; piszemy \a\ = /c, długość a. Niech e oznacza słowo puste (o długości 0). Rozważmy operację binarną o zdefiniowaną rekurencyjnie na parach słów jak następuje:
e o a —a o e = a; i [m ,n ](a o ([m '-m ,n ']/3 )),
jeśli m ^ m',
| [m ,n ] (([m —m —l,n]a) o /?),
jeśli m > m .
( m, n a) o (\m , n \p) — <
.
. ,
Wynika stąd, że czas potrzebny do obliczenia a o ¡3 jest proporcjonalny do \a o ¡3\ = |a| + \f3\. Co więcej, można udowodnić, że operacja o jest łączna i że [&i, 1] o [62 , 2 ] o • • *o[6n,n] = [0,o i][0 , 02 ] • • • [0,an]. Wyrażenie po lewej stronie można obliczyć w |"lgn] przebiegach, w każdym przebiegu grupując pary słów, co daje łącznie 0 (n log n) kroków. Przykład: Rozpoczynamy od (2 ) i chcemy policzyć [2,1] o [3,2] o [6,3] o [4,4] o [0, 5] o [2,6 ] o [2 , 7 ] o [1 , 8 ] o [0, 9]. Po pierwszym przebiegu mamy [2,1] [1,2] o [4,4] [1,3] o [0,5] [2,6]o[l,8] [0, 7]o[0,9]. Po drugim przebiegu [2, l][l,2][l,4][l,3]o[0,5][l,8][0,6] [0,7]o [0,9]. Trzeci przebieg daje [0, 5][1,1][0,8 ][0,2][0, 6 ][0,4][0, 7][0?3] o [0,9]. Po czwartym przebiegu otrzymujemy ( 1). Uzasadnienie: Słowo takie jak [4,4] [1,3] reprezentuje „uuul^uSu00” , gdzie „u” ozna cza lukę; operacja a o ¡3 rozmieszcza luki i nieluki z j3 w lukach a.
638
ODPOWIEDZI DO ĆWICZEŃ
5.1.1
6 . Rozpocznij od bi = 62 = • • • = bn = 0. Dla k = [_lg7tJ, [lgnj —1, . . . , 0 wykonuj, co następuje: x s +— 0 dla 0 ^ s ^ n / 2 /c+1; następnie dla j — 1 , 2 , . . . , n wykonuj: r [aj / 2 k j mod 2 , s <— |_aj / 2 fc+1J (to jest w istocie wyłuskiwanie bitów); jeśli r = 0 ,
to baj baj 4 - x s , a jeśli r = 1, to x s <—x s + 1. Inne rozwiązanie pojawia się w ćwiczeniu 5.2.4-21. 7. < j i Cj ^ n —J, ponieważ na lewo od aj jest j — 1 elementów, a na prawo n —j elementów. Żeby odtworzyć a\ . . . an z B i B 2 .. . B n , rozpocznij odelementu 1; następnie dla k = 2 , . . . , n dodaj jeden do każdegoelementu ^ k — Bk i dołóż k — Bk z prawej strony. (Zobacz opis metody 2 z punktu 1.2.5). Podobny schemat postępowania działa dla wektora C. Alternatywnie moglibyśmy skorzystać z rozwiązania następnego zadania. [Wektor inwersji c był rozważany przez Rodrigueza, J. de M ath. 4 (1839), 236-240; wektor inwersji C pojawił się w książce Netto, Lehrbuch der Combinatorik (1901), §5]. 8. bf = C, c' = B , B f — c, C* = b, ponieważ każda inwersja (di, aj) w a \ ... an odpowiada inwersji (J, i) w a[ . . . a'n . Oto kilka dalszych zależności: (a) Cj — j —1 wtedy i tylko wtedy, gdy (bi > bj dla wszystkich i < j)\ (b) bj = n — j wtedy i tylko wtedy, gdy (ci > Cj dla wszystkich i > j); (c) bj = 0 wtedy i tylko wtedy, gdy (ci — i < Cj - j dla wszystkich i > j)\ (d) Cj = 0 wtedy i tylko wtedy, gdy (bi+i < b j + j dla wszystkich i < j)\ (e) bi ^ bi+ 1 wtedy i tylko wtedy, gdy a- < a'+1, wtedy i tylko wtedy, gdy Ci ^ Ci+i; (f) Oj = j + Cj - Bj] a'j = j + bj ~ Cj. 9. b = C = bf jest równoważne temu, że a = a'
10. vT0. (Jednym ze sposobów umieszczenia ściętego ośmiościanu w układzie współrzędnych jest związanie wektorów (1 ,0 ,0 ), (0,1,0), ^(1,1, a/2 ), |( 1 , —1, y/ 2 ), ± ( - 1 , 1 , V 2 ) , ¿ ( - 1 , - 1 , v ^ ) z zamianami sąsiednich elementów w parach, odpowiednio 21, 43, 41, 31, 42, 32. Suma tych wektorów (1,1, 2y/2 ) jest równa wektorowi o początku w wierzchołku 1234 i końcu w wierzchołku 4321). W bardziej symetrycznym rozwiązaniu wierzchołek n reprezentujemy w czterech wymiarach przez ^ { e u — e v | ( u , v ) j e s t in w e r s ją w 7r},
gdzie ei = (1 ,0 ,0 ,0 ), e 2 = (0 ,1 ,0 ,0 ), e 3 = (0 ,0 ,1 ,0 ), e 4 = (0 ,0 ,0 ,1 ). Zatem, 1 2 3 4 (0 ,0 ,0 ,0 ); 1 2 4 3 (0 ,0 ,- 1 ,1 ); . . . ; 4 3 2 1 ^ (—3 , —1,1,3). Wszystkie punkty leżą w trójwymiarowej podprzestrzeni {(w ,x , y, z) | w + x + y + z = 0}; odległość między sąsiednimi wierzchołkami wynosi y/2. Równoważnie (patrz odpowiedź 8(f)) możemy reprezentować 7r = ai przez wektor (a[ , af2, a^, afA) ) gdzie a[ a'2 a'3 jest permutacją odwrotną. (Taka czterowymiarowa reprezentacja ściętego ośmiościanu z permutacjami jako współrzędne, jak i uogólnienie na n wymiarów, były rozważane przez C. Howarda Hintona w The Fourth Dimension (London, 1904), rozdział 10. Dalsze własności zostały odkryte wiele lat później przez Guilbauda i Rosenstiehla, którzy bryłę z rysunku 1 nazwali „permutościanem”; zobacz ćwiczenie 12). Kopie ściętych ośmiościanów wypełniają całą przestrzeń trójwymiarową w tzw. najprostszy sposób [zobacz H. Steinhaus, Kalejdoskop m atem atyczny (Warszawa: WSiP, 1989), 200-203; C. S. Smith, Scientińc Am erican 1 9 0 , 1 (January 1954), 58-64]. Ścięty ośmiościan był wymieniany w V Księdze zbioru Pappusa (około roku 300 n.e.) jako jedna z brył badanych przez Archimedesa. Bryła archimedesowa to bryła różna od graniastosłupa, w której wierzchołki są parami symetryczne i której ściany są wielokątami foremnymi, ale nie wszystkie ściany są identyczne. Ilustracje brył archimedesowych można znaleźć na przykład w książkach: W. W. Rouse Bali, M athem atical Recreations
5.1.1
ODPOWIEDZI DO ĆWICZEŃ
639
and Essays, w wydaniu poprawionym przez H. S. M. Coxetera (Macmillan, 1939), rozdział 5; H. Martyn Cundy i A. P. Rollett, M athem atical Models (Oxford, 1952), 94-109. 11. (a) Oczywiste, (b) Zbuduj graf skierowany o wierzchołkach { l , 2 , . . . , n } i kra wędziach x —» y, jeśli x > y i (x, y) £ E lub x < y i (y 1 x) £ E . Jeśli w takim grafie nie ma zorientowanych cykli, to można go posortować topologicznie i w wyniku otrzymać porządek liniowy, który wyznacza poszukiwaną permutację. Jeśli pojawia się cykl zorientowany, to najkrótszy taki cykl ma długość 3, ponieważ nie może być cykli 0 długościach 1 i 2 , a każdy cykl a\ a• • • —+ 01 można skrócić (albo o>i *03 , albo 03 —>01 ). Ale cykl zorientowany długości 3 zawiera dwie krawędzie albo z E , albo z P , co dowodzi, że E lub E nie jest przechodni. 12. [G. T. Guilbaud i P. Rosenstiehl, M ath. et Sciences Humaines 4 (1963), 9 -3 3 ]. Przypuśćmy, że (a, b) £ E , (5, c) £ P , (a, c) ^ E . Wówczas dla pewnego k ^ 1 mamy a — Xq > x \ > • • • > Xk — c, gdzie (rc*, £¿+1) £ P (tti) U E f a ) dla 0 ^ i < k. Rozważmy kontrprzykład tego typu przy minimalnym k. Ponieważ (a, b) £ E( t t i ) i ( 6 , c) £ P (tti), otrzymujemy (a, c) ^ P(tti) i podobnie (a, c) 0 £ ( ^ 2 ); stąd k > 1 . Ale jeśli x \ > 5, to ( x i,5) £ E przeczy minimalności /c, podczas gdy z ( x i , 6) £ E wynika, że (a, b) £ E. Podobnie, jeśli x\ < 5, widzimy, że nie jest możliwe, żeby (5, X \ ) £ i? lub ( 6 ,x 1) £ P . 13. Dla każdego ustalonego wyboru wartości 61 , . . . , bm- i , &m+i, • • •, bn w wektorze inwersji, w sumach bi każda reszta z dzielenia przez m pojawi się dokładnie raz dla bm przyjmującego wartości 0 , 1 , . . . , m — 1 . 14. W konstrukcji opisanej we wskazówce do zadania w pary są łączone różne podziały na składniki różne parami, z wyjątkiem dwóch przypadków j = k = pk i j — k = P k — 1. W tych przypadkach n wynosi odpowiednio (2j — 1) + • ■■+ j — (3j 2 — j ) / 2 1 (2j) 4 - ■■• + (j + 1 ) = (3j 2 + j )/2 i istnieje dokładnie jeden niesparowany podział na j składników. [Oryginalny dowód Eulera z Novi Comment. Acad. Sci. Pet. 5 (1754), 7 5 -8 3 , był także bardzo interesujący. Za pomocą prostych przekształceń pokazał on, że iloczyn nieskończony (patrz uwaga) jest równy Si, gdzie, dla n ^ 1 , s n definiuje się jako szereg potęgowy 1 —z 2n~ l — z 3 n~ 1 s n+1. Skończone wersje nieskończonej sumy Eulera były rozważane przez Knutha i Patersona w Fibonacci Quarterly 16 (1978), 198-212]. 15. Żeby przejść od podziału p do podziału P dokonaj transpozycji diagramu kropek. Łatwo jest otrzymać funkcję tworzącą dla podziałów P , ponieważ najpierw bierzemy do wolną liczbę jedynek (funkcja tworząca 1 / ( 1 —z)), potem niezależnie bierzemy dowolną liczbę dwójek (funkcja tworząca 1 /(1 —z 2)), . . . , na koniec dowolną liczbę wartości n. 16. Współczynnik przy z 7lqm w pierwszej tożsamości jest liczbą podziałów m na n składników. W drugiej tożsamości jest to liczba podziałów m na n różnych, nieujemnych składników, tzn. sum postaci m = p i -f P2 H gdzie p i > p 2 > • • • > p n ^ 0. To jest to samo co m — (”) = q\ +<72 J gdzie q\ ^ q^ ^ ^ qn ^ 0 , przy założeniu qt — pt —n + i . [Commentarii Academiae Scientiarum Petropolitanae 13 (1741), 6 4-93]. Uwagi: Tożsamość drugą dostajemy, przechodząc do granicy z n —►00 w twierdze niu g-mianowym (ćwiczenie 1.2.6-58). Podobnie tożsamość pierwszą można otrzymać, przechodząc do granicy z r ^ o o w twierdzeniu dualnym do wspomnianego twierdzenia, udowodnionym w odpowiedzi do ćwiczenia 1.2.6-58. Niech n \q = n * U i(l + Q + ' **+ Qk~ l ) i niech expq(z) = J2^=o z n/ n \ q. Pierwsza tożsamość mówi, że expg(z) jest równe l/r if e lo ( l — Qkz ( l — q)), gdy \q\ < 1 ; druga zaś, że to jest równe n ^ o ( ^ + q~kz( 1 —<7-1 )), gdy |g| > 1. Otrzymana tożsamość dla
640
ODPOWIEDZI DO ĆWICZEŃ
5.1.1
formalnych szeregów potęgowych expg(z) exp^-i (—z) = 1 jest równoważna tożsamości
X
n - /j)
n - «'='1 m -
n _
= 5n0
dla
^
która wynika z twierdzenia g-mianowego dla x = —1. 17.
0000 1101 1010 1011 1001 2012
0100 1201 0110 0111 0101 0212
0010 1021 0120 0121 0011 0122
0001 1012 0102 0112 0012 0123
18. Niech q = 1 — p. Sumę ]T)Pr(ai), po wszystkich inwersjach a, można policzyć, sumując po fc, gdzie 0 ^ k < n jest liczbą wszystkich skrajnie lewych pozycji tych bitów, na których zgadzają się i oraz j . jak również X t oraz X j , w inwersji X t (1) i > X j 0 j dla i < j. W ten sposób otrzymujemy wzór J2o^k
q2)n ) / {2 _ p 2 _ q2) + {p2 + q 2r _ l)
19. Poszukiwaną liczbą inwersji jest ^20
f [ { i - uV - 1) = ( - i r u C D t / G ) f [ ( i - u - kv l~k) , k~ 1 fc=l zatem z twierdzenia g-mianowego z ćwiczenia 1.2.6-58, dla q = uv, mamy, że
(1 — uk~ 1vk) J J (1 — ufctĆ- 1 )(l — uk~ 1vk) = (—l)ntt( 2 ^(2) k=l k=—n+1
= ( - i r u (nł % © V ( 2n)
(« »)(*)(-«-V “ ")*
3
= X i
2 n -)
Pomnóżmy obie strony przez nfc=i (^ — u v ' ) — — 9 ) 1 zauważmy, że dla ustalonego j mamy (n2^ ) ITI^=i (1 ~.Qk) = 1 + 0 (g n+1_|j|). Tożsamość Jacobiego otrzymujemy, przechodząc do granicy z n ^ o o .
21 . Zinterpretuj Cj jako liczbę elementów na stosie po wypisaniu j -tego elementu permutacji. (W ćwiczeniu 2.3.3-19 znajdziesz charakterystykę wektorów b i B dla permutacji stosowych).
22. (a) Rozmieść liczby z {1,2, . . . , n } na brzegu tarczy zegara i ustaw wskazówkę na 1. Następnie, dla j = n, n —1, . . . , 1 (w tym porządku), przesuń wskazówkę o hj + 1 pozycji w kierunku przeciwnym do ruchu wskazówek zegara, usuń wskazywaną liczbę z tarczy zegara i nazwij ją aj.
ODPOWIEDZI DO ĆWICZEŃ
5.1.1
641
(b) Każde i liczymy tyle razy, ile razy ciąg at a^+i. . . an zacykla się; to jest tyle razy, ile razy aj > a^+i, dla j ^ i. Dlatego każde j takie, że aj > aj+i, odpowiada indeksom 1, . . . , j liczonym tylko raz. [Guo-Niu Han, Advances in M ath. 105 (1994), 28-29; równoważny wynik w kontekście następnego ćwiczenia otrzymał Rawlings], 23. Przyjmijmy dla przykładu, ze n — 5 i a\ a 3 a 4 a$ = 3 1 4 2 5 . Liczba niewypałów przed każdym trafieniem musi być wówczas równa 2 + 5fci, 2 + 4 &2 , 1 + 3fc3, 1 + 2fc2, dla pewnych nieujemnych liczb całkowitych kj. Zauważmy, że dla permutacji dualnej 14 2 5 3 wektor h ma postać 0 1 1 2 2 (oznaczenia z poprzedniego ćwiczenia). W ogólności, prawdopodobieństwo otrzymania a \a ^ .. . an będzie równe
£
(
1
~
l “ 9l 1 - ^ 2
Snnhnnhn-i
nhi
1 ~ qk
gdzie pj = 1 —Qj jest prawdopodobieństwem trafienia po j —1 trafieniach, a h i h2 . . . h n odpowiada permutacji dualnej do ai a2 . . . an . W szczególności, gdy p x = • • • = p n — p = 1 —q, prawdopodobieństwo to wynosi qhl +'''+hn/G n(q)- Najmniej prawdopodobną kolejnością jest zatem n . . . 21. [J. Treadway i D. Rawlings, M ath. M ag. 67 (1994), 345-354. W Int. J. M ath. & M ath. Sci, 15 (1992), 2 9 1-312, Rawling uogólnił te rozważania na permutacje zbiorów z powtórzeniami]. 24. Niech ao = 0. Mówimy, że uogólniony spadek pojawia się w j < n, jeśli dj > i(cij+ 1). Wstawienie n między a3- \ i aj powoduje pojawienie się nowego uogólnionego spadku wtedy i tylko wtedy, gdy a j - 1 ^ K aj) < 71■ Przypuśćmy, że zdarza się to dla j o wartościach j \ > j 2 > * • > jk > 0 ; niech pozostałymi wartościami j będą j n > j n- 1 > *•• > jk+ 1. Wówczas j n — n i można pokazać, że uogólniony indeks rośnie o n — h, gdy n zostaje wstawione tuż przed ajk . [Specjalny przypadek, w którym Ki) — j d- d- dla pewnego d ^ 0 , był rozważany przez D. Rawlingsa, J. Combinatorial Theory A 31 (1981), 175-183. W Linear and M ultilinear Algebra 10 (1981), 2 53-260, Rawlings uogólnił ten przypadek na permutacje multizbiorów]. W tym ćwiczeniu definiuje się n! różnych statystyk dla permutacji, z których każda ma funkcję tworzącą pojawiającą sie w ( 7 ) i ( 8 ). Takich statystyk można zdefiniować dużo więcej, uogólniając zadanie o rosyjskiej ruletce w następujący sposób: Po j — 1 samobójstwach osobą, która rozpoczyna następną rundę strzałów, jest f j ( ai , . . . , a j - \ ), gdzie fj jest dowolną funkcją o wartościach w { 1 , . . . , n} \ { a i , . . . , aj_ 1}. [Zobacz Guo-Niu Han, Calcul Denertien (Thesis, Univ. Strasbourg, 1992), Part 1.3, §7]. 25. (a) Jeśli a x < an, to h(a) ma dokładnie tyle samo inwersji co a, ponieważ elementy z aj są w inwersjach z elementami Xj zamiast z an . Jeśli jednak a x > an, to h(a) ma 0 n — 1 mniej inwersji, ponieważ każdy x 3 nie jest dłużej w inwersjach z an i z elemen tami z aj. Zatem, jeśli weźmiemy x n = an i rekurencyjnie x\ ,. . x n_i = /(/i(o;)), to permutacja f ( a ) = x i . . . x n będzie miała żądane własności. Mamy / ( 1 9 8 2 6 3 7 4 5 ) = 9 1 2 6 3 8 7 4 5 oraz / [_1](1 9 8 2 6 3 7 4 5) = 1 9 2 6 8 7 3 4 5. (b) Kluczową obserwacją jest, że inv(a) = in v(a” ) i ind(aT) = in d ( /( a ) - ), gdy a~ jest odwrotnością a. Zatem, jeśli a x = a - , a 2 = f ( a 1), a 3 = a 2 1 a 4 — / ^ 1^(a3) 1 a 5 = a 4 , mamy in v (a 5) = in v (a 4) = in d (a 3) = ind(a2 ) = i n d ( a f ) = ind(a); in d (a 5) = ind(0:4 ) = in d (a 3 ) = ind(0:2) — im^au) = in v(a).
[Math. Nachrichten 83 (1978), 143-159].
642
ODPOWIEDZI DO ĆWICZEŃ
5.1.1
26. (Rozwiązanie: Doron Zeilberger) Oczekiwana wartość inv(a) ind(a) wynosi
^li/* E
a.
E
E
[aj > Ofc] l [ai > ai+\ ] .
1ś ^ j< k ś ^ n lś X l< n
Powyższe jest wielomianem od n o stopniu ^ 4. Obliczając tę sumę dla 1 ^ n ^ 5, otrzymujemy odpowiednio wartości 0, - , §, Tak więc rozważany wielomian musi mieć postać |n ( n — 1) 4 - ~ n 2(n — 1 ) . Odejmując mean(pn )2 i dzieląc przez var(pn), otrzymamy poszukiwane rozwiązanie 9 /(2 n + 5) dla n ^ 2 (korzystamy z ( 12 ) i ( 13 )). 27. Mamy inv(ai . . . an ) = inv(gn 91 ), gdy
(1
z ) . . . (1
_
inv(a1...an ) ^ind(oi ...an )
Zn J
^
ai ...an
PI
_
^
w inv(qn ...q2 qi) z qi+q2-ł
_
^ p H ---hPn
_^0 hin
\ zki+2k2+ -
71
K0+ «l + fe2H——n , , ^
=n!„, u' ex TT 1n1( * V 11
fco,fci,fc
2 ,...
Iyj
U * /vo
.3= 0
00
00
00
= n!w [«"] U expw(zj u) = nl w [uB] U j =0 j =0 fe=0
1
_
•
(1 _
>.
v
y
zgodnie z oznaczeniami z odpowiedzi 16 i wynikiem ćwiczenia 5.1.2-16. W ten sposób dostaliśmy bardzo elegancką tożsamość I I 1 —w jik>0- j -z ku-
H n (w, z) u 71 ( 1( l — n5 >o - w ) ( l - w 2) . . . { l - w n) ( l - z ) ( l - z 2) . . . ( l - z n )'
którą dla funkcji tworzącej H n ( w, z) = ujlnd^a )^md(a) podał D. P. Roselle w Proc. Am er. M ath. Soc. 45 (1974), 144-150. Z ćwiczenia 25 wynika, że tę samą funkcję tworzącą dwóch zmiennych wykorzystuje się do liczenia indeksów i inwersji. Dowód podany tutaj pochodzi od Garsii i Gessela [Advances in M ath. 31 (1979), 288-305], którzy uzyskali jednak dużo ogólniejsze wyniki. Przyjmując w ćwiczeniu 4.7-27 m — 0 0 , dostajemy równanie rekurencyjne
Hn(w,z) = E ( f c ) zn k ( H i 1 “ zn~}) ^ Hn-k(w,z). k — X
W
j —1
28. Zamieniając dwa sąsiednie elementy, zmieniamy sumaryczne przemieszczenie o 0 lub ± 2 ; zatem td(ai . . . an ) ^ 2 inv(ai a 2 . . . an ). Można także pokazać, że td(ai <22 . . . an ) ^ inv(ai a 2 . . . an). Załóżmy, że j jest najmniejszym elementem, który nie jest na swoim miejscu i niech au = j. Niech / będzie największym elementem takim, że / < k i ai ^ k. Zamiana ai z zmniejsza liczbę inwersji o 2(k — l) — 1, a sumaryczne przemieszczenie o 2(k —l). Zatem, jeśli do posortowania danej permutacji a \ a ^ • • • an musimy powtórzyć ten algorytm m razy, to td(«i «2 • • * cin) = inv(ai a 2 . . . an ) + m. Uwaga: Wartość oczekiwana sumarycznego przemieszczenia w losowej permutacji wynosi (n 2 — l)/3 ; zobacz ćwiczenie 5.2.1-7. Wydaje się, że funkcja tworząca dla sumarycznego przemieszczenia nie ma prostej postaci.
5.1.2
ODPOWIEDZI DO ĆWICZEŃ
643
29. Permutację tt można otrzymać jako złożenie inv( 7r) transpozycji T j, gdzie Tj zamie nia j i j + 1. Na przykład ścieżka 1234 —> 1324 —►1342 —> 3142 z rysunku 1 odpowiada T2 , następnie 73 , potem T\\ zatem 3 1 4 2 = T1 T3 T2 . Dlatego 7r7r/ otrzymuje się z 7Ć, wykonując inv( 7r) transpozycji, z których każda zmienia liczbę inwersji o ± 1 . Wynika stąd, że inv( 7T7T/) ^ inv( 7r)+ inv( 7r/). Jeśli zachodzi równość, każda transpozycja dodaje nową inwersję. Tak więc £ ( tttt') D E ^ t ) . Odwrotnie, dla E ( 7rir') D E ( n ł) pokazujemy, że pewien ciąg \E(tx'k,)\ — \E(tt/)\ = inv(7T7r') — inv(7r/) transpozycji przekształca 7r' w 7r7r/ . Ponieważ takie transpozycje definiują 7r, więc w ten sposób dowodzimy, że inv(7r) ^ inv(7T7r/)~inv(7r/); zatem równość musi zachodzić. Załóżmy na przykład, że 7r' = 3 1 4 5 9 2 6 8 7 i ż e £(7nr') D E(ir'). Jeśli £(7T7r') nie zawiera (4,1) lub (5,4), lub (9,5), lub (6,2), lub ( 8 , 6 ), to irir/ musi być równe 7r'. W przeciwnym przypadku E( n n ' ) zawiera jedną z tych inwersji, powiedzmy (9,5); wówczas E ( 7nr/) zawiera £ ( t 47t') = £ ’(3 1 4 9 5 2 6 8 7). W ten sposób możemy przeprowadzić dowód indukcyjny po |£(7r7r;)| — |£(7r')].
5.1.2 1 . Fałsz z istotnych powodów technicznych. Jeśli odpowiedzią jest „prawda”, Czytel nik prawdopodobnie nie zna definicji M\ U M 2 podanej w punkcie 4.6.3, która ma tę
własność, że M\ U M 2 jest zbiorem, jeśli tylko M\ i M 2 są zbiorami. W rzeczywistości a j ¡3 jest permutacją multizbioru Mi WM 2 . 2. b c a d d a d a d b . 3. Oczywiście nie, na przykład dla a = ¡3. (Twierdzenie o jednoznaczności rozkładu mówi jednak, że takich przypadków nie ma zbyt wiele). 4. (d) j (b c d) j (b b c a d) j (b a b c d) j (d).
5. Liczba wystąpień par . . . xx .. . jest równa liczbie kolumn postaci % minus 0 lub 1. Jeśli x jest najmniejszym elementem, to obie liczby są równe wtedy i tylko wtedy, gdy x nie jest pierwszym elementem permutacji. 6. Łatwo znaleźć liczbę odpowiednich dwuwierszowych reprezentacji: (X)(fc)7. Korzystając z części (a) twierdzenia B i postępując jak przy wyprowadzaniu ( 20 ), otrzymujemy
A -l \ ( B \ fC \ (B + k \ f C - k A — k —m — 1 ) \ m / \ ^ / V ^ —^ / V ^ A-l
\ f B\
(C\
f B + k —l \
fC-k
A-l \ (B\ (C\ (B +k - l \ A — k — rri) j \ ^ / \ B —l
(C-k l
8 . Całkowity rozkład na permutacje pierwsze ma postać (d) j (b c d) j (b) j (a d b c) j
(a b) t (b c d) j (d). Ten rozkład jest jednoznaczny, ponieważ żadna para sąsiednich permutacji nie jest przemienna. Tak więc mamy 8 rozwiązań z a = e, (d), (d) j ( b c d), 10. Ogólnie fałsz, ale prawda w ciekawych przypadkach. Dla danego liniowego uporząd kowania permutacji pierwszych istnieje co najmniej jeden rozkład o opisanej postaci kiedykolwiek warunek nie jest zachowany, możemy dokonać zamiany, która zmniejsza liczbę „inwersji” w rozkładzie. Tak więc warunek nie jest spełniony, ponieważ pewne permutacje mają więcej niż jeden taki rozkład.
644
ODPOWIEDZI DO ĆWICZEŃ
5.1.2
Niech p ~ a oznacza, że p jest przemienne z a. Następujący warunek jest konieczny i wystarczający dla jednoznaczności rozkładu w opisanej postaci: i
p -< a < r
implikuje
p ~ r.
Dowód.
Jeśli p ~ c r ~ T i p - < < 7 ^ T oraz p ^ r, to mielibyśmy dwa rozkłady podany warunek jest konieczny. W drugą stronę, żeby wykazać że jest on wystarczający dla jednoznaczności załóżmy, że pi j ■*• j pn = cru • —j crn są dwoma różnymi rozkładami spełniającymi ten warunek. Możemy przyjąć, że cr\ < pi, a stąd <7\ = pk dla pewnego k > 1; co więcej, a\ ~ pj dla 1 ^ j < k. Ponieważ p k - i ~ (Ti ~ pfe, mamy p k - i -< ¿D; stąd k > 2. Niech j będzie takie, że
= '?"TPTcr5 zatem
(a b) -< (d e) y (b c) -< (e a) >- (c d) -< (a b) y (d e); jest to sprzeczność. (Zobacz także następne zadanie). 1 1 . Chcemy pokazać, że jeśli p ( l ) . . . p(t) jest permutacją zbioru { 1 , . . . , t}, permutacja x p(i) . . . x p(t) jest uporządkowana topologicznie wtedy i tylko wtedy, gdy crp(i) T ■• ■T &p{t) — t " *t chcemy wykazać również, że jeśli x p(\) . . . xp(t) i ^g(i) • • • x q(t) różnymi topologicznymi uporządkowaniami, to ctpq) ^ &q(j) dla pewnego j. Pierwsza własność wynika z obserwacji, że xp(i) może być pierwszym w topologicznym porządku wtedy i tylko wtedy, gdy crp(i) jest przemienna z (i jest różna) crpy ) - i , . . . ,cr 1; z tego warunku wynika także, że crp(2) T ***T ^ (t) — a i T ***T0p (i)-i T 0p(i)+i T ***T a za_ tem możemy stosować indukcję. Druga własność jest prawdziwa, ponieważ jeśli j jest minimalne, takie że p(j ) ^ q ( j ), to z definicji porządku topologicznego otrzymujemy, powiedzmy, p(j) < q(j) i x p(j) -fi x q^y, stąd
12. Nie można sformować żadnych innych cykli, ponieważ, na przykład, wyjściowa permutacja nie zawiera kolumn ac . Jeśli (a b c d) pojawia się s razy, to (a b) musi wystąpić A —r —s razy, ponieważ jest A — r kolumn J , a tylko cykle dwóch rodzajów mogą zawierać takie kolumny. 13. W reprezentacji dwuwierszowej należy najpierw umieścić A — t kolumn postaci f , następnie umieścić pozostałe t liter a w drugim wierszu, potem należy umieścić litery 6 , a na koniec pozostałe litery. 14. Ponieważ w dwuwierszowej reprezentacji ir~ elementy pod dowolnym (ustalonym) elementem występują w porządku niemalejącym, nie zawsze ( n ~ )“ = 7r; prawdą jednak jest, że (( 7r~) “ )~ = 7r~. Faktycznie, tożsamość ( a j p y = ((a - j r r y zachodzi dla wszystkich a i ¡3. (Zobacz zadanie 5-2).
5.1.2
ODPOWIEDZI DO ĆWICZEŃ
645
Dla danego multizbioru, w którym różne elementy spełniają Xi < < xm, możemy scharakteryzować permutacje samoodwracalne (odwracalne same na siebie) zauważając, że każda z nich ma jednoznaczny rozkład na permutacje pierwsze postaci ß i j " *Tß m f gdzie ßj ma zero lub więcej pierwszych składowych w rozkładzie (xj) j- ■■j ( x j ) j ( x j X k l )j- *-[{xjXkt )y j < ki ^ ^ k t . Na przykład (a)T(a b)j(a b)j(b c)j(c) jest permutacją samoodwracalną. Liczba permutacji samoodwracalnych zbioru {m a, n-b} wynosi zatem m in(m ,n) + l; odpowiednią liczbą dla (La, m-b, n*c) jest liczba rozwiązań w nieujemnych liczbach całkowitych x, y, z nierówności x-\-y ^ l, x + z ^ m, y-\-z ^ n. Liczba samoodwracalnych permutacji zwykłego zbioru jest badana w punkcie 5.1.4. Liczba permutacji zbioru (ni ■x i , . . . ,n m ■Xm), dla których w dwuwierszowych reprezentacjach razy pojawia się wynosi fi* n*■/ Eli j n ij •; samo co liczba permutacji z n^ wystąpieniami X Ą . Zatem powinien istnieć lepszy sposób zdefiniowania odwrotności permutacji multizbioru. Na przykład, jeśli rozkładem 7r na permutacje pierwsze jest jak w twierdzeniu C ¿Ti j ¿72 j * • * j er* , to możemy zdefiniować — c rt_ j ■■■T&2 T^r, gdzie (xi . . . x n)~ = (xn . . . x i ) . Dominique Foata i Guo-Niu Han zauważyli, że jeszcze bardziej pożądane byłoby zdefiniowanie odwrotności w taki sposób, żeby 7r i 7r~ miały tyle samo inwersji, ponieważ funkcją tworzącą dla inwersji przy danych liczbach n^ jest Y \ i n ^ z / Y\i j zobacz zadanie 16. Jednakże, nie istnieje żaden naturalny sposób zdefiniowania inwolucji o ta kiej własności. 15. Zobacz twierdzenie 2.3.4.2D. W wyniku usunięcia jednej krawędzi z grafu skiero wanego dostajemy drzewo skierowane. 16. Jeśli xi < X2 < • • •, to składowe wektora inwersji odpowiadające wystąpieniom Xj muszą być postaci bji ^ ^ bjn j, gdzie bjnj (liczba inwersji dla skrajnie prawego xj) wynosi co najwyżej n^+i + n j + 2 H ■Tak więc funkcja tworząca dla j-tego fragmentu wektora inwersji jest funkcją tworzącą dla podziałów na co najwyżej nj składników, z których żaden nie przekracza rij+i + rij + 2 + ■■■. Funkcja tworząca dla podziałów na co najwyżej m składników, z których żaden nie przekracza n, jest z-mianowym współ czynnikiem (mr^n) J2; to można łatwo wykazać przez indukcję, jak i można udowodnić za pomocą pomysłowej konstrukcji pochodzącej od F. Franklina [Amer. J. M ath. 5 (1882), 268-269; zobacz także Pólya i Alexanderson, Elem ente der M athem atik 26 (1971), 102-109]. Mnożąc funkcje tworzące dla j = 1 , 2 , . . . , otrzymujemy żądany wynik dla inwersji w permutacjach multizbiorów, który został opublikowany przez MacMahona w Proc. London M ath. Soc. (2) 15 (1916), 314-321.
17. Niech hn (z) = (n\z)/n\\ wówczas funkcją tworzącą prawdopodobieństwa jest g(z) = h n ( z ) / h n i (z)h.n2(z) Z 5 . 1 .1- ( i 2 ) otrzymujemy, że wartością oczekiwaną hn (z) jest ^ ( 3)1 oczekiwaną g jest
więc wartością
*
646
ODPOWIEDZI DO ĆWICZEŃ
5.1.2
rowanie między m-krotkami (r/i, . . . .
S (9 i) H
h pn ),
gdzie T:(qj) jest sumą elementów z qj. [O dalszym uogólnieniu techniki użytej w dowo dzie i w wyprowadzeniu zależności 5.1.3-(8) można przeczytać w pracy D. E. Knutha, M ath. C om p. 24 (1970), 955-961. Zobacz także wyczerpujące omówienie tematu przez Richarda P. Stanleya w Memoirs Am er. M ath. Soc. 119 (1972)]. 19. (a) Niech S = {a \ a jest pierwszą, a jest lewą składową 7r}. Jeśli 5 ma k elemen tów, to lewe składowe A permutacji n takie, że p(X) ^ 0, są dokładnie 2k złożeniami z wtrąceniami podzbiorów S (zobacz dowód twierdzenia C); stąd + p(cr)) = 0, ponieważ p(a) = —1 i 5 jest niepusty. (b) Oczywiście e(żi . . . i n) = mM = 0, jeśli ij = ik dla pewnego j ^ k. W przeciwnym przypadku e(i\ .. , i n ) = (—l ) r, gdzie ii . . . in ma r inwersji. To równa się ( —l ) s , gdzie s jest liczbą parzystych cykli w i \ . . . i n i równa się ( —l ) n+t, gdzie t jest liczbą cykli w ii . . . in . 20. (a) Natychmiast z definicji składania z wtrąceniami, (b) Z definicji det (bij ) =
^ 1
^(¿i . . . im) frli\ • • *
•
,... ,im
Biorąc bij = óij — dijXj i stosując zadanie 19(b), otrzymujemy ^ 2
^ 2
X i l . . . X i n n { X i x . . . X i n ) v { X i 1 . . . X irl),
n ^ O l^ii ,...,in Ś^m
ponieważ p ( x ) jest zwykle równe zeru. (c) Wykorzystaj zadanie 19(a) do pokazania, że D j G = 1, gdy patrzymy na ilo czyn a>ów jako permutację nieprzemiennych zmiennych. Wykorzystaj także naturalną własność algebraiczną, że (a + ¡3) jtt = a j n {3jn. Zwięzły opis tego kombinatorycznego dowodu i podobne dowody innych ważnych twierdzeń zostały podane przez D. Zeilbergera, Discrete M ath. 56 (1985), 6 1 -7 2 . 21. Jeśli przyjmiemy n* —Odlafc^O, t o n ę l i (nfe+ 'Vi^nfe_d) , ponieważ na (nm+'n^nm~d) sposobów można umieścić różne m w takiej permutacji zbioru {ni - 1, . . . , n m-1 ■
22. (a) Odwrócenie permutacji l(n) z lewa na prawo należy do Po(0kl ni ... t nt), dla pewnego k. Zamiast odwracać /(7r), w jej dwuwierszowej reprezentacji umieścimy 0 na końcu górnego wiersza, a nie na początku. Liczba k zer w 1(tt) i r(n) jest liczbą kolumn l w dwuwierszowej reprezentacji 7r, dla których j ^ t < k\ to jest także liczba kolumn z k ^ t < j . Można łatwo zrekonstruować 7r z dwuwierszowych reprezentacji ¿(7r) i r(7r), ponieważ każda kolumna k z j,fe ^ < występuje w /(7r), każda kolumna z t < j , k występuje w r(7r), a pozostałe kolumny dostajemy, scalając z lewa na prawo j lub k z permutacji 1(tt) z ° lub £ z permutacji r(n). (b) Niech 7r będzie permutacją w podanej postaci i niech <7 będzie dowolną permu tacją z Po(0n° l ni . . . m nm). Konstruujemy A jak następuje: Usuń pierwsze no wartości z
5.1.3
ODPOWIEDZI DO ĆWICZEŃ
liih h iud k
fi N a r>r-7vPłflH ipili tt - 00000011111222233333 : u. iNa przyKiaa, jesn 7r — 23131302310102032010 1 a
_ ~
647
00000011111222233333
f
32313201103201300201» t o
A = x 2 y 2 y 3 X3 y i y i X i y 2 y 3 X3 Xi y 2 X3 y 1 i p = y 3 y 2 y 3 X 1 X3 X2 y i y \ y z y 2 y\ X 3 X2 xi . Odwrotnie, z A i p możemy odtworzyć 7r i o. (c) W konstrukcji z (a) mamy w(n) — w(l(rc)) w(r(7r)), ponieważ kolumna j w 7r zostaje albo kolumną k o wadze Wj/wk w Z(7r) lub r(7r), albo rozkłada się na kolumny £ i k o wagach Zj/zo i zo/zk. Jeśli /(7r) ma pj kolumn ° i qj kolumn ¿, jej wagą jest
n + ( ^ + nj_,v + i+ ~ P;') = r i j = i K / 2i)pj'_9i' ' Teraz (zespoloną) sprzężoną z r i j = i ( ^ / zi)^ ; z P0(0*Tni ... t nt) upraszcza się do k\ (ni + • • • + n t — k)\
jest liczw
w^ c suma wag po wszystkich elementach
\pt
z
-c o e r
pi + --+ P t-fc
■(?;
Podobne spostrzeżenia dotyczą r(7r). Podana suma jest dodatnia, ponieważ składnik dla k = 0 jest niezerowy. 23. Możemy założyć, że oryginalny łańcuch został posortowany. Niech t — 2, m = 4, Wi = W3 = z\ = 22 = +1, W2 = W4 = Z3 = Z4 = —1 w części (c) poprzedniego zadania. Wówczas u;(7r) = ( —l ) d, gdzie d jest liczbą kolumn k przy j / k. [Zobacz Gillis i Zeilberger, European J. Comb. 4 (1983), 221-223. Ten wynik został po raz pierwszy otrzymany w zupełnie inny sposób przez Askeya, Ismaila i Koornwindera, J. Comb. Theory A 2 5 (1978), 2 77-287, którzy znaleźli zadziwiające powiąza nia między permutacjami multizbiorów i całkami iloczynów wielomianów Laguerre’a L n(x) = E L » ( £ * ) ( —x ) k/k\]. Analogiczny wynik dla alfabetu pięcioliterowego nie jest prawdziwy, ponieważ wśród 5! permutacji zbioru {1 ,2 ,3 ,4 , 5} jest 1 + 10 + 45 permutacji z parzystą liczbą różnic i 0 + 20 + 44 z nieparzystą liczbą różnic. 24. (a) Transponując y l dwukrotnie, otrzymujemy ponownie y l . „Odsortowując” daną tablicę so rtu j ;;; y™) = (*}, ;;; xy?f ), przez znalezienie skrajnie lewego x w gór nym wierszu i przetransponowaniu go w lewo, otrzymujemy właściwy y. (Wartość sort(*? ;;; xy? ) także wyznacza się jednoznacznie). (b)
To co robimy w istocie, to przedstawiamy dwuwierszową reprezentację
7r w
staci 7r = sort ( \X u
' ' ' Xlni ...
l/l
‘ *X 2n2 2)21...
?/2
’ ’ ’ 2/* ■■• x t n t \ ...
Xt\ . ..
yt
)
'
Część (a) dostarcza nam właśnie tych narzędzi, których potrzebujemy. [Gdy R za chowuje pewne statystyki dotyczące dwuwierszowej reprezentacji, wówczas opisana konstrukcja jest podstawą kombinatorycznych dowodów kilku interesujących twierdzeń. Zobacz Guo-Niu Han, Advances in M ath. 105 (1994), 26-41].
5.1.3 1. Musimy tylko pokazać, że dla tej wartości ( 11 ) jest prawdziwe dla x — k ) gdy k ^ 1. Stosując ( 7 ), otrzymujemy
po
648
5.1.3
ODPOWIEDZI DO ĆWICZEŃ
Dla s < k sumowanie po j może być rozszerzone do zakresu 0 ^ j ^ n + l , a wartością sumy jest zero ((n + l)-sza różnica wielomianu n-tego stopnia od j) . 2. (a) Z zadania 1.2.6-64 mamy, że liczba ciągów a \a 2 - - - an zawierających każdy z elementów ( 1 , 2 , . . . , q) co najmniej raz wynosi {^}^!; liczba ciągów o własnościach analogicznych do (io), dla m — q, jest równa ponieważ musimy wybrać n — q z możliwych znaków = . (b) Dodaj wyniki z (a) dla m — n ~ ~ q \ n — q — 1. 3. Z (20 )
V — V / n \ i _ D fe = n
n\
k/
k
2 _ I ( (~^x )_____ ( - 2#) \ e~2x + 1 x \ ^e~Ax — 1 e~2x — 1 '/
n^O tak więc wynikiem jest ( —l ) n+ 1JBn+ i2 n+1 (2 n+1 —l)/(ra + 1). Alternatywnie, tożsamość 2/(e~~2x + 1 ) = 1 + tan hx pozwala wyrazić odpowiedź jako ( —l)^™ 1^ 2^ , jeśli n jest nieparzyste, gdzie Tn oznacza liczbę tangensową definiowaną wzorem tan z — T \ z + T^zz/Z\ 4 - Z5Z5/ 5! + *• ■. Gdy n > 0 jest parzyste, to z (7 ) wynika, że suma się zeruje. Przy okazji z ( 18 ) otrzymujemy niezwykłą tożsamość dla liczb Stirlinga
£{;} 4.
k\ (—2)k
2J5n+1(l —2 n+1) n + 1
( ~ l ) n+m{^)- (Rozważ współczynnik przy z m+1 w ( 18 )).
(£) = (k + l ) p —k p = (k + 1 ) — k = 1 (modulo p) dla 0^ k < p (zewzoru( 13 ), zadania 1.2.6-10 i twierdzenia 1.2.4F). 5.
6 . Sumowanie najpierw po k jest niedozwolone, ponieważ dla dowolnie dużych j i k
mamy niezerowe składniki, a suma ich wartości bezwzględnych jest nieskończona. Rozważmy prostszy przykład takiego złego rozumowania. Niech ajk = (k — j) [\j — k | = l]. Wówczas
]C ( j^O V
) =
= + 1’
0
^ 2 aik ) = J 2 (-Sko) = - i . /
p °dczas gdy
0 Vj^O
E. Barton, Combinatorial Chance(1962),150-154; zobacz
7. Tak. [F. N. David i D. także odpowiedź do zadania 25].
8 . [Combinatory Analysis 1 (1915), 190] Zasada włączania i wyłączania. Na przykład 1 / (/1 +¿ 2 )! ¿3 ! (h + h +¿ 6 )! jest prawdopodobieństwem, że x \ < • • • < x i1+i2, x i1+i2+ 1 <
< Xl 1_|_/2+i3 i 3'/i+Î2+î3+ 1 ^
^ *^il+Ï2+Î3 +^4+^5+^6 *
N. G. de Bruijn podał prosty algorytm, który w czasie 0 ( n 2) oblicza liczbę permutacji zbioru { 1 , . . . , n} mających sekwensy o długościach odpowiednio (/ 1, . . . , Zfc). (Nieuw A rchief voor W iskunde (3) 18 (1970), 6 1 -6 5 ), 9- Pkm = qkm - 9fc(m+i) w ( 23 ). Ponieważ J2k,m zatem \
k
x
/
w-.
h(z,x) = y Z h k(z)x = ----- g(x,z)( 1 - z 1 —x
qkmZm x k
x
-lv
)+
l
Więc hi (z) — e z ~ ( e z — l)/z ; h 2 (z) — (e2z— z e z ) +
z —x
ez
-1
= j ^ g { x , z) i g(x, 0) = 1, (1 — Z_1)x
Z ~ 1X
= y^iyr:--------h e {x — x l —x
—( e 2z - 1)/z.
.
ODPOWIEDZI DO ĆWICZEŃ
5.1.3
649
10. Niech M n = L \ + • • ■+ L n będzie wartością oczekiwaną; wówczas ^ M nx n = hf( l , x) , gdzie pochodna jest liczona względem z i wynosi x / { e x~ 1 ~ x) — x / ( l — x) (oznaczmy tę funkcję przez M( x) ) . Z twierdzenia o residuach zachodzi - (f M ( z ) z n 1 dz = M n — 2(n + - ) + ! +
2m J
J
— 1
+ —
Z\ — 1
jeśli całkujemy po okręgu o promieniu r, gdzie \zi \ < r < \z2 \. (Zwróć uwagę na biegun drugiego rzędu przy 2 = 1). Dodatkowo, wartość bezwzględna tej całki jest mniejsza od § \ M( z ) \ r ~n~ 1 dz = 0 ( r ~ n). Całkując po coraz większych okręgach, otrzymujemy zbieżny szereg M n = 2n - | + J 2 k^i i 1 ~ *fc))* W celu znalezienia wariancji obliczamy h " (l ,x ) = —2/t/(1,x) — 2x(x — l) e x_1/ (ex_1 —x ) 2. Argument podobny do użytego dla wartości oczekiwanej (tym razem mamy biegun trzeciego rzędu) pokazuje, że współczynniki w /i"(l, x) są równe asymptotycznie 4n2 + | n — 2M n plus składniki mniejszych rzędów. W ten sposób dostajemy asympto tyczny wzór na wariancję §rc + § (plus wykładniczo małe składniki). 11. Pkn = ... ,£fc-i,ra, i), gdzie D ( h , l2, - • -, h ) jest wyznacz nikiem MacMahona z zadania 8. Obliczając ten wyznacznik po pierwszym wierszu otrzymujemy Pkn = coP(k-i)n + ciP(k~ 2 )n H k cfc_ 2Pin - Pfc(n), gdzie Cj i E k są zdefiniowane następująco:
Ci = —
= ( - X)Jr,m E ^0 ( Ć J ( m^ ) (^Tl)! = _ 1 + e (^! _ i! + E\ ( n ) = l / ( n + 1)! - l / n ! ;
& ( . ) = (—1)‘ E U - 3 m^O Niech Pon = 0, C7(js) = A
i7>
£ 2 (71) = l / ( n + 1)!;
(n + 2 + m |!v 7
* * 3'
— (e1” * — 1)/(1 — z) i niech
{ ^ n k
2 , (c1 31 — l ) x 2
x 2(e1 x —ez)
E k+1 (n)z x = l - e + ------------- 2---------- _ n,A :
£(*,*) = £
h (_1)J j!
_ ^_
+
ez — 1 — 2
.
Otrzymana zależność rekurencyjna jest równoważna równaniu C ( x ) H ( z , x) = P (z , x ) / x + P (z , x); stąd # ( 2 , x) = P ( 2 , x)x(l —x )/( x e 1_x —1). Rozwijając ten szereg potęgowy, otrzymujemy H\ ( z ) = hi (z) (zobacz zadanie 9); # 2 ( 2 ) = ehi(z) + 1 — ez . [ Uwaga: Funkcje tworzące dla pierwszych trzech sekwensów zostały wyprowadzone przez Knutha, C A C M 6 (1963), 685-688. Barton i Mallows, Ann. M ath. Statistics 36 (1965), 249, podali wzór 1 — H n+i(z) — ( l — H n (z))/ ( 1 — z) — L nh\{z) dla n ^ 1, razem z (25). Inny sposób rozwiązania tego zadania został przedstawiony w zadaniu 23. Ponieważ sąsiednie sekwensy nie są niezależne, nie ma prostego związku między zadaniem rozwiązanym tutaj a prostszym (i prawdopodobnie bardziej użytecznym) wynikiem z zadania 9]. 12. [Combinatory Analysis 1 (1915), 209-211] Liczba sposobów rozrzucenia elemen tów multizbioru do t rozróżnialnych pudełek wynosi
N _ / i + ni —1 \ / i + ri2 - 1 \ ni
) \
ri2
/ t + nm - E /
\
Um
650
ODPOWIEDZI DO ĆWICZEŃ
5.1.3
ponieważ mamy (t+"1_ *) możliwości umieszczenia jedynek itd. Jeśli chcemy, żeby żadne pudełko nie pozostało puste, to z zasady włączania i wyłączania mamy, że liczba sposobów zapełniania pudełek wynosi Mt = N t —
Nt- i +
N tt —2
Niech Pk będzie liczbą permutacji o k sekwensach; jeśli umieścimy k — 1 pionowych kresek między sekwensami oraz t — k dodatkowych kresek w dowolnych z pozostałych n —k miejscach, dostaniemy jeden z M t sposobów podziału multizbioru na t niepustych, rozróżnialnych części. Zatem M t = P t + ( n _ J + 1 ) p t_ i + ( n - * + 2 ) p t_ 2 + . . . .
Przyrównanie obu wzorów na M t pozwala wyznaczyć kolejne wartości Pi, P 2, ... w zależności od JVi, N 2 , (Bardziej bezpośredni dowód byłby mile widziany).
13. 1 + § 1 3 x 3 = 20.5. 14. Z odpowiedniości Foata wynika, że dana permutacja odpowiada (3 1 ) T ( 1 ) T ••• t ( 4 ) =
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 3 1 1 2 3 4 3 2 1 1 3 4 2 2 4 4
z (33 ) to odpowiada 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 2 4 4 3 3 3 1 1 4 4 2 1 2 1 2 3 co odpowiada permutacji 2 3 4 2 3 4 1 4 2 1 4 3 2 1 3 1 zawierającej 9 sekwensów. 15. Liczba naprzemiennych sekwensów jest równa 1 plus liczba takich j, że 1 < j < n i albo c tj-i < aj > a3+ 1, albo a3_ 1 > a3 < a3 , 1. Dla ustalonego j prawdopodobieństwo wynosi stąd wartość oczekiwana dla n ^ 2 wynosi 1 + |( n — 2 ). 16. Każda permutacja zbioru { 1 , 2 , . . . , n —1} o k naprzemiennych sekwensach daje k permutacji o k takich sekwensach, 2 permutacje o k -b 1 sekwensach oraz n — k - ■2 permutacje o k + 2 sekwensach, gdy nowy element n wstawiamy na każdą z możliwych pozycji. Zatem n . n —l n n —1 n —1 + (n - k) k - 2 k =* t +2 » - 1 Jest wygodnie przyjąć | i | = J*;o> Gi ( z ) = 1 . Wówczas
Gn{z) — —((1 —z 2 )Gn-i (z) + (2 + (n —2 )z)Gn-i(z)). Tb
Różniczkując, otrzymujemy równanie rekurencyjne
l x n — —((n —2 )x n- i + 2n —2) n dla x n = G n (l), którego rozwiązaniem jest x n = | n — | dla n ^ 2. Różniczkując jeszcze raz, otrzymujemy równanie J/n =
- ( ( n - 4 ) j / „ _ i
Tb
+
| n 2 -
^ n
+
6)
dla j/„ = G'ń{ 1). Biorąc yn — a n 2 + /3n + 7 i rozwiązując dla a , 0, 7 , otrzymujemy J/n = I n 2 - §1 n + i i dla n ^ 4. Stąd var(grn) = ¿(16re - 29), n ^ 4.
5.1.3
ODPOWIEDZI DO ĆWICZEŃ
651
Powyższe wzory na wartość oczekiwaną i wariancję pochodzą od J. Bienaymégo, który podał je bez dowodu w [Bull. Soc. M ath. de France 2 (1874), 153-154; C om p tes Rendus Acad. Sci. Paris 81 (1875), 4 1 7 -4 2 3 , zobacz również uwagi Bertranda na str. 458]. Równanie rekurencyjne dla liczb {{£)) podał D. André [Comptes R en dus Acad. Sci. Paris 97 (1883), 1356-1358; Annales Scientifiques de l ’École Normale Supérieure (3) 1 (Paris: 1884), 121-134]. André zauważył, że gn{—1) — 0 dla n J? 4; tak więc liczba permutacji o parzystej liczbie naprzemiennych sekwensów wynosi n \ / 2. André wykazał także poprawność wzoru na wartość oczekiwaną oraz podał liczbę permutacji, które mają największą liczbę naprzemiennych sekwensów (zobacz zadanie 5.1.4-23). Można pokazać, że
Gn^
= ( 4 ^ ) " 1{1 + w r + l s n ( î T ^ ) ’
w= V îÎ f ’
n > 2’
gdzie gn{z) jest funkcją tworzącą ( 18 ) dla sekwensów rosnących. [Zobacz David i Barton, Combinatorial Chance (London: Griffin, 1962), 157-162]. 17-
(2*1- 2) kończy się zerem,
kończy się jedynką.
18. (a) Niech dany ciąg będzie wektorem inwersji tak jak w punkcie 5.1.1. Jeśli zawiera on k spadków, odwrotność odpowiadającej mu permutacji zawiera k spadków (zobacz odpowiedź 5.1.1-8(e)); zatem odpowiedzią jest (£). (b) Poszukiwana wielkość spełnia /(n , k) = h /( n —1, k) 4 - (n—h + l ) / ( n —l, fc—1), tak więc musi być równa [Zobacz D. Dumont, Duke M ath. J. 41 (1974), 313-315].
19. (a) (£), z odpowiedniości z twierdzenia 5.1.2B. (b) Pozostałe n — k nieatakujące się wieże można ustawić na całej szachownicy na (n —k) \ sposobów; stąd szukaną odpo wiedzią jest 1 /( n — k)\ razy o^nj (¿) >gdzie ani — (")> co wynika z (a). Z zadania 2 jest to równe { „ ” *.}■ [Rozdział 5 książki Riordana Introduction to Combinatorial Analysis (Wiley, 1958) zawiera ogólną analizę rozmieszczania wież]. Bezpośredni dowód powyższego faktu pochodzi od E. A. Bendera, Wiąże się w nim każdy podział zbioru { 1 , 2 , . . . , n} na k niepustych, rozłącznych podzbiorów z rozmiesz czeniem n — k wież: Niech podziałem będzie
{1,2,. . . ,71)■ — {ttl 1, 0-12 >*• •
U ' *' U
, . . . , Q>knk } j
gdzie aij < Ui(j+i) dla 1 ^ j < ni, 1 ^ i ^ k. W odpowiadającym mu rozmieszczeniu wieże są umieszczane w kolumnie dij w wierszu dla 1 ^ j ^ m , 1 ^ i k. Na przykład, konfiguracja z rysunku 4 odpowiada podziałowi { 1 ,3 , 8 } U {2} U { 4 , 6 } U { 5 } U {7}. 2 0 . Liczba odczytów jest równa liczbie sekwensów w permutacji odwrotnej. Pierwszy sekwens odpowiada pierwszemu odczytowi itd. 21. Ta permutacja zawiera n + 1 — k sekwensów i wymaga n + 1 —j odczytów.
2 2 . [J. Combinatorial Theory 1 (1966), 350-374] Jeśli rs < n, to do pewnego odczytu wybierzemy t > r elementów, = j + 1, . . . , = j + t, gdzie i\ < • • • < i t . Nie możemy mieć am > a m +1 dla wszystkich m z przedziału ik ^ m < ik+ 1, zatem permutacja zawiera co najmniej t — 1 miejsc z am < am+ 1; stąd taka permutacja ma co najwyżej n — t + 1 sekwensów. Z drugiej strony rozważmy permutację a r . . . «2 a i, w której blok ct3 zawiera liczby
= j (modulo r) w porządku malejącym; dla przykładu, gdy n = 9 i r = 4, taką permutacją jest 8 4 7 3 6 2 9 5 1 . Jeśli n ^ 2r — 1, to ta permutacja ma r — 1 wzrostów, a zatem ma n + 1 — r sekwensów. Prócz tego, wymaga ona dokładnie n + 1 — fn /r]
652
ODPOWIEDZI DO ĆWICZEŃ
5.1.3
odczytów, jeśli r > 1. Elementy z {k r + 1 , . . . , kr + r} można rozmieścić dowolnie bez zmiany liczby sekwensów; w ten sposób możemy zmniejszyć liczbę odczytów do dowolnie żądanej wartości ^ \ n / r \ . Załóżmy teraz, że rs ^ n, r + s ^ n + 1 oraz r, s ^ 1. Na podstawie ćwiczeń 20 i 21 możemy założyć, że r ^ s, ponieważ odbicie odwrotności permutacji o n + 1 —r sekwensach i s odczytach ma n + 1 —s sekwensów oraz r odczytów. Wówczas konstrukcję z poprzedniego akapitu możemy zastosować do wszystkich przypadków z wyjątkiem tych, w których s > n + 1 — \ n / r \ i r ^ 2. Żeby zakończyć dowód, możemy wziąć permutację postaci 2/c + l 2k —1 . . . 1 n + 2 —r n + 1 —r . . . 2fc + 2 2k . . . 2 n + 3 —r ... n —1 n, która ma n + 1 —r sekwensów i n + 1 —r —k odczytów dla 0
k ^ 1 (n —r).
23. [SIAM R eview 3 (1967), 121-122] Załóżmy, że nieskończoną permutację otrzymu jemy, wykonując niezależne próby losowe o rozkładzie jednostajnym. Niech f k (x) dx bę dzie prawdopodobieństwem, że k-ty długi sekwens rozpoczyna się od x\ i niech g(u, x) dx będzie prawdopodobieństwem, że długi sekwens rozpoczyna się od x, gdy poprzedni długi sekwens rozpoczyna się od u . Wówczas f i ( x ) = 1, /* + i(x) = J 1 fk(u)g(u, x) du. Mamy g(u, x) - ¿ m5sl gm (u, x), gdzie gm (u, x) = Pr(n < X x < • • • < X m > x lub u > X \ > • • • > X m < x) = Pr (u < X i <
< X m ) + Pr(n > X i >
> X m)
- Pr(n < X i < • ■■< X m < x) - Pr(n > X x > • ■•> X m > x) — (u 71 + (1 —u ) m + |u — x |m) /m ! ; stąd g( u, x) = e^ + e 1” ^ —1 — i znajdujemy, że / 2(x) = 2e —1 —ex —e l ~x. Można po kazać, że fk (x ) zbiega do wartości granicznej (2 cos (x —~) —sin | —cos ~) / (3 sin 1 —cos | ). ✓ Średnia długość sekwensu rozpoczynającego się od x wynosi e^ + e1“ ^ —1; stąd długość £ k k-tego długiego sekwensu wynosi f k (x)(ex + e1_x - 1) dx\ C\ — 2e - 3 « 2.43656; £ 2 = 3e2 — 8e + 2 « 2.42091. Podobne wyniki znajdziesz w punkcie 5.4.1. 24. Argumentując jak wcześniej, otrzymujemy 2k(p2 + q2)k{p2 + 2pq(2n~k~1 —1 + q2((2pg)n_fe~1 —l ) / (2pq — 1 )));
1+ 0^k
wykonując sumowanie i upraszczając, dostajemy
2 2
2 2
3 2 2 2 2
2n(p + q )n( p( p- q) / ( p + q - p q) - 5) + (2pq)npq /(p + q ){p + q - pq)
+ ł / ( p 2 + q2) + 2" “ 1. 25. Niech Vj = (U\ + • *• + Uj) mod 1; wówczas Vi , . . . , Vn są niezależnymi liczbami losowymi o rozkładzie jednostajnym z przedziału [0..1), które tworzą permutację zawierającą k spadków wtedy i tylko wtedy, gdy [Ui H \-Un\ = k. Stąd odpowiedzią jest (nk) /n \, co pierwszy zauważył S. Tanny [Duke M ath. J. 40 (1973), 717-722]. 26. Na przykład $ 5(1 — z ) ~ x = (z + 26z 2 + 66z3 + 26z4 + z 5)/ ( 1 - z ) 6. 27. Następująca reguła definiuje wzajemnie jednoznaczną odpowiedniość między permutacjami a rosnącymi lasami. Permutacji ai a2 . . . an o k spadkach przyporządko wujemy n-węzłowy las rosnący o k + 1 liściach: Pierwszym korzeniem jest oi, a jego potomkowie tworzą las odpowiadający permutacji a2 . . . a*, gdzie k jest najmniejsze, ta kie że dk +1 < ai lub k = n. [R. P. Stanley, Enumerative Combinatorics 1 (Wadsworth, 1986), Proposition 1.3.16].
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
653
28. Bieguny funkcji L(z) są wartościami funkcji T (l/e ), gdzie T( z ) jest (wielowartościową) funkcją drzewową zdefiniowaną przez T( z ) ~ zeT^z\ Stąd dla m > 0 mamy ciąg zbieżny
-
(Tm + ^ 2 . _ n>0
(ln (T m ) n+1 —k (n + 1 — k)\
1)f
n ^ rn
(Tm = “ 1 — ( 2 m + 1 ) 7vi
[Corless, Gonnet, Hare, Jeffrey i Knuth, Advances In C om putational M athem atics 5 (1996), 329-359, wzór (4.18)]; w szczególności mamy zm = (2m 4- |)7rź 4- ln(27rem) 4( i ~ Ł ln(27rem))/m + 0 ( ( l o g m ) 2/ m 2). Niech P(z) = o ( z / ( z - zm) + z / { z - ż m )). Z tego wynika, że P( x ) - P ( - x ) = E “ = 0 4 ^ { x z m / { x 2 ~Zm)) = E “ =l 0 ((X log ™.)/ (x2 + m 2)) = J2m=l 0 { { x log x ) / X2) + E m =x+i O ( ( x l o g m ) / m 2) = 0(loga:) dla x > 1. Ale wiemy, że ¿ (z ) + P (x ) = cx dla pewnych c; zatem 2cx L(x) — L ( —x) + 0(loga;), i przyjmując x —> oo w (25) otrzymujemy c = —1/2. Stąd L i = ^ m 1 cos^m —1 / 2. (Jest to wynik otrzymany przez Svatego Jansona). —
1
3 5
5 7
2
4
9
6
7
1
2
4 6
3
9
00
1.
00
5.1.4 1 3 4 5 7 8 9 5 9 2 4 8 1 7
2. Przyjmijmy, że gdy pi jest wstawiany do kolumny t, wówczas elementem w ko lumnie t — 1 jest pj. Wówczas (qj}pj) jest w klasie t —1, qj < qi i pj < Pi- Indukcyjnie można pokazać, że istnieją indeksy ¿1, . . . , it o takiej własności. Na odwrót, jeśli qj < qi i pj < p i, a na dodatek (qj, p j ) jest w klasie t —1 , to w momencie wstawiania pi kolumna t — 1 zawiera element < tak więc (qi,P i) jest w klasie ^ t. 3. Podczas wstawiania pi kolumny odpowiadają ciągom przemieszczeń (9 ). Wiersze 1 i 2 odpowiadają operacjom wykonywanym na wierszu 1 danej tablicy, zobacz ( 14 ). Jeśli usuniemy kolumny, w których w wierszu 2 znajdują się 0 0 , to wiersze 0 i 2 utworzą tablicę wypychanych elementów podobną do ( 15 ). Algorytm przechodzenia od wiersza k do k + 1 jest dokładnie algorytmem określania klas opisanym w głównym tekście. 4. (a) Przeprowadź dowód indukcyjny ze względu na rozmiar tableau i analizując możliwe przypadki. Najpierw rozważ wpływ takiej zamiany na wiersz 1, a następnie na ciąg elementów usuwanych z wiersza 1. (b) Dopuszczalne zamiany mogą posłużyć do symulacji operacji z algorytmu I z tableau reprezentowanym przez permutację kanoniczną przed i po wykonaniu algorytmu. Na przykład 17 11 4 13 14 2 6 10 15 1 3 5 9 12 16 8 możemy przekształcić na 17 11 13 4 10 14 2 6 9 15 1 3 5 8 12 16 za pomocą ciągu zamian dopuszczalnych (zobacz (4 ) i (5 )). 5. Zamiany dopuszczalne dla rozważanych permutacji są symetryczne, a permutacja kanoniczna dla P w oczywisty sposób przechodzi na permutację dla P T, gdy odwrócimy porządek wstawiania.
654
ODPOWIEDZI DO ĆWICZEŃ
5.1.4
6 . Niech t będzie liczbą wszystkich klas; dokładnie k z nich ma nieparzystą liczbę
elementów, ponieważ elementy klasy mają postać (P ifc iP ń )i
( P i f c - n P i 2 )ł
• • ■ł
(Zobacz ( 18 ) i ( 22 )). Dwuwierszowa tablica wypychanych elementów ma dokładnie t —k punktów stałych. Stąd przez indukcję otrzymujemy, że tableau bez pierwszego wiersza ma t — k kolumn o nieparzystych długościach. Tak więc t elementów w pierwszym wierszu prowadzi do k kolumn o nieparzystych długościach w całym tableau.
7. Liczba kolumn, czyli długość wiersza 1 , jest liczbą klas (ćwiczenie 2 ). Liczba wierszy jest liczbą kolumn w P T, tak więc ćwiczenie 5 (lub twierdzenie D) kończy dowód. 8 . Dla więcej niż n 2 elementów odpowiednie tableau P musi zawierać więcej niż n wierszy lub więcej niż n kolumn. Istnieją jednakże tableaux n x n. [Pierwszy dowód tego faktu znajduje się w Com positio M ath. 2 (1935), 463-470].
9. Istnieje wzajemnie jednoznaczna zależność między takimi permutacjami a parami tableaux o postaciach (n, n , . . . , n). Zatem na podstawie ( 34 ) odpowiedzią jest n 2\ A ( 2 n —1 , 2 n —2 , . . . , n ) \ 2 (2n - 1 )! (2n - 2)!... n\ )
(
n 2\
\ (2n - l)( 2n - 2)2 ... nn(n - l )™-1... I 1
Istnienie tak prostego wzoru jest naprawdę zadziwiające. Można także wyznaczyć liczbę permutacji zbioru { 1 , 2 , . . . ,m n }, które nie zawierają rosnących podciągów o długo ściach większych niż m i malejących podciągów o długościach większych niż n. 10. Dowodzimy indukcyjnie, że w kroku S3 P(r _i)s i Pr(s~i) są oba mniejsze od P(r+i)s
1 P r(s + 1)* 11. Oczywiście musimy także znać wartość, której początkowo równe było P u . Wów czas można wszystko odtworzyć z pomocą algorytmu bardzo podobnego do algoryt mu S.
12., ( Tl1^"1) + ( ni2 2 ) + ••' + 1) ’ to pokonana odległość. Minimum jest równe sumie pierwszych n elementów ciągu 1 , 2, 2 , 3 , 3 , 3 , 4 , 4 , 4 , 4 . . . z ćwiczenia 1.2.4-41; wartość tej sumy wynosi w przybliżeniu y / S/ 9 n3//2. (Na podstawie ćwiczenia 29, dla prawie wszystkich n-elementowych tableaux, ta wartość niewiele odbiega od podanej dolnej granicy. Zatem średnia liczba powtórzeń kroku S3 wynosi 0 (n3/2)). 13. Załóżmy, że permutowanymi elementami są { 1 , 2 , . . . , n} i że i. Zastosuj przypadek 1 do P T. Można tak uczynić na podstawie ćwiczenia 5 i faktu, że (P T )S = {PS)T. 15. Podobnie do ( 37 ), przykładowa permutacja odpowiada tableau 1
2
5 9 11
3
6
7
4
8 10
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
655
zatem poszukiwaną liczbą jest / ( / , m, n) — (¿ + ra-bn)! (I —m + l)(/ —n + 2 )(m —n + 1 )/ (/ + 2 )! ( m 4 - 1 )! (n)!, oczywiście przy założeniu, że l ^ m ^ n. 16. Na podstawie twierdzenia H, na 80080 sposobów. 17. Ponieważ g jest anty symetryczny ze względu na x, to jest równy zeru, gdy Xi = Xj. Wynika stąd, że jest on podzielny przez Xi — xj dla każdych i < j . Stąd g( x i , . . . , x n \ y ) = h ( x i , . . . , x n; y ) A ( x i , . . . , x n ). Wielomian h musi być jednorodny ze względu na X\ , . . . , x n, y, o stopniu całkowitym równym 1, jak i symetryczny ze względu na x i , . . . , x n - Tak więc h ( x i , . . . , x n; y) — a( x \ + • • • + x n ) + by dla pewnych a, b zależnych tylko od n. Możemy policzyć a , biorąc y = 0 . Możemy także policzyć b, znajdując pochodną cząstkową po y, a następnie biorąc y = 0. Mamy zatem ^ - A ( z i , . . . , £ i + y , . . . , x „ ) | J/= 0 = J r - A ( ® i , . . . , x n) = A ( x i , . . . , x n) y ^ ---- -— . (JX%
¿/y
¡Tj
iTj
Na koniec
E I Z ( Xi/ ( Xi
= E
i
i
^ 2 ( xi / ( xi - xi ) + xj / i xi ~ x i)) = ( 2 )-
j
18. To musi być równe A ( x i , . . . , x n ) * (60 + 2>iy + • ** + bmym), gdzie każde && jest jednorodnym, symetrycznym wielomianem stopnia m —k o zmiennych x. Mamy jęj
i ■ ■ • )X i~^~V^ ' •■ ł^n) |y— 0 — A ( x i , . . . ,X n ) ^ ^
j
W l = \ i X i ~ X 3l
i
gdzie sumowanie odbywa się po wszystkich (n~ *) wyborach różnych indeksów j \ , . . . , j k 7Ć i . Teraz w wyrażeniu bk = Y1XT / n f= i(x* —xói) możemy połączyć grupy po k 4- 1 składników mające dany zbiór indeksów {¿, j i , . . . , jfc}; dla przykładu, jeśli k — 2 , to grupujemy zbiory trzyskładnikowe postaci am/(a — b)(a — c) 4 - bm/(b — a)(b — c) + cm/(c —a)(c —6). Suma elementów z każdej takiej grupy wynosi [2 m“ fc] 1 /(1 —#¿2)(1 — . . . (1 —Xjkz), co wynika z ćwiczenia 1.2.3-33. Widzimy zatem, że bk gdzie s ( pi , . . . ,Pj) jest funkcją symetryczną będącą sumą wszystkich różnych jednomianów postaci x ^ . . . X7*3 dla różnych indeksów G { l , . . . , n } , natomiast wewnętrzna suma jest po wszystkich podziałach m — k na dokładnie j składników, czyli pi ^ ^ pj ^ 1, i pi 4 - • • ■+ pj — m — k. (Ten wynik został uzyskany w 1969 roku wspólnie z E. A. Benderem). Dla m — 2 odpowiedzią jest (s(2) + (n — l ) s ( l ) y 4- (^S/2) A ( x i , . . . , x n ); dla m = 3 dostajemy (s(3) + ((n - l)s(2 ) + s (l, 1))y + ("“ 1) s (l) i/2 + Q )y 3) A ( x i , . . . , x n )\ i tak dalej. Z innego wyrażenia dostajemy, że bk jest współczynnikiem przy z 171 w - a i z + a2z 2
),
gdzie ai = ‘ " x ii Jes^ elementarną funkcją symetryczną. Mnożąc przez y k i sumując po k , dostajemy odpowiedź jako współczynnik przy w
1 /'(l + * ( y - * 1) ) . . . ( l + * ( y - * „ ) ) _ 1\ A ( x i" ^ Xn)' yz \ (1 - z x i ) . . . (1 - z x n )
656
19.
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
Niech postacią transponowanego tableau będzie (ni, n i , . . . , n'r )\ odpowiedzią jest
2/(ni,na
"“ H
« (n ^ T j
+1
gdzie n = ^ = Y2n j- (Ten wzór można wyrazić w mniej symetrycznej postaci, wykorzystując zależność m* = \ ( n + 12 n 7))Uwaga: W. Feit [Proc. Amer. M ath. Soc. (1953), 740-744] pokazał, że liczba sposobów rozmieszczenia liczb całkowitych { 1 , 2 , . . . , n} w tablicy, która jest „różnicą” dwóch postaci tableau ( n i , . . . ,n m) \ (Zi,. . . , Zm), gdzie 0 ^ lj ^ rij i n = wynosi n! d e t(l/((n j — j ) — (h —i))!).
4
20.
H
Nieprawidłowe rozumowanie przedstawione w dyskusji po twierdzeniu jest po prawne w tym przypadku (odpowiednie prawdopodobieństwa są niezależne). Uwaga: Jeśli rozważymy wszystkie n! sposobów poetykietowania węzłów drze wa, etykietowania rozważane tutaj są tymi, które nie zawierają „inwersji”. Inwersje w permutacjach są tym samym co inwersje w etykietowaniach drzewa w szczególnym przypadku, gdy drzewo jest po prostu ścieżką. Zobacz A. Bjórner i M. L. Wachs, J. Com binatońal Theory (1989), 165-187.
A52 1 (1952),
21.
[Michigan M ath. J. 81-88] Niech g ( n i , .. . , n m) = (m + • ■• + n m }\ A ( m , . . . , n m ) / n 1\ . . . rimi cr(m, . . . , ti 77i ), gdzie ij(xi , . . . , Xrn ) — 1 (Xi ~h Xj ). Żeby udowodnić, że g ( n i , . . . , n m) jest liczbą sposobów zapełnienia przesuniętego ta bleau, musimy pokazać, że g { n \, . . . , nm) — g{n\ —1 , . . , , n m) + ■• • + g (n i , ... , n m —1). Tożsamością odpowiadającą ćwiczeniu 17 jest X\ A (xi + y , . . . , x n )/(r{xi + 2/, • • •, x n ) + hxnA ( x i , . . . i x n +y)/ cr(xu .. . , x n +y) = ( xH hxn) A ( x i , .. . , x n ) / a ( x i , .. . , £ n), niezależnie od y. Jest tak, gdyż przy obliczeniu pochodnej tak jak w ćwiczeniu 17 odkryjemy, że 2XiXj/(Xj — x f ) + 2XjXi/(x* —Xj) = 0.
22.
Załóżmy, że m = N (jeśli to jest konieczne można daną postać uzupełnić zerami). Jeśli m > N i rim > 0, liczba zapełnień wynosi oczywiście zero. Dla m — N odpowiedzią jest / nm ^ / m + m - 1 \ /r i 2 + m - 2 \ m —1 / V m —1 / \m —1 det ni + m —1 ri2 + m —2 Tlm \ 0 0 0 Dowód. Możemy założyć, że nm = 0, ponieważ przy nm > 0, w pierwszych nm kolumnach tablicy w i-tym wierszu musi znajdować się i. To pozwala ograniczyć nasze rozważania do postaci {n\ —n m, . . . ,n m —n m). Przez indukcję względem m otrzymuje my, że liczba zapełnień wynosi
/ /ki + m - 2 \ V 2
J
d e
m —2
/
/ f c i + m —2 \ —
/ km- i \
m —2
\m —2 /
V
)
t
n 2
nm^ k-m
/k2 + m - 3\
H
o
/
/A:2 + m - 3 \
/ km- A
l
i
o
/
o i
gdzie rij — kj jest liczbą wystąpień m w wierszu j . Sumowanie po każdym kj można wykonać niezależnie, otrzymując
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
/ / n i + m —1 \ \
m —1
/
/ r i 2 + m —2 \
/'ri2+m—2 \
V
V
771—1
/
777— 1
/
/ n 3 + m —3 N
/ n m_ i + l \
/
\
\
\ . 777— 1
771— 1
/
777 — 1
/
657
det / 7 7 1 + 7 7 7 -1 \
Vv
1
/ 7 7 2 + U 7 -2 \
)“(
1
J
/ 772 + 7 7 7 -2 \
V
1
( 7 7 3 + 7 7 7 -3 \
)“(
1
/n m - l + l\
)
"'
(
1
(71
)“ ( 1 )
co jest poszukiwaną odpowiedzią, ponieważ n m = 0. Tę odpowiedź można wyra zić za pomocą wyznacznika Vandermonde’a, wykonując stosowne operacje na wier szach i otrzymując w ten sposób ostateczny wynik A (ni + m —1, n 2-\-m —2 , . . . , n m) / (m —1)! (m —2)! . . . 0!. [Odpowiedź do tego ćwiczenia, w powiązaniu z równoważnym problemem z teorii grup, można znaleźć w książce D. E. Littlewooda, Theory o f Group Characters (Oxford, 1940), 189], 23. [Journal de M ath. (3) 7 (1881), 167-184] (To jest szczególny przypadek ćwiczenia 5.1.3-8, w którym wszystkie sekwensy mają długość 2, z wyjątkiem ostatniego, który może mieć długość 1). Gdy n ^ 2, wówczas element n musi znaleźć się w którymś wierszu na pierwszej pozycji z prawej strony. Po umieszczeniu n w wierszu k po prawej stronie, mamy ( 2 ^ - 1 ) J^2k~ 1A n - 2 k sposobów zakończenia naszej pracy. Niech A 2n - i z 2n~ 1/ { 2 n - 1)! = \ {g{z) - g { - z ) ) \
h(z) = £ n ^ 1
wówczas h(z ) 9 { z ) = £
( 2j f c -i ) A2k- l A n - 2k+lZnl n ' = ( T l A ri+izn/ n \ \ - 1 = g ( z ) - 1.
f c ,n > l
V nS>l
/
Zamieniamy z na —z i dodajemy, otrzymując h( z ) 2 — h f(z) — 1; zatem h(z) = tan z . Biorąc k(z) = g(z) — h(z), mamy h( z ) k ( z ) — k f(z); stąd k(z) = sec z oraz g(z) = sec z + tan z = tan ( ^ z + -7r). Współczynniki A 2n są więc liczbami Eulera \E2n\\ współ czynniki A 2n- i są liczbami tangensowymi T2n - i = ( —l ) n” 14n(4n —l)B 2n/(2 n ). Tablice tych liczb znajdują się w M ath. Comp. 21 (1967), 663-688; początkowymi wyrazami tego ciągu są (Ao, A i , A 2, . . . ) = (1,1,1, 2, 5,16, 61, 272,1385, 7936, . . . ) . Najprostszy sposób policzenia liczb tangensowych i Eulera polega prawdopodobnie na zbudowaniu trójkątnej tablicy 1 0 1 1 1 0 0 1 2 2 5 5 4 2 0 0 5 10 14 16 16 61 61 56 46 32 16 0 w której częściowe sumy uzyskuje się, przechodząc na przemian z lewa na prawo i z prawa na lewo [A. J. Kempner, Tóhoku M ath. J. 37 (1933), 348-349]. 25. Na ogół, jeśliunk je st liczbą permutacji{1, 2 , . . . , n} nie zawierającychcyklidłu gości > Ze, to Y l u nkZn/n l — exp(z +- z2/ 2 + *■• +- z k/ k ); dowodzi się to,wymnażając exp(^) x ■*• x exp(zk/ k ) i otrzymując
'
£ * "( n
£
N j 1 + 2j 2 H
1/ \ - k j k —n
/
658
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
zobacz także ćwiczenie 1.3.3-21. Podobnie, exp (£)5e5 z s/ s ) jest stosowną funkcją two rzącą dla permutacji, w których długości wszystkich cykli należą do danego zbioru S. 26. Wartością tej całki w przedziale od 0 do oo jest n tt+1^ 4r ( ( i + l)/2 )/2 ^ i+3^ 2, co dostajemy z całki dla funkcji gamma (ćwiczenie 1.2.5-20, t = 2x 2/ y / n ) . Tak więc dla przedziału od —od do oo dostajemy 0, gdy t jest nieparzyste, oraz n ^ ^ ^ y / n t l / 2(3*+D/2 (t/2)l w przeciwnym przypadku. 27. (a) Jeśli n < n + i i a < Ci+i, to nie może zachodzić i < Q rici+1 < i + 1. Jeśli n ^ n + 1 i Ci ^ Ci+1, na pewno nie może zachodzić i 4-1 ^ Qrici+1 ^ (b) Udowodnij przez indukcję względem liczby wierszy w tableau dla a\ . . . a^, że z a% < a*+i wynika Ci < Ci+i, a z a* > Gk+i wynika Ci ^ c^+i. (Rozważ wiersz 1 i ciągi „wypychanych” elementów), (c) To wynika z twierdzenia D(c). 28. Ten wynik pochodzi od A. M. Wierszyka i S. W. Kierowa, Doki. A kad. Nauk SSSR 233 (1977), 1024-1028; zobacz także B. F. Logan i L. A. Shepp, Advances in M ath. 26 (1977), 206-222. [J. Baik, P. Deift oraz K. Johansson, J. Amer. Math. Soc. 12 (1999), 1119-1178, pokazali, że odchylenie standardowe wynosi 0 ( n 1,/6); po nadto, prawdopodobieństwo, że długość jest mniejsza niż 2y/n + ¿n1^6, zbliża się do exp(—f t°° ( x—t ) u 2(x) dx), gdzie u ,f(x) — 2u 3(x )-\-x ( u )( x ) oraz u(x) jest asymptotycznie równa funkcji Airy’ego A i ( x ), gdy x —> oo]. 29. (7)/^ jesf średnią liczbą rosnących podciągów o długości l. (Z ćwiczeń 8 i 29 wynika, że prawdopodobieństwo tego, że długość najdłuższego rosnącego ciągu jest ^ ey/n lub ^ y/n/e, wynosi 0 ( 1 /y/n). [J. D. Dixon, Discrete M ath. 12 (1975), 139-142]. 30. [Discrete M ath. 2 (1972), 73-9 4 ; prostszy dowód podał Marc van Leeuwen, Elec tronic J. Combinatorics 3 ,2 (1996), praca #R15]. 31. x n = a Ln / 2j, gdzie a0 = 1, 33i 3 2y 33* Liczba takich tableaux wynosi A (l, 3 , 5 )/A ( l, 2 , 3) = 8. Rozszerzając algorytmy I oraz D na uogólnione tableaux [Pacific J. M ath. 34 (1970), 709 - 727], możemy dostać kombinatoryczne dowody ważnych tożsamości 771 71 ^
y ; Sx(xi, • • • X
=
n
n
i= 1 j = 1 1
^ x ' yi
771 71 5 a ( * i , ■■- , * m) S y r ( y i , . . . , y n ) = I I ] J (1 + Xi Vj ) ,
5.1.4
ODPOWIEDZI DO ĆWICZEŃ
659
gdzie sumowanie odbywa się po wszystkich możliwych postaciach A, a AT oznacza postać transponowaną. Te tożsamości jako pierwszy odkrył D. E. Littlewood, Proc. London M ath . Soc. (2) 40 (1936), 4 0 -7 0 , twierdzenie V]. Uwagi: Wynika stąd dla przykładu, że dowolny iloczyn kolejnych współczynników dwumianowych (“) (a^1) • • • (a^ 1) jest podzielny przez (*) (fe^ x) • •. (^^0’ Ponieważ l en iloraz jest równy A( a+Z, . . . , a + 1, a, k —1 , . . . , 1 ,0)/A(Z, . . . , 1 , 0 ) . Wartość A (/, . . . , 1 , 0 ) = (Z —1)!. . . 1! 0! nazywa się czasami „supersilnią” . 34. Długość haka jest także długością dowolnej ścieżki „zygzag” z dolnej lewej komórki haka (z, y) do jego górnej prawej komórki ( x \ y ) . Udowodnimy silniejszy wynik: Jeśli istnieje hak o długości a + 6, to istnieje albo hak o długości a, albo hak o długości b. Rozważmy komórki (x, y) = ( zi , yi ) , (a^jfe), ■ (xa+b,ya+b) = {xł, y ł), które znajdują się na spodzie tableau. Jeśli x a+i = x a, komórka (xa, yi) ma hak o długości a; w przeciwnym razie (xa+i , y a+b) ma hak o długości b. [Bibliografia: Japanese J. M ath. 17 (1940), 165-184, 411-423. Nakayama był pierwszym, który wykorzystał haki do badania grup permutacji i był bliski odkrycia twierdzenia H]. 35. W wyniku wykonania kroków G3 - G5 dokładnie hij elementów z tablicy p maleje o 1, podczas gdy zwiększana jest wartość qij. Dzieje się tak dlatego, że w algorytmie wędrujemy ścieżką zygzagowatą z p n/j do p lrll. Następne wykonanie tych kroków albo zaczyna się z większą wartością j , albo odbywa się powyżej poprzedniej ścieżki lub na niej. Z tego powodu tablica q jest wypełniana z lewa na prawo i z dołu do góry. Żeby odwrócić ten proces należy posuwać się z prawa na lewo i z góry do dołu: H I . [Inicjowanie] Wykonaj pij «— 0 dla 1 ^ j ^ wykonaj i 1 oraz j «— n x.
oraz 1 ^ i ^ n[. Następnie
H 2. [Znajdowanie niezerowej komórki] Jeśli qij > 0, to przejdź do kroku H3. W przeciwnym razie, jeśli i < rij, zwiększ i o 1 i powtórz ten krok. W prze ciwnym razie, jeśli j > 1, zmniejsz j o l , wykonaj ¿ « — l i powtórz ten krok. W przeciwnym razie zakończ wykonywanie algorytmu (tablica q jest wyzerowana). H 3. [Zmniejszanie q, przygotowywanie przejścia ścieżką „zygzag”] Zmniejsz qij o 1 i wykonaj Z«— i, k <— rii. H 4. [Ruch w dół lub w lewo] Jeśli l < n fk i pik > P(i+i)k, zwiększ Z o l i wróć do H4. W przeciwnym razie, jeśli k > j , zmniejsz k o 1 i wróć do H4. W przeciwnym razie wróć do H2. | Pierwsza ścieżka zygzag dla danej kolumny j kończy się powiększeniem p n>j , ponieważ Pij ^ ^ pn'i implikuje, że pn/„ > 0. Każda kolejna ścieżka dla kolumny j znajduje jJ jJ się poniżej lub na poprzedniej ścieżce, tak więc także kończy się w p n>y Nierówności, na które napotkaliśmy po drodze, pokazują, że ten algorytm jest odwrotnością poprzed niego. [J. Combinatorial Theory A 21 (1976), 216-221]. 36. (a) Wskazany współczynnik przy z m jest równy liczbie rozwiązań równania m = J2hijqij, tak więc możemy wykorzystać wynik z poprzedniego twierdzenia, (b) Jeśli a x, . . . , ak są dowolnymi, dodatnimi liczbami całkowitymi, to możemy udowodnić przez indukcję względem k , że
[zm] 1/(1 - z)(l - *01) . . . (1 - za") = ( 7 ) / ° i ■•■«*+ Oi m* - 1) . Liczba podziałów m na co najwyżej n części, gdzie n jest ustalone, wynosi zatem („TiJ/n! + 0 (m n -2 ), co wynika z ćwiczenia 5.1.1-15. To jest także asymptotyczna
660
ODPOWIEDZI DO ĆWICZEŃ
5.1.4
liczba podziałów m — pi H------ hp n na różne części pi > • ■• > pn > 0 (zobacz ćwiczenie 5.1.1-16). Tak więc liczba odwrotnych płaskich podziałów jest asymptotycznie równa iV(n™i)/n! -f 0 (m n_2), gdzie N jest liczbą tableaux o danej postaci zawierającej n komórek. Z (a) wynika, że jest to także równe hij + 0 ( m n~2). [Studies in Applied M ath. (1971), 167-188, 259-279].
50
37. Płaskie podziały w prostokącie są równoważne odwrotnym płaskim podziałom,
tak więc długości haków wyznaczają funkcję tworzącą l / n / = i F Ij= i(l — zt+j~ 1) dla prostokąta r x c. Dla r, c —> oo dostajemy eleganckie rozwiązanie 1/(1 —z)( 1 —z 2)2( 1 — z 3)3 . . . . [Oryginalne wyprowadzenie MacMahona w Phiiosophical Transactions 211 (1912), 7 5 -1 1 0 , 345-373, było bardzo skomplikowane. Pierwszy stosunkowo prosty dowód został podany przez Leonarda Carlitza, Acta A rithm etica 13 (1967), 29-47]. 38. (a) Dla k = l = 1 szukanym prawdopodobieństwem jest l/n . W przeciwnym razie prawdopodobieństwo to wynosi
n P ( / \ {to}, J ) + n P ( I , J \ { j o } ) n d^QjQ
(diob+ d ajo) / ( n d i0b • • • djk_ 1b dqjQ.. • dgjl_ l ) ~f~ dajp
co można dowieść przez indukcję względem k + /. (b) Sumując po wszystkich I oraz J dostajemy
n
1 ( 1
+
¿¿li,1 ) *
•
• ( ! +
d ( a - l ) b )
( 1
+
d a l
) • ■ ■ ( ! +
d a ( 6 - l ) )
•
Łatwo zauważyć, że jest to równe f ( T \ {(a, b ) } ) / f ( T ) . (c) Suma po wszystkich narożnikach jest równa 1, ponieważ każda ścieżka kończy się w narożniku. Dlatego f ( T \ {(a ^ ) } ) = /(^ )j z czego przez indukcję względem n dostajemy twierdzenie H. Ponadto, jeśli umieścimy n w komórce narożnej na końcu losowej ścieżki i powtórzymy ten sam proces dla pozostałych n —1 komórek, otrzymamy każde tableau z prawdopodobieństwem 1 //( T ) . [Advances in M ath. 31 (1979), 104-109]. 39. (a) Q i i . . . Q in będą równe elementom bi . . . bn tablicy inwersji wyjściowej permutacji P u . . . P in . (Zobacz punkt 5.1.1). (b) Q n . . . Q ni jest zanegowaną tablicą inwersji (—C i ) . . . (—C n) z ćwiczenia 5.1.1-7. (c) Krok P3 w oczywisty sposób zachowuje ten warunek. (d) ( Ï S ) -
( p ,
(o o1 )); ( “ ) -
((34)- (o “o1 ))- Ten przykład pokazuje, że
nie można wykonać kroku P3 wstecz bez zaglądania do tablicy P. 12 10 8 14 15 11 9 13 7 6 4 5
1
16 3 2 (f) Następujący algorytm jest poprawny, ale nie oczywisty.
Q l . [Pętla po
Wykonaj kroki Q2 i Q3 dla wszystkich komórek (i,j ) z tablicy w porządku leksykograficznym (to znaczy z góry na dół i w każdym wierszu z lewa na prawo); następnie zakończ wykonywanie algorytmu.
Q 2 . [Poprawianie Q] Znajdź „pierwszego kandydata” (r, s) zgodnie z podaną niżej zasadą. Następnie wykonaj <5 ^ + 1) <— Qik — 1 dla j ^ k < s.
ODPOWIEDZI DO ĆWICZEŃ
5.1.4
661
Q3. [Zmiana P w miejscu (i, j)] Wykonaj K
Prs. Następnie wykonuj nastę pujące operacje, aż będzie (r, s) = Jeśli P(r_ i)s > Pr(s~ i), wykonaj Prs *— P(r—i)s i r •<— r —1; w przeciwnym razie Prs <— Pr(s- i ) i s s —1. Na koniec wykonaj Pij <— K . |
W kroku Q2 komórka (r, s) jest kandydatem, gdy s ^ j , QiS ^ O ir — i —Qis . Niech T będzie drzewem zorientowanym ze wskazówki. Jednym z podstawowych niezmienni ków algorytmu Q jest ten, który mówi, że istnieje ścieżka z (r, s) do (i, j ) w T, ilekroć (r, s) jest kandydatem w kroku Q2. Ścieżkę odwrotną do tej ścieżki można zakodować jako ciąg liter D, Q i R oznaczający, że startujemy z (i, j), następnie idziemy w dół (D) lub w prawo (R) lub kończymy (Q). Pierwszym kandydatem jest ten, którego kod jest leksykograficznie pierwszy w porządku alfabetycznym; intuicyjnie, jest to kandydat 0 ścieżce „skrajnie lewej i najniższej”. Dla przykładu, kandydatami dla {i,j) = (1,1) w przykładzie z części (e) są (3,1), (4,2), (2,3), (2,4) i (1,6). Odpowiadającymi im kodami są DDQ, DDDRQ, RDRQ, RDRRQ i RRRRRQ; zatem pierwszym kandydatem jest (4,2). Algorytm P jest nieznacznie uproszczoną wersją konstrukcji podanej bez dowodu w Funkts. Analiz i Ego Priloz. (1992), 8 0 -8 2 . Jego dowód poprawności jest nietrywialny i został podany przez J.-C. Novelliego, I. Paka i A. V. Stoyanovskiiego w Disc. M ath. Theoretical Comp. Sei. 1 (1997), 5 3 -6 7 .
26,3
40.
Równoważny schemat został zanalizowany przez H. Rosta, Zeitschrift für Wahr scheinlichkeitstheorie und verwandte Gebiete (1981), 4 1 -5 3 .
58
41.
(Rozwiązanie zaproponowane przez R. W. Floyda) Operacja usuń-wstaw w istocie przemieszcza tylko ai. W ciągu takich operacji nie ruszane elementy pozostają w swoim względnym porządku. Dlatego, jeśli 7r można uporządkować za pomocą k operacji usuń-wstaw, to musi ona zawierać rosnący podciąg długości n — k\ i na odwrót. Stąd dis(7r) — n — (długość najdłuższego rosnącego podciągu w 7r) = n + (długość wiersza 1 w twierdzeniu A). M. L. Fredman udowodnił, że minimalna liczba porównań potrzebna do znalezienia tej długości wynosi n l g n —n l g l g n + 0 ( n ) . [Discrete M ath. 11 (1975), 2 9-35].
42.
Zbudujmy multigraf o wierzchołkach {Oh, 1l , I r , ■■■ (n 4- 1 )l} i krawę dziach kR — (k + 1 )l dla 0 ^ k ^ n. Dodajmy także krawędzie Oh — 7h, 7l — Iz,, 1h — 2l , 2h — 4l , 4h — 5l , 5h — SL , 3h — 6h, 6l — SL , które definiują „wiąza nia” Lobelii fervens. Z każdego wierzchołka wychodzą dokładnie dwie krawędzie, a za tem spójne składowe są cyklami: (Oh 1l 7l 6h 3h 4l 2r 3l 5h 6 l 8 l 7h)(1h 2 l)(4 h 5l)* Każda operacja odwracania zmienia liczbę cykli o —1, 0 lub +1. Dlatego potrzeba co najmniej pięciu operacji odwracania, żeby dojść do ośmiu cykli (Oh 1 l ) ( 1 h 2 l ) . . . ( 7h8l )- [J- Kececioglu i D. Sankoff, Lecture N otes in Com p. Sei. (1994), 307-325]. Pierwsza operacja musi przerwać wiązanie 6l — 8l , ponieważ nie dostaniemy nowego cyklu, gdy przerwiemy dwa wiązania o takiej samej orientacji lewy-prawy w ustawieniu liniowym. To daje pięć możliwości po wykonaniu jednego odwracania, a mianowicie 9 s 94 , 1 9 6 9 3 9h 9 ^ 9 2 9 ^ Q7\ cztery dodatkowe odwracania pozwalają posortować wszystkie z nich z wyjątkiem drugiej. Jest 27 • 7! = 645120 możliwych ustawień g\ , . . . , p7 , a 179904 pośród nich znajduje się w odległości ^ 5 od uporządkowania dla tytoniu. [Skuteczny algorytm znajdowania najlepszej metody sortowania oznakowanej permutacji przez odwracanie został podany przez S. Hannenhalliego i P. Pevznera, JA C H (1999), 1 - 2 7 i udoskonalony do czasu 0 ( n 2) przez Kapłana, Shamira i Tarjana, SO D A 8 (1997), 344-351].
807
46
662
ODPOWIEDZI DO ĆWICZEŃ
5.1.4
O z n a c z m y u s t a w ie n ie t a k i e j a k g^gxg 29 A9 hQ39 Q p r z e z o z n a k o w a n ą p e r m u t a c ję
43.
7 1 2 4 5 3 6 . J e ś li j e s t z a n e g o w a n y e le m e n t, p o w ie d z m y fc, a le n ie m a k — 1, je d n o o d w r ó c e n ie s p o w o d u je u t w o r z e n ie c y k l u d łu g o ś c i 2, ((/c-~ 1)h & l ) . P o d o b n ie , je ś li je s t k , a le n ie m a k + 1, p o je d y n c z e o d w r ó c e n ie u t w o r z y c y k l (k u ( & + 1 ) l ) . A je ś li w s z y s t k ie o d w r ó c e n ia t e g o r o d z a j u u s u n ą w s z y s t k i e z a n e g o w a n e e le m e n ty , p o je d y n c z e o d w r ó c e n ia u t w o r z ą d w a c y k l e d łu g o ś c i 2. J e ś li n ie m a z a n e g o w a n y c h e le m e n tó w i p e r m u t a c ja n ie j e s t p o s o r t o w a n a , ja k a ś o p e r a c j a o d w r a c a n i a z a c h o w u je lic z b ę c y k li. Z a t e m m o ż e m y s o r t o w a ć z a p o m o c ą ^ n o d w r ó c e ń , je ś li d a n a p e r m u t a c j a z a w ie r a z a n e g o w a n y e le m e n t, a z a p o m o c ą ^ n + 1 o d w r ó c e ń w p r z e c iw n y m p r z y p a d k u . D l a p a r z y s t e g o n p e r m u t a c j a n (n — 1 ) . . . 1 w y m a g a n + 1 o d w r ó c e ń , p o n ie w a ż b ę d z ie m i a ł a je d e n c y k l p o w y k o n a n iu p ie r w s z e g o o d w r ó c e n ia . G d y n > 3 j e s t n ie p a r z y s t e , p e r m u t a c j a 2 1 3 n ( n — 1) . . . 4 w y m a g a n + 1 o d w r ó c e ń ( a r g u m e n t u je m y p o d o b n ie ) . N ie c h Ck b ę d z ie lic z b ą c y k l i o d łu g o ś c i 2 k w m u lt ig r a fie z p o p r z e d n ic h o d p o w ie
44.
d z i. G ó r n e o g r a n ic z e n ie n a ś r e d n ią w a r t o ś ć Ck m o ż n a z n a le ź ć j a k n a s tę p u je : Ł ą c z n a lic z b a p o t e n c j a ln y c h 2 /c-cykli w y n o s i 2k (n + l ) - / ( 2 &), p o n ie w a ż m o ż e m y w y b r a ć c i ą g k r ó ż n y c h k r a w ę d z i z {O h —
1l,- - - ,^ h
(n + 1 ) l } n a (n + 1 ) - s p o s o b ó w i z o r ie n t o w a ć j e n a 2k s p o s o b ó w ; t u t a j k a ż d y c y k l j e s t lic z o n y 2k r a z y , w ł ą c z a
j ą c w t o n ie m o ż liw e p r z y p a d k i , t a k i e j a k
—
( 1 h 2 l2 h 3 l)
lu b ( 1 h 2 l 3 l 2 h 3 h 4 l )
łu b
( I r 2 l 6 r 7 l Al 3 h 2 h 3 l $l 5 f l ). D l a k ^ n k a ż d y m o ż liw y 2 /c-cykl w y s t ę p u je w d o k ła d n ie 2 n k (n — k)\ o z n a k o w a n y c h p e r m u t a c ja c h . D l a p r z y k ł a d u r o z w a ż m y p r z y p a d e k k =
5, n
— 9 i
c y k l ( O h 1 L 9 L 8 H 7 H 8 L 1 H 2 L 5 L 4 h ) . T e n c y k l p o j a w i a się w m u lt ig r a fie
w t e d y i t y l k o w t e d y , g d y o z n a k o w a n a p e r m u t a c j a z a c z y n a s ię o d 4 i z a w ie r a p o d s ło w a 9 1 8 7 i 2 5 lu b ic h o d w r o t n o ś c i. W s z y s t k i e r o z w i ą z a n i a d o s ta n ie m y , z n a jd u ją c w s z y s t k ie o z n a k o w a n e p e r m u t a c je z b io r u { 1 , 2 , 3 , 6 } i z a s t ę p u j ą c 1 p r z e z 9 1 8 7 , 2 p r z e z 2 5. D la t e g o E Ck ^ 1 / (2 k) 2k (n + l ) - 2 n~ k (n — k)\/2nn\ — l ( l f k + l / ( n + 1 — k )). W y n i k a s t ą d , ż e E c =
E cfc + E C n + i < H n + 1. P o n ie w a ż n + 1 — c j e s t d o ln y m o g r a n ic z e n ie m n a
lic z b ę o d w r ó c e ń , p o t r z e b u je m y ic h ^ n +
l-
E c > n - H n.
[W t y m d o w o d z ie s k o r z y s t a li ś m y z p o m y s łó w V . B a f n y i P . P e v z n e r a ,
25
SICOMP
( 1 9 9 6 ) , 2 7 2 - 2 8 9 , k t ó r z y b a d a li t r u d n i e j s z y p r o b le m s o r t o w a n ia p r z e z o d w r a c a
n ie nieoznakowanych p e r m u t a c ji. W
ty m
p r o b le m ie in t e r e s u ją c a p e r m u t a c ja , k t ó r ą
m o ż n a z a p is a ć j a k o z ło ż e n ie n ie r o z łą c z n y c h c y k li ( 1 2 3 )(3 4 5 ) ( 5 6 7 ) . . . , z ( n — 1 n) lu b
( n —2 n — 1 n) n a k o ń c u , z a le ż n ie o d t e g o , c z y n j e s t p a r z y s t e , c z y n i e p a r z y s t e , o k a z u je s ię n a j t r u d n i e j s z a d o p o s o r to w a n ia ] .
5.2 1.
T a k ; i o r a z j m o g ą p r z e b ie g a ć z b ió r w a r t o ś c i l ^ j < i ^
N
w d o w o ln y m p o r z ą d k u ,
t a k ż e r ó w n o le g le i / l u b p o d c z a s w p r o w a d z a n ia r e k o r d ó w .
2 . T o s o r t o w a n ie j e s t stabilne w z n a c z e n iu z d e fin io w a n y m n a p o c z ą t k u t e g o p o d r o z d z i a łu . W i s t o c ie p r z e d s t a w io n y a lg o r y t m s o r t u je le k s y k o g r a fic z n ie różne p a r y - k lu c z e ( A i , 1 ) , ( iĆ 2 , 2 ) , . . . , ( K n , N ) . (J e ś li p o m y ś lim y o k a ż d y m k lu c z u , ż e j e s t p o s z e r z o n y z p r a w e j s t r o n y p r z e z n u m e r s w o je j p o z y c j i w p lik u , to n ie m a k l u c z y o t y c h s a m y c h w a r t o ś c ia c h , a s o r t o w a n ie j e s t s t a b iln e ) . 3.
N a d a ł b y s o r t o w a ł, a le n ie w s p o s ó b s t a b iln y ; je ś li K j = K i o r a z j
< i, t o p o
u p o r z ą d k o w a n iu R j w y s t ą p i po R i . T a z m ia n a s p o w o d u je t e ż , ż e p r o g r a m C b ę d z ie d z i a ł a ł w o ln ie j. 4.
ENT1 N LD2 C0UNT,1 LDA INPUT, 1
1
N N
STA DEC1 J1P
OUTPUT+1,2 1
*-4
N N N |
5.2 5.
ODPOWIEDZI DO ĆWICZEŃ
663
C z a s d z i a ła n i a z m n ie js z a się o A + 1 — N — B je d n o s t e k i p r a w ie z a w s z e j e s t t o
p o p raw a.
6 . u = 0, v — 9.
COUNT = 0 0 0 0 0 0 0 0 0 0 P o D 2 , COUNT = 2 2 1 0 1 3 3 2 1 1 P o D 4 , COUNT = 2 4 5 5 6 9 12 14 15 16 P o d c z a s D5, COUNT = 2 3 5 5 5 8 9 12 15 16 j = 8 OUTPUT = IG — 4 A ---5L 6A 6T 61 70 7N Po D5, 0UTPUT = 0C 00 IN IG 2R 4A 5T 5U 5L 6A 6T 61 70 7N 8S 9. P o D l,
7.
T a k . Z a u w a ż m y , że w a r t o ś ć C0U N T[/ć?] m a le je w k r o k u D 6 r a z e m z j .
8 . N a d a l b ę d z ie s o r t o w a ł, a le n ie w s p o s ó b s t a b i ln y ( z o b a c z ć w ic z e n ie 7 ). 9 . N ie c h M — v — u. Z a łó ż m y , ż e |u| i |v| z a j m u j ą p o d w a b a j t y . LOCCiT, ) = IN P U T + ji; L 0 C (C 0 U N T [j]) = C0UNT + j\ L 0 C ( Ą ) = 0UTPUT + j; r l l = i ; rI2 = j ; rI3 = i - v lu b rI3 = K i .
M EQU V-U KEY EQU 0:2 1H ENN3 M 1 STZ C0UNT+V,3 M +l INC3 1 M+ l J3NP *-2 M +l 2H ENT2 N 1 3H LD3 INPUT,2 (KEY) N LDA COUNT,3 N INCA 1 N STA COUNT,3 N DEC2 1 N N J2P 3B 1 ENN3 M-l LDA C0UNT+U 1 M 4H ADD C0UNT+V,3 STA C0UNT+V, 3 M INC3 1 M J3NP 4B M 5H ENT2 N 1 6H LD3 INPUT,2 (KEY) N LD1 COUNT,3 N LDA INPUT,2 N STA OUTPUT,! N DEC1 1 N N ST1 COUNT,3 DEC2 1 N N J2P 6B
( I n f o r m a c ja d o d a t k o w a z n a j d u j e ;
D l . Zerowanie C0UNT. C0UNT l v - k l ^ - 0 .
u ^ i ^ V. D2. P ę t l a p o j. D3. Zwiększ COUNTCJRCiL
N % 3 > 0. D4. Sumowanie.
C0UNTK-1]. C0UNT li —1] +C0UNT [i] -»■ C0UNT [ i ] .
rA
U
$5
i
^
V.
D5. P ę t l a po i. D6. W y pi sz R i . i C0UNT \_Kj ] . rA + - R j . Si 4- r A .
C0UNT[ K j ] N % 3 > 0-
4-
¿ -1 .
I
C z a s d z i a ła n i a w y n o s i ( 10 M - f 22N + 1 0 ) u . 10 .
Ż e b y u n ik n ą ć k o r z y s t a n i a z d o d a t k o w y c h N b it ó w - z n a c z n ik ó w [ z o b a c z p u n k t 1 .3 .3
i Cybernetics 1 ( 1 9 6 5 ) , 95], a c ią g le m ie ć c z a s d z i a ła n i a p r o p o r c jo n a ln y d o iV, m o ż e m y z a s to s o w a ć n a s t ę p u j ą c y a lg o r y t m w y k o r z y s t u j ą c y c y k lo w ą s t r u k t u r ę p e r m u t a c ji:
664
5.2
ODPOWIEDZI DO ĆWICZEŃ
PI. [ P ę tla
p o i] P o w t ó r z k r o k P 2 d la 1 ^ i ^ iV ; n a s t ę p n ie z a k o ń c z w y k o n y w a n ie
a lg o r y t m u .
P2. [ C z y p(i) = i?] W y k o n a j k r o k i o d P 3 d o P3. [ P o c z ą t e k c y k lu ] t <— j <— i. P4. [ U s ta la n ie Rj] k <— p ( j ), Rj J?*, p ( j )
P 5 , j e ś l i p(i) ^ i.
j, j
fc. J e ś li p ( j ) 7^ i, p o w t ó r z
te n k ro k .
P5. [ K o n ie c
c y k lu ]
t, p ( j ) «— j .
I
S t o s u j ą c t o r o z w ią z a n ie d o s o r t o w a n ia , m o ż e m y z a ł o ż y ć , ż e p ( i) j e s t p r z e c h o w y w a n e w p a m ię c i, i z m ie n ia ć w a r t o ś ć p ( i ) w t r a k c ie w y k o n y w a n ia a lg o r y t m u . Z d r u g ie j s t r o n y i s t n i e j ą z a s t o s o w a n ia , t a k i e j a k t r a n s p o z y c j a m a c ie r z y , g d z ie p(i) j e s t fu n k c ją ¿, k tó r e j w a r t o ś ć j e s t o b li c z a n a n a b ie ż ą c o (n ie j e s t s t a b lic o w a n a ) w c e lu o s z c z ę d z a n ia p a m ię c i. W t a k i m p r z y p a d k u m o ż e m y z a s t o s o w a ć n a s t ę p u j ą c ą m e t o d ę p o l e g a ją c ą n a w y k o n a n iu k r o k ó w o d B I d o B 3 d la 1 ^ i ^ N.
BI. k p(i). B2. J e ś li k > i, t o k B3. J e ś li k < i, n ie r ó b
p(k) i p o w t ó r z t e n k r o k . n ic; je ś li j e d n a k k — i (to o z n a c z a , ż e i j e s t n a jm n ie js z e p e r m u t u je m y c y k l z a w i e r a ją c y i j a k n a s tę p u je :
w s w o im c y k l u ) ,
n a s t ę p n ie , d o p ó k i p(k)
Rk *— t.
7^ i , w y k o n u j Rk <— R P(k) i k
t
Rt;
p ( k ); n a k o n ie c
I
T e n a lg o r y t m j e s t p o d o b n y d o m e t o d y z a p r o p o n o w a n e j p r z e z J. B o o t h r o y d a [C o m p . J.
10 ( 1 9 6 7 ) ,
3 10 ], a le w y m a g a m n ie j p r z e m ie s z c z e ń d a n y c h ; p e w n e u s p r a w n ie n ia z o s t a ł y
z a p r o p o n o w a n e p r z e z I. D . G . M a c L e o d a
[Australian Comp. J. 2 ( 1 9 7 0 ) , 1 6 - 1 9 ] .
W p r z y p a d k u lo s o w y c h p e r m u t a c j i z a n a li z y z ć w ic z e n ia 1 . 3 .3 - 1 4 w y n ik a , ż e k r o k B 2 j e s t w y k o n y w a n y ś r e d n io ( N + 1 )Hjy — N r a z y . Z o b a c z t a k ż e o d n o ś n ik d o lit e r a t u r y w ć w ic z e n iu 1 . 3 .3 - 1 2 . M o ż n a z a p r o p o n o w a ć p o d o b n e a lg o r y t m y d la p r o b le m u z a m ia n y
(Rp(1 ) , . . . ,
R p (n )) n a ( # 1 , . . . , iU v ) , n a p r z y k ł a d je ś li w ć w ic z e n iu 4 n a le ż a ło b y p r z e
m ie ś c ić e le m e n t y t a k , ż e b y OUTPUT = INPUT.
1H ENT1 N 2H CMP1 P,1 JE 8F 3H LDX INPUT,1 ENT2 0 ,1 4H LD3 P,2 LDA INPUT,3 STA INPUT,2 ST2 P,2 ENT2 0,3 CMP1 P,2 JNE 4B 5H STX INPUT,2 ST2 P,2 8H DEC1 1 J1P 2B
o1 1c — f-t
III
Niech rll.= i ;rI2
k; rX = t.
1
P I . P ę t l a po i.
N N A -B A -B N -A N -A N -A N -A N -A N -A N -A A -B A -B N N
P2. C z y v( i ) — i ?
Skok, jeśli p( i ) — i. P3. P o c z ą t e k c y kl u. t <— Ri
3
i-
PA. Ustal R j . k
p(.j).
R j <— R k .
PÜ)
i-
Powtórz, jeśli p ( j ) 7= i. P5. K o n i e c cyklu. R i «— £.
PÜ)
3-
5.2
ODPOWIEDZI DO ĆWICZEŃ
665
C z a s d z i a ła n i a t e g o a lg o r y t m u w y n o s i ( 1 7 N —5 A —7B + l ) u , g d z ie A j e s t lic z b ą c y k li w p e r m u t a c ji p ( l ) . . . p ( N ) , a B j e s t lic z b ą p u n k t ó w s t a ł y c h ( c y k li je d n o e le m e n t o w y c h ) . Z r ó w n a ń 1 . 3 . 3 - ( 2 i ) i 1 .3 .3 - ( 2 8 ) o t r z y m u je m y , ż e
A = (m in 1 , a v e H n , m a x N , d e v \ J H n — H f f i ) o r a z B = ( m in 0, a v e 1 , m a x N , d e v l ) d la N ^ 2.
1 2 . O c z y w i s t y s p o s ó b p o le g a n a p r z e b ie g n ię c iu p r z e z lis t ę i z a s t ą p i e n i u d o w ią z a n ia w k - t y m e le m e n c ie p r z e z lic z b ę k , a n a s t ę p n ie p r z e m ie s z c z e n iu e le m e n t ó w w d o d a t k o w y m p r z e b ie g u . J e ś li r e k o r d y n ie s ą z b y t d łu g ie , t o n a s t ę p u ją c a , b a r d z ie j b e z p o ś r e d n ia m e to d a , za p ro p o n o w a n a p rze z M . D . M a c L a re n a , je s t p r o s ts z a i s z y b s z a . (P r z y jm ijm y
LINK(P)
d la p r o s t o t y , ż e 0 ^
^ N d la 1 ^
P
M l . [In icjo w a n ie] W y k o n a j P <— HEAD,
^ W, g d z ie A = 0).
k
<— 1.
k=
M 2 . [K o n ie c?] J e ś li P = A ( lu b r ó w n o w a ż n ie , je ś li
N + 1 ) , k o n ie c w y k o n y w a n i a
a lg o r y t m u .
M3. M4.
[C h ce m y
P
^
k]
J e ś li
P
< A;,
[Z a m ia n a ] Z a m ie ń Rk z
P
i?[P].
LINK(P)
i p o w tó rz te n k ro k .
LINK (A;) i LINK(P) s ą t a k ż e LINK (Ze) ,LINK (A:) P,
( P r z y jm u je m y , ż e
z a m ie n ia n e w t y m p r o c e s ie ) . N a s t ę p n ie w y k o n a j Q <—
P-f—
Q, A: ^— A:
-ł- 1
i w ró ć do kroku M 2.
|
D o w ó d , ż e m e t o d a M a c L a r e n a j e s t p o p r a w n a , m o ż n a p r z e p r o w a d z ić , k o r z y s t a j ą c z n a s t ę p u ją c e j w ła s n o ś c i, k t ó r a z a c h o d z i n a p o c z ą t k u k r o k u M 2 i k t ó r ą m o ż n a w y k a z a ć in d u k c y jn ie . E le m e n t a m i ^ . . . ,
aN+i
_ fc)
g d z ie
k
w c i ą g u P, L I N K ( P ), LINK (LIN K ( P ) ) , . . . , A s ą a±, a 2 , Rk-1 ^ Rax ^
^
^ R a N+1_k j e s t p o s z u k iw a n y m ,
d o c e lo w y m u p o r z ą d k o w a n ie m r e k o r d ó w . P o n a d t o L I N K ( j) ^ j d la 1 ^ j < k, t a k ż e z L I N K ( j) = A w y n ik a j ^
k.
A n a l i z a a lg o r y t m u M a c L a r e n a j e s t n a p r a w d ę in t e r e s u ją c a . J e d n ą z j e g o w a ż n y c h w ła s n o ś c i j e s t t a , ż e m o ż n a g o o d w r ó c ić i o d t w o r z y ć w y j ś c i o w y z b ió r d o w ią z a ń , m a j ą c d a n e k o ń c o w e w a r t o ś c i L I N K ( l) . . .L IN K
(AD.
K ażd a z
AM m o ż liw y c h k o ń c o w y c h k o n fi AM m o ż liw y c h k o n fig u r a c ji
g u r a c ji z j ^ LINK ( j ) ^ N o d p o w i a d a d o k ła d n ie je d n e j z w e jś c io w y c h . J e ś li A j e s t lic z b ą w y k o n a ń in s t r u k c ji P
L IN K (P ) w k r o k u M 3 , t o N — A
j e s t l ic z b ą t a k i c h j , ż e L I N K ( j) = j p o z a k o ń c z e n iu d z i a ła n i a a lg o r y t m u . T o z d a r z a s ię w t e d y i t y l k o w t e d y , g d y j j e s t n a jw ię k s z e w s w o im c y k lu . Z a t e m N — A j e s t lic z b ą c y k li w p e r m u t a c ji i A = (m in O , a v e N — H n , m a x N — 1 ).
Bibliografia: M . D . M a c L a r e n , J A C M 13 ( 1 9 6 6 ) , 4 0 4 - 4 1 1 ; D . G r ie s i J . F . P r in s , Science o f C o m p ut e r Programming 8 ( 1 9 8 7 ) , 1 3 9 - 1 4 5 .
13.
D 5 '. r < - N. D 6 '. J e ś li r
=
0, k o n ie c
w y k o n y w a n ia
a lg o r y t m u .
W
p r z e c iw n y m
r a z ie , j e ś li
COUNT l K r 1 < r , w y k o n a j r <— r — 1 i p o w t ó r z t e n k r o k ; je ś li COUNT \_Kr ~\ — r , z m n ie js z o 1 w a r t o ś c i COUNTl K r ] o r a z r i p o w t ó r z t e n k r o k . W p r z e c iw n y m r a z ie R < - R r , j
D7'.
COUNT [ K r ~\, C 0 U N T [ićr ] < - j -
S <- R j , k <- COUNT [ić,], COUNT LK,-] <-
k
1.
- 1, Rj «-
R, R <- 5, j <- k. Rj <— i?,
N a s tę p n ie , je ś li j 7- r , t o p o w t ó r z t e n k r o k ; je ś li j = r , t o w y k o n a j
r <— r — 1 i w r ó ć d o D 6 '.
|
A b y u d o w o d n ić , ż e t e n a lg o r y t m j e s t p o p r a w n y , z a u w a ż m y , ż e n a p o c z ą t k u k r o k u D 6 / w s z y s t k ie r e k o r d y R j y t a k i e że j > r i k t ó r e n ie z n a j d u j ą się je s z c z e n a s w o ic h d o c e lo w y c h p o z y c ja c h , m u s z ą z o s t a ć p r z e s u n ię t e w le w o . G d y r = 0, w ó w c z a s t a k i c h r e k o r d ó w
666
ODPOWIEDZI DO ĆWICZEŃ
5.2
b y ć n ie m o ż e , p o n ie w a ż ktoś m u s i a ł b y z o s t a ć p r z e s u n ię t y w p r a w o . P r z e d s t a w io n y a lg o r y t m j e s t e le g a n c k i, a le n ie j e s t s t a b i ln y d la k l u c z y o t y c h s a m y c h w a r to ś c ia c h . J e s t o n b lis k i k o n s t r u k c ji F o a t a z t w ie r d z e n ia 5 .1 .2 B .
5.2.1 1.
T a k ; r ó w n e e le m e n t y n ig d y n ie s ą z e s o b ą z a m ie n ia n e .
2.
T a k , j e d n a k c z a s d z i a ła n i a b y ł b y w i ę k s z y w p r z y p a d k u w y s t ę p o w a n ia r ó w n y c h
e le m e n t ó w , a s a m o s o r t o w a n ie b y ł o b y o d w r o t n o ś c ią s o r t o w a n ia s t a b iln e g o . 3.
N a s t ę p u j ą c y o ś m io w ie r s z o w y p r o g r a m
s o r tu ją c y m w ję z y k u
MIX,
w y d a j e się b y ć n a j k r ó t s z y m
program em
c h o c ia ż n ie p o le c a m y g o ze w z g lę d u n a w o ln e d z ia ła n ie . Z a
k ła d a m y , ż e s o r to w a n e lic z b y z n a j d u j ą s ię n a p o z y c j a c h
1 ,. . . , N
(to je s t
INPUT EQU 0),
w p r z e c iw n y m r a z ie p o t r z e b n y j e s t je s z c z e j e d e n w ie r s z k o d u .
LDA CMPA JLE MOVE STA START ENT1 1H DEC1 J1P 2H
0 ,1 1,1 1F 1,1 0,1 N 1 2B
B B B A A A+l B +l B+l
Uwaga: Żeby oszacować czas działania tego programu, zauważmy, że A jest liczbą inwersji. Wielkość B jest stosunkowo prostą funkcją wektora inwersji, a przy założeniu losowości danych jej funkcją tworzącą jest 2JV_1(1 + Z ) ( l + Z 2 + Z 2 + 1 ) X (1 + z 3 + z3+2 + z 3+2+1) . . . (1 + z N ~ 1 + z2" - 3 + • • • + z n ( n ~ 1 ) / 2 ) / N \ .
Średnią wartością B jest N —1 + ^2^=1(k —1)(2 k —l)/6 = (N —1)(47V2 + N + 36)/36, a zatem średni czas działania tego programu wynosi w przybliżeniu | N 3u. 4. Rozważmy wektor inwersji danej permutaeji wejściowej, zdefiniowany jak w ćwiczeniu 5.1.1-7. Wówczas A jest o jeden mniejsze od liczby tych Bj , które są równe j — 1, a B jest sumą wszystkich B j . Zatem B — A i B są, największe, gdy wejściową permutacją jest N ... 2 1, natomiast obie te wielkości są najmniejsze, gdy wejściową permutacją jest 1 2 ... N. Dlatego minimalny czas działania dostajemy dla A — 0 i B = 0, to jest (10iV —9)u; maksymalny czas działania występuje, gdy A = N ~ 1 i B = (^), i wynosi (4.5iV2 + 2.5iV —6)u.
5. Poszukiwaną funkcją tworzącą jest Z10N~9 razy funkcja tworząca dla 9B — 3A. Biorąc pod uwagę wektor inwersji z poprzedniego ćwiczenia i pamiętając, że poszcze gólne elementy wektora inwersji są parami niezależne, dostajemy funkcję tworzącą z iqn-9 f ] 1
5.2.1 7.
ODPOWIEDZI DO ĆWICZEŃ Ś r e d n ią w a r t o ś c ią
667
\aj — j\ j e s t
~ (| 1 — j\ + |2 ~ j | + Tl
+ \n~3\) = l
+
n
3+ 1
2
sumując po j, dostajemy ¿ ((nJ :1) + ("J1)) = K ™2 ” 1)8 . Nie; rozważ dla przykładu ciąg kluczy 2 1 1 1 1 1 1 1 1 1 1 . 9. Dla tabeli 3, ^4 = 3 + 0 + 2 + l = 6, B ~ 3 + 1 + 4 + 21 = 29; dla tabeli 4, A — 4 + 2 + 2 + 0 = 8, 5 = 4 + 3 + 8 + 10 = 25; tak więc czas działania programu D wynosi odpowiednio 786u i 734u. Chociaż liczba przesunięć została obcięta z 41 do 25, czas działania nie jest konkurencyjny w stosunku doprogramu S, ponieważ dla N = 16 operacje pomocnicze zabierają zbyt dużo czasu. W przypadku 16elementów lepiej byłoby wykonać tylko dwa przebiegi. Dwuprzebiegowy program D zaczyna być szybszy od programu S dla N = 13, chociaż przez chwilę są one prawie równe (a dla tak małych N znacząca jest też prawdopodobnie długość programu). 10. Wstaw „INC1 INPUT; ST1 3F(0:2)” między linijki 07 i 08 i zamień linijki 10“ 17 na: 3H CMPA INPUT+N-H, 1 NT - S JGE 8F NT -S 4H ENT2 N-H, 1 NT - S - C B 5H LDX INPUT,2 B 6H STX INPUT+H,2 B DEC2 0 ,4 B J2NP 7F CMPA INPUT,2 B -A B~A JL 5B 7H STA
NT - S - C
INPUT+H,2
|
Chociaż liczba instrukcji rośnie o cztery, zaoszczędzamy w ten sposób 3 (C—T) jednostek czasu, gdzie C jest liczbą przypadków, w których Kj ^ Kj~h - Dla przykładów z tabel 3 i 4 zaoszczędzamy w przybliżeniu, odpowiednio, 87 i 88 jednostek czasu; eksperymenty komputerowe pokazują, że wartość C/{NT —S) jest równa prawdopodobnie około 0.4, gdy hs+i/hs « 2, i około 0.3, gdy ha+i/hs ~ 3. Tak więc nasza poprawka jest warta zastanowienia. (Z drugiej strony, jeśli nie mamy pewności, że dane wejściowe są prawie uporządkowane, to analogiczna zmiana w programie S nie jest pożądana, ponieważ oszczędności w tym przypadku są proporcjonalne tylko do logiV). 11.
12.
Z m ia n a z
^
na A
z a w s z e z m ie n ia lic z b ę in w e r s ji o ± 1 , z a le ż n ie o d t e g o c z y
z m ia n a o d b y w a się p o w y ż e j, c z y p o n iż e j p r z e k ą t n e j. 13 .
O d c in k o w i łą c z ą c e m u (z, jr — 1) z ( i , j ) p r z y p i s z w a g ę |i — j |.
14 .
(a) Z a m ie ń i z j w s u m ie d la A 2n i d o d a j o b ie su m y . (b ) B i o r ą c p o ło w ę z t e g o
w y n ik u w id z im y , ż e 4
(i
+ i\
—
i
— j\
. ( 2 i + k \ ( 2 n — 2i — k \
668
ODPOWIEDZI DO ĆWICZEŃ
5.2.1
P o w y ż s z y d o w ó d p r z e d s t a w i ł a u t o r o w i L e o n a r d C a r ł i t z . I n n y d o w ó d p o le g a n a o p e r o w a n iu n a p o z io m y c h i p io n o w y c h w a g a c h ( z o b a c z ć w ic z e n ie 1 3 ) , a je s z c z e in n y w y k o r z y s t u j e t o ż s a m o ś ć z o d p o w ie d z i d o ć w ic z e n ia 5 .2 .2 - 1 6 z f ( k ) — k. J e d n a k ż e n ie j e s t z n a n y ż a d e n o c z y w i s t y s p o s ó b n a p r o s t e , k o m b in a t o r y c z n e w y p r o w a d z e n ie w z o r u
A n = [n /2 \ 2n~2. 15.
D la n > 0
gn (z) = z ngn- i ;
h n (z) = gn (z) + z ~ n gn (z);
n
n
9 n(z) = ^ ~2gk ( z ) g „ - k ( z );
h „ ( z ) = ] T ] h k ( z ) h n- k (z).
k=l
B i o r ą c G (w , z) — J 2 n
k= 1
ffn(z)wn, z n a jd u je m y ,
ż e w z G ( w , z ) G ( w z , z) = G(w, z) — 1 . M a j ą c
t a k ą r e p r e z e n t a c ję , m o ż e m y w y d e d u k o w a ć , ż e d la t = y/l — 4w = l — 2w — 2w2 — 4w3 ------- ,
G ( w , 1 ) = (1 — t)/(2w); G,{ w, 1 ) = l / ( w t ) - (1 - t ) /( 2 w2); G f{ w , l ) = l / ( 2 t 2) - l / ( 2 t ) ; G Ą w , 1) = 2/ ( w t 3) - 2 / (w2t) + (1 - t ) / w 3 ; G',(w, 1 ) - 2/t 4 - l / t 3; G ,f(w, 1 ) = l / t 3 — ( 1 — 2w) / t4 + 10u> 2/ i 5 . T u t a j d o ln e p r im i b is o z n a c z a ją r ó ż n ic z k o w a n ie p o p ie r w s z y m p a r a m e t r z e , n a t o m ia s t z w y k ł e p r im i b is o z n a c z a ją r ó ż n ic z k o w a n ie p o d r u g im p a r a m e t r z e . P o d o b n i e z e w z o r u
w ( z G ( w z , z) + G(w, z ) ) H ( w ,
z )
= H ( w , z) — 1
w n io s k u je m y , ż e
H ' ( w , 1) = w/t4,
H " ( w , 1 ) — —w / t 3 — w / i 4 + 2w/t 3 + ( 2 w 2 + 20u ; 3) / i 7 .
P r z e d s t a w i o n e w z o r y z o s t a ł y o r y g in a ln ie u z y s k a n e r ę c z n ie , a le d z is ia j m o ż n a b y je o tr z y m a ć z a p o m o c ą k o m p u te ra . W
z a s a d z ie w s z y s t k i e m o m e n ty r o z k ła d u s ą d o
o t r z y m a n i a w ła ś n ie w t a k i s p o s ó b . F u n k c ja t w o r z ą c a gn (z) r e p r e z e n t u je t a k ż e
^wewnętrzna dłue°sc ścieżki pQ WSZy S^_
k ic h d r z e w a c h o n -f-1 w ę z ła c h ; z o b a c z ć w ic z e n ie 2 .3 .4 .5 - 5 . J e s t in t e r e s u ją c e , ż e b y z a u w a ż y ć , ż e G ( w , z ) j e s t r ó w n e F ( - w z , z ) / F ( - w , z), g d z ie F ( z , q ) = £ n>0 ^ ^ / E t L i i 1 -
qk); w s p ó łc z y n n i k p r z y ( f nz n w F ( z , q ) j e s t lic z b ą p o d z ia łó w m = p\ Ą ż e pj ^ p j + i + 2 d la 1 j < n i p n > 0 ( z o b a c z ć w ic z e n ie 5 . 1 . 1 - 1 6 ) . 16 .
h pn ta k ic h ,
D l a h — 2 m a k s im u m w y s t ę p u j e w t e d y , k ie d y ś c ie ż k a n a k r a t o w n ic y o d p o w i a d a j ą c a
t e j p e r m u t a c ji p r z e c h o d z i p r z e z g ó r n y p r a w y r ó g . J e s t o n o w t e d y r ó w n e ^ [n/2\ + 1 ^
D l a d o w o ln e g o h o d p o w ie d n ią lic z b ą j e s t
g d z ie q i r s ą z d e fin io w a n e w t w ie r d z e n iu H ; p e r m u t a c ja
di+jh — 1 4 - q(h — i ) + ( r — i) [i ^ r]
d la 1 ^ i ^ h o r a z j ^ 0
m a k s y m a l iz u je l ic z b ę in w e r s ji m ię d z y k a ż d ą z (£) p a r p o s o r t o w a n y c h p o d c ią g ó w . M a k s y m a ln ą lic z b ę p r z e s u n ię ć o t r z y m a m y , g d y w ( 6 ) z a s t ą p i m y / p r z e z / .
ODPOWIEDZI DO ĆWICZEŃ
5.2.1 17.
669
J e d y n ą d w u u p o r z ą d k o w a n ą p e r m u t a c j ą z b io r u { 1 , 2 , . . . , 2 n } , k t ó r a m a ( n J 1) in w e r
s ji, j e s t n + 1 1 n + 2 2 . . . 2 n n . S t o s u ją c t e n p o m y s ł r e k u r e n c y jn ie , d o s t a n ie m y p e r m u t a c ję d e fin io w a n ą p r z e z d o d a n ie j e d y n k i d o k a ż d e g o e le m e n t u w c i ą g u ( 2 * — l ) R . . . l H 0 f l , g d z ie R o z n a c z a o p e r a c ję p o le g a j ą c ą n a p r z e d s t a w ie n iu d a n e j l ic z b y c a łk o w it e j j a k o ¿ -b ito w e j l ic z b y b in a r n e j, a n a s t ę p n ie o d w r ó c e n iu k o le jn o ś c i w y s t ę p o w a n ia c y f r w t e j r e p r e z e n t a c ji. (!)
18.
W y ł ą c z w s p ó ln y c z y n n ik p r z e d n a w ia s i w e ź ht — 4N/7T. C h c e m y z m in im a liz o w a ć
h lJ 2/ h s- 1 , g d y ho = 1. R ó ż n i c z k u j ą c , d o s t a j e m y h f = 4 h s _ 1 h s + i i w id z im y , że (2* — l ) l g / i i = 2t + 1 “ 2 ( i + l ) + l g h t . M in im a ln ą w a r t o ś c ią p r z e d s t a w io n e g o w y r a ż e n i a
su m ę
je s t z a t e m (1 — 2~t ) ^ 2t 1 _ 1)/( 2t ~ 1 )jV ’1+2 d o g r a n ic z n e j w a r t o ś c i N y n N / 2 , g d y
t
- 1) ) c o WZr a s t a s z y b k o
—> o o.
T y p o w y m i p r z y k ł a d a m i „ o p t y m a ln y c h ” w a r t o ś c i
h
d la N = 100 0 ( z o b a c z t a k ż e
t a b e lę 6 ) są: /i2 ~ 5 7 .6 4 ,
hz w 1 3 5 .3 0 , /14 « 28 4 .4 6 ,
hg w
h 2 ~ 2 2 .0 5 ,
/13 w 6 7 .2 3 ,
h 8 « 12 2 9 4 .0 5 ,
9 1 6 4 .7 4 ,
hi w 6 .1 3 ,
N ie c h
3 ( 71,
h i « 4 .4 5 ,
h 2 ~ 1 6 .3 4 , h 7 w 7 1 1 9 .5 5 ,
h 4 « 23 2.0 0 ,
19.
ho = 1;
ho = 1;
h i « 4 .0 3 , h 6 « 2 7 0 8 .9 5 ,
h2 «
h 3 « 6 1 .1 3 ,
ho = 1;
1 5 .6 9 ,
h 5 w 8 3 5 .5 0 , h 0 = 1.
h i w 3 .9 7 ,
h) = H r — 1 + ^2r < j ^ h q/ ( q j + 0 ? g d z ie y i r s ą z d e fin io w a n e w t w ie r
d z e n iu H ; n a s tę p n ie w ( 6 ) z a s t ą p / p r z e z g.
20.
( T o j e s t t r u d n ie js z e d o z a p i s a n ia n iż d o z r o z u m ie n ia ) Z a łó ż m y , ż e h - u p o r z ą d k o w a n y
p lik i ? i , . . . , / ? j v
Ki ^
z o s t a ł h - p o s o r t o w a n y i n ie c h 1 ^
Ki+k- Z n a j d ź u , v t a k ie , ż e i
k
= u i i +
a n a s tę p n ie s k o r z y s t a j z le m a t u L z
i ^ N — k; c h c e m y p o k a z a ć , ż e = v ( m o d u lo h ) , 1 ^ u , v ^
K v+ ( j - i ) h , yj =
=
p ie r w s z y c h e le m e n t ó w
. . . , A T + ( r - i) / i w c i ą g u
lu b r ó w n e o s t a t n im r e le m e n t o m
Ku+k,
y je s t
h,
W ów czas r o d p o w ie d n io m n ie js z e
. . . , l ć u+fc+(r _ i)^ z c i ą g u
x,
g d z ie r
j e s t n a jw ię k s z ą l ic z b ą c a ł k o w it ą t a k ą , ż e w + h + ( r — l ) h ^ 7V.
21.
J e ś li
xh + yk = x'h +
(x —xf)h = ( y ' —y )fc , z a t e m a/ = x + tk i y ' = y — th t. N ie c h h 'h + k'k = 1; w ó w c z a s n = ( n h / ) h + ( nkf)k , t a k n m a j e d n o z n a c z n ą r e p r e z e n t a c ję w p o s t a c i n = xh + yk,
y 'h , t o
d la p e w n e j lic z b y c a łk o w it e j w ię c k a ż d a l ic z b a c a ł k o w it a
x < k, i n j e s t g e n e r o w a ln a w t e d y i t y l k o w t e d y , g d y y ^ 0. P o d o b n ie , n ie c h hk —h —k —n = xh-\-yfk\ w ó w c z a s {x-\-xf)h-\-{yJry>)k = hk — h — k. S t ą d æ + a;7 = k — 1 (m o d u lo h) i m u s i z a c h o d z ić x + xl — k — 1 . Z a t e m y + y ' = - 1 , a y ^ 0 w t e d y i t y l k o
g d z ie 0 ^
w t e d y , g d y y < 0. Z s y m e t r ii p o w y ż s z e g o w y n i k u w id a ć , ż e d o k ła d n ie ~ ( h — l ) ( h — 1) d o d a t n ic h lic z b c a łk o w it y c h j e s t n ie r e p r e z e n t o w a ln y c h w e w s p o m n ia n e j p o s t a c i. T e n w y n i k p o c h o d z i o d S y lv e s t r a [Mat hemat ical Questions, with their Solutions, from the ‘Educat ional T i m e s ’
41 22.
(18 8 4 ), 21]. Ż e b y u n ik n ą ć n ie p o r ę c z n e j n o t a c ji, r o z w a ż m y p r z y p a d e k s = 4 , k t ó r y j e s t r e p r e
z e n t a t y w n y d la o g ó ln e g o p r z y p a d k u . N ie c h k tó r a p r z y s ta je d o
k
nk
b ę d z ie n a j m n i e j s z ą l ic z b ą c a ł k o w it ą ,
( m o d u lo 1 5 ) i j e s t r e p r e z e n t o w a ln a w p o s t a c i 1 5 a o + 3 1 a i + ■• • ;
n a s tę p n ie ła t w o z n a jd u je m y , ż e
k nk
= =
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0 3 1 62 63 94 1 2 5 12 6 1 2 7 1 5 8 18 9 190 2 2 1 2 5 2 2 5 3 2 5 4 .
670
ODPOWIEDZI DO ĆWICZEŃ
5.2.1
Z a t e m 239 = 2 4 (2 4 — 1) — 1 j e s t n a j w i ę k s z ą n ie r e p r e z e n t o w a ln ą lic z b ą , a łą c z n ie lic z b n ie r e p r e z e n t o w a ln y c h j e s t £4 = ( n i - 1 + ri 2 - 2 H--------b n u - 1 4 ) / 1 5 = (2 + 4 + 4 + 6 + 8 + 8) + 8 + (10 -b 12 -b 12 -b 1 4 +
16 + 16 ) -b 16
= 2 x 3 + 8 • 9; w o g ó ln o ś c i, x s = 2 x s- i + 2 S“ 1 ( 2S_1 + 1 ). W
p r z y p a d k u d r u g ie g o p r o b le m u o d p o w ie d z ia m i s ą o d p o w ie d n io 2 2s +
2S +
2
i 25~ 1 ( 2 s + s — 1 ) + 2 .
23.
K ażd a z
24.
lic z b m a d o k ła d n ie [ (hs+2—1)
{hs+i — 1) /hs]
in w e r s ji w s w o im p o d c ią g u ,
( R o z w i ą z a n i e u z y s k a n e w s p ó ln ie z V . P r a t t e m ) B u d u je m y „ h - r e c y d y w n ą p e r m u t a -
c ję ” { 1 , 2 , . . . , d la
N
j
N}
j a k n a s t ę p u je . R o z p o c z y n a m y o d p u s t y c h p o z y c j i a \ . . . cln] n a s tę p n ie
= 2 , 3 , 4 , . . . w y k o n u je m y k r o k
j:
z a p e łn ij k a ż d ą p u s t ą p o z y c j ę a*, p r z e g lą d a ją c
k o le jn o p o z y c j e o d s t r o n y le w e j d o p r a w e j, u s t a w i a j ą c n a n ie j n a jm n ie js z ą lic z b ę , k t ó r a n ie z n a l a z ł a się j e s z c z e w p e r m u t a c ji, je ś li t y l k o
(2h — 1)j
—
i
j e s t d o d a t n ią lic z b ą
c a ł k o w i t ą o r e p r e z e n t a c ji t a k i e j j a k w ć w ic z e n iu 22. P o w t a r z a j t e n p r o c e s d o m o m e n tu , w k t ó r y m w s z y s t k i e p o z y c j e z o s t a n ą z a p e łn io n e . T a k w ię c d la
N
= 20 d w u r e c y d y w n ą
p e r m u ta c ją je s t
6 2 1 9 4 3 12 7 5 1 5 10 8 1 7 1 3 1 1 1 9 16 14 20 18. P e r m u ta c ja h -r e c y d y w n a je s t
N/(2h— 1 ),
(2k — l) - u p o r z ą d k o w a n a
d la k a ż d e g o
k ^ h.
D la
2h < j ^
d o k ła d n ie 2^ — 1 p o z y c j i z o s t a j e z a p e łn io n y c h p o d c z a s k r o k u j ; ( f c + l ) - s z a
z n ic h z w i ę k s z a l ic z b ę p r z e s u n ię ć p o t r z e b n y c h d o ( 2h~ 1 — l) - p o s o r t o w a n i a n a s z e j p e r m u t a c j i c o n a jm n ie j o 2 /l_1 — 2 k. Z a t e m lic z b a p r z e s u n ię ć p o t r z e b n y c h d o p o s o r to w a n ia h - r e c y d y w n e j p e r m u t a c j i, p r z y s k o k a c h >
23/l~4 >
^ N 3/2. W
hs
=
2s —
s w o je j p r a c y d o k t o r s k ie j
1 i gdy
N
=
2h+1 (2h — 1 ),
w ynosi
( S t a n fo r d U n iv e r s it y , 1 9 7 2 ) P r a t t
u o g ó ln ił t ę k o n s t r u k c ję n a w i ę k s z ą r o d z in ę p o d o b n y c h c ią g ó w , w ł ą c z a j ą c w t o ( 12 ). H e u r y s t y k i, k t ó r e w y z n a c z a j ą p e r m u t a c j e w y m a g a ją c e je s z c z e w ię k s z e j lic z b y p r z e s u n ię ć , b y ł y b a d a n e p r z e z H . E r k ió , B I T 2 0 (1 9 8 0 ), 1 3 0 - 1 3 6 . Z o b a c z t a k ż e W e is s i S e d g e w ic k ,
25. F n + i
J.
Al go ri t hms
11
(1 9 9 0 ), 2 4 2 - 2 5 1 , g d z ie p o p r a w io n o k o n s tr u k c ję P r a t t a .
[ten w y n i k p o c h o d z i o d H . B . M a n n a , Econometrica
13
( 1 9 4 5 ) , 256]. J e s t
t a k d la t e g o , ż e k a ż d a p e r m u t a c j a m u s i z a c z y n a ć się a lb o o d 1 , a lb o o d 1 2 . K a ż d a p e r m u t a c j a m a c o n a j w y ż e j [A7/2J in w e r s ji; ł ą c z n a l ic z b a in w e r s ji w y n o s i AT — 1
~
2AT
fjv + T fN - 1'
( Z o b a c z ć w ic z e n ie 1 .2 . 8 - 1 2 ) . Z a u w a ż m y , ż e p e r m u t a c je „ F ib o n a c c ie g o r z ę d u
N
+ 1”
m o ż n a w y g o d n i e r e p r e z e n t o w a ć z a p o m o c ą „ k o d o w a ń M o r s e ?a ” - c ią g ó w k r o p e k i k r e s e k , g d z ie k r e s k a o d p o w i a d a in w e r s ji ( z o b a c z ć w ic z e n ie 4 .5 .3 - 3 2 ) . W
te n sp o só b w y
z n a c z y l iś m y ł ą c z n ą l ic z b ę k r e s e k w e w s z y s t k i c h k o d a c h M o r s e ’a o d łu g o ś c i
N.
N a s z e r o z u m o w a n ie p o k a z u je , ż e lo s o w a p e r m u t a c j a 3- i 2 - u p o r z ą d k o w a n a z a w ie ra z g ru b sza
+ 2~2) N
—
/y/E ~ 0 .2 7 6 N in w e r s ji. J e ś li je d n a k lo s o w a
p e r m u t a c j a j e s t n a j p i e r w 3 - p o s o r t o w a n a , a n a s tę p n ie 2 - p o s o r t o w a n a , t o ć w ic z e n ie 42 p o k a z u je , ż e w ó w c z a s m a o n a «
N / 4 in w e r s ji; je ś li n a j p i e r w j e s t o n a 2- p o s o r t o w a n a ,
a p o t e m 3 - p o s o r t o w a n a , t o lic z b a in w e r s ji w y n o s i « JV/3.
26.
T a k ; n a jk r ó ts z y p r z y k ła d o w y c ią g 4 1 3 7 2 6 8 5
m a 9 in w e r s ji. O g ó ln ie , c ią g
d 3k+s = 3& + 4 s , d la — 1 ^ s ^ 1 , j e s t 3-, 5- i 7 - u p o r z ą d k o w a n y i m a w p r z y b liż e n iu in w e r s ji. D l a N m o d 3 = 2 t a k o n s t r u k c ja j e s t n a j le p s z ą z m o ż liw y c h .
5.2.1
27.
ODPOWIEDZI DO ĆWICZEŃ (a ) Z o b a c z J. Al gori thms
15
671
( 1 9 9 3 ) , 1 0 1 - 1 2 4 . C . G . P l a x t o n i T . S u e l, J. Al go-
rithms 23 ( 1 9 9 7 ) , 2 2 1 - 2 4 0 , z n a le ź li n ie z a le ż n ie p r o s t s z y d o w ó d , w k t ó r y m p o k a z u ją , że c m o ż e b y ć d o w o ln ą s t a ł ą < (b ) T o j e s t o c z y w i s t e , g d y m > - c 2 ( l n i V / l n l n i V ) 2. W p r z e c iw n y m p r z y p a d k u N l + c / v k ^ N ( \ n N ) 2. R . E . C y p h e r [ S I C O M P 22 ( 1 9 9 3 ) , 6 2 - 7 1 ] p o k a z a ł n ie z n a c z n ie m o c n ie js z e o g r a n ic z e n ie O ( N ( lo g N ) 2/ lo g lo g N ) , g d y s k o k i s p e łn i a j ą w a r u n k i h s+1 > h s , d la w s z y s t k i c h s , i g d y s ie ć s o r t u j ą c a j e s t z b u d o w a n a t a k j a k w ć w ic z e n iu 5 . 3 .4 - 2 . N ie s ą je s z c z e z n a n e ż a d n e d o ln e g r a n ic e n a a s y m p t o t y c z n y średni c z a s d z ia ła n ia .
28.
209 10 9 4 1
19 5 1 , c o w y n ik a z ( n ) . M o ż liw e s ą j e d n a k le p s z e c ią g i; z o b a c z
ć w ic z e n ie 29.
29.
D o ś w ia d c z e n ia w y k o n a n e w 1 9 7 1 r o k u p r z e z C . T r i b o l e t a w s k a z a ły n a c i ą g i 3 7 3
1 3 7 5 3 19 7 3 1 ( £ ave w 7 2 1 0 ) i 3 1 7 101 3 1 1 1 3 1 ( B ave w 8 1 7 0 ) . [D la p ie r w s z e g o z n ic h c z a s s o r to w a n ia w y n o s i ~
1 2 7 7 2 0 u , c o n a le ż y p o r ó w n a ć z c z a s e m «
128 593u,
g d y z a s t o s u je m y c i ą g s k o k ó w ( i i ) ] . W o g ó ln o ś c i T r ib o le t p r o p o n u je b r a ć z a h s lic z b ę p ie r w s z ą , k t ó r a le ż y n a jb liż e j N s^. D o ś w ia d c z e n ia p r z e p r o w a d z o n e p r z e z S h e lb y S ie g e l w 1 9 7 2 r o k u w s k a z u ją , ż e n a j le p s z ą l ic z b ą s k o k ó w w t e j m e t o d z ie , d la N ^ 10000, j e s t i«
| ln (J V / 5 .7 5 ). R o b e r t L . T o m lin s o n , J r ., z n a la z ł in n y d o b r y c ią g . J e s t n im
19 9 79 3 1 1 1 5 1
( R ave ~ 7 9 5 0 ). J a k d o t ą d ś r e d n i c z a s d z i a ła n i a d la t e g o c ią g u , « 1 2 7 2 6 0 u , j e s t n a j le p s z y m w ś r ó d z n a n y c h c ią g ó w . Z w ie lu e k s p e r y m e n t ó w p r z e p r o w a d z o n y c h p r z e z C a r o le M . M c N a m e e w y n ik a , ż e n a jle p s z y m c ią g ie m t r z y s k o k o w y m j e s t 4 5 7 1 ( B ave ~ 1 8 2 4 0 ). W p r z y p a d k u c z t e r e c h s k o k ó w n a jle p s z y m w je j t e s t a c h o k a z a ł s ię c i ą g 9 1 23 7 1 (£?aVe ~ 1 1 8 6 5 ) , j e d n a k d o ś ć s z e r o k a g a m a in n y c h s k o k ó w d a j e z g r u b s z a t e n s a m c z a s d z i a ła n i a .
30.
L ic z b a p u n k t ó w o c a łk o w it y c h w s p ó łr z ę d n y c h w o b s z a r z e t r ó j k ą t n y m
{ x ln 2 + t / l n 3 < In iV, x ^ 0, y ^ 0 }
w ynosi
| ( l o g 2J V )(lo g 3JV) + 0 ( l o g N ) .
Z t w ie r d z e n ia K m a m y , ż e p o d c z a s / i- s o r to w a n ia c i ą g j e s t j u ż 2h - u p o r z ą d k o w a n y i 3 h- u p o r z ą d k o w a n y , a z a t e m m a z a s t o s o w a n ie ć w ic z e n ie 25.
31. 01 02 03 04 05 06 07 08 09 10 11 12 13 U 15 16 17 18
START ENT3 T 1H LD4 H,3 ENN2 -INPUT-N,4 ST2 6F(0:2) ST2 7F(0:2) ST2 4 F (0 :2) ENT2 0 ,4 JMP 9F 2H LDA INPUT+N,1 CMPA INPUT+N-H,1 4H JGE 8F 6H LDX INPUT+N-H,1 STX INPUT+N,1 7H STA INPUT+N-H,1 INC1 0 ,4 8H INC1 0 ,4 J1NP 2B DEC2 1
1 T T T T T T T N T - S - BA A N T - S - BA A N T - S - BA A B B B B N T -B +A N T -B A A S
672
ODPOWIEDZI DO ĆWICZEŃ 19 20 21 22
9H
5.2.1
ENT1 -N ,2 8B DEC3 1 J3P IB
T + S
32?
T + 5 T
T |
T u t a j A m a z w i ą z e k z p r a w o s t r o n n y m i m a k s im a m i w t a k i s a m s p o s ó b , w j a k i A z p r o g r a m u D j e s t z w ią z a n e z le w o s t r o n n y m i m in im a m i; o b ie w ie lk o ś c i s t a t y s t y c z n i e z a c h o w u ją się t a k s a m o . U p r o s z c z e n ia w p ę t l i w e w n ę t r z n e j z m n ie js z a ją c z a s d z ia ła n ia d o 7 N T + 7 A — 2 5 + 1 + 1 5 T je d n o s t e k i c o d z iw n ie js z e , n ie z a le ż n ie o d B ! D l a N = 8 s k o k a m i s ą 6 , 4, 3, 2 , l i m a m y A ^ e — 3 .8 9 2 , B ave = 6 .76 2 ; ł ą c z n y ś r e d n i c z a s d z i a ła n i a w y n o s i 2 7 6 .2 4 it. ( P o r ó w n a j z t a b e l ą 5 ). Z a r ó w n o A , j a k i B p r z y jm u ją
2 . D l a N = 1000 m a m y 40 sk o k ó w 9 7 2 ,8 6 4 , 76 8 , 7 2 9 , . . . , 8 , 6 , 4 , 3 , 2 , 1 ; z e k s p e r y m e n t ó w , p o d o b n y c h d o t y c h z t a b e li 6 , w y n ik a , ż e A « 8 7 5 , B w 4 2 5 0 , a ł ą c z n y c z a s d z i a ła n i a w y n o s i o k o ło 268000u ( d w a n a j w i ę k s z e w a r t o ś c i d la p e r m u t a c j i 7 3 8 4 5 1 6
r a z y w ię c e j o d c z a s u d z i a ła n i a p r o g r a m u D z e s k o k a m i z ć w ic z e n ia 28). Z a m ia s t s o r t o w a ć s k o k i w o s o b n e j t a b li c y , w y g o d n ie j e s t j e g e n e r o w a ć ( n a m a s z y n ie b in a r n e j) w n a s t ę p u j ą c y s p o s ó b :
P I.
P r z y p is z m
2 ^lgiV^_ 1 , n a j w i ę k s z ą p o t ę g ę d w ó jk i m n ie js z ą d o N.
P 2 . h <— m. P3.
W y k o r z y s t a j h w j e d n y m p r z e b ie g u s o r to w a n ia .
P4.
J e ś li h j e s t p a r z y s t e , w y k o n a j h «— h + h / 2 ; n a s tę p n ie , je ś li h < N, w r ó ć d o P3.
P5.
W y k o n a j m «— [m/2\ i je ś li m ^ 1 , w r ó ć d o P 2 .
|
C h o c i a ż w t y m a lg o r y t m i e s k o k i n ie s ą g e n e r o w a n e w p o r z ą d k u m a le ją c y m , k o le jn o ś ć , w j a k i e j się j e o t r z y m u je , j e s t j e d n a k w y s t a r c z a j ą c a d o t e g o , a b y a lg o r y t m s o r to w a n ia b y ł c ią g le p o p ra w n y .
32.
4 12 1 1 13 2 0 8 5 10 1 4 1 6 3 9 16 7 1 5 .
33.
M o ż liw e s ą d w a r o d z a j e u s p r a w n ie ń . P o p ie r w s z e , w y k o r z y s t u j ą c s z t u c z n y k lu c z
K o — o o , n ie m u s im y s p r a w d z a ć , c z y p > 0. ( T e n p o m y s ł b y ł j u ż w y k o r z y s t y w a n y , n a p r z y k ł a d w a lg o r y t m i e 2 .2 .4 A ) . P o d r u g ie , m o ż e m y z a s to s o w a ć s t a n d a r d o w ą te c h n ik ę o p t y m a li z a c j i . M o ż e m y m ie ć d w ie k o p ie p ę t li w e w n ę t r z n e j, w k t ó r y c h n a z m ia n ę re j e s t r y s ą p r z y p i s y w a n e p i q\ w t e n s p o s ó b u n ik a m y p r z y p is a n ia q <— p . ( T e n p o m y s ł z a s t o s o w a liś m y j u ż w ć w ic z e n iu 1 . 1 - 3 ).
INPUT
T a k w ię c z a k ła d a m y , ż e n a p o z y c j i
z a p is a n a j e s t w p o lu ( 0 :3 ) n a jw ię k s z a
m o ż liw a w a r t o ś ć , i z a m ie n ia m y w ie r s z 0 7 i w s z y s t k i e n a s tę p n e w p r o g r a m ie L p rze z :
07 08 09 10 11 12 13
U 15 16 17
8H LD3 CMPA JG 7H ST1 ST3 JMP 4H LD2 CMPA JG 5H ST1 ST2
INPUT,2 (LINK) INPUT,3 (KEY) 4F INPUT,2 (LINK) INPUT,1 (LINK) 6F INPUT,3 (LINK) INPUT,2 (KEY) 8B INPUT, 3 (LINK) INPUT,1 (LINK)
B! Bf Bf Nf N! N'
B" B" B"
-
L q. ( T u t a j p = rI3, q
D o L4 z q
<-» p,
je ś li K
=
rI2)
> K p,
Lq
l 3 « -p . S k o c z , ż e b y z m n ie js z y ć j . p
<-- L q. ( T u t a j p =
D o L4 z q
N"
Lq
TV"
Lj < -p .
3-
rI2, q = rI3)
p, je ś li K > K p .
5.2.1 18 19 20 21
ODPOWIEDZI DO ĆWICZEŃ
6H DEC1 1
N N N N
ENT3 0
LDA J1P
IN P U T , 1 4B
673
j *“ 3 ~ 1- 0. K N > j^
1.
|
T u t a j B ' + B ff =
B + N — 1, N f + N f/ = TV — 1, t a k w ię c ł ą c z n y c z a s d z i a ła n i a w y n o s i 5 B + 14 ÍV + N f — 3 je d n o s t e k . P o n ie w a ż N* j e s t l ic z b ą e le m e n t ó w , d la k t ó r y c h lic z b a e le m e n t ó w m n ie js z y c h i p o ło ż o n y c h n a p r a w o j e s t n i e p a r z y s t a , t o o d p o w i a d a j ą m u sta ty s ty k i
^ m in O , a v e ^ iV +
m a x TV -
1^ .
S z t u c z k a z oo p r z y ś p ie s z a t a k ż e p r o g r a m S; w p o n iż s z y m p r o g r a m ie , z a p r o p o n o w a n y m p r z e z J. H . H a lp e r in a , z a s t o s o w a n o t e n p o m y s ł i in s t r u k c ję MOVE w c e lu r e d u k c ji c z a s u d z i a ła n i a d o ( 6 £f + 1 1 IV — 1 0 ) u , p r z y z a ło ż e n iu , że n a p o z y c j i INPUT+N+i z n a jd u je s ię j u ż n a j w i ę k s z y m o ż liw y k lu c z je d n o s ło w o w y :
01 02 03
2H
LDA
IN P U T ,2
ENT1 IN P U T ,2 JMP
04
05 06 07 08 09 10
1
START ENT2 N - l
3F
4H
MOVE 1 , 1 ( 1 )
3H
CMPA 1 , 1 4B JG
5H
STA
0 ,1
DEC2 1 J2P
2B
N - l N - l N ~ 1 B B + N —l B + TV- 1
N - l N - l N - l |
D u p lik u ją c p ę t lę w e w n ę t r z n ą z a o s z c z ę d z ilib y ś m y d o d a t k o w o B / 2 j e d n o s t e k c z a s u . 34.
I s tn ie je ( ^ )
c ią g ó w N
w y b o r ó w , n a k t ó r y c h d a n a l is t a j e s t w y b i e r a n a n r a z y .
P o n ie w a ż d a n a lis t a j e s t w y b i e r a n a z p r a w d o p o d o b ie ń s t w e m 1 / M , z a t e m p r a w d o p o d o b ie ń s tw o w y s t ą p i e n i a k a ż d e g o t a k ie g o c i ą g u w y n o s i ( 1 / M ) n ( l — l / M ) JV_n. E N T 10 24 25 ENT2 1-M 26 711 LD3 HEAD+M, 2 J3Z 8F 27 ST3 IN P U T ,1 (LIN K ) 28
1 1 M M M -E
29 30 31 32 8H 33
ENT1 0 , 3 LD3
I N P U T ,! (L IN K )
J3P
*-2
N N N
INC2 1
M
J2NP 7B
M
Uwaga: J e ś li z m o d y fik o w a lib y ś m y p r o g r a m M t a k , ż e b y m ie ć d o s t ę p d o k o ń c ó w lis t , w s t a w i a j ą c m ię d z y lin ijk i 19 i 20 in s t r u k c ję „S T 1 E N D ,4” , t o m o g lib y ś m y z a o s z c z ę d z ić n a c z a s ie , łą c z ą c lis t y r a z e m t a k j a k w a lg o r y t m i e 5 .2 .5 H .
36.
P r o g r a m L : A = 3, B = 4 1 , N — 16 , c z a s — 4 9 6 u . P r o g r a m M : ^4 — 2 + 1 + 1 +
3 = 7, £? = 2 + 0 + 3 + 3 = 8 , N — 1 6 , c z a s = 5 4 9 u . ( Ż e b y n a s z e p o r ó w n a n ie b y ł o w p e łn i u c z c iw e , p o w in n iś m y t a k ż e d o d a ć c z a s d z i a ła n i a p r o g r a m u z ć w ic z e n ia 3 5 , 9 4 u. M n o ż e n ia s ą w o ln e ! Z a u w a ż m y , ż e p o p r a w io n y p r o g r a m L z ć w ic z e n ia 3 3 z a b ie r a t y l k o 358 j e d n o s t e k c z a s u ) .
37.
P r z e d s t a w io n a t o ż s a m o ś ć j e s t r ó w n o w a ż n a t o ż s a m o ś c i
674
5.2.1
ODPOWIEDZI DO ĆWICZEŃ
c o d o w o d z i się t a k j a k w ć w ic z e n iu 34. P o lic z e n ie p e w n y c h w a r t o ś c i t y c h fu n k c ji m o ż e b y ć in t e r e s u ją c e , ż e b y z o b a c z y ć , j a k o n e z a c h o w u ją się , g d y r o ś n ie M :
g41 (z ) =
(2 16 +
6 4 8 z + 1 0 8 0 z 2 + 1 2 9 6 z 3 + 10 8 0 z4 + 64 S z 5 + 2 1 6 z 6) / 5 1 8 4 ,
gA2(z ) =
(9 4 5 + 1 9 1 7 z + 1 4 8 5 z 2 +
g4z(z) = (1 7 0 4 + 2 2 6 4 z +
8 40 z2 +
594z3 +
13 5z4 +
8 1z5 +
2 7 2 6) / 5 1 8 4 ,
304^3 +
40 z 4 +
2Az5 +
S z 6) / 5 18 4 .
J e ś li G m (w, z) j e s t w s p o m n ia n ą fu n k c ją t w o r z ą c ą d w ó c h z m ie n n y c h , t o r ó ż n ic z k u ją c p o z, d o s ta je m y
/ G '
m
{
w
,
z
)
=
M
(
n\ M— l £ f f n ( 2 ) +
)
...
n>0
n
£ & * ( * )
/.
n^O
^
n!
stą d
E 7V^0
'
w (M - 1)10 ( w 2
(3\ M N w N
‘
V
M
w\
2
Mm
7
p o d o b n ie z e w z o r u p n ( l ) = § ( 4) + § ( 3) w y n ik a , ż e
£
9m N { 1 ) ^
^
iV^0
= M (M -
+ M e ' - - 1) - ( ^
'
^
P o r ó w n u ją c w s p ó łc z y n n i k i p r z y
d o s ta je m y
w a r ia n c ja w y n o s i ( | ( ^ ) +
M ~ 2.
38.
M am y
£
( * ) p ? ( l.- p ,) * " "
7
+
^
(”) = {N 2) E j P h
7
~
- W
i F f (x) = / (o :) t a s u m a z b ie g a d o ( ^ ) / M r a z y f Q f ( x ) 2 d x , g d y t y l k o F z a c h o w u je się w y s t a r c z a ją c o d o b rz e . [J ed n a k że
f ( x ) 2 d x m o ż e b y ć c a łk ie m d u ż e . Z o b a c z t w ie r d z e
n ie 5 .2 .5 T , k t ó r e m a z a s t o s o w a n ie d o wszystkich o g r a n ic z o n y c h c a łk o w a ln y c h g ę s to ś c i].
39.
Ż e b y z m in im a liz o w a ć A C / M + B M y m u s im y m ie ć M = y j A C / B , t a k w ię c z a M
n a le ż y w z i ą ć l ic z b ę c a ł k o w i t ą o j e d e n w ię k s z ą o d te j w ie lk o ś c i. ( W p r z y p a d k u p r o g r a m u M w a r t o ś ć M p o w in n a b y ć p r o p o r c jo n a ln a d o N). 40.
S z e r e g a s y m p t o t y c z n y d la n _ 1 ( l — a / N ) n~ N = - A T 1 + £ ( i V + ¿fc)_ 1 ( l - a / W ) *
£
n>N
k^O
m o ż n a o t r z y m a ć , o g r a n i c z a j ą c k d o 0 ( 7 V 1+ e), r o z w i j a j ą c (1 — a / N ) k w e - ak/N r a z y
(1 — h a 2/ 2 N 2 H—
•) i w y k o r z y s t u j ą c w z ó r s u m a c y jn y E u le r a ; z a c z y n a się o n o d s k ła d
n ik ó w e a F i ( a ) ( l + a 2/ 2 N ) — ( 1 + a ) / 2 J V + 0 ( N ~ 2). Z a t e m a s y m p t o t y c z n ą w a r t o ś c ią
(15) j e s t i V ( l n a + 7 - f F i ( a ) ) / a + ( l — e -Q£( l + a ) ) / 2 a + 0 ( N ~ 1). [ W s p ó łc z y n n ik p r z y N j e s t r ó w n y w p r z y b li ż e n iu « 0 .7 9 6 6 , 0 .6 5 9 6 , 0.288 0, o d p o w ie d n io d la a = 1 , 2 , 1 0 ] . Z ć w ic z e n ia 5 .2 .2 - 4 3 m a m y , ż e I n a + 4 1.
M a m y ak
7
+ F i ( a ) = / 0a ( l —
dt.
— 0 ( p fc), p o n ie w a ż z t w i e r d z e n i a o lic z b a c h p ie r w s z y c h w y n ik a , że
m ię d z y pk a pk+ x j e s t (p fc+1/(fc + 1 ) — p k/ k ) / l n p lic z b p ie r w s z y c h ; t a w a r t o ś ć je s t d o d a t n ia d la w s z y s t k i c h d o s t a t e c z n i e d u ż y c h k. D la t e g o s u m a p ie r w s z y c h ( 2) e le m e n tó w z ( 10 ) w y n o s i
& («*> % ) = E i < i < j < f c ° { P %+:I)\ a s tfŁd d o s t a j e m y
5.2.1
ODPOWIEDZI DO ĆWICZEŃ i+j
P3(pk 1 )(pk 1 (^ -IK C -D
_
.« & « (b ) J e ś li ( /C2 1) < lo g p N ^ ( 2) , t o Z au w ażm y, że g d y
(k -
675
1) •
2 ) 2 < 2 1 o g p iV , s t ą d
p2k =
0 ( e x p c V ln N ) .
—> 1 , c i ą g b a z o w y a i , 02 , • ■• s t a j e s ię c ią g ie m lic z b p ie r w s z y c h
i o g r a n ic z e n ie z t w ie r d z e n ia I r e d u k u je s ię d o 0 ( i V ( l o g i V ) 4 ( l o g l o g i V ) ~ 2 ). 42.
C.
(a ) [A .
J. A i gor it hms
Yao,
1
(1 9 8 0 ),
14 -5 0 ]
M ożem y
pokazać,
że k a żd a
( 2) p a r lis t w n o s i ^ - g ~ 2 h ~ 3^2 N 3^2 + 0 { N / gh) in w e r s ji d o k a ż d e g o p o d c ią g u ( K ai K a+g, K a+ 2g , . • • ), 1 ^ a ^ g. Z a ł ó ż m y d la p r z y k ł a d u , ż e h — 1 2 , g — 5 , a = 1 i z b a d a jm y in w e r s je , g d y l is t y K 3 < K 15 < K 27 < - • i K 7 < K i g < K 31 < • • ■p r z e c i n a j ą p o d c ią g ( K u K ^ K u , . . . ) . P o p ie r w s z e j fa z ie (/ ć3 , K 7, K 15, K 19, K 27 , K 3 1 , . . . ) je s t 2 - u p o r z ą d k o w a n ą lo s o w ą p e r m u t a c ją . D l a in t e r e s u ją c y c h n a s e le m e n t ó w K 3 m a m y j = 1 ( m o d u lo 5) i j = 3 lu b 7 ( m o d u lo 1 2 ) ; s t ą d j = 5 1 lu b 3 1 ( m o d u lo 60 ); n a s z y m z
c e le m j e s t p o lic z e n ie ś r e d n ie j w a r t o ś c i p ( 5 1 , 3 1 ) , g d z ie
9 (x ) y) ~ ^ ^ { \ K x+ghj > Ky-\-ghk\
H~
[Ky+ghj >
+ ?"(#)
R x + 3 /ifc ])
2/) ;
j
r (x,
y) =
E
^ NJ gh
.
3 J e ś li |p| ^ g o r a z |ę| ^ g , t o [R jf+ p h —
gh
^
R /c + g/i+g/i]
+
[Ky+ghj
^
[Jć?
^
R fc]
^
^
^k-\-qh —gh] ]
stą d
Ky+ghk]
[■K ar+g/ij > ^
[R a:+ p fi+ g ń .(j + l)
>
> R y + q h + g h ( f c - l ) ] +
[ R y + g h + p /iC j + l)
>
K x + p h + g h( k—!)]->
a s t ą d w y n ik a , ż e g ( x , y ) ^ p(:r-|-p/i, 7/-j-ę/i)+ 8A r/ę/i- P o d o b n ie z n a jd u je m y , ż e g ( x , p ) ^ «/(as + p/i, y + ę/i) — S N/ g h. A l e s u m a w a r t o ś c i y (cc, y ) p o w s z y s t k i c h g 2 p a r a c h (x, y ) t a k ic h , ż e x m o d h — b i y m o d h = c, d la d o w o ln y c h d a n y c h b ^ c, j e s t r ó w n a o g ó ln e j lic z b ie in w e r s ji w lo s o w e j 2 - u p o r z ą d k o w a n e j p e r m u t a c j i 2 N / h e le m e n t ó w . Z a t e m z ć w i c z e n ia 1 4 w y n ik a , że ś r e d n ią w a r t o ś c ią y ( x , y) j e s t g ~ 2y/ 7r/12 8 (2 W //i )3^2 + 0 ( W / y / i) . (b ) Z o b a c z
S.
Jan son i D . E . K n u th , R a n d o m
Structures and Algs.
10 (19 9 7 ),
1 2 5 - 1 4 2 . D l a d u ż y c h h i g m a m y t/>(/i, g) = ^ 7 i 7 i / 1 2 8 y + 0 ( g ~ ljf2h 1^2) + 0 ( y / i “ 1/2). 43.
J e ś li p o w y k o n a n iu k r o k u D 3 , K < K i , t o n a le ż y w y k o n a ć ( K i , . . . , K j - h , R j ) <—
( K , K i , . . . , K j - h ) ; w p r z e c iw n y m r a z ie w y k o n u je m y k r o k i D 4 i D 5 a ż d o m o m e n tu , w k t ó r y m K ^ K i . T u t a j l = 1, g d y j — h + 1 o r a z / <— Z + 1 — h [l = /¿], g d y j r o ś n ie o 1. [Z o b a c z H . W . T h im b le b y ,
Software Practice
Exper. 19
( 1 9 8 9 ), 3 0 3 - 3 0 7 ] .
I n n y s p o s ó b p r z y ś p ie s z e n ia t e g o p r o g r a m u [ z o b a c z W . D o b o s ie w ic z ,
Letters 1 1
Inf. Proc.
(19 8 0 ), 5 - 6 ] p o le g a n a w y k o n y w a n iu t y l k o c z ę ś c io w e g o s o r t o w a n ia d la h > 1,
b e z p r ó b y p r z e m ie s z c z a n ia K j d a le j n a le w o o d p o z y c j i j — h; w y d a j e s ię je d n a k , ż e t o p o d e jś c ie w y m a g a w ię k s z e j l ic z b y s k o k ó w . 44.
(a) T a k . T o j e s t ja s n e , g d y 7r' j e s t j e d e n k r o k p o w y ż e j 7r. Z ć w ic z e n ia 5 . 1 . 1 - 2 9
w y n ik a , ż e is t n ie je ś c ie ż k a s ą s ie d n ic h t r a n s p o z y c j i z 7r d o k a ż d e j p e r m u t a c ji p o w y ż e j n ie j. (b ) T a k . P o d o b n ie , je ś li 7r j e s t p o w y ż e j 7r ', t o n R le ż y p o n iż e j 7r, R . (c) N ie ; 2 1 3 n ig d y n ie le ż y a n i p o w y ż e j, a n i p o n iż e j 3 1 2 , a le 2 1 3 ^ 3 1 2.
676
ODPOWIEDZI DO ĆWICZEŃ [ C z ę ś c io w y p o r z ą d e k 7r ^
5.2.1
7T/ p o r a z p ie r w s z y b a d a ł C . E h r e s m a n n , Annal s o f
Ma th . (2) 3 5 ( 1 9 3 4 ) , 3 9 6 - 4 4 3 , §20, w k o n t e k ś c ie t o p o lo g ii a lg e b r a ic z n e j. W i e lu m a t e m a t y k ó w n a z y w a g o t e r a z „ p o r z ą d k ie m B r u h a t a ” p e r m u t a c ji, p o d c z a s g d y p o r z ą d e k „ p o w y ż e j ” j e s t n a z y w a n y „ s ła b y m p o r z ą d k ie m B r u h a t a ” -
w r z e c z y w is t o ś c i p o r z ą d e k
„ p o w y ż e j ” j e s t s iln ie js z y , p o n ie w a ż w y s t ę p u j e r z a d z ie j. T y lk o s ł a b y p o r z ą d e k d e fin iu je k ra tę ].
5.2.2 1 . N ie ; n o w a p e r m u t a c j a m a 2 m + 1 mni ej in w e r s ji, g d z ie m ^ 0 j e s t l ic z b ą e le m e n tó w cik t a k i c h , ż e i < k < j o r a z ai > ak > aj. ( Z a t e m wszystkie m e t o d y s o r to w a n ia p r z e z z a m ie n ia n ie z b i e g a j ą w k o ń c u d o p o s o r to w a n e j p e r m u t a c ji) .
2 . (a ) 6 . (b ) [A . C a y le y , P h i l o s . M a g . 3 4 ( 1 8 4 9 ) , 5 2 7 - 5 2 9 ] R o z w a ż m y c y k lo w ą re p r e z e n t a c ję p e r m u t a c ji 7r. K a ż d a z a m i a n a e le m e n t ó w z tego samego c y k lu z w ię k s z a l ic z b ę c y k li o 1 ; k a ż d a z a m i a n a e le m e n t ó w z różnych c y k li z m n ie js z a t ę lic z b ę o 1 . ( T e m u w i s t o c ie j e s t p o ś w ię c o n e ć w ic z e n ie 2 .2 .4 - 3 ) . W p e łn i p o s o r t o w a n a p e r m u t a c ja c h a r a k t e r y z u je się t y m , ż e m a n c y k li. S t ą d x c h ( 7r) j e s t r ó w n e n m in u s l ic z b a c y k li w 7r. ( W a lg o r y t m i e 5 .2 .3 S w y k o n y w a n y c h j e s t d o k ła d n ie x c h ( 7r) z a m ia n ; z o b a c z ć w ic z e n ie 5 .2 .3 - 4 ) . 3.
T a k ; w z g lę d n e p o ło ż e n ie r ó w n y c h e le m e n t ó w n ig d y n ie u le g a z m ia n ie .
4.
J e s t t o p r a w d o p o d o b ie ń s t w o , ż e w w e k t o r z e in w e r s ji b\ > m a x ( 62, • • ■, £>n), c z y li
k \ k n ~h~ 1 J
i V l^k
n\ = y j 7r / 2n + 0 ( n - 1 ) = p o m ija ln ie m a ło .
/ /
= (bi — r + 1) [bi ^ r] b ę d z ie w e k to r e m in w e rs ji p o r — 1 p r z e b ie g a c h . J e ś li b[ > 0, t o e le m e n t i p o p r z e d z a b\ w ię k s z y c h e le m e n tó w , z k t ó r y c h n a j w i ę k s z y p r z e s u n ie się c o n a jm n ie j n a p o z y c ję b\ + i , p o n ie w a ż i e le m e n tó w 5.
M o ż e m y z a ł o ż y ć , ż e r > 0. N ie c h
j e s t ^ i . P o n a d t o , je ś li e le m e n t j j e s t s k r a jn ie p r a w y m e le m e n te m , k t ó r y m u si z o s ta ć z a m ie n io n y , t o
> 0 i p o r - t y m p r z e b ie g u BOUND = bj +
j —
1.
6 . Rozwiązanie 1: E le m e n t w y s u n i ę t y n a j b a r d z i e j n a p r a w o o d s w o je j k o ń c o w e j p o z y c ji p r z e s u w a się w k a ż d y m p r z e b ie g u , z w y j ą t k i e m o s t a t n ie g o , o j e d n ą p o z y c je w le w o .
Rozwiązanie 2 ( w y ż s z y p o z io m ) : z ć w ic z e n ia 5 . 1 . 1 - 8 , o d p o w ie d ź ( f ) , a[ — i = bi — c^, d la 1 ^ i ^ n , g d z ie c\ C2 . . . cn j e s t d u a ln y m w e k t o r e m in w e rs ji. J e ś li bj = m a x ( 6i , , . . , 6n ), t o Cj — 0 . 7.
( 2 ( n + 1 ) ( 1 + P ( n ) - P ( n + 1 ) ) - P ( n ) - P ( n )2) 1/2 = y/(2 - t t/ 2 )n + 0 ( 1 ) .
8 . D l a i < k 4 - 2, bi m o ż n a w y b r a ć n a j + k — i 4 - 1 s p o s o b ó w ; d la k + 2 ^ i < n — j + 2 is t n ie je j — 1 w y b o r ó w ; a d la i ^ n — j + 2 t a k i c h w y b o r ó w j e s t n — i -1- 1 . 10 .
(a ) J e ś li i — 2k — 1 , o d (k — 1 , ai — k ) d o (fc, ai — k). J e ś li i = 2k, o d (ai — k, k — 1 )
d o (at — /c, k). (b ) K r o k a 2fc - i z n a j d u j e s ię p o w y ż e j p r z e k ą t n e j
a 2k - i ^ 2k
a 2k - i > a 2k
*<==>•
a 2k ^ 2k - 1
■<==> k ^ a2k- 1 — k
a2k - k ^ k — 1
k r o k a 2k z n a j d u j e się p o w y ż e j p r z e k ą t n e j. Ic h w y m ia n a p o w o d u je z a m ia n ę k r o k ó w p o z io m y c h i p io n o w y c h , (c) K r o k a2k+d z n a jd u je s ię c o n a jm n ie j m p o n iż e j p r z e k ą tn e j
k 4- m - 1 ^ a 2k+d ~ (k 4- m ) + m a 2k+d < 2/c + m a 2k ^ 2/c + ra a2k — k ^ k + m k r o k a 2k z n a jd u je się c o n a jm n ie j m p o n iż e j p r z e k ą t n e j. (J e śli a2k+d < 2 k Jr m i a2k < 2 fc + m , t o is t n ie je c o n a jm n ie j ( k + m ) + k e le m e n t ó w m n ie js z y c h o d 2k 4- m ; t o j e s t n ie m o ż liw e . J e ś li a2k+d ^ 2k + m i a 2& ^ 2k 4 - m , je d e n z e le m e n tó w Js m u s i b y ć > ; a le n ie m o ż e m y w p a s o w a ć w s z y s t k i c h e le m e n t ó w ^ 2k + m w m n ie j n iż
5.2.2
(k + m) + k p o z y c ji.
ODPOWIEDZI DO ĆWICZEŃ
677
S t ą d o 2fc+2m - i < a 2fe w t e d y i t y lk o w t e d y , g d y a 2fc+2m_ i <
2k + m
w t e d y i t y lk o w t e d y , g d y 11.
2k + m
^ a 2fc- D o ś ć n ie s p o d z ie w a n y w y n ik ! ) .
16 10 13 5 14 6 9 2 15 8 1 1 3 12 4 7 1 (6 1 z a m ia n ) , c o o t r z y m u je m y , p o s i ł k u ją c s ię w y
k r e s e m n a k r a t o w n ic y . S y t u a c j a s t a j e się b a r d z ie j s k o m p lik o w a n a , g d y N j e s t w ię k s z e ; w o g ó ln o ś c i, z b io r e m { iC 2 , K ą , . . . } p o w in ie n b y ć z b ió r { 1 , 2 , . . . , M — 1 , M , M + 2 , M + 4 ,
..,, 2 \N/2\
— M } , s p e r m u t o w a n y t a k , ż e b y z m a k s y m a liz o w a ć l ic z b ę z a m ia n d la [iV / 2 j
e le m e n tó w . T u t a j M — |~2fe/3~|, g d z ie k m a k s y m a liz u je k [ N / 2J — ~ ( ( 3 k — 2)2k~l + ( — l ) fe). C a łk o w it a , m a k s y m a ln a l ic z b a z a m ia n w y n o s i 1 — 2 1 g l g i V / l g i V - f 0 ( 1 / lo g 7 V ) r a z y lic z b a p o r ó w n a ń [R. S e d g e w ic k , S I C O M P 7 ( 1 9 7 8 ) , 2 3 9 - 2 7 2 ] . 12 .
N a s t ę p u j ą c y p r o g r a m , p o c h o d z ą c y o d W . P a n n y ’e g o , n ie z a w ie r a in s t r u k c ji AND.
W y k o r z y s t a n a z o s t a ł a o b s e r w a c ja , że k r o k M 4 j e s t w y k o n y w a n y d la
0 i 0 ^ s i p -- 1 —s
01 02 03 04 05 05 07 08 09 10 11 12 13 U 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
=
<
i — r + 2kp + s,
p. T u t a j TT = 2* — , p = r l l , r = r I 2 , i = rI3 , i + d — N = rI4
rI5 ; p r z y jm u je m y , ż e N
START ENT1 TT 2H ENT2 TT ST2 Q(1:2) ENT2 0 ENT4 0,1 3H ENT3 0 ,2 INC4 -N ,3 8H ENT5 -1 ,1 4H LDA INPUT+1,3 CMPA INPUT+N+1,4 JLE *+4 LDX INPUT+N+1,4 STX INPUT+1,3 STA INPUT+N+1,4 J5Z 7F DEC5 1 INC3 1 INC4 1 J4N 4B JMP 5F 7H INC3 1,1 INC4 1,1 J4N 4B 5H ENT2 0,1 * ENT4 Q ENTA 0 ,4 SRB 1 STA Q ( 1 : 2) DEC4 0,1 J4P 3B 6H ENTA 0,1 SRB 1 STA *+1(1:2) ENT1 * J1NZ 2B
^ )
1 T
T T T A A D + E
C C C C
M l . Inicjowanie y. p <— 2 i _ 1 . M2. Inicjowanie q, r , d. q ^ 2 t~1. r +— 0 . rI4 < - d.
M 3 . P ę t l a p o i. i
r.
rI4 ♦ — i + d — AT.
s ^—0.
C C C B
M 4 . Porównaj /zamień
B B C - D - D - D - D E D D D
Ri+1
A A A A A A A T T T T T
Rj+\ :Ri+d+1 .
S k o k , j e ś l i K i +i ^ ić t+ d + i*
Ri+d+l-
S k o k , j e ś l i s = p — 1. s <— s + 1 .
i
i + 1.
P o n o w n ie p ę t la , je ś l i i + d < N . W p r z e c iw n y m r a z ie p r z e jd ź d o M 5 .
i «— i + p + 1. P o n o w n ie p ę t la , je ś l i i + d < W . M 5. P ę t la po q . r rI4
p.
q.
9 <- flf/2. rI4 < - d. D o M 3 , je ś l i d / 0 . M d . P ę t l a p o y.
p < - Lp/2J. D o M 2 , je ś l i p ^ 0.
|
678
ODPOWIEDZI DO ĆWICZEŃ
5.2.2
C z a s d z i a ła n i a z a l e ż y o d s z e ś c iu w ie lk o ś c i, z k t ó r y c h t y lk o j e d n a j e s t z a le ż n a o d d a n y c h w e jś c io w y c h ( p o z o s t a ł e p ię ć s ą fu n k c ja m i t y lk o N): T = t, lic z b a „ c y k li p o d s t a w o w y c h ” ;
A — t ( t + l ) / 2 , l ic z b a p r z e b ie g ó w lu b „ c y k li d r u g o r z ę d n y c h ” ; B = ( z m ie n n a ) lic z b a z a m ia n ; C = lic z b a p o r ó w n a ń ; D = lic z b a b lo k ó w k o le jn y c h p o r ó w n a ń i E = lic z b a n ie p e łn y c h b lo k ó w . D l a N — 2f n ie j e s t t r u d n o u d o w o d n ić , ż e D = (t — 2 ) N + t + 2 i E — 0. D l a d a n y c h z t a b e li 1 m a m y T = 4, A — 10 , i? = 3 + 0 + 1 + 4 + 0 + 0 4 8 + 0 + 4 + 5 =
2 5 , C — 6 3 , D = 38, E = 0 , t a k w ię c c a ł k o w it y c z a s d z i a ła n i a w y n o s i
1 1 A + 6 B + 1 0 C + 2 E + 1 2 T + 1 = 9 3 9 u. o g ó ln y m p r z y p a d k u , g d y N
W
= 2 ei + • • • + 2 £r’ , P a n n y p o k a z a ł, ż e z a c h o d z i
D = ei ( N + l ) ~ 2(2ei - 1) , E = (ei~er) + (ci + e2 + • • • + er-i) - (ex - l)(r - 1). 13 .
N ie , j a k i a lg o r y t m y Q i R .
14 .
(a ) D l a p = 1 w o s t a t n im s c a la n iu w y k o n u je m y (2t~ 1 - 0 ) + (2 i ~ 1 — 1 ) + ( 2t_1 — 2 ) +
(2 i _ 1 - 4 ) H -------h ( 2 i “ 1 - 2 i ~ 2) = ( i — l ) 2 t - 1 + l p o r ó w n a ń , (b ) x t — x t _ i + | ( i - l ) + 2 _f =
• • • = *0 + £ 15.
o
+ 2 -fc- 1) = i ( ‘) + 1 - 2-*. stąd c(2‘) = 2t_2(t2 - t + 4) - 1.
(a ) N a l e ż y r o z w a ż y ć l ic z b ę p o r ó w n a ń t a k ą , ż e i-\-d — N ; w ó w c z a s t r z e b a z a s to s o w a ć
in d u k c ję w z g lę d e m r . (b ) J e ś li b(n) = c ( n + 1 ) , t o m a m y b(2n) = a ( l ) +
b a (2 n ) =
a ( 0 ) + o ( l ) + o ( l) H ------ b a ( n — l ) + a ( n ) + x ( l ) + x ( 2 )H-------- \-x(2 n) = 2b(n)~\-y(2n)-a{n)\ p o d o b n ie ó (2 n + l ) = 2b(n)-\-y(2n-\~l). (c) Z o b a c z ć w ic z e n ie 1 .2 .4 - 4 2 . (d ) D o ś ć ż m u d n e o b lic z e n ie w y r a ż e n i a ( z ( N ) + 2z(\_N/2\) + ••■) — a ( N ) , p r z y u ż y c iu w z o r ó w t a k ic h j a k
¿ 2 - ( n - k ) , 2" « - „ - 2,
£ 2“ (" ; * ) - 2"+> - ( ” + 2) - 1 ,
k= 0
k= 0
p ro w a d z i d o w y n ik u
c(N) = WQ ( 2 ) + 2ei - l) - 2ei (ei - 1) - 1 1 (e 1 - ej + Ę 2ei(ci + --- + eJ_ i - i ( e 1 - l ) + I ( 2 J=1
16.
R o z w a ż m y ( 2^ ) ś c ie ż e k n a k r a t o w n i c y z (0 ,0 ) d o (n , n) t a k i c h j a k n a r y s u n k a c h 1 1
i 18 . Z k a ż d y m o d c in k ie m z p u n k t u ( i, j ) d o ( i + l , j ) w ią ż e m y w a g ę / ( i — j ) , je ś li i ^ j , lu b f ( j ~
i
— 1) + 1 , je ś li
i
< j . T u t a j f ( k ) j e s t l ic z b ą z m ia n w a r t o ś c i b i t u
br
7^ br+i
w r o z w in ię c iu b in a r n y m k = ( . . . Ó2& i 6o ) 2 - C a ł k o w i t a l ic z b a z a m ia n w o s t a t n im s c a la n iu
dla N = 2n wynosi wówczas E o < ^ i < „ ( 2/ 0 ) + ! ) ( t - / ) ( “" ń - i l r 1)- R - Sedgewick pokazał, że ta sum a upraszcza się dla ogólnego / do | (2” ) + 2 E k > i („2'\ ) E o n a s t ę p n ie m o ż n a z a s t o s o w a ć m e t o d ę z f u n k c ją g a m m a , ż e b y o t r z y m a ć a s y m p t o t y c z n y w zór
(i) (lnlgn+(lg^ 2 F ~ +S+Jil+5(n))71 + °^logn) g d z ie ń ( n ) j e s t fu n k c ją o k r e s o w ą l g n o o k r e s ie o g r a n ic z o n y m p r z e z 0.0005. Z a t e m p r z y
n —►o o , ś r e d n io o k o ło 1 / 4 p o r ó w n a ń p r o w a d z i d o z a m ia n . [ S I C O M P 7 ( 1 9 7 8 ) , 2 3 9 - 2 7 2 ; z o b a c z r ó w n ie ż F l a j o l e t i O d l y z k o , S I A M J . Discrete M a i h . 3 (1 9 9 0 ), 2 3 8 - 2 3 9 ] .
17.
K
n
+ i j e s t b r a n y p o d u w a g ę , g d y s o r t o w a n y j e s t p o d c ią g z
r
=
N
i K i je s t
n a j w i ę k s z y m k lu c z e m . K q j e s t b r a n y p o d u w a g ę w k r o k u Q 9 , g d y le w o s t r o n n e m in im a s ą p r z e m ie s z c z a n e n a p o z y c j ę R \ .
5.2.2 18 .
W
ODPOWIEDZI DO ĆWICZEŃ k r o k a c h Q 3 i Q 4 d o k o n u je s ię t y lk o p o je d y n c z a z m ia n a w a r t o ś c i z, j
p r z e jś c ie m d o Q 5 ; p r o c e s p o d z i a ł u d la Ą
679 p rzed
. . . R r k o ń c z y s ię w k r o k u Q 7 z j = f(Z + r ) / 2 ] ,
p o d z ia łe m t e g o p o d c ią g u t a k d o b r z e , j a k t o t y l k o j e s t m o ż liw e . M ó w ią c j ę z y k i e m p a r a m e tr ó w w y d a j n o ś c i a lg o r y t m ó w , n a le ż y ( 1 7 ) z a s t ą p i ć p r z e z A = 1 , B = |_(^ — 1 ) / 2 J ,
C — N 4 - ( N m o d 2 ). T o p r o w a d z i n a s d o najlepszego p r z y p a d k u d a n y c h w e jś c io w y c h d la n a s z e g o a lg o r y t m u ( z o b a c z ć w ic z e n ie 2 7 ), z w y j ą t k i e m , ż e B « ~ C . J e ś li w k r o k a c h Q 3 i Q 4 z n a k i „ < ” z a m ie n im y n a
, t o n a s z a lg o r y t m n ie b ę d z ie d łu ż e j p o p r a w n ie
s o r to w a ł. N a w e t, je ś li d o p u ś c im y z n a k i
„< ” w
( 13 ),
Ro
z o s t a n i e z a m ie n io n y z
R \1
n a s tę p n ie w t r z e c ie j fa z ie d z ie le n ia w y j ś c i o w y r e k o r d Ro z o s t a n ie p r z e s u n ię t y n a p o z y c j ę
R 2 itd . - p r a w d z iw a k a t a s t r o fa . 19.
T a k , p o d c ią g i p o w s t a j ą c e w w y n i k u p o d z i a ł u m o g ą b y ć p r z e t w a r z a n e w d o w o ln y m
p o r z ą d k u . J e d n a k ż e k o le jk a b ę d z ie z a w i e r a ła Q ( 7 V / V lo g N ) e le m e n t ó w w p r z y p a d k u , g d y w w y n ik u p o d z i a ł u p o w s t a j ą p o d c ią g i o t a k i c h s a m y c h r o z m ia r a c h . D l a s t o s u m a m y g w a r a n c ję d u ż o m n ie js z e g o r o z m ia r u ( z o b a c z n a s t ę p n e ć w ic z e n ie ) .
20.
( N a jg o r s z y p r z y p a d e k z a c h o d z i w t e d y , k i e d y N
m ax (0 , [ lg ( iV + 2 ) / ( M + 2 ) ] ) .
=
2 k(M + 2) — 1 i w s z y s t k i e p o d c ią g i d z ie lo n e s ą p o r ó w n o ).
2 1 . D o k ła d n ie t r e k o r d ó w z o s t a j e p r z e s u n ię t y c h w k r o k u Q 6 d o o b s z a r u z a jm o w a n e g o p r z e z R s + i . . • R n , a z a t e m B — t. F a z a p o d z i a ł u k o ń c z y się z j = s , z a t e m C — C f =
N + 1 — s je s t lic z b ą t y c h p r z y p a d k ó w , w k t ó r y c h w a r t o ś ć j j e s t z m n ie js z a n a . G d y k lu c z e s ą r ó ż n e w k r o k u Q 7 m u s i z a c h o d z ić i = s - f 1 , p o n ie w a ż i = j im p lik u je K j = K ; t a k w ię c C
~ s.
2 2 . P o d a n a z a le ż n o ś ć d la
An{z)
As-i{z)An~s{z)
z a c h o d z i, p o n ie w a ż
j e s t f u n k c ją
t w o r z ą c ą d la w a r t o ś c i A p o n ie z a le ż n y m p o s o r t o w a n iu lo s o w o i n ie z a le ż n ie u p o r z ą d k o w a n y c h c ią g ó w o r o z m ia r a c h s — 1 i N — s. P o d o b n ie d o s t a j e m y z a le ż n o ś c i
N
3
Bn(z) ^2
Bs~i{z)BN- s(z),
=
s = l
1
t —0 N
Cn(*) = j j ' 5 2 * N+1c . - i ( z ) c N-,(z), S—1 1 N dn(z) — '^2,Ds- 1 (z)Dn-s{z), =
3= 1
En(z) -
1 N —
^2 Es- i{z)EN- s(z), 3= 1
S n ( z ) = ^ J 2 z I M+1
s=1
^
Sn- ^ z^
d la N > M . T u t a j bstN j e s t p r a w d o p o d o b ie ń s t w e m , ż e s i t m a j ą d a n e w a r t o ś c i w c i ą g u o d łu g o ś c i JV, c z y l i
c o j e s t r ó w n e ( 1 /AT!) r a z y ( s — 1 )! s p o s o b ó w p r z e p e r m u t o w a n ia { 1 , . . . , s — 1 } r a z y ( N —s)\ s p o s o b ó w p r z e p e r m u t o w a n ia {s + 1 , . . . , N } r a z y
( ^ r * ) s p o s o b ó w r o z m ie s z c z e n ia
680
5.2.2
ODPOWIEDZI DO ĆWICZEŃ
t e le m e n t ó w p o k a ż d e j z e s t r o n . D l a 0 ^ N ^ M m a m y B n ( z ) — C n ( z ) = S n ( z ) — 1; D
n
(z ) = n f c L i ( ( ! + (^ -
1)z ) / k ) i E
n
(z ) = I lf c L iiU + z H
1" z k
1) / k ) -
[ I n t e r e s u ją c y m p r o b le m e m j e s t z b a d a n ie z a c h o w a n ia się t y c h fu n k c ji t w o r z ą c y c h , g d y N j e s t d u ż e ; o c i ą g u a n a lo g ic z n y m d o C n ( z ), a le w k t ó r y m z N+1 j e s t z a s t ą p io n e p r z e z z N _ 1 , w ia d o m o , ż e z b ie g a d o r o z k ła d u p r a w d o p o d o b ie ń s t w a , k t ó r y n ie je s t n o r m a ln y i j a k d o t ą d n ie w p e łn i z a n a liz o w a n y . W ię c e j m o ż n a z n a le ź ć w p r a c a c h P . H en n e ą u in a , M . R e g n ie r a i U . R ó s le r a , R A I R O Theoretical Informatics and Applications 2 3 ( 1 9 8 9 ) , 3 1 7 - 3 3 3 ; 2 3 ( 1 9 8 9 ), 3 3 5 - 3 4 3 ; 2 5 ( 1 9 9 1 ) , 8 5 - 1 0 0 ] . 23.
G d y N > M , A ;v = l + ( 2 / N ) J2 Q^ k
= ( l / - ^ ) E f L i ( ( s - l ) ( ^ - s ) / ( N - l ) + S s_ i + S ^ _ s ) = C N -2 )/ 6 + (2/N)J2o^k 2M + 1, S n = (2/2V) ^20
— 2 ) /IV. K a ż d a z t y c h r e k u r e n c ji j e s t p o s t a c i ( 19 )
—
d la p e w n e j fu n k c ji f n . 24.
R o z w i ą z a n i e m r ó w n a n ia r e k u r e n c y jn e g o C n = N — 1 + (2/A7) ^20
N > M , j e s t ( A r + l ) ( 2 i 7 N + i - 2 i 7 M+2 + l - 4 / ( M + 2 ) + 2/ ( ; v + l ) ) d la JV > M
( T a k w ię c
m o g lib y ś m y z a o s z c z ę d z ić o k o ło 4 N / M p o r ó w n a ń . A le k a ż d e p o r ó w n a n ie t r w a d łu ż e j, j e ś l i m u s i b y ć p o p r z e d z o n e p o r ó w n a n ie m in d e k s ó w i o r a z j . T a k w ię c t r a c im y , c h y b a że k o sz t p o ró w n a ń k lu c z y je s t | M l n N
r a z y w i ę k s z y o d k o s z t u p o r ó w n a ń z a w a r to ś c i
r e je s t r ó w . A u t o r z y w ie lu a r t y k u łó w n ie z d a j ą s o b ie s p r a w y , ż e t a k i e
„ u s p r a w n ie n ie ”
c z y n i s o r t o w a n ie s z y b k i e z n a c z ą c o w o ln ie js z y m !) . 25.
C
( N a le ż y s k o r z y s t a ć w ie lo k r o t n ie z r ó w n a n ia (1 7 ) d la s = 1 ). A — N — M , B — 0 ,
= ( N+ 2)
26.
-
( M + 2) ,
D=
E = 5 = 0.
W r z e c z y w i s t o ś c i n a j t r u d n i e j j e s t p o s o r t o w a ć c ią g
1 2 3 ... s u b te ln ie js z y c ią g N
N -M
IM
N -M +1-,
N — 1 j e s t r ó w n ie z ł y d o p o s o r t o w a n ia . T o j e s t n ie c o g o r z e j n iż w ć w ic z e n iu 2 5 , p o n ie w a ż t u t a j D — M — 1 , E = ( ^ ) . 27.
M —1 M —2 . . .
N N - 1 ... M - j-1 . . .
12 2 3 1 8 6 7 5 9 10 1 1 4 1 6 1 4 1 5 1 3 20 18 19 1 7 2 1 22 23, p o t r z e b u je 5 4 6 u . M o ż n a
p o k a z a ć , ż e n a j le p s z y p r z y p a d e k d la N = 3 ( M + l ) 2 k — 1 j e s t w t e d y , k ie d y p o d c ią g i s ą d z ie lo n e p o r ó w n o a ż d o u z y s k a n ia p o d c ią g ó w o r o z m ia r z e 3 M + 2 ; p o te m je s t d o k o n y w a n y p o d z i a ł n a t r z y r ó w n e c z ę ś c i, ż e b y z a o s z c z ę d z ić n a o p e r a c ja c h w s t a w ia n ia n a s t o s . M a m y A = 3 ■2k -
1 , C = (k + § ) ( N + 1 ), S = 2k -
1,
B
= D = E = 0.
( O b r a z z a c h o w a n ia s ię s z y b k i e g o s o r t o w a n ia d la d o w o ln y c h M i N j e s t in te r e s u ją c y , a le z ło ż o n y ). 28.
R ó w n a n ie r e k u r e n c y jn e
2 Cn
=
U
+
1
+
n ^ ( f c
E)Ck-\
( 3) m o ż n a p r z e k s z t a łc ić d o
+ ( " 3 2) Cn~2 = 2 ( n - l ) ( n - 2 ) + 2(n-2)C „_2. 29.
R o z w a ż m y o g ó ln e r ó w n a n ie r e k u r e n c y jn e
ODPOWIEDZI DO ĆWICZEŃ
5.2.2
681
m e d ia n y z 2t + 1 e le m e n ^ n C n Z 71, m o ż n a p r z e d s t a w ić n a s z e r ó w n a n ie w p o s t a c i
k t ó r e p o w s t a je , g d y p o d z i a ł j e s t d o k o n y w a n y w z g lę d e m t ó w . P r z y j m u ją c C ( z )
=
(1 - z ) i + 1 C {2t+1\ z ) / { 2 t + 2)! = 1 / ( 1 - z ) t+2 + C (£)( z ) / ( * + 1 ) ! . N ie c h f { x ) = C (£)( l x ) ; w ó w c z a s p t ( d ) f ( x ) — ( 2 i + 2 ) ! / x £+2, g d z ie p r z e z # o z n a c z a m y o p e r a t o r x ( d / d x ) , a p t(x ) =
(i — x ) —
— ( 21 + 2 ) —
(i? — a ) g ( x ) = x 13 j e s t
. R o z w ią z a n ie m o g ó ln y m
g(x) = x^/{j3 — a ) + C x a d la a ^ /?; # ( x ) = x ^ ( l n x + C ) d la a = f3. Z a c h o d z i p t ( —t — 2 ) = 0 ; t a k w ię c o g ó ln y m r o z w ią z a n ie m n a s z e g o r ó w n a n ia r ó ż n ic z k o w e g o j e s t t
C (t){z) = (2 1 + 2 ) ! l n ( l - z)/p't ( - t - 2 ) ( 1 - z ) t+2 + ^
c,-( 1 -
,
3=0
g d z ie a o , ■* •, ckt s ą p ie r w ia s t k a m i r ó w n a n i a p t ( x ) = 0 , a s t a ł e Ci z a l e ż ą o d p o c z ą t k o w y c h w a r to ś c i C t , . . . , C 2t. K o r z y s t a j ą c z p o m o c n ic z e j t o ż s a m o ś c i
v
'
r o i °’
n^O
o t r z y m u je m y z a s k a k u ją c o p r o s t e zamknięte rozwiązanie ri
H n-^
1
i^i + 1 /
.
\ .
1 \
'
/
\ n —t
7 7 ----------- 77— (n + ! ) + ~y XJ2t + 2 — ^ t + 1 W: “
J=0i
i
z k t ó r e g o ła t w o m o ż n a j u ż w y p r o w a d z ić p o s z u k iw a n y w z ó r a s y m p t o t y c z n y . ( G ł ó w n y s k ła d n ik n \ n n / ( H 2t +2 — # i + i )
13
z o s ta ł u zy sk a n y p rzez M . H. v a n E m d e n a
[CACM
( 1 9 7 0 ) , 5 6 3 - 5 6 7 ] z a p o m o c ą m e t o d t e o r io in fo r m a c y jn y c h . P r z y p u ś ć m y , ż e c h c e
m y z a n a liz o w a ć d o w o ln y p r o c e s p o d z i a ł u t a k i , ż e le w y p o d c ią g z a w ie r a c o n a j w y ż e j
x N e le m e n tó w z a s y m p t o t y c z n y m p r a w d o p o d o b ie ń s t w e m f ( x ) dx, g d y N — ► o o , d la 0 ^ x ^ 1 ; v a n E m d e n u d o w o d n ił, ż e ś r e d n ia lic z b a p o r ó w n a ń p o t r z e b n a d o p e łn e g o p o s o r t o w a n ia c i ą g u w e jś c io w e g o w y n o s i a s y m p t o t y c z n i e a _ 1 r i l n n , g d z ie a = - 1 //0 ( f ( x ) + / ( ! — x ) ) x \ n x dx. T e n w z ó r s t o s u je się z a r ó w n o d o s o r t o w a n ia p o z y c y j n e g o , s o r to w a n ia s z y b k ie g o , j a k i w ie lu in n y c h a lg o r y t m ó w . Z o b a c z t a k ż e H . H u r w it z ,
CACM 14 30.
(19 7 1), 9 9 -1 0 2 ).
Rozwiązanie 1 (o h is t o r y c z n y m z n a c z e n iu ) : K a ż d y p o d c ią g i d e n t y f ik u je m y z a p o
m o c ą c z te r e c h w a r t o ś c i (/, r , k, X ) , g d z ie l i r s ą ( ja k z a z w y c z a j ) j e g o g r a n ic a m i, k j e s t l ic z b ą t y c h p o c z ą t k o w y c h s łó w w k lu c z a c h , o k t ó r y c h w ia d o m o , ż e s ą t a k i e s a m e w t y m p o d c ią g u , a X j e s t o g r a n ic z e n ie m d o ln y m d la (k + l ) - s z y c h s łó w w k lu c z a c h . Z a k ł a d a ją c , że k lu c z e s ą n ie u je m n e , n a p o c z ą t k u m a m y (Z, r , k , X ) = ( 1 , N , 0 , 0 ). W p r o c e s ie p o d z i a ł u z a K
b ie r z e m y (k + l ) - s z e s ło w o k lu c z a t e s t o w e g o K q. J e ś li K
t o w w y n ik u p o d z i a ł u w s z y s t k i e k lu c z e ^ K
> X,
z n a j d ą się z p r a w e j s t r o n y , a w s z y s t k i e
k lu c z e < K z n a jd ą się z le w e j s t r o n y ( p a t r z y m y t y lk o n a (k + l ) - s z e s ło w o w k a ż d y m k lu c z u ) ; id e n t y f ik a t o r a m i p o d c ią g ó w o t r z y m a n y c h w w y n ik u p o d z i a ł u s ą o d p o w ie d n io ( i,j- l,/ c ,X )
o r a z ( j , r , k , K ) . J e ś li j e d n a k K
s t r o n y z n a jd ą s ię w s z y s t k i e k lu c z e
>
X , to w w y n ik u p o d z ia łu z p raw ej K , a z le w e j s t r o n y w s z y s t k i e k lu c z e K =
[w r z e c z y w is t o ś c i = K]\ id e n t y f ik a t o r a m i o t r z y m a n y c h p o d c ią g ó w b ę d ą o d p o w ie d n io (Z, j , k + 1 ,0 ) o r a z (j + l , r , k , K ) . W o b u p r z y p a d k a c h n ie m a m y p e w n o ś c i, ż e n a s w o je j d o c e lo w e j p o z y c j i , p o n ie w a ż n ie s p r a w d z a liś m y s łó w
R j je s t
(k + 2 ) -g ic h . D a ls z e
p o p r a w k i u w z g lę d n ia ją c e w a r u n k i b r z e g o w e s ą o c z y w i s t e . P o d o d a n iu p ią t e j s k ła d o w e j ( „ g ó r n e g o o g r a n ic z e n ia ” ) o p is a n ą m e t o d ę m o ż n a u c z y n ić s y m e t r y c z n ą d la le w e j i p r a w e j stro n y .
682
ODPOWIEDZI DO ĆWICZEŃ
5.2.2
Rozwiązanie 2 , B e n t l e y i S e d g e w ic k [ S O D A 8 ( 1 9 9 7 ) , 3 6 0 - 3 6 9 ] : T a k j a k w r o z w i ą z a n i u 1 , n ie c h K b ę d z ie s ło w e m (k + l ) - s z y m w K q z p o d c ią g u o id e n t y fik a t o r z e (Z ,r, fc), a le t e r a z s t o s u je m y a lg o r y t m z ć w ic z e n ia 4 1 d o t r ó j p o d z i a ł u n a s z e g o p o d c ią g u n a (Z, i — 1 , &), (ż, J, k H - 1 ),
(j +
l , r , k) d la p r z y p a d k ó w < / i ,
> K . T o r o z w ią z a n ie ,
k t ó r e a u t o r z y n a z y w a j ą wielokluczowym sortowaniem szybkim , j e s t z n a c z ą c o le p s z e o d r o z w i ą z a n i a 1 i j e s t k o n k u r e n c y jn e d la n a j s z y b s z y c h z n a n y c h m e t o d s o r t o w a n ia s łó w . 3 1.
W y k o n u j e m y p r o c e s p o d z i a ł u i n ie c h R s b ę d z ie p o z y c j ą , n a k t ó r e j w k o ń c u z n a jd z ie
s ię R i . J e ś li s — m , t o p r z e r w ij; je ś l i s < m , z a s t o s u j t ę s a m ą t e c h n ik ę d o z n a le z ie n ia e le m e n t u ( m — s) c o d o w ie lk o ś c i w p r a w y m p o d c ią g u ; je ś l i j e d n a k s > m , t o z n a jd ź m - t y e le m e n t c o d o w ie lk o ś c i w le w y m p o d c ią g u . [ C A C M 4 ( 1 9 6 1 ) , 3 2 1 - 3 2 2 ; 1 4 ( 1 9 7 1 ) , 3 9 -4 5 ]. R . G . D r o m e y [Software Practice S¿ E xp eri ence 1 6 (1 9 8 6 ), 9 8 1 - 9 8 6 ] z a u w a ż y ł, ż e je ś li k a ż d ą fa z ę p o d z i a ł u z a t r z y m a m y n a t y c h m i a s t p o t y m j a k t y lk o i lu b j o s ią g n ą p o z y c j ę m , t o w y k o n a n y c h z o s t a n ie m n ie j p o r ó w n a ń i z a m ia n . 32.
R ó w n a n ie m r e k u r e n c y jn y m n a C nrn j e s t C\\ = 0 i C nm = n + 1 + ( A nm + B n7n)/n
d la n > 1 , g d z ie
Anm
^ ^
1^ d la 1 ^ za te m
772
^
77.
0(n~s)(rn —s)
Í
B nm. —
^ ^
m
s < m
Anm 4“ Cnm i
P o n ie w a ż - 4 ^ n + l) ( T T i + l)
m o ż e m y n a jp ie r w w y p r o w a d z ić w z ó r n a D n =
-R (n
+ l)m
— B nm 4” Cnm ;
(n 4- l ) C ( n + i) ( m + i) - n C n m ,
a n a s t ę p n ie p o p r z e s u m o w a n iu d o s t a ć p o s z u k iw a n e r o z w ią z a n ie 2((?7 4-1 ) H n — ( n + 2 —
m ) H n ^ i - m - { m + l ) H m P n + \ ) - \ d m n - \ b m i - \ 8 m n à m i - D l a 72 = 2 7 7 2 -1, t o j e s t r ó w n e 4 r n ( i f 2m - i “ i/ m ) 4 ” 4 r n - 4 i 7 m 4 - | ( l - 5 m i ) = ( 4 + 4 In 2 ) m - 4 l n m - 4 7 - f T O i m 1 ) « 3 .3 9 n . [ Z o b a c z D . E . K n u t h , Proc. I F I P Congress ( 1 9 7 1 ) , 1 9 - 2 7 ] . In n e r o z w i ą z a n i e m o ż n a o t r z y m a ć n a p o d s t a w ie w y n ik ó w z p u n k t u 6 .2 .2 . Z a łó ż m y , ż e k lu c z a m i s ą { 1 , 2 , . . . , n }
j
i n ie c h X j k b ę d z ie l ic z b ą w s p ó ln y c h p r z o d k ó w w ę z łó w
i k w d r z e w ie b in a r n y m o d p o w i a d a j ą c y m s o r to w a n iu s z y b k ie m u . W ó w c z a s m o ż n a
p o k a z a ć , ż e l i c z b a p o r ó w n a ń w y k o n y w a n y c h w a lg o r y t m ie z ć w ic z e n ia 3 1 je s t r ó w n a
Y . U x i 771 + Xmm — 2 [w ę z e ł m j e s t liś c ie m ] . P r a w d o p o d o b ie ń s t w o , ż e w ę z e ł i je s t j i k w lo s o w y m d r z e w ie w y s z u k iw a ń b in a r n y c h , w y n o s i l / ( m a x ( i , j, k) — m in ( ¿ ,J , k) + l ) . Ś r e d n ią lic z b ę p o r ó w n a ń d o s t a j e m y n a p o d s t a w ie
w s p ó ln y m p r z o d k ie m w ę z łó w fa k tó w , że E
Xjk — Hj
+ i 7 n + i_*¡ + 1 —
2Hk-j+i,
d la 1
j
fc,
i P r (w ę ze ł
liś c ie m ) = P r ( ż e w lo s o w e j p e r m u t a c ji p o m n ie w y s t ę p u j e 7 7 2 + 1 ) = | + |
m
je st +
[ Z o b a c z R . R a m a n , S I G A C T News 2 5 , 2 ( J u n e 1 9 9 4 ), 8 6 - 8 9 ] . Z a n a li z ą p o d o b n e g o a lg o r y t m u w y b o r u , a le z u ż y c ie m p o d z i a ł u z m e d ia n ą z t r z e c h m o ż n a z a p o z n a ć się w p r a c y K ir s c h e n h o f e r a , P r o d in g e r a i M a r t in e z a , R ando m Structu
res and Al go r it h ms 1 0 ( 1 9 9 7 ) , 1 4 3 - 1 5 6 . A s y m p t o t y c z n i e s z y b s z e m e t o d y s ą o m ó w io n e w ć w ic z e n iu 5 .3 .3 - 2 4 .
33.
N a l e ż y p o s t ą p ić t a k s a m o j a k w p ie r w s z e j fa z ie s o r t o w a n ia p o z y c y jn e g o , w y k o r z y
s t u j ą c z n a k i l ic z b z a m ia s t n a j b a r d z i e j z n a c z ą c y c h b itó w .
34.
W k a ż d e j fa z ie m o ż e m y u n ik a ć s p r a w d z a n ia , c z y i
c o n a jm n ie j j e d e n b i t o w a r t o ś c i 0 i c o n a jm n ie j je d e n b i t o w a r t o ś c i 1 - t z n . p o w y k o n a n i u p ie r w s z e j z a m ia n y w fa z ie . W
t e n s p o s ó b w p r o g r a m ie R o s z c z ę d z a m y
w p r z y b l i ż e n iu 2C j e d n o s t e k c z a s u .
A = N - 1 , B = ( m in 0 , a v e \ N l g N , m a x ^ J V lg J V ), C = N l g N, G = K = L — R — 0, S = \ N - 1 , X = ( m in 0, a v e ~ ( N — 1 ), m a x N - 1 ) . W o g ó ln y m
35.
p r z y p a d k u w a r t o ś c i p a r a m e t r ó w A , C , G , JĆ, L , R ï S z a le ż ą t y lk o o d z e s t a w u k lu c z y
5.2.2
ODPOWIEDZI DO ĆWICZEŃ
683
w e jś c io w y c h , a n ie o d ic h p o c z ą t k o w e g o u p o r z ą d k o w a n ia . W y j ś c i o w y p o r z ą d e k k l u c z y w p ły w a ty lk o n a w a rto ś c i B i X . 36.
( a ) E ( 3 ( - ) ( - l) H j^
=
=
o»- (b ) <*»o>;
( S n i ) ; ( ( - 1 )mSnm); { ( l - a ) n}\ ( (™) ( - a ) m ( 1 - a ) n “ m ). (c) J e ś li z a p is z e m y r o z w i ą z y w a n e r ó w n a n ie w p o s t a c i x n — yn — a n + z n , t o n a p o d s t a w ie (a ) m a m y yn — a n + z n ; t a k ż e
2i
= z n , t a k w ię c yn s p e łn i a t o s a m o r ó w n a n ie c o x n - [W ć w ic z e n ia c h 53
i 6 . 3 - 1 7 w p e w ie n s p o s ó b u o g ó ln ia m y t e n w y n ik . N ie w y d a j e się , ż e ł a t w o bezpośrednio u d o w o d n ić , ż e x n = an2 n _ 1/ ( 2n_1 — 1 )]. 3 7 1.
( S m Cm ( 2™ )2
” ) d la d o w o ln e g o c i ą g u s t a ł y c h co , c i , C2 , . . . . [Z te j o d p o w ie d z i,
c h o ć p o p r a w n e j, n ie w y n ik a n a t y c h m ia s t , ż e ( l / ( n + 1 )) i {n — <5n i ) s ą w ł a ś n ie t a k i m i c ią g a m i! C i ą g i p o s t a c i {an + a n) s ą z a w s z e d o s ie b ie d u a ln e . Z a u w a ż m y , ż e b io r ą c p o d u w a g ę fu n k c ję t w o r z ą c ą A ( z ) = ^
anz n/ n \, m a m y A ( z ) = e 2^4(— z ) ; z a t e m ^4 = A j e s t r ó w n o w a ż n e p o w ie d z e n iu , ż e A ( z ) e ~ z/2 j e s t f u n k c ją p a r z y s t ą ] . 38.
F a z a p o d z ia łu , w w y n i k u k t ó r e j o t r z y m u je m y le w y p o d c ią g r o z m ia r u s i p r a w y
p o d c ią g r o z m ia r u N — s , m a n a s t ę p u j ą c y w k ł a d d o o g ó ln e g o c z a s u d z ia ła n ia : A = 1,
B = i,
C = N,
g d z ie t j e s t l ic z b ą k l u c z y i ^ i , . . . ,
K = <5ai ,
L = <5so,
i? = <5Sj/v,
X = h,
o b ic ie b r ó w n y m 1 , a h j e s t b it e m b k l u c z a K s+ i ;
je ś li s = N) t o h = 0. ( Z o b a c z ( 1 7 ) ) . T o p r o w a d z i d o r ó w n a ń r e k u r e n c y jn y c h t a k i c h j a k
( Z o b a c z ć w ic z e n ie 2 3 ). P o r o z w ią z a n iu t y c h r ó w n a ń m e t o d ą z ć w ic z e n ia 36 o t r z y m u je m y w zory A n
Ln ~ Rn
39.
— V n — U n + 1, B n — \ { U n + N — 1 ), C n — V n + N, K n — N /2, ~ \ {Vn — U n — X ) + 1 , X n — ^ ( A jv L n )■ O c z y w i ś c ie G n — 0 .
W s o r to w a n iu s z y b k im , p o k a ż d e j fa z ie p o d z i a ł u , c o n a jm n ie j j e d e n e le m e n t z n a j
d z ie się n a s w o je j d o c e lo w e j p o z y c j i , a t o n ie m u s i się z d a r z a ć w s o r t o w a n iu p o z y c y j n y m ( z o b a c z t a b e la 3 ). 4 0 . J e ś li z a s t o s u je m y p r o s t e w s t a w ia n ie , ile k r o ć r — l < M w k r o k u R 2 , n ie b ę d z ie m y m ie li p r o b le m ó w , c h y b a ż e p o ja w i się w ię c e j n iż M t a k i c h s a m y c h e le m e n t ó w . J e ś li t o d r u g ie je s t p r a w d o p o d o b n e , t o m o ż e m y s p r a w d z a ć , c z y K i = * • * = K r , ile k r o ć j < l lu b j — r w k r o k u R 8 .
41.
L u t z M . W e g n e r [ IEE E Trans.
C-34
( 1 9 8 5 ) , 3 6 2 - 3 6 7 ] r o z w a ż a ł k ilk a s p o s o b ó w
r o z w ią z a n ia t e g o z a d a n ia , z k t ó r y c h n a s t ę p u j ą c y ( p r z e d s t a w io n y p o u p r o s z c z e n iu p r z e z B e n t le y a i M c ll r o y a w Software P ract ice Sz E x p .
23
( 1 9 9 3 ) , 1 2 5 6 - 1 2 5 8 ) w y d a j e s ię
n a jle p s z y w p r a k t y c e . P o d s t a w o w y p o m y s ł p o le g a n a p r z e t w a r z a n i u t a b l i c y k l u c z y p o d z ie lo n e j n a p ię ć c z ę ś c i = K
l
?
< K a
b
c
a ż d o c h w ili, w k t ó r e j ś r o d k o w a c z ę ś ć s t a j e się p u s t a . W p r z e r z u c a się d o ś r o d k a .
= K
> K
d
r
o s t a t n im k r o k u o b a k o ń c e
684
ODPOWIEDZI DO ĆWICZEŃ
5.2.2
/, c <— d
D l . [In icjo w a n ie ] a <— b
r.
Kb > K ] J e ś li b ^ c i iCf, < K , t o p o w ię k s z 6 o 1 i p o w t ó r z t e n k r o k . J e ś li 5 ^ c i Kb = K , z a m ie ń R a ^ Rb, p o w ię k s z a i 6 o 1 i p o w t ó r z
D 2 . [ P o w ię k s z a n ie
b aż
te n k rok.
D3.
aż K c < K ] J e ś li b ^ c i K c > K , z m n ie js z c o l i p o w t ó r z t e n c i K c = iC , t o z a m ie ń R c <-► z m n ie js z c i J o 1, i p o w t ó r z
[ Z m n ie js z a n ie c k r o k . J e ś li
b^
te n krok.
D4.
[Z a m ia n a ] J e ś li
b<
c, t o z a m ie ń Rb
R c , p o w ię k s z 5 o 1, z m n ie js z c o 1
i w ró ć do D 2.
D5.
[ P o r z ą d k o w a n ie ] Z a m ie ń R i + k t a k ż e i ? 6+fc
R r - fe d la 0 ^
/ + 6 — a, j
ż
<-»■
r — d + c.
d la
A: <
0^ k <
m in ( a — l ,b
m in ( d — c , r —
d).
—a );
z a m ie ń
N a k o n ie c w y k o n a j
|
P r o s t e m o d y fik a c je w k r o k u D l u m o ż liw ią e f e k t y w n ą o b s łu g ę z d e g e n e r o w a n y c h p r z y p a d k ó w i z a p e w n ią , ż e
„b ^
a
<
b
i c <
d
p r z e d p r z e jś c ie m d o D 2 . W ó w c z a s t e s t y
c ” w D 2 i D 3 n ie b ę d ą j u ż p o tr z e b n e ; z o b a c z ć w ic z e n ie 24. C o w ię c e j, t e z m ia n y
s p o w o d u ją , ż e w t y c h k r o k a c h n ie t r z e b a b ę d z ie w y k o n y w a ć z a m ia n r e k o r d ó w s a m y c h ze sobą. Jednym
z g łó w n y c h z a s t o s o w a ń s o r t o w a n ia je s t g r u p o w a n ie r e k o r d ó w o t a k ic h
s a m y c h k lu c z a c h . Z t e g o p o w o d u s c h e m a t z p o d z i a łe m
n a t r z y c z ę ś c i j e s t c z ę ś c ie j
s t o s o w a n y o d s c h e m a t u z p o d z i a ł e m n a d w ie c z ę ś c i z a lg o r y t m u Q . Z a m ia n y z k r o k u D 5 s ą b a r d z o w y d a j n e , p o n ie w a ż p o ic h w y k o n a n iu w s z y s t k i e r e k o r d y o k lu c z a c h r ó w n y c h K z n a j d u j ą się j u ż n a s w o ic h d o c e lo w y c h p o z y c ja c h . Z a d a n ie r o z w i ą z y w a n e w t y m ć w ic z e n iu j e s t a u t o r s t w a W . H . J. F e ije n a , k t ó r y n a zw a ł je
„ Z a d a n ie m
o fla d z e h o le n d e r s k ie j” : D a n y j e s t z b ió r c z e r w o n y c h , b i a ły c h
i n ie b ie s k ic h ż e to n ó w , k t ó r e z o s t a ł y lo s o w o r o z m ie s z c z o n e w je d n e j k o lu m n ie . P o k a ż , w j a k i s p o s ó b z a m ie n ia ć ż e t o n y p a r a m i t a k , ż e b y c z e r w o n e z n a la z ł y się w k o lu m n ie n a s a m e j g ó r z e , a b i a łe n a s a m y m d o le . N a l e ż y p r z y t y m s t o s o w a ć s ię d o r e g u ł, ż e k a ż d y ż e t o n o g lą d a m y ( s p r a w d z a m y j e g o k o lo r ) t y l k o r a z i że t y lk o k ilk a z m ie n n y c h m o ż e z o s t a ć u ż y t y c h d o s t e r o w a n ia c a ł y m p r o c e s e m . [Z o b a c z E . W . D i j k s t r a , Umiejętność
programowania ( W a r s z a w a : W N T , 1 9 7 8 , r o z d z i a ł 4].
42. J e s t t o s z c z e g ó ln y 41 ( 1 9 9 4 ) , 1 1 3 6 - 1 1 5 0 ,
p r z y p a d e k o g ó ln e g o t w ie r d z e n ia R . M . K a r p a ; z o b a c z J A C M §2.8 . Z n a c z ą c o o s t r z e js z e a s y m p t o t y c z n e o g r a n ic z e n ia n a c z a s
d z i a ł a n i a s z y b k i e g o s o r t o w a n ia z o s t a ł y o t r z y m a n e p r z e z M c D ia r m id a i H a y w a r d a , J. Al-
21 ( 1 9 9 6 ) , 4 7 6 - 5 0 7 . 43. D l a a —>0+ m a m y ya~1(e~v —1) dy + f™ ya~1e~y dy —T(d) —l/a ~ (r(a + l ) r ( i ) ) / a - r'(i) = - 7 , c o w y n i k a z ć w ic z e n ia 1 .2 .7 - 2 4 . 44. D l a k ^ 0 m a m y r k {m) ~ ± ( 2 m ) {k+l)/2r ( ( k + l ) / 2 ) - Sko B k+ 2j + i /
gorit hms
((k + 2j + 1 ) j l ( 2m y ) . G d y k = — 1 , w ó w c z a s w k ł a d d o ( 36 ) p o c h o d z ą c y z r e d u k u je s ię z p o d o b n y m i s k ła d n ik a m i w r o z w in ię c iu H m - 1 i o t r z y m u je m y r _ i ( m ) = Hm-1 +
( l/ V ^ m ) £ o o / - iW
-
| ( l n ( 2m ) +
7) ~
E ^ i ( - I ) ^ 2j / ( 2J )J ! ( 2 m ) Ć
D l a t e g o w k ł a d d o W m- i p o c h o d z ą c y z e s k ła d n ik a N l/t z ( 33 ) o t r z y m u je m y z s u m y
m
i_1 e x p ( - t 2/ 2 m ) ( l - t 3/ 3 m 2 + ¿6/ 1 8 m 4) ( l - i 4/ 4 m 3) ( l - t / 2 m - t 2/ S m 2) +
0 ( m “ 1 / 2) = | m l n m + ^ ( l n 2 + 7 ) m — ^ v /2 7 r m + | + 0 ( m _ 1 /2). S k ła d n i k - ^ N t~ 1 w n o s i — \ J 2 t ^i e x P ( — ¿2/ 2 m ) ( l — t s/ 3 m 2) ( l — t / 2 m ) ( l + t /m) + 0 ( m ~ 1/2) = — ~y/2rnn + S k ła d n ik
d a je
1 ) B 2N t~ 2 w y n o s i
N a k o n ie c m a m y , ż e w k ł a d p o c h o d z ą c y z e s k ła d n ik a
t e x p ( —t 2/2m) + 0 ( m * 1 /2) = X + 0 (m - i / 2y
~(t —
5.2.2
ODPOWIEDZI DO ĆWICZEŃ
685
45. Możemy argumentować tak samo, jak przy wyprowadzaniu (42 ), pom ijając residua w z = —1 i z — 0 . 46. Postępując tak jak z (4 5 ), otrzym ujem y (5 — l ) ! / l n 2 + <5s (n), gdzie 2
Ss(n) = t y ; 3ft(r(s —27tzA:/ ln 2) exp (27rife lg n)). In2 k > 1 [Z a u w a ż m y , ż e | r ( s + i i )|2 — ( r io < fc < s ( ^ 2 '^^2) ) 7r/ ( ^ s ^I1^17r^) ^ la l ic z b y c a łk o w it e j s ^ 0, t a k w ię c m o ż e m y o g r a n ic z y ć (^ ) ] •
47.
( n / 2 J ) s j e s t r ó w n e c a łc e z ć w ic z e n ia 46 d la w s z y s t
W r z e c z y w is t o ś c i
k ic h s > 0 .
48.
W y k o r z y s t u j ą c p o ś r e d n ią t o ż s a m o ś ć
_1
1
/*—■1/2+zoo
- e— = - 4 /
r ( * ) * " 'd * ,
p o s t ę p u je m y t a k , j a k o p is a n o w t e k ś c ie , p r z y c z y m z a 1 — e ~ x b ie r z e m y e ~ x — 1 + x;
V n+i /( n -h 1 ) — ( — l / 2 n i ) f S i / 2 - i M T ( z ) n “ z d z / ( 2 ~ z — 1 ) + 0 ( n “ 1 ), a w a r t o ś c ią c a ł k i j e s t l g n + 7 / ł n 2 — ^ — 5 o (n ) + O ( n “ 10° ) , p r z y o z n a c z e n ia c h z ć w ic z e n ia 46. [ Z a te m w a r t o ś c ią A n
49.
z
ć w ic z e n ia 38 j e s t J V ( l / l n 2 — 5 q (N — 1 ) — Ó - i ( N ) ) + 0 ( 1 ) ] .
P r a w ą s t r o n ę r ó w n o ś c i ( 40 ) m o ż n a p o p r a w ić d o o s z a c o w a n ia e ~ x ( l — \ x 2/ n +
0 ( ( x 3 + x 4) n ~ 2)). T e r a z n a le ż y o d j ą ć p o ło w ę s u m y z ć w ic z e n ia 4 7 , z a m i e n i a ją c 0 ( 1 ) | ( l / l n 2 + $i{n)) + 0 ( n - 1 ). ( „ 2 ” p o c h o d z i z „ 2 / n ” w ( 46 ) ) .
w ( 50 ) p r z e z 2 -
50.
[7mn =
n lo g m 71 + n ( ( 7 -
l)/ ln m
-
| + ¿ - i( n ) ) + m / (m — 1) -
1 / ( 2 ln m ) -
(n ) 4- 0 ( n - 1 ), g d z ie 5s (n) d e fin iu je się t a k j a k w ć w ic z e n iu 4 6 , a le z a m i e n i a ją c l n 2 i lg n a l n m i ło g m . [Uwaga: D l a m = 2, 3, 4, 5, 10 , 100 , 1000 i 1 0 6 m a m y o d p o w ie d n io
¿ -1 (n ) < 0 .0 0 0 0 0 0 17 2 5 0 1, 0 .0 0 0 0 4 12 2 7 , 0 .0 0 0 2 96 3, 0 .0 0 0 8 5 0 14 3 3 , 0 .0 0 6 2 70 4 , 0 .0 6 7 9 7 , 0 .1 5 2 5 , 0.348]. 51.
N ie c h N — 2 m . S u m ę ( 35 ) m o ż n a w z i ą ć p o w s z y s t k i c h t ^ l i
w t e d y r ó w n a s ię
ona
-i
£
/>a+ ioo
/
-i
r{z)(t2/N)~ztk dz = —
J a —i o o
Z 7TZ
r a + i oo
I
T{z)Nza i z ~ k) dz,
J a — i oo
p o d w a r u n k ie m , ż e a > (fc + l ) / 2 . T a k w ię c p o t r z e b u je m y w ie d z ie ć , j a k i e s ą w ła s n o ś c i fu n k c ji d z e t a . K i e d y 9ft(w) ^ — q, t o m a m y £(tu) = 0 ( | w | 9 + 1), p r z y \w\ —> 00 ; z a t e m m o ż e m y p r z e s u n ą ć p r z e d z ia ł c a łk o w a n ia w le w o t a k d a le k o , j a k t y lk o c h c e m y , je ś li t y l k o b ie r z e m y p o d u w a g ę r e s id u a . F u n k c ja T ( z ) m a b ie g u n y w 0, — 1 , — 2 , . . . , a £ ( 2 z ~ k ) m a t y lk o je d e n b ie g u n w z = (k - f l ) / 2 . R e s id u u m w z = —j j e s t
— h)/j\,
a C ( - n ) = ( - l ) n R n + i / ( n + 1 ). R e s id u u m w z = (k + l )/2 j e s t ^ T ( ( k + 1 ) / 2 ) N ^ 1^ 2. J e d n a k g d y k = — 1 , is t n ie je p o d w ó j n y b ie g u n w z = 0; i ( ( z ) = 1 / ( 2 — l ) + 7 + 0 (|z — 1|), t a k w ię c r e s id u u m w 0 j e s t w t y m p r z y p a d k u 7 + | ln N — ¿ 7 . W t e n s p o s ó b o t r z y m u je m y s z e r e g a s y m p t o t y c z n y , o k t ó r y m b y ł a m o w a w o d p o w ie d z i d o ć w ic z e n ia 44.
52.
W eźm y x — t/ n ; w ów czas
{/+/)
/ C r ) =«»ppm*2/1•2+x*/3■4+■ ■■)+i*2/2+ z4/4+• ■•) -
(l/6n)(x2 - x 4 H
) H
);
686
ODPOWIEDZI DO ĆWICZEŃ
5.2.2 ¿fed (£ ) e _ i ¡ n d la r ó ż n y c h k. P o s t ę
n a s z ą s u m ę m o ż n a t e r a z w y r a z i ć w t e r m in a c h p u je m y j a k w ć w ic z e n iu 5 1 . P o n ie w a ż r e s id u a
r(z)nzę(2z
((z)2
—
z a t e m c h c e m y o b lic z y ć
— k ) 2 p r z y k ^ 0. W z = — j r e s id u u m j e s t
n~j ( - i y ( B 2j+k+1/(2j
+ k + 1 ) f / j \,
(k + l )/2 w y n o s i o n o n^k+1^ 2V ( ( k + l ) / 2 ) ( /y + \ I n n -I- \ ^ { { k + l ) / 2 ) ) , g d z ie 4>(z) — T f{ z) /T {z ) — H z - \ — 7 ; t a k w ię c , n a p r z y k ł a d , g d y k = 0, w ó w c z a s a w z
=
e ~ t2^nd(t) — \ y f n n I n n + ( § 7 — | ln 2 ) -y/Tm + - +
0(n~M)
D l a S n / ( 2™) d o d a je m y d o t e j w ie lk o ś c i ( — I n n 4 - — 7 4 - ^
d la w s z y s t k ic h M .
^ \n2)y/n/n 4 - 0 ( n _ 1 ).
( Z o b a c z ć w ic z e n ia 1 .2 .7 - 2 3 i 1 .2 .9 - 1 9 ) .
53.
N ie c h q =
1
— p . U o g ó l n ia j ą c ć w ic z e n ie 3 6 ( c ) , je ś li
1
\
^ ( ^ \
(
k
n —k
x n = a n + 2_^{ k ) (P Q
1
k
+ QP
n —k \
) x k,
kä 2 to X r = On +
O f e ^ + ę fe) / ( l - / k>
- qk).
2
i C n m o ż n a w y z n a c z y ć j a k p o p r z e d n io ; w s p ó łc z y n n i k ~ w B n
Z t e g o w y n ik a , ż e
p o w in ie n z o s t a ć z a s t ą p i o n y p r z e z pq. B a d a n ie a s y m p t o t y c z n e g o z a c h o w a n ia się Un p r z e b ie g a w z a s a d z ie t a k j a k w t e k ś c ie , p r z y c z y m
T" =
£ ( ;)(e -" p V -* - l + npV-*) r^l, s^O 1
3 / 2 +ioo
Z-. /
r(z)rr‘ (p-‘ + q~*) dz/il - p~z -
27TŹ ioo STTi 7y —3 - 3 / 22 — -io o
= (n//&p ) ( l n n + 7 - 1 + /ip2V 2 /ip - hp 4- <5(n)) + 0 ( 1 ) , g d z ie hp =
~ ( p \ n p + q\ nq), h p2) = p ( l n p )2 + q(\nq)2 i - 1 , q — 0 - 2 , r o z w ią z a n ia m i s ą z = ( — l ) fe+1 + k n i / l n Ą . D o m in u ją c y s k ła d n ik ( n l n n ) / / i p s u m o w a n ie o d b y w a się p o w s z y s t k i c h l ic z b a c h z e s p o lo n y c h 2 /
m o ż n a b y t a k ż e o t r z y m a ć z o g ó ln e g o w z o r u v a n E m d e n a c y t o w a n e g o w o d p o w ie d z i d o ć w ic z e n ia 29, D l a p — 0 _1 o t r z y m u je m y l / h p & 1 .5 0 3 7 1 8 , w p o r ó w n a n iu z l / h i /2 w 1 .4 4 2 6 9 5 .
54.
N ie c h C
b ę d z ie o k r ę g ie m o p r o m ie n iu (M + |)£> t a k im , ż e c a ł k a p o C d ą ż y d o
z e r a , g d y M — ►00 . ( M o ż n a t e r a z w in n y s p o s ó b o t r z y m a ć a s y m p t o t y c z n ą p o s t a ć Un , r o z w ija ją c
r(n+
1 ) / T ( n + ibm). M e t o d a o p is a n a w t y m ć w ic z e n iu m a z a s to s o w a n ie d o
wszystkich s u m p o s t a c i
^ ( I ) * " 1^
k
" ^
= 2^7 ł
J
B (n + l,-z)f{z)d z,
g d z ie / z a c h o w u je s ię w y s t a r c z a j ą c o d o b r z e . O s t a t n i w z ó r m o ż n a z n a le ź ć w p r a c y N . E . N ö r lu n d a Vorlesungen über Differenzenrechnung ( B e r lin : S p r in g e r , 1 9 2 4 ), § 1 0 3 ).
5.2.2 55.
ODPOWIEDZI DO ĆWICZEŃ
687
Z a m ie ń lin ijk i 0 4 - 0 6 w p r o g r a m ie Q p r z e z
JGE 5F 2H ENTA 0 ,2 STA INPUT,3 c ^ b < a CMPX INPUT,4 INCA 0 ,3 STX INPUT,2 a
...
1
p o t r z e b a w ó w c z a s N 2 k r o k ó w . ( T e n z a s k a k u j ą c y f a k t p ie r w s z y z a u w a ż y ł D . B . C o ld r ic k i t r u d n o w n ie g o u w ie r z y ć — p r z e k o n a j s ię !). T e c h n ik a o p is a n a p o w y ż e j z o s t a ł a z a p r o p o n o w a n a p r z e z R . S e d g e w ic k a i o k a z a ł a się w o ln a o d t a k i c h z ł o ś l i w y c h a n o m a lii, a w d o d a t k u d a j e s z y b k i a lg o r y t m . W p o d z ia le z „ m e d ia n ą z t r z e c h ” n ie k o r z y s t a się z k lu c z a s t r a ż n ik a K n + 1 , a le b y ć m oże n a d al trz e b a sp ra w d za ć Ko w k ro k u Q 9.
56.
+ 2
R ó w n a n ie r e k u r e n c y jn e ( g ) x n =
(k — l ) ( n — k ) x k - i d la n > m m o ż n a
r o z w ią z a ć , b io r ą c yn =
n x r U r = nyn+i - (n - f 2)yr = nUn + l — {n — 5 ) lir W y n i k a s t ą d , że vn = 6 ( 6n+2 — 26n + i + bn ) d la n > m. Przykład: N ie c h x n — 5ni d la n rri i n ie c h bn = 0. W ó w c z a s vn = 0 d la w s z y s t k i c h n > m , s t ą d n s i i n+ i — 1U 5 . P o n ie w a ż m a m y y m+ i = 1 2 j m o r a z y m+2 — 1 2 / ( m + 1 ) , w k o ń c u d o s t a j e m y x n = 4 ^ (n + l ) / m ( 7?i + l ) ( m + 2) + ^ - ( m — 1 ) 4/116 d la n > m. O g ó ln ie , n ie c h f n — ( l 2 / ( n — l ) ( n — 2 )) 2 f c = i ( ^ — l ) ( n — k ) x k - i ,’ r o z w ią z a n ie m d la n > m , g d y bn j e s t t o ż s a m o ś c io w o r ó w n e z e r u , j e s t X T = (n + 1)
( m + l ) f m+2 - (m - 4 ) / m + i
( ( m + 1 ) / m+2 -
7(m + l)(m T 2)
(m + 3) / m + i ) m 5
7n6
G d y bn ~ ( 3) / n p i x n = 0 d la n ^ m , r o z w ią z a n ie m je s t
( p - 3 ) { p - 2) n + 1
( p - 6) ( p + l ) ( n + l ) p + i
+
12
12 (m + 1 - p ) e-.
7 ( p + l ) ( m + 2 )p + i
7 (p - 6 ) ( n + 1)7 ’
d la n > m ; w y j ą t k i e m j e s t p = — 1 , g d y d o s t a j e m y x n / (n + 1 ) = ^ ( H n+i — -ffm + 2 ) + H + 3§ ( m + 2 ) l / ( n + i ) ! ) i P = 6 , g d y x n/ { n + 1 ) = -
4f / ( m + 2) i+ H /(n + 1)1-
- H m- 5) / ( n + 1)7 +
688
5.2.2
ODPOWIEDZI DO ĆWICZEŃ
R o z u m u ją c p o d o b n ie j a k w ć w ic z e n ia c h 2 1 - 2 3 , w id z im y , ż e p ie r w s z a f a z a p o d z i a łu w n osi te ra z 1 do
po
A, t
do
B
i je s t
i iV — 1 d o C , g d z ie
z d e fin io w a n e j a k p o p r z e d n io , a le
p r z e m ie s z c z e n ia c h o p is a n y c h w ć w ic z e n iu 5 5 . P r z y t y c h z a ło ż e n ia c h m a m y
=
bstN
6 ( s ~ 2) ( jiV~ts _ 1) / A r ( JJ “ 11); t a k w ię c r ó w n a n ie r e k u r e n c y jn e o p is a n e p o w y ż e j p o ja w i a się w n a s t ę p u j ą c y c h p o s t a c ia c h :
An Bn Dn En
Wartość dla N ^ M
W (£) dla N > M
Rozwiązanie dla N > M
0 0 o N —H n N(N-l)/4
1 (7V-4)/5 IV- 1 o 0
(JV+l)(“ / ( M + 2 ) ) —l + 0(iV_6) (CN - 3 A N )/b ( I V + l ) ( ^ ( R N+1- H M + 2) + i - ^ / ( M + 2) ) + 2+ 0 (IV-6) ( I V + 1 ) ( 1 - ^ / / m + i / ( M + 2 ) - | / ( M + 2)) + 0 ( I V - 6) (AT + l ) ( ^ M - ^ + f / ( M + 2 ) ) + 0 ( 7 V - 6)
P o d o b n ie
Sn = f (N +
1)(5 M
+
3 )/ (2 M
+
3 )(2 M
+ 1) -
c z a s d z i a ł a n i a p r o g r a m u z ć w ic z e n ia 5 5 w y n o s i 53 ^
9Sn + 7N;
w ybór
M = 9 je s t
1
+ 0(N~6).
Ł ączn y , śred n i
+ 11 B n + 4C n + 3D n + 8 E n +
M = 10 , d a j ą c ś r e d n i c z a s d z i a ła n i a + 2 .1 1 6 I V [Acta Inf. 7 ( 1 9 7 7 ) , 3 3 6 - 3 4 1 ] . B io r ą c d o ś r e d n ie g o c z a s u d z i a ła n i a i w z ią ć M — 10.
n ie z n a c z n ie le p s z y n iż
w y n o s z ą c y w p r z y b l i ż e n iu 1 0 § § i V l n i V D IV z a m ia s t SRB, n a le ż y d o d a ć llv 4 jv
5.2.3
1.
N ie ; r o z w a ż p r z y p a d e k
K\ > K 2 — • • *
=
Kn.
00
J e d n a k m e t o d a z u ż y c ie m
( o p is a n a t u ż p r z e d a lg o r y t m e m S ) j e s t s t a b iln a .
2 . P r z e g lą d a n ie l is t y lin io w e j p r z e c h o w y w a n e j s e k w e n c y jn ie w p a m ię c i j e s t c z ę s t o t r o c h ę s z y b s z e , je ś li r o b im y t o o d in d e k s ó w n a j w y ż s z y c h d o in d e k s ó w n iż s z y c h , p o n ie w a ż z a z w y c z a j k o m p u t e r m o ż e ła t w i e j s p r a w d z a ć , c z y in d e k s j e s t z e r e m , n iż s p r a w d z a ć , c z y j e s t w i ę k s z y o d N. (Z t e g o s a m e g o p o w o d u w y s z u k iw a n ie w k r o k u S 2 p r z e b ie g a o d j d o 1 ; z o b a c z j e d n a k ć w ic z e n ie 81). 3.
(a ) P e r m u t a c ję 0 1 . . . o n - i N d o s t a j e m y z
N d2 • • • & n —i &i-> CbiNas . . . aN—i & 2 ,
• • •,
0,1 <22 . . . a jv —2 N a N - i ,
(b ) Ś r e d n ia l ic z b a p r z y p a d k ó w , w k t ó r y c h p o d c z a s p ie r w s z e j i t e r a c ji k r o k u S 2 z m ie n ia się m a k s im u m , w y n o s i H n — 1 , c o p o k a z a n o w p u n k c ie 1 .2 .1 0 . [ Z a te m B n m o ż n a o b li c z y ć z a p o m o c ą 1 .2 .7 - ( 8 ) ] . 4.
J e ś li n a w e jś c iu j e s t d a n a p e r m u t a c j a z b io r u { 1 , 2 , . . . , I V } , t o lic z b a p r z y p a d k ó w ,
w k t ó r y c h i = j w k r o k u S 3 , j e s t d o k ła d n ie o je d e n m n ie js z a o d lic z b y c y k li w te j p e r m u t a c ji. ( C o w ię c e j, n ie t r u d n o p o k a z a ć , ż e w k r o k a c h S 2 i S 3 e le m e n t j j e s t p o p r o s t u u s u w a n y z c y k lu ; z a t e m k r o k S 3 j e s t n i e a k t y w n y t y lk o w t e d y , k ie d y j j e s t n a jm n ie js z y m e le m e n t e m w c y k l u ) . Z 1 . 3 . 3 - ( 2 i ) o t r z y m u je m y , ż e m o ż n a ś r e d n io z a o s z c z ę d z ić H n — 1 z i V - l
w y k o n a ń k ro k u S3.
T a k w ię c d o d a n ie p r z e d k r o k ie m S 3 e k s t r a t e s t u J e d n a k ż e z a m ia s t p o ró w n y w a ć i z j
„i =
j? ”
j e s t n ie e fe k ty w n e .
m o g lib y ś m y w y d łu ż y ć n ie c o p r o g r a m
d la S 2 ,
p o w i e l a j ą c c z ę ś ć k o d u t a k , ż e b y n ig d y n ie w c h o d z ić d o S 3 , je ś li p o c z ą t k o w a w a r t o ś ć
Kj
n ie z m ie n ia s ię p o d c z a s w y s z u k i w a n i a m a k s im u m ; t o c z y n i ło b y p r o g r a m S n ie z n a c z n ie szyb szym .
5. (IV — 1) + (JV —3) + •
= LJV2/4 J.
5.2.3
ODPOWIEDZI DO ĆWICZEŃ
689
6 . (a) J e ś li i / j w k r o k u S 3 , t o w t y m k r o k u l ic z b a in w e r s ji z o s t a n ie z m n ie js z o n a 0 2 m — 1 , g d z ie m je s t o je d e n w ię k s z e o d lic z b y k l u c z y w K i + i . . . K j - ± , k t ó r e le ż ą m ię d z y K i a K j ; o c z y w iś c ie m n ie j e s t m n ie js z e o d w k ł a d u d o B z p o p r z e d n ie g o k r o k u S 2. T e r a z m o ż n a w y k o r z y s t a ć o b s e r w a c ję z ć w ic z e n ia 4 o p o w ią z a n ia c h c y k li z w a r u n k ie m i — j , (b ) K a ż d ą p e r m u t a c ję m o ż n a o t r z y m a ć z N . . . 2 1 p r z e z k o le jn e z a m ia n y s ą s ie d n ic h e le m e n tó w , k t ó r e n ie s ą u p o r z ą d k o w a n e . ( W t y m c e lu m o ż n a z a s t o s o w a ć w p o r z ą d k u o d w r o t n y m z a m ia n y , k t ó r e s o r t u j ą t ę p e r m u t a c ję m a le ją c o ) . K a ż d a t a k a o p e r a c ja z m n ie js z a I o je d e n i z m ie n ia C o ± 1 . Z a t e m , d la ż a d n e j p e r m u t a c ji, w a r t o ś ć 1 — C n ie j e s t w ię k s z a o d te j w a r t o ś c i d la N . . . 2 1 . [Z ć w ic z e n ia 5 m a m y , ż e n ie r ó w n o ś ć B ^ [ N 2/4\ j e s t n a j le p s z a z m o ż liw y c h ] , 7.
W
p racy A . C . Y ao,
„ O n s t r a i g h t s e le c tio n s o r t ” , C o m p u t e r S c ie n c e T e c h n ic a l
R e p o r t 18 5 ( P r in c e t o n U n iv e r s it y , 19 8 8 ), p o k a z a n o , ż e w a r ia n c ja t a w y n o s i a N 1'5 +
0 ( N 1A95 lo g W ), g d z ie a —
w 0 .9 12 9 ; A . C . Y a o p o s t a w i ł t a k ż e h ip o t e z ę , ż e
r z e c z y w is t y s k ła d n i k b łę d u j e s t z n a c z n ie m n ie js z y .
8 . N a s t ę p n ą it e r a c ję k r o k u S 2 m o ż n a r o z p o c z ą ć o d p o z y c j i K i p o d w a r u n k ie m , ż e z a p a m ię t a liś m y m a x ( K i , . . . , i ć - i ) .
J e d e n z e s p o s o b ó w u t r z y m y w a n i a c a łe j te j d o
d a tk o w e j in fo r m a c ji p o le g a n a u ż y c i u t a b l i c y d o w ią z a ń L \ . .. L n t a k i e j , ż e K h k j e s t p o g r u b io n y m e le m e n te m p r z e d p o g r u b io n y m e le m e n t e m K^\ L i — 0. [ M o g lib y ś m y u ż y ć m n ie j d o d a tk o w e j p a m ię c i k o s z te m p e w n y c h r e d u n d a n t n y c h p o r ó w n a ń ] . W
p o n iż s z y m p r o g r a m ie n a m a s z y n ę MIX k o r z y s t a się z m o d y fik a c ji a d r e s u d la
05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
21 28
7H 8H 6H
4H
9H 5H
1 1 1
j, rI3
c
01 START ENT1N STZ LINK+1 02 JMP 9F 03 04 1H ST1 6F(0:2)
= k —
II!
przyśpieszenia pętli wewnętrznej, r ll = j, rI2
j^N .
N —D Modyfikacja adresów w pętli. N-D N—D N-D N-D
ENT4INPUT,1 ST4 7 F (0 :2) ENT4LINK,1 ST4 8 F (0 :2) CMPAINPUT+J,2 A JGE *+4 A ST3 LINK+J ,2 N-\-1— C ENT3J,2 N+l-C LDA INPUT,3 N + l - C INC21 A J2NP7B A LDX INPUT,1 N STX INPUT,3 N STA INPUT,1 N DEC11 N ENT20,3 N LD3 LINK,3 N J3NZ5F N ENT31 C ENT22 C DEC20,1 IV + 1 LDA INPUT,3 IV + 1 J2NP1B IV+ 1 J1P 4B DAI
[Zmodyfikowany adres] Skok, jeśli K i ^ K k W przeciwnym razie
L k
<—
i*-k.
i, [Zmodyfikowany adres] [Zmodyfikowany adres]
k<—k+l . S k o k , je ś li k ^ j .
R i^ R j. R j -«— p o p r z e d n ie Ri. rI2 <— ż.
%^ Li
.
J e ś li ¿ > 0 , k s t a r t u j e o d i. W p r z e c iw n y m r a z ie
k s t a r t u je o d 2. rA ^ K i. S k o k , je ś li k ^ j . S k o k , je ś li j > 0 .
|
1.
690 9.
ODPOWIEDZI DO ĆWICZEŃ N — 1 +
2^
5.2.3
~~ l ) f ó ~ V & ) ~ ł ( ^ ) + N ” Hn- [Ś re d n ie w a r to ś c i C i D
w y n o s z ą o d p o w ie d n io H n + 1 i H n ~ w ynosi
s t ą d ś r e d n i c z a s d z i a ła n i a t e g o p r o g r a m u
(1.25N 2 + 31.75iV —15ii/v + 14.5)u].
087 087 —oo
—oo 061
—oo
—oo —oo
—oo
—oc —oo
—oo
—oo
087 —oo 061 —oo —oo —oo —oo —oo —oo —oo —oc —oo —oo —oo —oo
503 087 —oo
P r o g r a m H j e s t d u ż o le p s z y .
275 061
170
653 oo
426
703 509
677
-o o
—oo—oo —oo —oo —oo —oo —oo —oo —oo 154 —oo 612 —oo —oo —oo
1 2 . 2n - 1 , r a z d la k a ż d e j w a r t o ś c i — oo w w ę ź le - r o z g a łę z ie n iu . 13 .
J e ś li K
^ K r+ 1 , t o z k r o k u H 4 m o ż n a p r z e jś ć d o k r o k u H 5 , g d y j
= r. (K ro k
H 5 j e s t n ie a k t y w n y , c h y b a ż e K r < K r+ 1 , k ie d y t o z k r o k u H 6 i t a k p r z e jd z ie się d o k r o k u H 8 ). Ż e b y b y ć p e w n y m , ż e K ^ K r +1 p o d c z a s w y k o n y w a n ie a lg o r y t m u , m o ż n a w y s t a r t o w a ć o d K n + i ^ m i n ( i ć i , . . . , i ć v ) ; z a m ia s t w y k o n a n ia R r
R i w k ro k u H 2,
n a le ż y w y k o n a ć R r +1 *— R n + i i R n + i <— i i i ; t r z e b a t a k ż e w y k o n a ć R 2 <— R n + i , p o t y m j a k r = 1. ( T a s z t u c z k a a n i n ie p r z y ś p i e s z a a lg o r y t m u , a n i n ie c z y n i p r o g r a m u H k ró tszy m ). 14.
Ż e b y u z y s k a ć k o le jk ę p r o s t ą ( lu b o d p o w ie d n io s t o s ) , w s t a w i a n y e le m e n t p o w in ie n
o t r z y m a ć k lu c z , k t ó r y j e s t m n ie js z y ( lu b w ię k s z y ) o d w s z y s t k i c h w c z e ś n ie j p r z y z n a n y c h k lu c z y ). 15.
W c e lu u z y s k a n ia w ię k s z e j e f e k t y w n o ś c i s t o s u je m y n a s t ę p u ją c e s p r y t n e r o z w ią z a
n ie , u n i k a ją c w s z y s t k i c h w ie lo k r o t n iś c i 3 [ C A C M 1 0 ( 1 9 6 7 ) , 570 ]. K rok P I.
W y k o n a j p [ l] <— 2, p[ 2]
3, k <— 2, n <— 5 , d
i u m ie ś ć ( 2 5 ,1 0 ,3 0 ) w k o le jc e p r io r y t e t o w e j. ( W p ie r w s z e j; k =
2, r
1 , t <— 25
t y m a lg o r y t m i e p[i] — ¿-tej lic z b ie
lic z b ie d o t y c h c z a s z n a le z io n y c h lic z b p ie r w s z y c h ; n
=
k a n d y d a to w i
n a lic z b ę p ie r w s z ą ; d — o d le g ło ś c i d o n a s t ę p n e g o k a n d y d a t a ; r = lic z b ie e le m e n tó w w k o le jc e ; t = p[r + 2 ]2, t j. n a s tę p n e j lic z b ie n , d la k t ó r e j p o w in n iś m y z w ię k s z y ć r. E l e m e n t y k o le jk i m a j ą p o s t a ć (u , u , 6p ) , g d z ie p j e s t n a jm n ie js z ą lic z b ą p ie r w s z ą , k t ó r a j e s t d z ie ln ik ie m u, v — 2p lu b 4p , a u + v n ie j e s t w ie lo k r o t n o ś c ią 3). K r o k P 2 . N ie c h (q, q(, q ,f) b ę d z ie n a jm n ie js z y m e le m e n t e m w k o le jc e , k t ó r y m a n a j m n i e j s z ą p i e r w s z ą s k ła d o w ą . Z a m ie ń g o w k o le jc e p r z e z (q + q \ q f/ — q \ q ' ł )> (T o o z n a c z a , ż e n a s t ę p n a w i e lo k r o t n o ś ć qtf/% m u s i b y ć w y ł ą c z o n a z r o z w a ż a ń ) . J e ś li n > q, t o p o w t a r z a j t e n k r o k , a ż b ę d z ie s p e łn io n y w a r u n e k n ^ q. K r o k P 3 . J e ś li n > N, t o z a k o ń c z w y k o n y w a n ie a lg o r y t m u . W p r z e c iw n y m r a z ie , je ś l i n < g, w y k o n a j k <— k + 1 , p[k]
n, n
n + d , d <— 6 — d i p o w t ó r z t e n k r o k .
5.2.3
ODPOWIEDZI DO ĆWICZEŃ
691
K ro k P 4 . ( T e r a z n = q n ie j e s t l ic z b ą p ie r w s z ą ) . J e ś li n = t, t o w y k o n a j r <— r + 1 , u <— p[r + 2], t <— u2 i w s t a w (£, 2 u , 6 u ) lu b (t, 4w, 6 u ) d o k o le jk i, z a le ż n ie o d t e g o , c z y u m o d 3 = 2, c z y u m o d 3 = 1. K ro k P 5 . W y k o n a j n <— n + d, d 6 — d i p o w r ó ć d o ( P 2 ). T a k w ię c o b lic z e n ia r o z p o c z y n a j ą s ię w n a s t ę p u j ą c y sp o s ó b : Z a w a r t o ś ć k o le jk i
Z n a le z io n e l ic z b y p ie r w s z e
(2 5 , 10 , 30)
5 , 7 , 1 1 , 1 3 , 1 7 , 1 9 , 23
(3 5 , 20, 3 0 ) (49,
28, 4 2 )
29, 3 1
(4 9 , 28, 4 2 ) ( 5 5 ,
10 , 30)
37,
(5 5 , 10 , 3 0 ) ( 7 7 ,
14 , 4 2 ) ( 1 2 1 ,
4 1, 43, 47
22 , 66 ) 53
J e ś li k o le jk a je s t r e p r e z e n t o w a n a j a k o k o p ie c , t o w s z y s t k i e l ic z b y p ie r w s z e ^ N m o ż n a z n a le ź ć w m n ie j n iż 0 ( N lo g N ) k r o k a c h ; r o z m ia r k o p c a w y n o s i c o n a j w y ż e j t y l e , ile j e s t lic z b p ie r w s z y c h ^ y/N. S i t o E r a t o s t e n e s a , z a im p le m e n t o w a n e t a k j a k w ć w ic z e n iu 4 .5 .4 - 8 , d z i a ła w c z a s ie 0 ( i V T o g l o g N ) , a le j e s t m e t o d ą w y m a g a j ą c ą z n a c z n ie w ię c e j p a m ię c i o d o s tę p ie b e z p o ś r e d n im . E f e k t y w n i e js z e im p le m e n t a c je o m a w ia m y w p o d r o z d z ia le 7 .1 .
16. K ro k I I . K ro k 12 . K ro k 13.
K J e ś li
w s t a w i a n y k lu c z ;
[j/ 2J. i—0
j <— n +
1.
lu b K i ^ K , t o w y k o n a j K j <— K i z a k o ń c z w y k o n y w a n ie
a lg o r y t m u .
K ro k 14.
W y k o n a j / i? <—
iC , j
[T . P o r t e r i I. S im o n p o k a z a li w
i i p o w ró ć do k roku
IEEE Trans. SE-1
12.
( 1 9 7 5 ) , 2 9 2 - 2 9 8 , ż e je ś l i
An+1
o z n a c z a ś r e d n ią lic z b ę w y k o n a ń k r o k u 4, d la lo s o w e g o k o p c a z b u d o w a n e g o z lo s o w y c h lic z b o r o z k ła d z i e j e d n o s t a j n y m , t o
n=
An
=
[_lg n j + (1 —
n~1)An> d la n
>
1 , g d z ie
( l b i - i b i - 2 • • • i>o)2 im p lik u je rt = ( l b i ~2 . . . £>0) 2 • J e ś li l = [ l g n j , t o t a w a r t o ś ć j e s t
z a w s z e ^ A 2i + i _1 = ( 2Z+1 — 2 ) / ( 2i+1 — 1 ) i z a w s z e ^ A 2i < a , g d z ie a j e s t s t a ł ą z ( 19 )].
17.
A l g o r y t m H z a s t o s o w a n y d o c i ą g u w e jś c io w e g o 1 2 3 d a j e k o p ie c 3 2 1 , n a t o m ia s t
(Uwaga:
a lg o r y t m z ć w ic z e n ia 16 d a j e c i ą g 3 1 2 .
P e s y m is ty c z n y c z a s b u d o w y k o p c a
d r u g ą m e t o d ą j e s t r z ę d u iV T o g 7V; j e d n a k ż e t e s t y e m p ir y c z n e w y k a z a ły , ż e d la d a n y c h lo s o w y c h ś r e d n ia lic z b a it e r a c j i k r o k u 2 p o d c z a s f a z y b u d o w y k o p c a j e s t m n ie js z a n iż
2.2SN. R . H a y w a r d i C . M c D ia r m id [J.
Algorithms
1 2 ( 1 9 9 1 ) , 1 2 6 - 1 5 3 ] u d o w o d n ili
śc iś le , ż e w s p ó łc z y n n i k p r o p o r c jo n a ln o ś c i le ż y m ię d z y 2 .2 7 7 8 a 2 .2 9 9 4 ).
18.
N a le ż y u s u n ą ć k r o k H 6 i z a s t ą p i ć H 8 p r z e z : H S 7. [R u ch w górę] W y k o n a j
j <—i, i
[ C z y K p a s u je ? ] J e ś li K ^ K i lu b
[j / 2 J . j
— l, t o w y k o n a j R j <— R i w r ó ć d o H 2 . W p r z e c iw n y m r a z ie w y k o n a j R j «— R t i w r ó ć d o H 8'. | T o je s t w z a s a d z ie t a s a m a m e t o d a c o w ć w ic z e n iu 1 6 , je d n a k s t a r t u j e z in n e g o m ie js c a w k o p c u . J ej o d d z i a ły w a n ie n a p lik w e jś c io w y j e s t t a k i e s a m o j a k a lg o r y t m u H . T e s t y e m p ir y c z n e t e j m e t o d y p o k a z u ją , ż e l ic z b a p r z y p i s a ń R j
Rt w j e d n y m p r z e s ie w a n iu
p o d c z a s f a z y w y b i e r a n i a w y n o s i o d p o w ie d n io ( 0 , 1 , 2 ), z p r a w d o p o d o b ie ń s t w a m i (0 .8 3 7 , 0 .1 3 5 , 0 .0 16 ). P r z y te j m e t o d z ie p r o g r a m H j e s t t r o c h ę d łu ż s z y , a le j e g o a s y m p t o t y c z n a s z y b k o ś ć p o p r a w ia się d o 1 3 N lg N + O ( N ) . W s k a z a n e j e s t u ż y c i e in s t r u k c j i m a s z y n y MIX d o d z ie le n ia p r z e z d w a w a r t o ś c i r e je s t r u in d e k s o w e g o . C.
J. H . M c D ia r m id i B . A . R e e d [J.
Algorithms 10
( 1 9 8 9 ), 3 5 2 - 3 6 5 ] u d o w o d n ili
t a k ż e , ż e d z ię k i t e j m o d y fik a c ji o s z c z ę d z a m y ś r e d n io (3/3 — 8) N & 0 .2 3 2 N p o r ó w n a ń w fa z ie b u d o w y k o p c a , g d z ie ¡3 j e t s t a ł ą z d e f in io w a n ą w o d p o w ie d z i d o ć w ic z e n ia 2 7.
692
ODPOWIEDZI DO ĆWICZEŃ
5.2.3
D a l s z ą a n a liz ę p o p r a w k i F lo y d a m o ż n a z n a le ź ć w p r a c y I. W e g e n e r a , Theoretical Comp.
Sci. 1 1 8 ( 1 9 9 3 ) , 8 1 - 9 8 . J. W u i H . Z h u [J. Comp. Sci. and Tech. 9 ( 1 9 9 4 ) , 2 6 1 - 2 6 6 ] z a u w a ż y li, ż e m o ż n a b y t a k ż e w y k o r z y s t a ć w y s z u k iw a n ie b in a r n e . W ó w c z a s k a ż d e p r z e s ie w a n ie w fa z ie w y b i e r a n i a z a b i e r a ło b y c o n a j w y ż e j lg N + lg lg N p o r ó w n a ń i lg N p r z e s u n ię ć . 19.
N a l e ż y p o s t ą p i ć t a k s a m o j a k w p o p r a w io n y m a lg o r y t m ie p r z e s ie w a n ia z ć w ic z e n ia
zK
18 , 20.
= K
n, / =
1 i
r=
N — 1 , r o z p o c z y n a ją c o d d an ej w a rto śc i
j
w k r o k u H 3.
D l a 0 ^ k ^ n l ic z b a d o d a t n ic h lic z b c a łk o w it y c h ^ W , k t ó r y c h b in a r n e r e p r e z e n t a
c je s ą p o s t a c i (bn . . . b k a i . . . aq)2 d la p e w n e g o q ^ 0 , w y n o s i o c z y w iś c ie ( 6fc_i . . . ¿>0)2 +
1 + ¿o
j
N ie c h
— (cr . . . c 0)2 b ę d z ie z z a k r e s u [ N / 2 k + l \ = (bn ■■•
1)2 <
j
< (bn . . . bk )2
l_A^/2fcj . W ó w c z a s Sj j e s t lic z b ą d o d a t n ic h lic z b c a łk o w it y c h ^ iV , k t ó r y c h b in a r n e
r e p r e z e n t a c je s ą p o s t a c i (cr . . . c o a i . . . a g)2 d la p e w n e g o q ^
0 , c z y l i E o ^ O c 29 =
2k+1 — 1 . S t ą d l ic z b a n ie s p e c ja ln y c h p o d d r z e w r o z m ia r u 2k ■1 — 1 w y n o s i \ N/2k\ - [ N / 2 k+1\ - 1 = [ ( N - 2k) / 2k+1\. [ Ż e b y u d o w o d n ić o s t a t n i ą t o ż s a m o ś ć , n a le ż y s k o r z y s t a ć z p r a w a r e p lik a c ji z ć w ic z e n ia 1 .2 .4 - 3 8 d la n = 2 i x = N / 2 k+1}. 22.
Z a n im / =
K ażd a
z ty c h
1, m a m y p ię ć m o ż liw o ś c i 5 3 4 1 2 , 3 5 4 1 2 , 4 3 5 1 2 ,
15432 i 25413.
a\ a 2 as a4 a5 p r o w a d z i d o t r z e c h m o ż liw y c h p e r m u t a c ji
m o ż liw o ś c i
a\ a 2 as a± a s , a i a 4 as a 2 a s , a i a s a 3 a 4 a 2, p r z e d t y m j a k 1 = 2. 23.
(a ) P o B
ite r a c ja c h ,
j
^
[ N / 4 J ) + 2([JV /4J -
( [AT/2J -
2B l\ z a t e m 2B l ^ [iV / 8j ) + 3 ( | t f / 8 j -
r. (b ) M a m y |tf/16j) + - • - =
L^°S2 (iV/Z)J
=
[N/2\ + [N/4\ +
[_iV/8 j + • • • = N — v { N ) , g d z ie v ( N ) j e s t lic z b ą j e d y n e k w b in a r n e j r e p r e z e n t a c ji N. Z ć w ic z e n ia 1 .2 .4 - 4 2 m a m y t a k ż e
[lg^ J = A T[lg 2VJ — 2 ^Ig N J+ 1 + 2 . Z t w ie r d z e n ia H
w ie m y , ż e t o o g r a n ic z e n ie g ó r n e n a B j e s t n a jle p s z e z m o ż liw y c h d la f a z y b u d o w y k o p c a . P o n a d t o w a r t o z w r ó c ić u w a g ę n a t o , ż e is t n ie je d o k ła d n ie je d e n k o p ie c z a w i e r a ją c y k lu c z e { 1 , 2 , . . . , N } i t a k i , ż e K j e s t id e n t y c z n o ś c io w o r ó w n y 1 p o d c z a s f a z y w y b ie r a n ia w a lg o r y t m i e H . ( D l a p r z y k ł a d u , d la N = 7 t e n k o p ie c m a p o s t a ć 7 5 6 2 4 3 1; n ie j e s t t r u d n o p r z e jś ć z N
d o N 4- 1 ). D l a f a z y w y b ie r a n ia w a lg o r y t m ie k o p c o w y m ,
t e n k o p ie c d a j e m a k s y m a l n ą w a r t o ś ć B ( ja k i m a k s y m a ln ą w a r t o ś ć [ N / 2 j p a r a m e t r u
D ). Z a t e m n a j le p s z e m o ż liw e g ó r n e o g r a n ic z e n ie n a B d la c a łe g o s o r to w a n ia w y n o s i N — v ( N ) + N [ l g N\ - 2 [lgiVJ+1 + 2 .
24. E L iU g fcJ2 = n =
( N + l - 2 n ) n 2 + Y , o ^ k < n k 22k
=
( N + l ) n 2 - ( 2 n - 3 ) 2 n + 1 -6,
gdzie
|_lgiVJ ( z o b a c z ć w ic z e n ie 4 .5 .2 - 2 2 ) ; s t ą d p o s z u k iw a n a w a r ia n c ja d la o s t a t n ie g o
p r z e s ie w a n ia w y n o s i / 3 n = ( ( A ^ - h l) n 2 — ( 2 n — 3 ) 2 n+1 — 6)/JV — ( ( N + l ) n - \ - 2 —2n+1 ) 2/ N 2 = 0 ( 1 ) . O d c h y le n ie s t a n d a r d o w e z m ie n n e j B'N w y n o s i ( £ { & 25.
I s € M n } ) 1^2 = 0 ( V N ).
P r z e s ie w a n ie m a „ r o z k ła d j e d n o s t a j n y ” , a p r a w d o p o d o b ie ń s t w o t e g o , ż e w y n ik ie m
p o r ó w n a n ia K j : K j + i j e s t < , w y n o s i ~ . W t y m p r z y p a d k u ś r e d n i w k ł a d d o C j e s t r ó w n y d o k ł a d n ie p o ło w ie s u m y ś r e d n ic h w k ł a d ó w d o A i ¿2, a m ia n o w ic ie ( ( 2n — 3 ) 2 n_1 4 * - ) /
(2n+1 - 1). 26.
(a ) ( | § + I + i | + I + i i + i | + 2 i + i + l i + i | + 2~ + l | + 2 + 2 + 3 + 0 +
1 + 1 + 2 + 1 + 2 + 2 + 3 + 1 + 2 + 2 ) / 2 6 = 1 1 8 9 / 7 8 0 w 1 .5 2 4 . (b ) g d z ie
v{k)
J e ś li N
( E i L i v (k ) ~ N + h Y N /2\ - \ n + Y 2 = \ m i n ( a fc_ i , a fc- a fc_ i - l ) / ( a k - l ) ) / N , j e s t l ic z b ą j e d y n e k w b in a r n e j r e p r e z e n t a c ji k , n a t o m ia s t ak = (1 bk . . . 60) 2.
= 2 ei + 2e2 + • • • -b 2 e\ d la c\ > e 2 > • • • > e t ^ 0, t o m o ż n a p o k a z a ć , że
5.2.3
ODPOWIEDZI DO ĆWICZEŃ
693
Y^k=o = ł ( ( e i + 2 ) 2 ei + (e2 + 4 ) 2 62 H I- ( e t + 2t ) 2 e£) + t - W. [ A s y m p t o t y c z n e w ła s n o ś c i t a k i c h s u m m o ż n a d o k ła d n ie z a n a liz o w a ć z a p o m o c ą t r a n s f o r m a t M e lłin a ; z o b a c z F l a j o l e t , G r a b n e r , K ir s c h e n h o f e r , P r o d in g e r , T ic h y , Theoretical Comp . Sci. 1 2 3 (1 9 9 4 ), 2 9 1 - 3 1 4 ] . 27.
ctnXn/ ( l ~ x n) m o ż n a
J. W . W r e n c h , J r. z a u w a ż y ł, ż e o g ó ln y s z e r e g L a m b e r t a
p r z e d s t a w ić j a k o J 2 N ^ i ( T , d \ N ad)x N = E m 5!i ( a ™ + Y , k > A a ™ + am+ k ) x km) x ™ 2. [ P r z y p a d k i a n = 1 i an = n r o z w a ż a ł J . H . L a m b e r t w s w o je j p r a c y A n i a g e zur
Archi tectonic 2 ( R ig a : 1 7 7 1 ) , §8 75; C l a u s e n p o d a ł s w ó j w z ó r d la p r z y p a d k u an = 1 w Crelle 3 (1 8 2 8 ), 95, n a t o m ia s t H . F . S c h e r k p r z e d s t a w ił d o w ó d w Crelle 9 ( 1 8 3 2 ) , 1 6 2 - 1 6 3 . G d y an — n i x =
71>1
w ó w c z a s d o s t a j e m y z a le ż n o ś ć
m^l \
V
7
} /
V
= 2 .7 4 4 0 3 3 8 8 8 7 5 9 4 8 8 36048 0 2 14 8 9 1 4 9 2 2 7 2 1 6 4 3 1 1 4 + ; t a s t a ł a p o ja w i a się w ( 20 ), g d z ie m a m y
B'N ~ (/? —2)N i C'N ~ (|/3 —|a —^)N\.
N a w ia s e m m ó w ią c , je ś li w z ią ć q = x i z = x y w p ie r w s z e j t o ż s a m o ś c i z ć w ic z e n ia 5 . 1 . 1 - 1 6 , a n a s tę p n ie p o li c z y ć JŁ w y = 1 , d o s t a n ie m y in t e r e s u ją c ą t o ż s a m o ś ć dy
x
Y 1, r h ; = ' £ kxk{1- xk+1)il- xk+2)--- ■ 28.
D z ie ć m i w ę z ł a k s ą w ę z ł y 3 k — 1 , 3fc i 3fc + 1; r o d z ic e m j e s t [(k + 1 ) / 3 J . P r o g r a m
n a m a s z y n ę MIX, a n a lo g ic z n y d o p r o g r a m u H , z a b i e r a a s y m p t o t y c z n i e 2 l | W l o g W
«
1 3 . 7 A l g W je d n o s t e k c z a s u . W y k o r z y s t u j ą c p o m y s ł z ć w ic z e n ia 18 , m o ż n a z m n ie js z y ć te n cza s d o 1 8 | W lo g 3 W «
1 1 . 8 N \ g N , c h o c ia ż d z ie le n ie p r z e z 3 s p o w o d u je d o d a n ie
d u ż e g o s k ła d n ik a © (W ). W ię c e j o k o p c a c h ¿ -a r n y c h m o ż n a d o w ie d z ie ć s ię z p r a c y S . O k o m y , Lect ure N ot es
in C o m p . S ci . 88 (19 8 0 ), 4 3 9 - 4 5 1 . 30.
Z a łó ż m y , ż e n — 2 * — 1 + r , g d z ie t — [ l g u j i 1 ^ r ^ 2 i . W ó w c z a s fi 2m = [m = 0] i
i —2 ^ ( n + l ) m ^ ^ ^ (2
1 ) ^71(771—j ) + 2
^ ,7i(m ~i + l) +
^^n (m -t)
d la
Tl
^ 2,
J=0 co d o s ta je m y , r o z w a ż a j ą c lic z b ę e le m e n t ó w z p o z io m u j , k t ó r e m o g ł y b y b y ć k o ń c o w ą p o z y c j ą k lu c z a A n + i , p o w s t a w ie n iu g o w m ie js c e K \ i p r z e s ia n iu . D la t e g o , j e ś l i gnm =
hjuri / 2 m ,
to m a m y
t_1 2J - 1 9 ( n - \ - l ) m ć: ^ ^ 9n ( m
J^o
r —j )
“1“ ^ n (m —i+1) "P rt+9 n ( m
2
—t )
^ ( lg ( n + 1 )) m a x g71771 )
2
m>0
i p r z e z in d u k c ję d o s t a je m y , ż e gnm ^ L n = n ) c =2 Ś r e d n ia lic z b a p r o m o c ji w c z a s ie f a z y w y b i e r a n i a w y n o s i B ^ — h g d z ie Hn =
J ^m>0 rnhNm,
^JVm j e s t ł ą c z n ą lic z b ą m o ż liw y c h k o p c ó w ( tw ie r d z e n ie H ). W i e
m y, ż e B' n ^ 2N7fig N ] . Z d r u g ie j s t r o n y m a m y B ^
^ m — h
^
m — htfl Lj v X i r = i ( m — k ) 2 fc > m ~ 2 7n + 1 ń + 1 L jv d la k a ż d e g o m. P o d s t a w i a j ą c m — l g (Hn / L n ) + 0 ( 1 ), d o s t a j e m y t e r a z
^ l g ( ń j v / L 7v ) + 0 ( 1 ).
694
ODPOWIEDZI DO ĆWICZEŃ
5.2.3
L i c z b a p o r ó w n a ń p o t r z e b n a d o z b u d o w a n ia k o p c a w y n o s i c o n a j w y ż e j 2N , c o w y n i k a z ć w ic z e n ia 2 3 ( b ); s t ą d Hn m a m y l g (Hn / L n
31.
N \ / 22N. J e s t ja s n e , ż e L n ^ ( l g i V ) ^ , z a t e m ) ^ N lg N — N l g l g N + O ( N ) . [J. Al gori thms 15 (1 9 9 3 ) , 7 6 - 1 0 0 ] . ^
( R o z w i ą z a n i e J. E d ig h o ffe r a , 1 9 8 1 ) N ie c h A b ę d z ie t a b li c ą 2 n e le m e n t ó w t a k ą , że
A [ 2 [ź / 2 j]
A[2i\ i ^.[2 l_ż/2 J — l] ^ A[2i — 1 ] d la 1 < i ^ n ; p o n a d t o ż ą d a m y , ż e b y A[2i — 1 ] ^ A[2i] d la 1 i ^ n . ( T e n o s t a t n i w a r u n e k z a c h o d z i d la w s z y s t k ic h i w t e d y i t y lk o w t e d y , g d y z a c h o d z i d la n / 2 < i ^ n , c o w y n ik a z e s t r u k t u r y k o p c a ) . T e n „ k o p ie c b l i ź n i a c z y ” z a w ie r a 2n e le m e n tó w ; w p r z y p a d k u n ie p a r z y s t e j lic z b y e le m e n tó w n a le ż y p o p r o s t u je d e n e le m e n t t r z y m a ć z b o k u . D o o b s łu g i k o p c ó w b liź n ia c z y c h m o ż n a p o m o d y f ik a c ja c h w y k o r z y s t a ć in n e a lg o r y t m y z t e g o p u n k t u i j e s t in t e r e s u ją c e , ż e b y d o p r a c o w a ć s z c z e g ó ły . P o w y ż s z e r o z w ią z a n ie z o s t a ł o n ie z a le ż n ie o d k r y t e i d a le j r o z w i n ię t e p r z e z J. v a n L e e u w e n a i D . W o o d a [Comp. J.
36
( 1 9 9 3 ) , 2 0 9 - 2 1 6 ] , k t ó r z y n a z w a li
o m a w ia n ą s t r u k t u r ę „ k o p c e m p r z e d z i a ł o w y m ” .
32.
W
każd ym kopcu o N
r ó ż n y c h e le m e n t a c h n a jw ię k s z e m
— \ N f 2] e le m e n tó w
t w o r z y p o d d r z e w o . C o n a jm n ie j [ m / 2 j z n ic h n ie m o ż e b y ć liś ć m i w t y m p o d d r z e w ie , p o n ie w a ż d r z e w o b in a r n e o k liś c ia c h m a c o n a jm n ie j k — 1 n ie liś c i. D la t e g o c o n a jm n ie j |_m/2j z n a j w i ę k s z y c h m e le m e n t ó w w y s t ę p u j e n a p ie r w s z y c h [N/2\ p o z y c j a c h w k o p c u . T e e le m e n t y m u s z ą z o s t a ć w y p r o m o w a n e d o k o r z e n ia , z a n im o s ią g n ą s w o je d o c e lo w e p o z y c j e . T a k w ię c ic h r u c h w n o s i c o n a jm n ie j
=
^ m lg m H -O (r a ) do R ,
co
w y n i k a z ć w ic z e n ia 1 .2 .4 - 4 2 . Z a t e m B min(N) ^ ~ i V l g JV’+ 0 ( J V ) + i ? m in ( L N / 2 j ) i p o s z u k iw a n e r o z w i ą z a n i e o t r z y m u je m y p r z e z in d u k c ję w z g lę d e m N . [I. W e g e n e r , Theoretical
C omp . Sci. 118 ( 1 9 9 3 ) , 8 1 - 9 8 , t w ie r d z e n ie 5 .1 . S c h a ffe r z S e d g e w ic k ie m i n ie z a le ż n ie B o llo b a s , F e n n e r i F r ie z e , s k o n s t r u o w a li p e r m u t a c je , k t ó r e w y m a g a j ą n ie w ię c e j n iż
~ N \ g N - \ - 0 ( N \ o g \ o g N ) p r o m o c ji; z o b a c z J. Al go ri thms 15 ( 1 9 9 3 ) , 7 6 - 1 0 0 ; 20 ( 1 9 9 6 ), 2 0 5 - 2 1 7 . Z ć w ic z e n ie 30 w y n ik a , ż e t a k i e p e r m u t a c je s ą d o ś ć r z a d k ie ] . 33.
P i Q w s k a z u ją n a d a n e k o le jk i DIST(A) = 0, t a k j a k w t e k ś c ie ,
N ie c h
je m y , ż e
M l.
[In icjo w a n ie ]
R
p r io r y t e t o w e . W a lg o r y t m ie p o n iż e j p r z y jm u c h o c ia ż
A
n ie j e s t p r a w d z iw y m w ę z łe m .
A.
M 2 . [Scalanie list] Jeśli Q = A , to wykonaj D «— DIST(P) i przejdź do M 3 . Jeśli P = A , to wykonaj P <— Q, D <— DIST(P) i przejdź do M 3 . W przeciwnym przypadku, jeśli KEY(P) ^ KEY(Q), to wykonaj T <- RIGHT(P ), RIGHT(P) <- R, R +— P, P «— T i powtórz krok M 2 . Jeśli KEY(P) < KEY(Q), to wykonaj T <- RIGHT(Q), RIGHT(Q) <— R, R +— Q, Q «— T i powtórz krok M 2 . ( W tym kroku w zasadzie są scalane dwie „prawe listy” z danych drzew przez umiesz czenie tymczasowo wskaźników w górę w polach RIGHT). M 3.
[ C z y k o n ie c ? ] J e ś li
R=
A , t o z a k o ń c z w y k o n y w a n ie a lg o r y t m u ;
P w s k a z u je
na
w y n ik o w ą k o le jk ę .
M 4.
34.
DIST] Q <- RIGHT(R ) . J e ś li DIST(LEFT(R)) < D, t o w y k o n a j D < - DIST (LEFT (R)) + 1 , RIGHT (R) < - LEFT (R) , LEFT (R) < - P; w p r z e c iw n y m r a z ie w y k o n a j D D+ l, RIGHT(R) <—P. N a k o n ie c w y k o n a j DIST(R) <— D, P <— R, R Q i p o w róć do M 3. | [ U s ta la n ie w a r t o ś c i
R o z p o c z y n a j ą c o d r e k u r e n c ji
5.2.4
ODPOWIEDZI DO ĆWICZEŃ
695
n a s k ła d o w e o g ó ln e j fu n k c ji t w o r z ą c e j ¿ ( ^ ) = E n ^ o ^ n = E m ^ i L rn( z ) t g d z ie L m ( z ) = z 2m - 1 _|
o d p o w ia d a g e n e r o w a n iu w s z y s t k i c h d r z e w le w ic o w y c h o d łu g o ś c i n a j k r ó t s z e j
ś c ie ż k i o d k o r z e n ia d o A r ó w n e j m , R a in e r K e m p u d o w o d n ił, ż e L ( z ) = z + ~ L ( z ) 2 + i L m ( z ) 2 o r a z że a « 0 .2 5 0 3 6 , n a t o m ia s t 6 «
2 .7 4 9 4 8 7 9 [lu f. P r o c . L e t t e r s 2 5
( 1 9 8 7 ) , 2 2 7 - 2 3 2 ; R a nd o m Graphs ’8 7 (1 9 9 0 ), 1 0 3 - 1 3 0 ] . W
1 9 7 8 r o k u L u is T r a b b
P a r d o z a u w a ż y ł, że fu n k c ja t w o r z ą c a G ( z ) = z L ( z ) s p e łn ia e le g a n c k ą z a le ż n o ś ć G ( z ) —
z + G(zG(z)). 35.
N ie c h w a r t o ś c ią p o la DI ST u s u w a n e g o w ę z ł a b ę d z ie do i n ie c h w a r t o ś c ią p o la D I ST
s c a lo n y c h p o d d r z e w b ę d z ie d\. J e ś li do = d i , n ie m u s im y w o g ó le iś ć w g ó r ę . J e ś li do > d i , w ó w c z a s d i = do — 1 ; i je ś li w z n ie s ie m y s ię o n p o z io m ó w , n o w y m i w a r t o ś c ia m i p ó l D IST p r z o d k ó w P m u s z ą b y ć , o d p o w ie d n io , d i + 1, d i + 2, . . . , d i + n . J e ś li do < d i , t o ś c ie ż k a p r o w a d z ą c a w g ó r ę m u s i k ie r o w a ć s ię t y lk o n a le w o . 36.
Z a m ia s t o g ó ln e j k o le jk i p r io r y t e t o w e j n a jp r o ś c ie j j e s t z a s t o s o w a ć lis t ę d w u k ie r u n
k o w ą ; n a le ż y p r z e s u w a ć w ę z ł y n a je d e n k o n ie c lis ty , k ie d y s ą o n e u ż y w a n e , a u s u w a ć w ę z ły z d r u g ie g o k o ń c a . [Z o b a c z o m ó w ie n ie s a m o o r g a n iz u ją c y c h s ię p lik ó w w p o d r o z d z ia le 6 . 1 ]. 37.
W
k o p c u n ie s k o ń c z o n y m
k - t y n a j w i ę k s z y e le m e n t z je d n a k o w y m p r a w d o p o d o
b ie ń s tw e m p o ja w i a się w le w y c h lu b p r a w y c h p o d k o p c a c h s w o ic h w i ę k s z y c h p r z o d k ó w . T a k w ię c m o ż n a z a s t o s o w a ć t e o r ię d r z e w w y s z u k i w a ń p o z y c y jn y c h i o t r z y m a ć
e(k) = C k — C k - 1 , p r z y o z n a c z e n ia c h z 6 .3 —( 1 3 ). Z ć w ic z e n ia 6 .3 - 2 8 d o s t a j e m y e (k) — lg fc + 7 / ( l n 2 ) - f \ — a 4- $o(k) + 0 ( k ~ 1) « lg k — 0 .2 7 4 , g d z ie a j e s t z d e fin io w a n e w ( 19 ), a So(k) je s t fu n k c ją o k r e s o w ą lg fc . [P. V . P o b le t e , B I T 3 3 ( 1 9 9 3 ) , 4 1 1 - 4 1 2 ] . 38.
M 0 = 0; M i — { 1 }; M n — { N } i & M 2k _ i & M N _2k d la AT > 1 , g d z ie A; = |_lg(2iV/3)J.
5.2.4 1 . R o z p o c z y n a m y o d ¿1 = m i n ^ i i ! ,.. . ,X k i k ) =
*• • =
%k
—
1, j
X r i r i u s ta w ia m y Zj —
=
1 . N a s t ę p n ie w p ę t l i z n a jd u je m y
Xj'ir , j
<_ j
ą.
l r _j_ l
ir
ęw
ty m
p r z y p a d k u w y k o r z y s t a n i e x ¿(mi + i) — 00 j e s t w y g o d n ą k o n ie c z n o ś c ią ) . K i e d y k j e s t u m ia r k o w a n ie d u ż e , j e s t p o ż ą d a n e , ż e b y t r z y m a ć k lu c z e x u ± , . . . , X k i k w s t r u k t u r z e d r z e w ia s t e j w ła ś c iw e j d la w ie lo k r o t n e g o w y b i e r a n i a m in im u m . T a k ą s t r u k t u r ę o m a w ia liś m y w p u n k c ie 5 .2 .3 . W ó w c z a s d o z n a le z ie n ie k a ż d e g o m in im u m , p o z a p ie r w s z y m , m u s im y w y k o n a ć t y lk o |_lg k\ p o r ó w n a ń . W r z e c z y w i s t o ś c i j e s t t o t y p o w e z a s to s o w a n ie z a s a d y „ n a jm n ie js z y w c h o d z i, p ie r w s z y w y c h o d z i ” z k o le jk i p r io r y t e t o w e j. K lu c z e m o ż n a t r z y m a ć w k o p c u , a 00 m o ż n a b y c a łk o w ic ie u n ik n ą ć . P o d a ls z e o m ó w ie n ie t e g o t e m a t u n a le ż y s ię g n ą ć d o p u n k t u 5 .4 .1 .
2 . N ie c h C b ę d z ie lic z b ą p o r ó w n a ń ; m a m y C — m + n — S, g d z ie S j e s t l ic z b ą e le m e n tó w p r z e n o s z o n y c h w k r o k u M 4 lu b M 6 . P r a w d o p o d o b ie ń s t w o , ż e S ^ s m o ż n a ł a t w o p o lic z y ć i w y n o s i o n o
* = ( r +; - ’M ra+r d la 1 ^
‘) ) / r r )
s ^ m + n; qs — 0 d la s > m + n. Z a t e m w a r t o ś ć o c z e k iw a n a S w y n o s i
pmn =
(m + 2 n ) n / ( m + l ) ( r o + 2) — C = (m in m in ( m , n ) ,
) — Mmn — m ( 2 m + n ) / ( n + l ) ( n + 2 ) +
T a k w ię c m a m y a v e m-\- n — pmn,
m a x m -j- n — 1 ,
d e v
696
5.2.4
ODPOWIEDZI DO ĆWICZEŃ
D l a m = n w a r t o ś ć o c z e k iw a n a z o s t a ł a n a j p i e r w p o lic z o n a p r z e z H . N a g le r a , C A C M 3
(1 9 6 0 ), 6 1 8 - 6 2 0 ; w y n o s i o n a 2 n — 2 + 0 ( n - 1 ) p r z y o d c h y le n iu
y/2 + 3.
sta n d a rd o w y m
Z a t e m C j e s t b a r d z o b lis k ie s w o je j w a r t o ś c i m a k s y m a ln e j. M 2 '. J e ś li K i < K j , t o p r z e jd ź d o M 3 '; je ś li K i — K j , t o p r z e jd ź d o M 7 '; je ś li
K i > K j , t o p r z e jd ź d o M 5'. M 7 y. W y k o n a j K% +— K j , k
k + 1, i
i + 1, j
j + 1 . J e ś li i > M , t o p r z e jd ź
d o M 4 '; w p r z e c iw n y m r a z ie , je ś li j > N, to p r z e jd ź d o M 6 '; w p r z e c iw n y m r a z ie w r ó ć d o M 2 '.
|
( O d p o w ie d n io n a le ż y t a k ż e z m o d y fik o w a ć p o z o s t a łe k r o k i a lg o r y t m u M . P o n o w n ie u n ik n ie m y w ie lu s z c z e g ó ln y c h p r z y p a d k ó w , je ś li w s t a w im y s z t u c z n e k lu c z e K M+1 — Ą r + i = oo n a k o ń c a c h c ią g ó w ) . 4.
C i ą g e le m e n t ó w , k t ó r e p o j a w i a j ą s ię z b ie g ie m c z a s u w u s t a lo n y m w ę ź le , p o w s t a je
z e s c a le n ia t a k i c h c ią g ó w z d z ie c i t e g o w ę z ła . ( W p u n k c ie 5 .2 .3 w y b i e r a n y b y ł największy e le m e n t , a le r ó w n ie d o b r z e m o ż n a o d w r ó c ić p o r z ą d e k ) . T a k w ię c o p e r a c je z w ią z a n e z w y b i e r a n i e m d r z e w o w y m s ą w z a s a d z ie t a k i e s a m e , j a k t e z w ią z a n e ze s c a la n ie m , a le s ą o n e w y k o n y w a n e w in n e j k o le jn o ś c i i u ż y w a j ą in n y c h s t r u k t u r d a n y c h . I n n y z w i ą z e k m ię d z y s c a la n ie m a w y b ie r a n ie m d r z e w o w y m z o s t a ł w s k a z a n y w ć w i c z e n iu 1. Z a u w a ż m y , ż e s c a la n ie iV - w e jś c io w e c ią g ó w je d n o e ie m e n t o w y c h t o w ła ś n ie s o r t o w a n ie p r z e z w y b ie r a n ie ; p o r ó w n a j m y t a k ż e s c a la n ie c z te r o w e jś c io w e d la ( A , B , C , D ) z e s c a la n ie m d w u w e jś c io w y m d la ( A , B ), (C, D ) , a n a s tę p n ie d la ( A B , C D ) .
5.
W kroku N 6 m am y zaw sze K i
<
K i-\
^ Kj;
w N 10 m a m y
Kj < Kj+i <
Ki.
6 . 2 6 4 10 8 1 4 12 16 1 5 1 1 1 3 7 9 3 5 1 . P o p ie r w s z y m p r z e b ie g u d w a z o c z e k iw a n y c h k r o k ó w w d ó ł z n ik a ją : 1 2 5 6 7 8 13 1 4 1 6 1 5 12 1 1 1 0 9 4 3 . T a k a m o ż liw o ś ć z o s t a ł a p o r a z p i e r w s z y z a u w a ż o n a p r z e z D . A . B e lla , Comp. J. 1 ( 1 9 5 8 ) , 74 . Z ja w is k a t a k ie j a k to c z y n i ą d o k ł a d n ą a n a liz ę a lg o r y t m u N p r a w ie b e z n a d z ie jn ą . 7.
[Ig A T ] , j e ś l i N
>
1. ( N a le ż y r o z w a ż y ć , ile r a z y p m u s i b y ć p o d w a ja n e , a ż b ę
d z ie ^ N).
8 . J e ś li N n ie j e s t w ie lo k r o t n o ś c ią 2 p, w k a ż d y m p r z e b ie g u m a m y je d e n k r ó t k i sek w e n s , k t ó r y z a w s z e z n a jd u je się b lis k o ś r o d k a . O z n a c z a j ą c je g o d łu g o ś ć p r z e z t, m a m y 0 ^ t < p. W k r o k u S 12 s ą o b s łu g iw a n e p r z y p a d k i , w k t ó r y c h k r ó t k i s e k w e n s m a b y ć „ s c a la n y ” z p u s t y m s e k w e n s e m lu b g d y t = 0 ; w p r z e c iw n y m r a z ie m a m y w r z e c z y w i s t o ś c i x\ ^ X2 ^
^ x p | yt ^
J e ś li x p ^ y t , t o s e k w e n s z le w e j s t r o n y
j e s t w y c z e r p y w a n y j a k o p ie r w s z y , a z k r o k u S 6 p r z e jd z ie m y d o S 1 3 p o p r z e n ie s ie n iu
x p d o w y n ik o w e g o c ią g u . Z d r u g ie j s t r o n y , j e ś l i x p > y t , t o s e k w e n s z p r a w e j s t r o n y z o s t a n ie s z t u c z n i e w y c z e r p a n y , j e d n a k K j — x p n ig d y n ie b ę d z ie < K i w k r o k u S3! Z a t e m w k o ń c u w e w s z y s t k i c h p r z y p a d k a c h p r z e c h o d z im y z S 6 d o S 1 3 . 1 0 . N a p r z y k ł a d d la j ^ n w a lg o r y t m i e M m o ż n a b e z k o n flik to w o s c a lić e le m e n ty x j +1 . . . Xj+m z Xj+rn+1 • • • Xj+m+n w t a b l i c y n a p o z y c j a c h x\ . . . x m + n . P r z y p e w n e j u w a d z e m o ż n a w y k o r z y s t a ć t e n p o m y s ł t a k , ż e b y N + 2^lgiV^_1 m ie js c w p a m ię c i w y s t a r c z y ł o w c a ł y m s o r to w a n iu . J e d n a k w t y m p r z y p a d k u p r o g r a m w y d a j e się d o ś ć s k o m p lik o w a n y w p o r ó w n a n iu z a lg o r y t m e m S . [Comp. J. 1 ( 1 9 5 8 ) , 75 ; z o b a c z t a k ż e L . S . Ł o z iń s k i, Kibiernietika 1 , 3 ( 1 9 6 5 ) , 5 8 - 6 2 ] .
11.
T a k . M o ż n a s ię o t y m p r z e k o n a ć , r o z w a ż a j ą c n a p r z y k ł a d z w ią z e k z w y b ie r a n ie m
d r z e w o w y m w s p o m n ia n y w ć w ic z e n iu 4. J e d n a k a lg o r y t m y N i S w o c z y w i s t y s p o s ó b n ie s ą s t a b iln e .
5.2.4
ODPOWIEDZI DO ĆWICZEŃ
697
1 2 . W y k o n a j L 0 +— 1 , £ <— JV + 1 ; w ó w c z a s d la p = 1 , 2 , . . . , W — 1 , w y k o n a j c o n a s tę p u je : J e ś li K p ^
Kp+i,
p+
to L p
(p
1 ; w p r z e c iw n y m r a z ie L t <
N a k o n ie c Lt <— 0 , L n <— 0 , L n + i
+ 1), i
p.
|Lj\r+i|.
( S t a b iln o ś ć z o s t a j e z a c h o w a n a . L ic z b a p r z e b ie g ó w w y n o s i [ I g r ] , g d z ie r j e s t lic z b ą r o s n ą c y c h s e k w e n s ó w n a w e jś c iu ; d o k ł a d n y r o z k ła d r z o s t a ł z a n a liz o w a n y w p u n k c ie 5 .1 .3 . P o d s u m o w u ją c , s c a la n ie n a t u r a ln e j e s t le p s z e o d p r o s t e g o s c a la n ia , k i e d y m o ż n a s k o r z y s t a ć z a lo k a c ji d o w ią z a n io w e j, c h o c ia ż j e s t g o r s z e w p r z y p a d k u a lo k a c ji s e k w e n c y jn e j) .
13.
C z a s d z i a ła n i a d la
N ^ 3 w y n o s i (11 A + 6 B + 3B ł 4 - 9C + 2C" 4 - 4D + 5N
4 - 9)u,
g d z ie A j e s t l ic z b ą p r z e b ie g ó w ; B = B ' 4 - B f/ j e s t lic z b ą w y k o n a n y c h o p e r a c ji s c a la n i a p o d c ią g ó w , g d z ie B f j e s t l ic z b ą t y c h s c a le ń , w k t ó r y c h p o d c ią g p z o s t a j e w y c z e r p a n y ja k o p ie r w s z y ; C — C f 4 - C " j e s t l ic z b ą w y k o n a n y c h p o r ó w n a ń , g d z ie C ' j e s t l ic z b ą t y c h p o r ó w n a ń , w k t ó r y c h K p ^ K q\ D — D ( 4 - D " j e s t lic z b ą e le m e n t ó w p o z o s t a j ą c y c h w p o d c ią g a c h , k ie d y d r u g i z p o d c ią g ó w z o s t a ł w y c z e r p a n y , g d z ie D f j e s t lic z b ą t y c h t a b e li 3 m a m y A = 4, B f — 6 , B n = 9, C f = 22 , C tf = 22 , D ! — 10 , D n = 10 , ł ą c z n y c z a s = 7 6 1 u . ( P o r ó w n y w a ln y p r o g r a m
e le m e n tó w , k t ó r e n a le ż ą d o p o d c ią g u q. W
5.2.1 L ,
p o p o p r a w k a c h z ć w ic z e n ia
5.2.1-33, z a b i e r a N j e s t m a łe ) .
t y lk o
433u.
Tak
w ię c w id z im y , ż e
s c a la n ie n ie je s t z b y t e fe k t y w n e , g d y
A l g o r y t m L w y k o n u je c i ą g s c a le ń n a p o d c ią g a c h , k t ó r y c h r o z m i a r y ( m , n ) m o ż n a w y z n a c z y ć w n a s t ę p u j ą c y s p o s ó b : N ie c h w z a p is ie b in a r n y m M a m y ( 6f c . . . 6j + i )2 „ z w y k ł y c h ” s c a le ń z ( m , n) te ż
N
—
1 = (6* . . . 6160)2.
— (2J' , 2 J") d la 0 ^ j
< k\ m a m y 1 d la
( 2 J , 1 4 - ( b j - i . . . 60) 2), k ie d y k o lw ie k bj =
„ s p e c ja ln e ” s c a le n ia z ( m , n ) =
0 ^ j ^ k. N a p r z y k ł a d d la AT = 1 4 m a m y : s z e ś ć z w y k ł y c h s c a le ń z ( 1 , 1 ) , t r z y z w y k ł e s c a le n ia z ( 2 ,2 ) , je d n o z w y k łe s c a le n ie z ( 4 ,4 ) i s p e c ja ln e s c a le n ia p o d c ią g ó w o r o z m ia r a c h ( 1 , 1 ), ( 4 ,2 ) , ( 8 , 6 ). M u lt iz b ió r M n r o z m ia r ó w s c a la n y c h c i ą g ó w ( m , n ) m o ż n a t a k ż e o p is a ć z a le ż n o ś c ią r e k u r e n c y jn ą
M i = 0;
M 2k+r = { ( 2 fe, r ) } W M 2k W M r
d la 0 < r < 2k .
W y n i k a s t ą d , że n ie z a le ż n ie o d d a n y c h w e jś c io w y c h A
C ' 4 D " — Y lj =o bj2 j ( 1 + \ i ) i C łł + L>! = Y l j = o b j { l +
=
[ l g A -] , B
=
N
— 1,
+ bj + i -1--------h 6*,)); z a t e m
t y lk o B \ C \ D f m u s z ą b y ć d a le j a n a liz o w a n e . J e ś li d a n e d la a lg o r y t m u L s ą lo s o w e , t o k a ż d a z o p e r a c ji s c a l a n i a s p e łn i a w a r u n k i z ć w ic z e n ia 2 i j e s t n ie z a le ż n a o d z a c h o w a n ia się in n y c h s c a le ń ; t a k w ię c r o z k ła d B \
C \ D ' j e s t k o n w o lu c ją in d y w id u a ln y c h r o z k ła d ó w d la k a ż d e g o s c a la n i a p o d c ią g ó w . O c z e k iw a n e w a r t o ś c i d la t a k i e g o s c a la n ia w y n o s z ą B f — n / { m + n ) , C ( — m n / ( n + 1 ), D ' = n / ( m 4- 1 ). S u m u ją c p o w s z y s t k i c h s t o s o w n y c h ( m , n ) , d o s t a n ie m y d o k ła d n e ś r e d n ie w a r to ś c i.
N = 2k m a m y = kN i Z)ave =
D la
C+
D
E n^O
o c z y w iś c ie n a j p r o s t s z ą s y t u a c ję : B ¿ve =
+ !)) =
l 2n 4. 1 ~ a
1
V“—V
2
^
n^l
a'N
+
\ B , C ł&ve = ^ C ave,
0 ( 1 ) , gdzie
1 4n — 1
= 1.2 6 4 4 9 978 0 3 4 8 4 4 4 2 0 9 19 1 3 1 9 7 4 7 2 5 5 498 48 2 5 5 7 7 m o ż n a p o li c z y ć z d u ż ą d o k ła d n o ś c ią t a k j a k w ć w ic z e n iu 5 .2 .3 - 2 7 . T e n s z c z e g ó ln y p r z y p a d e k z o s t a ł p o r a z p i e r w s z y z a n a liz o w a n y p r z e z A . G le a s o n a [ n ie o p u b lik o w a n o , 1956] i
H.
N a g le r a [ C A C M
3
(1 9 6 0 ), 6 1 8 - 6 2 0 ] .
698 14 .
ODPOWIEDZI DO ĆWICZEŃ
5.2.4
Ż e b y z m a k s y m a liz o w a ć C , n a l e ż y w ć w ic z e n iu 13 w z i ą ć D
= B . [S z c z e g ó ło w a
a n a li z a a lg o r y t m u L z o s t a ł a p r z e p r o w a d z o n a p r z e z W . P a n n y ’e g o i H . P r o d in g e r a ,
Al go ri t hmi ca 1 4 ( 1 9 9 5 ) , 3 4 0 - 3 5 4 ] . 15.
N a l e ż y z r o b ić k o p ie k r o k ó w L 3 , L 4 , L 6 d la p r z y p a d k ó w , w k t ó r y c h w ia d o m o , ż e L a
j e s t r ó w n e p lu b q. [M o ż n a je s z c z e w p r o w a d z ić dalsze p o p r a w k i, u s u w a ją c p r z y p is a n ie
s <— p ( lu b s <— q) z w e w n ę t r z n e j p ę t li, p r z e m ia n o w u ją c p o p r o s t u r e je s t r y ! D la p r z y k ł a d u m o ż n a z m ie n ić w ie r s z e 20 i 2 1 n a ‘LD3 IN PU T, 1 (L ) ’ i k o n t y n u o w a ć z p w rI3 , z s w r l l i z L s r ó w n y m p. B i o r ą c d w a n a ś c ie k o p ii w e w n ę t r z n e j p ę t li, o d p o w i a d a j ą c y c h r ó ż n y m p e r m u t a c j o m ( p , ę , r ) o d n o s z ą c y c h s ię d o ( r l l , rI2 , rI3 ) i r ó ż n e j w ie d z y o L s , m o ż e m y z r e d u k o w a ć ś r e d n i c z a s d z i a ła n i a d o 8 N \ g N + O ( N ) ] . 16 .
( T a k i a lg o r y t m b ę d z ie t r o c h ę s z y b s z y o d a lg o r y t m u L ; z o b a c z ć w ic z e n ie 5 .2 .3 - 2 8 ) .
17.
N o w y r e k o r d t r a k t u j e m y j a k o p o d c ią g o d łu g o ś c i 1. N a s t ę p n ie p o w t a r z a m y s c a la n ie
n a j k r ó t s z y c h p o d c ią g ó w , j e ś l i s ą te j s a m e j d łu g o ś c i. ( O t r z y m a n y a lg o r y t m s o r to w a n ia j e s t w z a s a d z ie t a k i s a m j a k a lg o r y t m
L , j e d n a k p o d c ią g i s ą s c a la n e w e w z g lę d n ie
r ó ż n y m c z a s ie ) . 18 .
T a k , a le w y d a j e się , ż e j e s t t o s k o m p lik o w a n e . W p ie r w s z y m z n a le z io n y m r o z w ią
z a n iu k o r z y s t a s ię z n a s t ę p u ją c e j p o m y s ło w e j k o n s t r u k c ji [Dokłady A k a d . N auk S S S R 1 8 6 ( 1 9 6 9 ) , 1 2 5 6 - 1 2 5 8 ] : N ie c h n ss y/N. W e jś c io w y c i ą g d z ie lim y n a m + 2 „ s t r e f ”
Z i . . . Zm Z m+ i Z m + 2 , g d z ie Z m+2 z a w ie r a N m o d n r e k o r d ó w , a k a ż d a z p o z o s t a ły c h s t r e f p o n r e k o r d ó w . N a s t ę p n ie z a m ie n ia m y r e k o r d y z Z m+i z r e k o r d a m i z e s t r e f y z a w i e r a ją c e j R m \ t e r a z c i ą g w e jś c io w y p r z y jm u je p o s t a ć Z\ . . . Z m A , g d z ie k a ż d a ze s t r e f Z\ . . . Zm z a w ie r a d o k ła d n ie n u p o r z ą d k o w a n y c h r e k o r d ó w , a A j e s t p o m o c n ic z y m o b s z a r e m z a w i e r a j ą c y m s r e k o r d ó w d la p e w n e g o s z z a k r e s u n ^ s < 2 n . Z n a j d u j e m y s t r e fę z n a j m n i e j s z y m c z o ło w y m e le m e n te m i z a m ie n ia m y j ą c a ł ą z Z \ ; je ś l i w ię c e j n iż j e d n a s t r e f a m a n a j m n i e j s z y c z o ł o w y e le m e n t, t o b ie r z e m y t ę z n a jm n ie j s z y m o s t a t n im e le m e n t e m . ( T o k o s z t u je 0 ( m + n) o p e r a c ji) . N a s t ę p n ie z n a jd u je m y s t r e fę z n a s t ę p n y m i n a jm n ie js z y m i, c z o ł o w y m i o s t a t n im , e le m e n t a m i i z a m ie n ia m y j ą z Z 2 itd . P o 0 ( m ( m + n) ) = O ( N ) o p e r a c ja c h d o s t a n ie m y m s t r e f u p o r z ą d k o w a n y c h w z g lę d e m ic h c z o ło w y c h e le m e n t ó w . P o n a d t o , z n a s z y c h p o c z ą t k o w y c h z a ło ż e ń o c ią g u w e jś c io w y m
w y n ik a , ż e k a ż d y z k l u c z y w Z \ . . . Z m b ę d z ie m ia ł t e r a z m n ie j n iż n
in w e r s ji. M o ż e m y s c a lić Z\ z Z 2 z a p o m o c ą n a s t ę p u ją c e j s z t u c z k i: N a le ż y z a m ie n ić Z\ z p ie r w s z y m i n e le m e n t a m i A ' z A , a n a s t ę p n ie s c a la ć Z 2 z A ' w z w y k ł y s p o s ó b , z a m ie n i a j ą c w y p r o w a d z a n e e le m e n t y c i ą g u w y n ik o w e g o z e le m e n t a m i z Z i Z 2. N a p r z y k ła d d la n = 3 i x\ < y\ < X2 < V2 <
< P3 m a m y S tr e fa
Z a m ia n a Z\\
X\ a1
Z a m ia n a X\\
Xi
Z a m ia n a y\\
Xi
Z a m ia n a X2 '
XI XI Xl
P o c z ą t k o w a z a w a r to ś ć :
Z a m ia n a yyZ a m ia n a £ 3 :
X2 a,2
1 X3
S t r e fa 2 3/i
2/2
2/3
ax
o2
03
X2
X3
X2 X2
Vi
a3 Ci3 a3
&2
3/i
x2
a2
yi
X2
2/2
a2
2/3
yi
X2
2/2
X3
2/3
a2
P o m o c n ic z a
Vi
2/2
2/3
X\
Vi
2/2
2/3
ai
2/2
2/3
2/2
2/3
a\ ai
03
X3 X3 X3
Ol
O3
X3
Ol
O3
02
( S c a la n ie k o ń c z y się z a w s z e , g d y n - t y e le m e n t z p o m o c n ic z e g o o b s z a r u z o s ta n ie z a m ie n io n y ; w t e j m e t o d z ie p o m o c n ic z e r e k o r d y s ą z a z w y c z a j p e r m u t o w a n e ) . P o w y ż s z ą s z t u c z k ę s t o s u je s ię d o s c a le n ia Z\ z Z 2, n a s t ę p n ie Z 2 z Z 3 , . . . , Z m~ 1 z Zm, u ż y w a j ą c łą c z n ie 0 ( m n )
= O ( N ) o p e r a c ji. P o n ie w a ż ż a d e n z e le m e n tó w n ie
5.2.5
ODPOWIEDZI DO ĆWICZEŃ
m a w ię c e j n iż n in w e r s ji, z a t e m fr a g m e n t
Z\
699
. . . Z m n a s z e g o c i ą g u z o s t a n ie c a łk o w ic ie
p o s o r to w a n y . K o ń c z y m y , s o r t u ją c p r z e z w s t a w i a n i e r e k o r d y R n + i ~ 2s . *. R n w
0 {s 2 )
= O(N)
k r o k a c h ; p o t y m s n a j w i ę k s z y c h r e k o r d ó w z n a jd u je s ię w o b s z a r z e A . N a s t ę p n ie s c a l a m y i i i . . , R n —2s % R n -\-i~2s ■• ■R n —s z a p o m o c ą p o w y ż s z e j s z t u c z k i i z p o m o c n i c z y m o b s z a r e m A ( je d n a k z a m i e n i a ją c w s z ę d z ie r o la m i p r a w y z le w y m i m n ie js z y z w ię k s z y m ) . N a k o n ie c s o r t u je m y r e k o r d y R n + i ~ s . . . R n p r z e z w s t a w ia n ie . J. K a t a j a i n e n , T . P a s a n e n i J. T e u h o la d o k o n a li k o le jn e g o u d o s k o n a le n ia i o m ó w ili j e w Nordic J . Co m p ut i n g 3 ( 1 9 9 6 ) , 2 7 - 4 0 . Z o b a c z o d p o w ie d ź 5 .5 - 3 , w k t ó r e j o m ó w io n o p r o b le m stabilnego s c a la n ia w m ie js c u . 19 .
M o ż e m y p o n u m e r o w a ć w e jś c io w e w a g o n y t a k , ż e b y k o ń c o w a p e r m u t a c j a m i a ł a
2 n ; t a k w ię c j e s t t o w r z e c z y w i s t o ś c i p r o b le m s o r t o w a n ia . N a j p i e r w p r z e p u s z c z a m y 2n~ 1 w a g o n ó w p r z e z n — 1 s t o s ó w , u s t a w i a j ą c j e w p o r z ą d k u m a le j ą c y m p o rzą d ek 1 2
...
i p r z e s u w a ją c n a s t o s n t a k , że n a j m n i e j s z y z n ic h j e s t n a g ó r z e . P o t e m p r z e p u s z c z a m y k o le jn e 2n~ 1 w a g o n ó w p r z e z n — 1 s t o s ó w , u s t a w i a j ą c j e w p o r z ą d k u r o s n ą c y m t u ż p r z e d n - t y m s to s e m . N a k o n ie c s c a la m y w o c z y w i s t y s p o s ó b o b a c ią g i.
20.
D a ls z e in f o r m a c je n a t e n t e m a t m o ż n a z n a le ź ć w p r a c y
R. E.
T a r ja n a , J A C M 1 9
(19 72 ), 3 4 1 - 3 4 6 .
22 .
Z o b a c z Information Processing Let te rs
2
23.
S c a le n ia m o ż n a r e p r e z e n t o w a ć z a p o m o c ą d r z e w a b in a r n e g o , k t ó r e g o w s z y s t k i e
w ę z ły z e w n ę tr z n e z n a j d u j ą s ię n a p o z io m a c h
(19 7 3 ), 1 2 7 - 1 2 8 .
l_lg iVJ i [ l g i V ] . D l a t e g o m a k s y m a ln a
l ic z b a p o r ó w n a ń j e s t r ó w n a m in im a ln e j d łu g o ś c i ś c ie ż k i z e w n ę t r z n e j w d r z e w ie b in a r n y m o N w ę z ła c h z e w n ę t r z n y c h , 5 .3 .1 ~ ( 3 4 ) , m in u s N — 1 , p o n ie w a ż f ( m , n) = m + n — 1 je s t m a k s y m a ln e i m a m y N — 1 s c a le ń . ( Z o b a c z t a k ż e 5 . 4 . 9 - ( l ) ) . O g ó ln e t e c h n ik i b a d a n ia a s y m p t o t y c z n y c h w ła s n o ś c i t a k i c h r e k u r e n c ji z a p o m o c ą t r a n s fo r m a t M e llin a z o s t a ł y p r z e d s t a w io n e p r z e z P . F l a j o l e t a i M . G o l in a w A c t a Infor
mática 3 1 ( 1 9 9 4 ) , 6 7 3 - 6 9 6 ; w s z c z e g ó ln o ś c i p o k a z a li o n i, ż e ś r e d n ia l i c z b a p o r ó w n a ń w y n o s i i V l g i V - O N + 6 ( \ g N ) N + 0 ( 1 ) , n a t o m ia s t w a r ia n c ja j e s t r ó w n a ~ 0 . 345 ÍV, g d z ie S j e s t c i ą g ł ą f u n k c ją o o k r e s ie 1 i o ś r e d n ie j w a r t o ś c i r ó w n e j 0 , a
0 =
_ ł + ln 2
=
2
V 2 ln 2rre + 1 ln 2 m — 1 (m +l)(m + 2) n 2m v
1 .2 4 8 1 5 20420 9 9 6 5 3 84890 2 9 5 6 5 6432 9 5 3 2 4 0 1 6 1 2 7 + .
Ł ą c z n ą lic z b ę p o r ó w n a ń p r z y N —►oo d o b r z e p r z y b l i ż a r o z k ła d n o r m a ln y ; z t a k ą u z u p e ł n i a ją c ą a n a li z ą m o ż n a z a p o z n a ć się w p r a c y H .- K . H w a n g a i M . C r a m e r a , R a n d o m
Structures and Ai gor it hms 8 ( 1 9 9 6 ) , 3 1 9 - 3 3 6 ; 1 1 ( 1 9 9 7 ) , 8 1 - 9 6 .
5.2.5 1 . N ie , p o n ie w a ż s o r to w a n ie p o z y c y jn e n ie j e s t p o p r a w n e , je ś l i p o p ie r w s z e j fa z ie s o r to w a n ie p r z e z r o z r z u c a n ie n ie j e s t s t a b iln e . ( J e d n a k z a p r o p o n o w a n e s o r t o w a n ie p r z e z r o z r z u c a n ie mogłoby z o s t a ć u ż y t e w s o r t o w a n iu p o z y c y jn y m t y p u „ n a jb a r d z ie j z n a c z ą c a c y f r a p ie r w s z a ” , u o g ó ln ia ją c t y m s a m y m s o r to w a n ie p o z y c y j n e p r z e z z a m ie n ia n ie w s p o s ó b z a s u g e r o w a n y w o s t a t n im p a r a g r a fie g łó w n e g o t e k s t u ) .
2 . W p r o s t p r z e c iw n ie , j e s t „ a n t y s t a b i l n y ” . E le m e n t y o t a k i c h s a m y c h k lu c z a c h p o j a w i a j ą się w o d w r o t n y m p o r z ą d k u , p o n ie w a ż w p ie r w s z y m p r z e b ie g u r e k o r d y s ą p r z e g lą d a n e w k o le jn o ś c i o d R n d o R\. ( T o o k a z u je s ię w y g o d n e z e w z g lę d u n a w ie r s z e
700
ODPOWIEDZI DO ĆWICZEŃ
5.2.5
28 i 20 w p r o g r a m ie R , w k t ó r y c h k o r z y s t a s ię z p r z y r ó w n a n ia A d o 0 ; n ie j e s t je d n a k k o n ie c z n e , ż e b y w p ie r w s z y m p r z e b ie g u r e k o r d y b y ł y p r z e g lą d a n e o d t y ł u ) .
3. Jeśli kupka 0 nie jest pusta, to B0TM[0] już wskazuje na pierwszy element; jeśli jest pusta, to wykonujemy P L0C(B0TM[0] ), a następnie na LINK(P) zapamiętujemy wskaźnik na początek pierwszej niepustej kupki. 4.
G d y d o k o ń c a p o z o s t a j e p a r z y s t a lic z b a p r z e b ie g ó w , n a le ż y w z ią ć n a jp ie r w k u p k ę
0 (z g ó r y d o d o ł u ) , n a s t ę p n ie k u p k ę 1 , . . . , k u p k ę ( M — 1 ); w w y n i k u o t r z y m u je m y c ią g u p o r z ą d k o w a n y z e w z g lę d u n a d o t y c h c z a s p r z e jr z a n e c y fr y . G d y d o k o ń c a p o z o s t a je n i e p a r z y s t a l ic z b a p r z e b ie g ó w , n a le ż y n a j p i e r w w z ią ć k u p k ę ( M — 1 ) , p o t e m k u p k ę ( M — 2 ), . . . , k u p k ę 0 ; w w y n i k u d o s t a j e m y c i ą g w odwrotnym p o r z ą d k u z e w z g lę d u n a d o t y c h c z a s o b e jr z a n e c y fr y . ( T a z a s a d a z o s t a ł a n a jp r a w d o p o d o b n ie j p o r a z p ie r w s z y o p u b lik o w a n a p r z e z E . 5.
H.
F r ie n d a [ J A C M
N a l e ż y z m ie n ić w ie r s z 04 n a
R3SW
R5SW
LD2 LD2 LD2 LD2 LD2 LD2 LD2 LD2 LD1
‘ENT3 T
3 (1956), 156, 165-166]). i z m ie n ić t a b li c e
R3SW o r a z R5SW na:
KEY,1 (1 :1 ) KEY,1 (2 :2 ) KEY,1 (3 :3 ) KEY,1 (4 :4 ) KEY,1 (5 :5 ) INPUT,1 (1 :1 ) INPUT,1 (2 :2 ) INPUT,1 (3 :3 ) INPUT,1(LINK)
!
( p o w t ó r z y ć p o p r z e d n ie w ie r s z e je s z c z e s z e ś ć r a z y )
DEC1
1
|
N o w y c z a s d z i a ła n i a o t r z y m u je m y , z a m i e n i a ją c w s z ę d z ie „ 3 ” n a „ 8” , co d la p = 8 d a je ( lip -
1 )JV + 1 6 p M + 1 2 p - 4 £ + 2 .
6 . (a ) R o z w a ż m y u m ie s z c z e n ie ( N + l ) - s z e g o e le m e n tu . R ó w n a n ie r e k u r e n c y jn e pM(N+l)k =
fc + 1
M -k
PMN(k+1) H------ J J— PMNk
j e s t r ó w n o w a ż n e p o d a n e m u w z o r o w i, (b ) n - t a p o c h o d n a s p e łn i a z a le ż n o ś ć 9 m \n + i ){z ) = ( 1 - n / M ) g (" )N (z) + ( ( 1 - z ) / M ) g M { %1){z), c o m o ż n a u d o w o d n ić p r z e z in d u k c ję p o n. B io r ą c z — 1, d o s ta je m y że # m ^ (1 ) “
(1
~
n / M ) N M n, p o n ie w a ż
qmo{z) — z M. Z a t e m
mean(
7.
N ie c h R
=
s o r t o w a n ie p o z y c y jn e , R X
=
s o r to w a n ie p o z y c y jn e p r z e z z a m ie n ia n ie .
O t o p e w n e p o d o b ie ń s t w a i r ó ż n ic e : R X p r z e b ie g a o d n a jb a r d z ie j d o n a jm n ie j z n a c z ą c e j c y fr y , n a t o m i a s t R o d w r o t n ie . W o b u m e t o d a c h s o r to w a n ie p o le g a n a o g lą d a n iu c y fr 1 n ie w y k o n u je się p o r ó w n a ń m ię d z y k lu c z a m i. W R X z a w s z e M — 2 ( z o b a c z j e d n a k ć w ic z e n ie 1 ). C z a s d z i a ła n i a R p r a w ie n ie z m ie n ia się, p o d c z a s g d y R X je s t w r a ż liw y n a r o z k ła d c y fr . W o b u p r z y p a d k a c h c z a s d z i a ła n i a w y n o s i 0 ( N lo g K ) , g d z ie K je s t z a k r e s e m k lu c z y , j e d n a k w s p ó łc z y n n i k p r o p o r c jo n a ln o ś c i j e s t w ię k s z y d la R X ; z d ru g ie j s t r o n y , k i e d y r o z k ła d k l u c z y n a n a jb a r d z ie j z n a c z ą c y c h c y f r a c h j e s t je d n o s t a jn y , ś r e d n i c z a s d z i a ła n i a R X w y n o s i 0 ( N \ o g N ), n ie z a le ż n ie o d K . R w y m a g a p ó l n a d o w ią z a n ia ,
ODPOWIEDZI DO ĆWICZEŃ
5.2.5
701
n a t o m ia s t R X d z i a ła w m in im a ln e j p a m ię c i. W e w n ę t r z n a p ę t l a R b a r d z ie j n a d a j e się d la k o m p u t e r ó w p o t o k o w y c h .
8 . W o s t a t n im p r z e b ie g u k u p k i p o w in n y z o s t a ć p o w ią z a n e z e s o b ą w in n y m p o r z ą d k u ; n a p r z y k ła d , je ś li M = 2 5 6 , t o p ie r w s z ą k u p k ą b ę d z ie ( 10000000) 2 , n a s t ę p n y m i k u p k a m i z a ś ( 10000001 ) 2,
( 1 1 1 1 1 1 1 1 ) 2, ( 00000000) 2, ( 00000001) 2, . . . , ( 0 1 1 1 1 1 1 1 ) 2 . T ę
z m ia n ę w w ią z a n iu m o ż n a ła t w o p r z e p r o w a d z ić , m o d y f ik u ją c a lg o r y t m H lu b ( w t a b e li
1 ) z m ie n ia ją c s p o s ó b a lo k a c ji p a m ię c i w o s t a t n im p r z e b ie g u . 9 . M o g lib y ś m y n a j p i e r w o d d z ie lić l ic z b y u je m n e o d d o d a t n ic h , t a k j a k w ć w ic z e n iu 5 .2 .2 - 3 3 ; m o g lib y ś m y t e ż w
p ie r w s z y m
p r z e b ie g u z m ie n ić z a p is k l u c z y n a n o t a c ję
u z u p e łn ie n io w ą . A l t e r n a t y w n i e m o g lib y ś m y p o o s t a t n im
p r z e b ie g u o d d z ie lić k lu c z e
d o d a t n ie o d u je m n y c h , o d w r a c a j ą c p o r z ą d e k t y c h o s t a t n ic h , c h o c ia ż m e t o d a z ć w ic z e n ia 5 .2 .2 - 3 3 n ie m a w ię c e j z a s to s o w a ń .
11.
B e z p ie r w s z e g o p r z e b ie g u n a s z a m e t o d a n a d a l b y d z i a ła ła , p o n ie w a ż ( p r z e z p r z y
p a d e k ) 503 p o p r z e d z a j u ż 509. B e z p ie r w s z y c h d w ó c h p r z e b ie g ó w lic z b a in w e r s ji w y n o s i ł a b y l + l + 0 + 0 + 0 - f l + l + l + 0 + 0 = 5. 12 .
P o z a m ia n ie Rk z R [ P ] w k r o k u M 4 ( ć w ic z e n ie 5 .2 - 1 2 ) m o ż e m y p o r ó w n a ć K k
z K k - 1 . J e ś li K k j e s t m n ie js z y , t o p o r ó w n u je m y g o z K k - 2, K k - 3 , . . . , a ż s t w ie r d z im y
K k ^ K j . N a s t ę p n ie n a le ż y w y k o n a ć ( R j + i , . . . , R k- i , Rk) ( R k, Rj +i , •. ■, R k - i ) , bez z m ia n y z a w a r t o ś c i p ó l LINK. W y g o d n i e j e s t u m ie ś c ić n a p o c z ą t k u c i ą g u s z t u c z n y k lu c z K q, k t ó r y j e s t ^ o d w s z y s t k i c h in n y c h k lu c z y .
14.
J e ś li o r y g in a ln a p e r m u t a c j a k a r t w y m a g a
5 .1 .3 - 2 0 , i je ś li u ż y w a m y
m
k
cz y ta ń ,
w
z n a c z e n iu
z ć w ic z e n ia
k u p e k n a p r z e b ie g , t o m u s im y w y k o n a ć c o n a jm n ie j
|"logm k ] p r z e b ie g ó w . ( R o z w a ż m y o p e r a c ję o d w r o t n ą p o l e g a ją c ą n a p r z e jś c iu o d t a l i i p o s o r to w a n e j d o t a lii o r y g in a ln e j; lic z b a c z y t a ń r o ś n ie co n a j w y ż e j
m
ra zy w każd ym
p r z e b ie g u ) . P o d a n a p e r m u t a c j a w y m a g a 4 c z y t a ń r o s n ą c y c h i 10 c z y t a ń m a le ją c y c h ; z a t e m p o r z ą d e k m a le j ą c y w y m a g a 4 p r z e b ie g ó w z d w o m a k u p k a m i lu b 3 p r z e b ie g ó w z t r z e m a k u p k a m i. N a o d w r ó t , o p t y m a ln a l ic z b a p r z e b ie g ó w j e s t o s ią g a ln a : N u m e r u je m y k a r t y o d 0 d o
k—lw
z a le ż n o ś c i o d t e g o , d o k t ó r y c h c z y t a ń n a le ż ą , i s t o s u je m y s o r to w a n ie p o z y c y jn e
( n a jm n ie j z n a c z ą c a c y f r a p ie r w s z a , p o d s t a w a m ) . [Z o b a c z Martin G a rd n e r ’s Si x t h B o o k
o f Mat hemat ical G a m e s ( S a n F r a n c is c o : W . H . F r e e m a n , 1 9 7 1 ) , 1 1 1 - 1 1 2 ]. 15.
N ie c h
k
b ę d z ie l ic z b ą c z y t a ń , a m lic z b ą k u p e k . P o k a ż d y m p r z e b ie g u o d w r a c a m y
p o r z ą d e k ; je ś li w d a n y m u p o r z ą d k o w a n iu m a m y
k c z y ta ń ,
t o lic z b a c z y t a ń w u p o r z ą d k o
w a n iu p r z e c iw n y m w y n o s i n + 1 — k. M in im a ln a l ic z b a p r z e b ie g ó w a lb o j e s t n a j m n i e j s z ą l ic z b ą p a r z y s t ą w ię k s z ą lu b r ó w n ą lo g m lu b r ó w n ą lo g m (n - f i —
k).
k,
a lb o n a j m n i e j s z ą lic z b ą n i e p a r z y s t ą w ię k s z ą
( C o f a j ą c się , m a m y c o n a j w y ż e j
m
m a le j ą c y c h c z y t a ń p o
je d n y m p r z e b ie g u , m 2 r o s n ą c y c h c z y t a ń p o d w ó c h p r z e b ie g a c h i t d .) . P r z y k ł a d o w y c i ą g m o ż n a p o s o r to w a ć r o s n ą c o w m in ( 2 , 5) =
2 p r z e b ie g a c h , m a le ją c o w m i n ( 3 , 4) =
3
p r z e b ie g a c h , u ż y w a j ą c t y lk o d w ó c h k u p e k .
16.
Z a łó ż m y , że s ło w a k o ń c z ą s ię s p e c ja ln y m z n a k ie m , k t ó r y j e s t m n ie js z y o d k a ż d e j
l it e r y w a lfa b e c ie . W y k o n u je m y s o r to w a n ie p o z y c y jn e z le w a n a p r a w o . R o z p o c z y n a m y o d w s z y s t k ic h s łó w p o w ią z a n y c h w je d e n b lo k d a n y c h . N a s t ę p n ie , d la
k
= 1 , 2, . . . ,
k a ż d y b lo k , k t ó r y z a w ie r a c o n a jm n ie j d w a r ó ż n e s ło w a , d z ie lim y n a p o d b lo k i w z g lę d e m fc-tych lit e r s łó w w b lo k u , c a ł y c z a s u t r z y m u ją c p o r z ą d e k w y z n a c z o n y p r z e z d o t y c h c z a s s p r a w d z o n e p r e fik s y . G d y b lo k s k ła d a s ię t y l k o z je d n e g o s ło w a lu b g d y w s z y s t k i e
k-t e
lit e r y w b lo k u s ą s p e c ja ln y m i s y m b o la m i (c o o z n a c z a , że w s z y s t k i e n a p i s y w b lo k u s ą t a k ie s a m e ) , z a z n a c z a m y t e n fa k t , ż e b y u n ik n ą ć j e g o d a ls z e g o p r z e t w a r z a n ia . [R. P a ig e ,
702
5.2.5
ODPOWIEDZI DO ĆWICZEŃ
R . E . T a r j a n , S I C O M P 1 6 ( 1 9 8 7 ) , 9 7 3 - 9 8 9 , § 2]. O p is a n y p r o c e s j e s t w z a s a d z ie t a k i s a m j a k p r o c e s k o n s t r u k c ji d r z e w a , o k t ó r y m j e s t m o w a w p o d r o z d z ia le 6 .3 . P o d o b n y , a le t r o c h ę m n ie j e f e k t y w n y a lg o r y t m , o p a r t y n a s o r to w a n iu p o z y c y jn y m z p r a w a n a le w o , z o s t a ł z a p r o p o n o w a n y p r z e z A h o , H o p c r o ft a , U llm a n a , Projektowanie i analiza
algorytmów komputerowych ( W a r s z a w a : P W N , 19 8 3 ). M e t o d y z a p r o p o n o w a n e p r z e z M c ll r o y a , B o s t i c a i M c ll r o y a , c y t o w a n e w t e k ś c ie , s ą w p r a k t y c e j e s z c z e s z y b s z e .
17.
M e t o d a M a c L a r e n a p r z y ś p i e s z a d r u g i p o z io m , a le n ie m o ż e b y ć w y k o r z y s t a n a n a
p o z io m ie p ie r w s z y m , p o n ie w a ż n ie o b li c z a się w n ie j lic z b Nk-
18.
f ^ ^ CNf(x) dx
N a j p i e r w u d o w o d n im y w s k a z ó w k ę : N ie c h pk =
b ę d z ie p r a w d o
p o d o b ie ń s t w e m , ż e d a n y k lu c z w p a d a d o k o s z y k a A;, g d y m a m y d o d y s p o z y c ji C N k o s z y k ó w . C z a s p o t r z e b n y d o r o z r z u c e n ia r e k o r d ó w w y n o s i 0 ( i V ) , n a t o m ia s t ś r e d n ia l ic z b a in w e r s ji p o z o s t a j ą c y c h p o r o z r z u c e n iu w y n o s i
(^)p3 k {l — Pk)N ~j (J2) =
l E f c f o " 1 ( 2 )Pk < Er 1 T,k=o~1PkB /C:, ponieważ pk ^ B/CN. R o z w a ż m y t e r a z d w a p o z io m y r o z r z u c a n ia , z c N k o s z y k a m i n a p o z io m ie p ie r w s z y m i n ie c h bk =
su p { f(x )
\ k/cN ^
x <
d z i a ł a n i a w y n o s i O ( N ) p lu s Y^k =o 1 ^
(k A l ) / c N } . W ó w c z a s ś r e d n i, ł ą c z n y c z a s g d z ie Tk j e s t ś r e d n im c z a s e m p o t r z e b n y m d o
p o s o r t o w a n ia Nk k l u c z y m e t o d ą M a c L a r e n a , p r z y fu n k c ji g ę s t o ś c i f k ( x ) = f ( ( k + x)
/ c N ) / c N p k . K o r z y s t a j ą c z e w s k a z ó w k i, m a m y Tk — E O ( b k N k / c N p k ), p o n ie w a ż f k{x ) j e s t o g r a n ic z o n e p r z e z b k / c N p k . A l e E N k — N p k , z a t e m T k = 0 ( 6 * / c ) . P r z y N —> 00 —►N
m am y
f ( x ) dx = W , c o w y n i k a z d e fin ic ji c a ł k i R ie m a n n a .
5.3.1 lł
^
( ii)
lu b
gdzie A i j to
D łu g o ś ć ś c ie ż k i z e w n ę tr z n e j w y n o s i 112
n a t o m i a s t B i jk t o
ijk4
i j 4k
i4jk
4ijk
( je s t o p t y m a ln a ) .
(b ) T u t a j A i j =
3^4
g d z ie Cijki =
C i j 34
P o n o w n ie d łu g o ś ć ś c ie ż k i z e w n ę t r z n e j w y n o s i 1 1 2 ( je s t o p 2.
Z g o d n ie z o z n a c z e n ia m i z ć w ic z e n ia 5 .2 .4 - 1 4 ,
t L(n) - B(n) = £)((e* + fc - l)2 efc - (ei + l)2 efc) + 2ei+1 - 2et k=1 t = 2ei - 2 e* - ^ ( e i - e k + 2 - k ) T k k = 2
;> 2ei - (2ei_1 + • ■■+ 2e i“ t+1 + 2et) ^ 0,
ODPOWIEDZI DO ĆWICZEŃ
5.3.1
g d z ie m a m y r ó w n o ś ć w t e d y i t y l k o w t e d y , g d y n = 2k — 23, d la p e w n y c h k > j
703 0. [G d y
s c a le n ia w y k o n u je m y „z g ó r y d o d o ł u ” , j a k w ć w ic z e n iu 5 .2 .4 - 2 3 , w ó w c z a s m a k s y m a ln a lic z b a p o r ó w n a ń w y n o s i B(n)]. D l a n > 0 lic z b a w y n ik ó w s o r t o w a n ia , w k t ó r y c h n a j m n i e j s z y k lu c z p o j a w i a się
3.
d o k ła d n ie k r a z y , w y n o s i (k )-P n —k . S t ą d d la n ^ 0 , 2Pn — E / c {n k) P n - k i d a le j 2P ( z ) =
e z P ( z ) + 1 , co w y n ik a z 1 . 2 . 9 - ( i o ) . W in n y m d o w o d z ie w y k o r z y s t u j e się f a k t , ż e P n — Ysk >o
p o n ie w a ż { £ } j e s t
l ic z b ą s p o s o b ó w p o d z i a ł u n e le m e n t ó w n a k n ie p u s t y c h c z ę ś c i, k t ó r e m o ż n a p r z e p e r m u t o w a ć n a fc! s p o s o b ó w . S t ą d J 2 n>0 P n Z n/ n \ — J2k>o(eZ ~ 1 )* “
1 / ( 2 — e z ), c o w y n ik a
z 1.2.9-(23). J e s z c z e inny d o w ó d , b y ć m o ż e n a j b a r d z i e j in t e r e s u ją c y , o t r z y m a m y , je ś li d a n e e le m e n ty u s t a w im y w c i ą g s t a b iln ie w t a k i s p o s ó b , ż e K i p o p r z e d z a K j w t e d y i t y l k o w t e d y , g d y K i < K j lu b ( K i = K } o r a z i < j ) . W ś r ó d w s z y s t k i c h P n w y n ik ó w d a n e r o z m ie s z c z e n ie K ai . . . K an p o j a w i a s ię d o k ła d n ie 2k r a z y , je ś l i p e r m u t a c j a a i . . . a n z a w ie r a k w z r o s tó w ; z a t e m P n m o ż n a w y r a z i ć z a p o m o c ą lic z b e u le r o w s k ic h , P n —
J 2 k ( k ) 2 fc- P o s z u k iw a n y w y n i k d o s ta n ie m y , je ś li w 5 . 1 . 3 - ( 2 0 ) w e ź m ie m y z ~ 2. T ę fu n k c ję t w o r z ą c ą o t r z y m a ł A . C a y l e y [P h i l . Mag.
18
(18 5 9 ), 3 7 4 - 3 7 8 ] p r z y
p r z e lic z a n iu p e w n e j, n i e p r e c y z y jn ie z d e fin io w a n e j k l a s y d r z e w . Z o b a c z t a k ż e P . A . M a c M a h o n , Proc. L ondon Math. Soc. 2 2 ( 1 8 9 1 ) , 3 4 1 - 3 4 4 ; J . T o u c h a r d , An n. Soc.
Sci. Bruxelles 5 3 ( 1 9 3 3 ) , 2 1 - 3 1 ; j a k r ó w n ie ż O . A . G r o s s , A M M
6 9 (19 6 2 ), 4 - 8 ,
k t ó r y p o d a ł in t e r e s u ją c ą z a le ż n o ś ć P n = Y^k^i k n/ 2 1+k, n ^ 1 .
4.
K o r z y s ta ją c z ln 2 )
2P ( z ) = ^ f 1 — i c o t
1 2
z — ln 2
k> 1
\ z — ln 2 — 2ni k
d o s t a je m y s z e r e g z b ie ż n y P n /n\ = | ( l n 2 )
+
z — ln 2 4 - 27ńikk )
n 1 + Y l k > i ^ ((^ n 2 + 27TŻA:) n 1).
S'(n) ^ S(n), p o n ie w a ż w s z y s t k i e k lu c z e m o g ą b y ć r ó ż n e ; p o z o s t a j e p o k a z a ć , S'(n) ^ S(n). D l a d a n e g o a lg o r y t m u s o r t u ją c e g o , w y k o n u ją c e g o S(n ) k r o k ó w d la
6. że
r ó ż n y c h k lu c z y , m o ż e m y s k o n s t r u o w a ć a lg o r y t m s o r t u j ą c y w o g ó ln y m p r z y p a d k u , u t o ż s a m ia ją c r o z g a łę z ie n ie = z r o z g a łę z ie n ie m < i u s u w a j ą c r e d u n d a n c je . W w ę ź le z e w n ę t r z n y m z n a n e s ą w s z y s t k i e r ó w n o ś c i, p o n ie w a ż z a c h o d z i w y k o n a n e b e z p o ś r e d n ie p o r ó w n a n ie
Kai :Kai+1
d la
Kai ^ Ka2
i z o s ta ło
Rys. A—1 .
R o z w i ą z a n i e d o ć w ic z e n ia
( „ * ” o z n a c z a p r z y p a d e k , k t ó r y n ie z a c h o d z i) .
R o z w i ą z a n i e d o ć w ic z e n ia 8 .
5.3.1
Rys. A—2.
7.
5.3.1
ODPOWIEDZI DO ĆWICZEŃ
705
M . P a t e r s o n z a u w a ż y ł , że je ś li w ie lo k r o t n o ś c ia m i k l u c z y s ą ( n i , . . . , n m ), t o lic z b ę p o ró w n ań m o żn a zred u k o w ać do n lg n — £
% Ig nj + 0 ( n ) ; z o b a c z S I C O M P 5 ( 1 9 7 6 ) , 2.
T o d o ln e o g r a n ic z e n ie j e s t p r a w ie o s ią g a ln e i n ie w y m a g a i s t o t n ie d o d a t k o w e j p a m ię c i. W
t y m c e lu m o ż n a z a a d a p t o w a ć s o r to w a n ie k o p c o w e d o p r z y p a d k u r ó w n y c h k lu c z y ,
w s p o s ó b z a p r o p o n o w a n y p r z e z M u n r o i R a m a n a w Lect ure N ot es in Comp . Sci. 5 1 9 (19 9 1), 4 7 3 -4 8 0 . 7.
Z o b a c z r y s u n e k A - l . Ś r e d n ia lic z b a p o r ó w n a ń w y n o s i (2 + 3 + 3 + 2 + 3 + 3 + 3 +
3 + 3 + 3 + 3 + 3 + 2 + 3 + 3 + 2 )/16 = 2 § .
8 . Z o b a c z r y s u n e k A - 2 . Ś r e d n ia lic z b a p o r ó w n a ń w y n o s i 3 § f . 9.
Ż e b y s t w ie r d z ić , ż e w s z y s t k i e k lu c z e s ą t a k i e s a m e (je ś li t a k j e s t n a p r a w d ę ) , p o
t r z e b u je m y c o n a jm n ie j n — 1 p o r ó w n a ń . O d w r o t n ie , n — 1 p o r ó w n a ń z a w s z e w y s t a r c z y , p o n ie w a ż z a w s z e m o ż n a u s t a lić k o ń c o w e u p o r z ą d k o w a n ie p o p o r ó w n a n iu K i z e w s z y s t k im i p o z o s t a ły m i k lu c z a m i. 10 .
N ie c h f ( n ) b ę d z ie p o s z u k iw a n ą f u n k c ją i n ie c h g(n) b ę d z ie m in im a ln ą ś r e d n ią
lic z b ą p o r ó w n a ń p o t r z e b n ą d o p o s o r t o w a n ia n + d o k ła d n ie
k
k
e le m e n tó w , g d y
k
> 0 i w a rto ś c i
z t y c h e le m e n tó w s ą z n a n e (0 lu b 1 ) . W ó w c z a s / (O ) = / ( 1 ) — g( 0) = 0,
9 ( ! ) = 1 ; f { n ) = 1 + | f { n - 1 ) + ±g(n - 2), g(n) = 1 + m in (c?(n - 1 ), i g ( n - 1 ) + \ g { n — 2 )) = l + \ g ( n — l ) + ^ g ( n — 2 ), d la n ^ 2. ( T a k w ię c n a j le p s z a s t r a t e g i a p o le g a n a p o r ó w n y w a n iu d w ó c h n ie z n a n y c h e le m e n t ó w , k i e d y t y lk o j e s t t o m o ż liw e ) . W y n i k a s t ą d , ż e f ( n ) — g(n) = | ( / ( r t — 1 ) — p ( n — 1 )) d
l a
2 , n a t o m ia s t g(n) = | ( n + | ( l — ( ~ | ) n ))
d la n ^ 0. Z a t e m o d p o w ie d z ią j e s t l ^
+
I - K
- i r - d r 1
d lan ^ l.
(T e n d o k ła d n y w z ó r m o ż n a p o r ó w n a ć z t e o r io in f o r m a c y jn ą d o ln ą g r a n ic ą , l o g 3 (2 n — 1) w 0 .6 3 0 9 n ). 11.
K o r z y s t a j ą c z b in a r n e g o w s t a w ia n ia , m a m y S m (n ) ^
d la n ^ m . Z d r u g ie j s t r o n y SV n(n) ^ [lg Y l k L i
B(m)
+ (n —
m) |~lg(m + 1 ) ]
> a t ° j e st a s y m p t o t y c z n i e r ó w n e
n l g m + 0 ( ( ( m — l ) / m ) n ); z o b a c z 1 . 2 . 6- ( 53 ). 12 .
(a) J e ś li b r a k j e s t r e d u n d a n t n y c h p o r ó w n a ń , t o m o ż e m y w d o w o ln y s p o s ó b u s t a lić
p o r z ą d e k t a k ic h s a m y c h k l u c z y w c h w ili, k ie d y j e p o r ó w n u je m y p i e r w s z y r a z , p o n ie w a ż ż a d n e g o p o r z ą d k u n ie je s t e ś m y w s t a n ie u s t a lić n a p o d s t a w ie w c z e ś n ie j w y k o n a n y c h p o r ó w n a ń , (b ) Z a łó ż m y , ż e d a n e d r z e w o s iln ie s o r t u je k a ż d y c i ą g z e r i je d y n e k ; u d o w o d n im y , ż e s o r t u je o n o k a ż d ą p e r m u t a c ję z b io r u { 1 , 2 , . . . , n } .
Z a łó ż m y , ż e t a k n ie
je s t ; w ó w c z a s is t n ie je p e r m u t a c ja , d la k t ó r e j w d r z e w ie s t w ie r d z a m y , ż e K ai ^ K a2 $ ■• ■^ K o n , p o d c z a s g d y w r z e c z y w is t o ś c i K ai > K ai+1 d la p e w n e g o i. Z a s t ą p m y t e r a z w s z y s t k ie e le m e n t y < K ai p r z e z 0 , a w s z y s t k i e e le m e n t y ^ K ai p r z e z 1 ; z z a ło ż e n ia , s t o s u ją c tę m e t o d ę , d o s t a n ie m y c i ą g p o s o r to w a n y , j e ś l i p r z e jd z ie m y p o ś c ie ż c e p r o w a d z ą c e j d o K ai ^ K a 2 ^ * * * $ K an - s p r z e c z n o ś ć . 13.
J e ś li n j e s t p a r z y s t e , t o F ( ń ) — F ( n — 1) = 1 + F ( [ n / 2 \ ) -
F ([n / 2 J - l) , ta k
w ię c m u s im y u d o w o d n ić , ż e Wk - i < \n/2\ ^ Wk\ t o j e s t o c z y w i s t e , p o n ie w a ż Wk-\ =
[wk/2\. J e ś li n j e s t n ie p a r z y s t e , t o F ( n ) — F ( n — 1) = G { \ n/ 2\ ) — G(|_n/2_|), a z a t e m m u s im y u d o w o d n ić , że t k - i < \n/2] ^ t o j e s t o c z y w is t e , p o n ie w a ż t k - i = \wk/2~\. 14.
Z ć w ic z e n ia 1 .2 .4 - 4 2 d o s t a je m y , ż e t ą s u m ą j e s t n [ lg ~ri\ — (wi H
Wj < n $5 Wj+1 . T a o s t a t n ia s u m a w y n o s i Wj+i p r z e d s t a w ić w p o s t a c i n [ T g | n ] — [2^-lg^6n ^ / 3 j + sp o so b ó w ).
h Wj), g d z ie —[ j / 2j —1 . D la t e g o F ( n ) m ożna lg;(6 n )J
( ja k i n a w ie le in n y c h
706 15.
5.3.1
ODPOWIEDZI DO ĆWICZEŃ
J e ś li [ lg ~n\ = l g ( f n ) + 0, t o F ( n ) — n \ g n - (3 - l g 3 ) n + n ( 0 + 1 — 2e ) + 0 ( l o g n ) .
J e ś li [ l g n ] = l g n + 0, B ( n ) = n l g n — n + n(0 + 1 - 26) - f O ( l o g n ) . [Z a u w a ż m y , ż e l g n ! = n l g n — n / ( ln 2) + O ( l o g n ) ; l / ( l n 2 ) w 1 .4 4 3 ; 3 — lg 3 w 1 .4 1 5 ] . 17.
L i c z b a p r z y p a d k ó w , w k t ó r y c h bk < ap < 6^+1 w y n o s i
i m —p~\-n —k \ / p —1 + fc\ V m ~p J \ p —1 / n a t o m ia s t lic z b a p r z y p a d k ó w , w k t ó r y c h aj < b q < O j+ i w y n o s i
Ç i-q +m - j ^ Çq-1+j^ 18 .
N ie , p o n ie w a ż p o n iż e j
k a ż d e g o p o r ó w n a n ia w d r z e w ie r o z w a ż a m y t y lk o g a łą ź
o m n ie js z e j j a k o ś c i. J e d n a z g a ł ę z i o w ię k s z e j ja k o ś c i m o g ła b y o k a z a ć się t r u d n ie js z a d o p r z e jś c ia . 20.
N ie c h L b ę d z ie m a k s y m a ln y m p o z io m e m , n a k t ó r y m p o j a w i a j ą się w ę z ł y z e w n ę t r z
n e , i n ie c h l b ę d z ie m in im a ln y m t a k i m p o z io m e m . J e ś li L ^
+ 2, t o m o ż e m y u s u n ą ć
d w a w ę z ł y z p o z io m u L i u m ie ś c ić j e p o n iż e j w ę z ł a z p o z io m u /; w t e n s p o s ó b d łu g o ś ć ś c ie ż k i z e w n ę t r z n e j z m n ie js z a się o 1 + 2 L — ( L — l + 2 ( / H -l)) — L — l — l ^ 1. O d w r o tn ie , j e ś l i L ^ Z + 1 , t o n ie c h k b ę d z ie l ic z b ą w ę z łó w z e w n ę t r z n y c h n a p o z io m ie Z, a N — k l ic z b ą w ę z łó w z e w n ę t r z n y c h n a p o z io m ie Z + 1 , g d z ie 0 < k ^ N. Z ć w ic z e n ia 2 .3 .4 .5 - 3 m a m y k 2 ~ l + ( N — k ) 2 ~ L~ 1 = 1 ; z a t e m N + k ~ 2 i+ 1 . Z n ie r ó w n o ś c i 2 l ^ N < 2 /+1 w y n ik a te r a z , że Z =
[ lg iV J ; t o d e fin iu je k i p r o w a d z i d o d łu g o ś c i ś c ie ż k i z e w n ę tr z n e j
r ó w n e j ( 34 ).
2 1 . N ie c h
r(x)
b ę d z ie k o r z e n ie m p r a w e g o p o d d r z e w a x. W y s o k o ś c i w s z y s t k i c h p o d -
d r z e w s ą m in im a ln e w t e d y i t y l k o w t e d y , g d y
rig*«*))! ^ rigi(ar)i -1 i rigi(r(x))i ^ [^*0*01 - 1 d la w s z y s t k i c h x. P i e r w s z y w a r u n e k j e s t r ó w n o w a ż n y
2t (l ( x) ) — t (x) ^ 2 P g«(*)l - ¿ ( x ) , n a t o m ia s t d r u g i
t (x) — 2t ( i ( x ) ) ^ 2 P g*(*)l - t ( x ). 2 2 . Z ć w ic z e n ia 20 m a m y , ż e c z t e r y w a r u n k i
Ligt(z(x))j,
Ug^K*))! ^
-1
i
te *00*0)1.
te *(r 0*0)l < te *0*01 - 1
s ą k o n ie c z n e i w y s t a r c z a j ą c e . R o z u m u ją c j a k w ć w ic z e n iu 2 1 , m o ż e m y u d o w o d n ić , że s ą o n e r ó w n o w a ż n e w a r u n k o m s f o r m u ło w a n y m w t y m ć w ic z e n iu . [ M a r tin S a n d e liu s ,
A M M 68 ( 1 9 6 1 ) , 1 3 3 - 1 3 4 ] . P e w n e u o g ó ln ie n ie z n a jd z i e m y w ć w ic z e n iu 33. 23.
W e w s t a w i a n i u d o w ie lu lis t z a k ł a d a się , ż e r o z k ła d k l u c z y j e s t j e d n o s t a j n y n a
zn anym
p r z e d z ia le . T a k w ię c t a m e t o d a n ie j e s t
„ c z y s t ą m e t o d ą s o r to w a n ia p r z e z
p o r ó w n y w a n ie ” z a c h o w u j ą c ą o g r a n ic z e n ia , o k t ó r y c h j e s t m o w a w t y m r o z d z ia le . 24.
N a j p i e r w p o s t ę p u j e m y t a k , j a k p r z y s o r to w a n iu p ię c iu e le m e n tó w , a ż p o p ię c iu
p o r ó w n a n ia c h d o j d z i e m y d o je d n e j z k o n fig u r a c ji z ( 6 ). W p ie r w s z y c h t r z e c h p r z y p a d k a c h k o ń c z y m y s o r t o w a n ie p ię c iu e le m e n t ó w , w y k o n u ją c d o d a t k o w o d w a p o r ó w n a n ia , a n a s t ę p n ie w s t a w i a m y s z ó s t y e le m e n t / . W p o z o s t a ły c h p r z y p a d k a c h n a j p i e r w p o r ó w n u je m y / : 6, n a s t ę p n ie w s t a w i a m y / d o g łó w n e g o ła ń c u c h a , a p o t e m c. [ P ic a r d , Théorie
des Questionnaires , s t r o n a 1 1 6 ] .
ODPOWIEDZI DO ĆWICZEŃ
5.3.1 25.
707
P o n ie w a ż N = 7! = 5040 i q = 1 3 , t o n a p o z io m ie 12 z n a la z ł o b y się 8 1 9 2 — 5040 —
3 1 5 2 w ę z łó w z e w n ę t r z n y c h , a n a p o z io m ie 13 z n a la z ł o b y się 5040 — 3 1 5 2 = 18 8 8 w ę z łó w z e w n ę tr z n y c h .
26.
L . K o ll a r [Lecture N ot es in C o m p . Sci.
233
(1 9 8 6 ), 4 4 9 - 4 5 7 ] w y k a z a ł w z n a k o m i t y
s p o s ó b , że w o p t y m a ln e j m e t o d z ie d łu g o ś ć ś c ie ż k i z e w n ę tr z n e j w y n o s i 6 2 4 1 6 .
27.
J e s t jedynym s p o s o b e m r o z p o z n a n ia d w ó c h n a jc z ę ś c ie j p o j a w i a j ą c y c h s ię p e r m u t a c j i z a p o m o c ą d w ó c h p o r ó w n a ń , m im o ż e p ie r w s z e p o r ó w n a n ie d a j e p o d z i a ł 0 .2 7 / 0 .7 3 !
28.
L u n K w a n u ł o ż y ł 8 7 3 - w ie r s z o w y p r o g r a m , k t ó r e g o ś r e d n i c z a s d z i a ła n i a w y n o s i
3 8 .9 2 5 u . J e g o p e s y m i s t y c z n y c z a s d z i a ła n i a w y n o s i 4 3 u; t e n d r u g i c z a s o k a z u je s ię b y ć o p ty m a ln y , p o n ie w a ż j e s t t o c z a s 7 p o r ó w n a ń , 7 t e s t ó w , 6 ła d o w a ń i 5 p r z e s ła ń d o p a m ię c i.
29.
M u s im y w y k o n a ć c o n a jm n ie j S ( n ) p o r ó w n a ń , p o n ie w a ż n ie j e s t m o ż liw e d o
w ie d z e n ie się, c z y p e r m u t a c j a j e s t p a r z y s t a , c z y n ie p a r z y s t a , z a n im
n ie w y k o n a m y
w y s t a r c z a ją c e j lic z b y p o r ó w n a ń , ż e b y r o z s t r z y g n ą ć t o je d n o z n a c z n ie . M o ż e m y b o w ie m z a ł o ż y ć , że w y k o n a liś m y w y s t a r c z a j ą c ą lic z b ę p o r ó w n a ń , ż e b y z a w ę z ić w s z y s t k o d o d w ó c h m o ż liw o ś c i, k t ó r e z a l e ż ą o d t e g o , c z y
j e s t , c z y n ie j e s t m n ie js z e o d a^,
d la p e w n y c h i o r a z j\ j e d n ą z t y c h m o ż liw o ś c i j e s t p e r m u t a c j a p a r z y s t a , n a t o m i a s t d r u g ą p e r m u t a c j a n ie p a r z y s t a . [Z d r u g ie j s t r o n y , d la t e g o p r o b le m u istnieje a lg o r y t m d z i a ł a j ą c y w c z a s ie O ( n ) , k t ó r y p o le g a n a p o lic z e n iu c y k li i w k t ó r y m
w o g ó le n ie
s t o s u je się p o r ó w n a ń ; z o b a c z ć w ic z e n ie 5 .2 .2 - 2 ] .
30.
R o z p o c z y n a m y o d o p t y m a ln e g o d r z e w a p o r ó w n a ń o w y s o k o ś c i S ( n ) ; n a s tę p n ie
w y k o n u je m y z a m ia n y i <-+ j w p r a w y m p o d d r z e w ie w ę z ł a o e t y k ie c ie i : j , p r z e m ie s z c z a j ą c się p o d r z e w ie z g ó r y d o d o łu . W y n i k in t e r p r e t u je m y j a k o d r z e w o p o r ó w n a ń i z a m ia n , w k t ó r y m k a ż d y w ę z e ł k o ń c o w y d e fin iu je j e d n o z n a c z n ie p e r m u t a c ję , k t ó r ą m o ż n a p o s o r to w a ć z a p o m o c ą c o n a j w y ż e j n — 1 d o d a t k o w y c h p o r ó w n a ń i z a m ia n (c o w y n ik a z ć w ic z e n ia 5 .2 .2 - 2 ) . [ P o m y s ł d r z e w a p o r ó w n a ń i z a m ia n p o c h o d z i o d T . N . H ib b a r d a ] .
31.
C o n a jm n ie j 8 p o r ó w n a ń - z a m ia n j e s t n ie z b ę d n y c h , p o n ie w a ż w k a ż d y m d r z e w ie
o w y s o k o ś c i 7 m o ż e m y d o jś ć p o 4 k r o k a c h d o k o n fig u r a c ji
a*
( lu b d u a ln e j d o n ie j) z a /
1 . T a k ie j k o n fig u r a c ji n ie m o ż n a p o s o r t o w a ć z a p o m o c ą 3 d o
d a t k o w y c h o p e r a c ji p o r ó w n a ń - z a m ia n . Z d r u g ie j s t r o n y , w n a s t ę p u j ą c y m d r z e w ie o s i ą g a się ż ą d a n ą g r a n ic ę (i b y ć m o ż e t a k ż e m in im a ln ą średnią lic z b ę p o r ó w n a ń - z a m ia n ) :
708
33.
ODPOWIEDZI DO ĆWICZEŃ
5.3.1
K a ż d e d r z e w o o r z ę d z ie x i r o z d z ie lc z o ś c i 1 m o ż n a p r z e k s z t a łc ić z a p o m o c ą p r o
s t y c h o p e r a c ji w d r z e w o , k t ó r y m a n ie d łu ż s z ą ś c ie ż k ę w a ż o n ą i w k t ó r y m w s z y s t k ie w ę z ł y z e w n ę t r z n e le ż ą n a p o z io m a c h k i k — 1 d la p e w n e g o k , a c o n a jw y ż e j je d e n w ę z e ł z e w n ę t r z n y n ie j e s t c a łk o w it y . D ł u g o ś ć ś c ie ż k i w a ż o n e j w k a ż d y m t a k i m d r z e w ie j e s t t a k a , j a k p o d a n o w ć w ic z e n iu , t a k w ię c m u s i b y ć m in im a ln a . O d w r o tn ie , je ś li w j a k i m k o lw ie k d r z e w ie p o s z u k iw a ń o w a r t o ś c ia c h r z e c z y w is t y c h s ą s p e łn io n e (iv ) i ( v ), t o m o ż n a p o k a z a ć p r z e z in d u k c ję , ż e d łu g o ś ć ś c ie ż k i w a ż o n e j m a p o d a n ą w a r to ś ć , p o n ie w a ż is t n ie je p r o s t y w z ó r n a d łu g o ś ć ś c ie ż k i w a ż o n e j c a łe g o d r z e w a w z a le ż n o ś c i o d d łu g o ś c i ś c ie ż e k w a ż o n y c h p o d d r z e w k o r z e n ia .
35.
N ie u d a n e e k s p e r y m e n t y w y k o n a n e p r z e z K n u t h a i K a e h le r a o p is a n e w Information
Processi ng Let te rs 1 ( 1 9 7 2 ) , 1 7 3 - 1 7 6 , m o g ą s t a n o w ić w s k a z ó w k ę . [ M a t. Z ame tki 4 ( 1 9 6 8 ), 5 1 1 - 5 1 8 ] Z o b a c z S . F e ls n e r i W . T . T r o t t e r , Combinatorics , P a ul Erdós is E i gh t y 1 ( 1 9 9 3 ) , 1 4 5 - 1 5 7 , w c e lu z a p o z n a n ia się z p o d s u m o w a n ie m s t a n u
36.
b a d a ń n a t y m p r o b le m e m i z d o w o d e m , ż e z a w s z e m o ż n a o s ią g n ą ć
1 ś T(G i )/T(G2) Ś P , g d z ie s t a ł a p j e s t n ie w ie le m n ie js z a o d 8 /3 .
5.3.2 1 . S ( m + n ) ^ S (m ) + S(n) + M ( m ,n ) . 2 . W ę z e ł w e w n ę t r z n y , k t ó r y j e s t k-tym w p o r z ą d k u s y m e t r y c z n y m o d p o w ia d a p o r ó w n a n iu A \ : Bk. 3.
S t r a t e g i a B ( l , l) n ie j e s t le p s z a o d s t r a t e g i i A ( l , Z + l) , a s t r a t e g i a B ; ( l , / ) n ie je s t
l e p s z a o d s t r a t e g i i A ' ( l , /— 1 ); z a t e m m u s im y r o z w ią z a ć r ó w n a n ie r e k u r e n c y jn e
.M. ( 1 , n) =
m in
m ax ( m ax ( l+ .M . (1, / — 1)),
m a x ( l + . M . ( 1 , n — / ))),
n ^ 1;
. M . ( 1 ,0 ) = 0. N ie j e s t t r u d n o s p r a w d z ić , ż e [ lg ( n + 1 ) ] j e s t r o z w ią z a n ie m t e g o r ó w n a n ia .
4. 6.
N ie . [C. C h r i s t e n , F O C S D la j
19
(19 78 ), 2 5 9 -2 6 6 ].
— i + 1 , z w y j ą t k i e m i ^ 2, m o ż n a z a s to s o w a ć A ^ ^ ż + l ) . N a t o m ia s t d la
j ^ i -h 2 m o ż n a z a s t o s o w a ć s t r a t e g i ę A ( ż , ż + 2 ) .
5.3.2
ODPOWIEDZI DO ĆWICZEŃ
709
7. Żeby umieścić k + m elementów wśród n innych, należy niezależnie umieścić k ele mentów i m elementów. (Dla dużych k i m można to zrobić lepiej; zobacz ćwiczenie 19). 8, 9. Na poniższych diagramach i :j oznacza porównanie A i :Bj; Mij oznacza scalanie i elementów z j elementami w krokach, a A oznacza sortowanie w trzech krokach wzorca
M 14 M 15 M 1 3 + 1 A
M %4 M i z + l
M 14+ 1 M13+2
11. Niech n = gt będzie takie jak we wskazówce. Możemy założyć, że t ^ 6. Bez straty ogólności niech pierwszym porównaniem będzie A 2 :Bj. Jeśli j > gt- 1 , odpowiedź A2 < Bj będzie wymagała ^ t dodatkowych kroków. Jeśli j ^ gt- 1, odpowiedź A 2 < Bj nie stanowiłaby problemu, tak więc tylko przypadek A 2 > Bj wymaga zbadania. Wówczas najwięcej informacji dostaniemy, gdy j — gt- 1. Jeśli t = 2k + 1 , moglibyśmy zostać zmuszeni do scalenia A 2 z gt —gt- 1 = 2fc-1 elementami > Bgt_i i scalenia Ai z gt- 1 innymi elementami, ale to wymaga &+(&+!) = t dalszych kroków. Z drugiej strony, jeśli n —gt —1, to moglibyśmy scalić A 2 z 2k~l —1 elementami, potem A\ z n elementami w (k —1) + (A; + 1) dodatkowych krokach. Stąd M(2, gt—1) ^ t. Przypadek t —2k jest znacząco trudniejszy; zauważmy, że gt —gt- 1 ^ 2fe~2. Przy puśćmy, że wykonujemy porównanie A\ :Bj po tym, jak A 2 > Bgt l . Jeśli j > 2fe_1, to odpowiedź A\ < Bj wymaga k + (k —1 ) dalszych porównań (za dużo). Jeśli j ^ 2fc“1,
710
5.3.2
ODPOWIEDZI DO ĆWICZEŃ
m o ż e m y a r g u m e n t o w a ć t a k j a k p o p r z e d n io , ż e j = 2 fc_1 d a j e n a jw ię c e j in fo r m a c ji. P o t y m , j a k A i > B 2k - i , n a s t ę p n y m i p o r ó w n a n ia m i z u d z ia łe m A\ m o g ł y b y b y ć r ó w n ie d o b r z e t e z B 2k - i +2k~2 > a p o t e m z B 2k - i + 2k-2+2k - 3 ; p o n ie w a ż 2k~ 1 + 2fe-2 + 2fc~3 > 5 t - i , z a t e m p o z o s t a j e p r o b le m s c a le n ia z n — ( 2/c_1 + 2fc” 2 + 2 fc-3 ) e le m e n t a m i. O c z y w i ś c ie n ie m u s im y w y k o n y w a ć ż a d n e g o p o r ó w n a n ia z A\ b e z p o ś r e d n io ; z a m ia s t t e g o m o g lib y ś m y p o r ó w n a ć A 2 : B n+ i - j . D l a j ^ 2fc_3 r o z w a ż a m y p r z y p a d e k A2 <
n a t o m i a s t d la j
> 2k~3 r o z w a ż a m y A 2 > B n + l - j . W t y m d r u g im
p r z y p a d k u p o t r z e b a c o n a jm n ie j (k — 2) + (k 4 - 1 ) d o d a t k o w y c h k r o k ó w . K o n t y n u u ją c , o d k r y w a m y , ż e jedynym p o t e n c j a ln ie o w o c n y m c ią g ie m o d p o w ie d z i j e s t A 2 > B gt_iy
A 2 < B nJri _ 2k - 3 , A i > B 2k - 1 , A i > 1 ć l i > B 2k - i j t_2k~2jr2k-3 , a le w ó w c z a s p o z o s t a j e d o k ła d n ie p t _5 e le m e n tó w ! N a o d w r ó t , d la n — gt — 1 t a k i s p o s ó b p o s t ę p o w a n i a g w a r a n t u je s u k c e s . [ A c t a Informática 1 ( 1 9 7 1 ) , 1 4 5 - 1 5 8 ] . 1 2 . P ie r w s z y m p o r ó w n a n ie m m u s i b y ć a lb o a : X k d la 1 ^ k a lb o ( s y m e tr y c z n ie ) /3:Xn~ k d la 1 ^ k ^ j . W p ie r w s z y m p r z y p a d k u o d p o w ie d ź a < X k w y m a g a w ię c e j n iż R n ( k — l , j ) d o d a t k o w y c h p o r ó w n a ń ; p r z y o d p o w ie d z i a > X k z o s t a j e m y z p r o b le m e m p o s o r t o w a n ia a < /?, Y í < • • • < Y n -fc , ot < Y i - k + i , P > Y n - k ~ j , g d z ie Y r — X r - k . 13.
[ C o m p u t e r s in N u m b e r T h e or y ( N e w Y o r k : A c a d e m i c P r e s s , 1 9 7 1 ) , 2 6 3 - 2 6 9 ] .
14 .
[ S I C O M P 9 (1 9 8 0 ), 2 9 8 - 3 2 0 . P e łn e r o z w ią z a n ia d la M ( 4, n) z o s t a ł o p o d a n e k r ó t
k o p o t e m p r z e z J . S c h u lt e M ó n t in g a , k t ó r y p o d a ł t a k ż e h i p o t e t y c z n e r o z w ią z a n ie d la M ( 5 , n ) . Z o b a c z Theor. Co mp . Sci. 1 4 ( 1 9 8 1 ) , 1 9 - 3 7 ] . 15.
N a l e ż y p o d w a j a ć m , a ż p r z e k r o c z y n. T o w y m a g a
16 .
D la w s z y s tk ic h z w y ją tk ie m
( m , n) =
|_lg(n/ m)J +
1 p o d w o je ń .
( 2 ,8 ) , ( 3 ,6 ) , ( 3 ,8 ) , ( 3 ,1 0 ) , ( 4 ,8 ) , ( 4 ,1 0 ) ,
(5 , 9 ), ( 5 ,1 0 ) , k i e d y t o w y k o n u je o 1 p o r ó w n a n ie z a d u ż o . 17.
Z a łó ż m y , ż e m ^ n i n ie c h t = l g ( n / m ) — 0 . W ó w c z a s lg (mJ^n ) > l g n m — l g m ! ^
r a l g n — ( m l g m — m + l ) = m ( t P 0 ) + m — 1 = H ( m , n ) + 0 m — |_2 ^mJ ^ H ( m , n ) + 0m —
2 ° m ^ U ( m , n) — m. ( N ie r ó w n o ś ć m ! ^ m rn2 1~rn w y n ik a z fa k t u , że k ( m — k) d la 1 ^ k < m). 19 .
N a j p i e r w s c a la m y { A i , . . . , A m } z { B 2, Bą, . . . , £¡2 ^ / 2]
( m / 2 )2
N a s t ę p n ie m u s im y u m ie
ś c ić n i e p a r z y s t e e le m e n t y B 2 1 - 1 w ś r ó d ai e le m e n t ó w z A , d la 1 ^ i « i + «2 +
h O fn /21 ^
g d z ie
T ° o s t a t n ie w y m a g a d la k a ż d e g o i c o n a j w y ż e j ai o p e r a c ji,
t a k w ię c c a ł ą p r a c ę z a k o ń c z y m y p o c o n a j w y ż e j m d o d a t k o w y c h p o r ó w n a n ia c h . 20.
Z a s t o s u j ( 12 ).
22.
R . M ic h a e l T a n n e r [ S I C O M P 7 ( 1 9 7 8 ) , 1 8 - 3 8 ] p o k a z a ł, że a lg o r y t m „ w s ta w ia n ia
f r a k t a l n e g o ” w y k o n u je ś r e d n io c o n a j w y ż e j 1.0 6 lg ( m^ n) p o r ó w n a ń . L . K o llá r [C o m p u -
ters and Artiñcial Int. 5 ( 1 9 8 6 ), 3 3 5 - 3 4 4 ] z b a d a ł z a c h o w a n ie s ię a lg o r y t m u H w ś r e d n im p rzyp ad ku . 23.
P r z e c i w n i k k o r z y s t a z m a c ie r z y X
o w y m ia r a c h n x n , k t ó r e j e le m e n t y
są
p o c z ą t k o w o w s z y s t k i e r ó w n e 1 . G d y a lg o r y t m p y t a , c z y A ¿ — B y p r z e c iw n ik u s t a w ia
x y n a 0. O d p o w i e d z i ą j e s t z a w s z e „ N I E ” , c h y b a ż e p e r m a n e n t m a c ie r z y X s t a ł się w ła ś n ie r ó w n y 0. W t y m d r u g im p r z y p a d k u p r z e c iw n ik o d p o w ia d a „ T A K ” i u s u w a i-ty w ie r s z i j - t ą k o lu m n ę z X ; p e r m a n e n t w y n ik o w e j m a c ie r z y (n — 1 ) x (n — 1) b ę d z ie n ie z e r o w y . P r z e c i w n i k p o s t ę p u je d a le j w t e n s p o s ó b d o c h w ili, g d y p o z o s t a n ie m a c ie r z
0 x 0. J e ś li p e r m a n e n t m a p r z y j ą ć w ła ś n ie w a r t o ś ć z e ro , t o m o ż e m y p r z e s t a w ić w ie r s z e i k o lu m n y t a k , ż e b y i — j ~ 1 , a m a c ie r z m i a ł a s a m e j e d y n k i n a g łó w n e j p r z e k ą t n e j. N a w e t w ó w c z a s p e r m a n e n t z e r u je się , g d y X n
1 ; m u s im y z a t e m m ie ć x \ kx ki = 0
5.3.3
ODPOWIEDZI DO ĆWICZEŃ
711
d la k a ż d e g o k > 1. W y n i k a s t ą d , ż e z a n im p r z e c iw n ik o d p o w ie p ie r w s z y r a z „ T A K ” , c o n a jm n ie j n z e r z o s t a n ie u s u n ię t y c h i c o n a jm n ie j n — 1 n a s t ę p n y m r a z e m itd . A l g o r y t m k o ń c z y s w o je d z ia ła n ie p o o t r z y m a n i u n o d p o w ie d z i „ T A K ” i p o z a d a n iu c o n a jm n ie j n + ( n — l)H
|_i p y t a ń [ J A C M 1 9 ( 1 9 7 2 ) , 6 4 9 - 6 5 9 ] . P o d o b n e r o z u m o w a n ie p o k a z u je ,
ż e p o t r z e b n y c h j e s t n A (n — 1) + * • • + (n — m + 1) p y t a ń , ż e b y s t w ie r d z ić , c z y A Ç B , g d y \A\ = m ^ n = |B\. 24.
N ie w y r a fin o w a n e s c a la n ie w s t ę p n e w y m a g a m - f ą — 1 p o r ó w n a ń , a k a ż d e z n a s t ę p
n y c h w s t a w ie ń w y m a g a c o n a j w y ż e j i p o r ó w n a ń . T y c h g ó r n y c h o g r a n ic z e ń n ie m o ż n a z m n ie js z y ć . T a k w ię c m a k s im u m j e s t t a k i e s a m e j a k d la a lg o r y t m u H ( z o b a c z ( 19 ) ) . 25.
P r o b le m o g ó ln y j e s t t a k t r u d n y j a k s z c z e g ó ln y p r z y p a d e k , w k t ó r y m Xij j e s t r ó w n e
0 lu b 1 i x = | . W ó w c z a s k a ż d e p o r ó w n a n ie o d p o w i a d a s p o j r z e n iu n a b i t X i j , a n a s z y m c e le m j e s t p o z n a n ie c a łe j m a c ie r z y , p a t r z ą c n a j a k n a jm n ie j b it ó w . K a ż d y p r o b le m s c a la n ia ( 1 ) o d p o w ia d a t a k ie j w ła ś n ie m a c ie r z y 0 - 1 , j e ś l i w e ź m ie m y x%j — [Ai > B n+ \- j \ . (N . L in ia ł i M . S a k s , w J.
Aigorithms
6 ( 1 9 8 5 ) , 8 6 -1 0 3 , p r z y p i s u j ą t ę o b s e r w a c ję
J. S h e a r e r o w i. P o d o b n y w y n i k ł ą c z y w y s z u k iw a n ie i s o r to w a n ie w z g lę d e m d o w o ln e g o c z ę ś c io w e g o p o r z ą d k u ) .
5.3.3 1.
Z a w o d n ik 11 p r z e g r a ł z z a w o d n ik ie m
0 5 ; z a t e m w ia d o m o , ż e z a w o d n ik 1 3 j e s t
g o r s z y o d z a w o d n ik ó w 05, 11 i 12.
2 . N ie c h x b ę d z ie k - t y m n a j w i ę k s z y m e le m e n t e m i n ie c h S b ę d z ie z b io r e m w s z y s t k i c h e le m e n tó w y t a k ic h , ż e w y k o n a n e p o r ó w n a n ia n ie s ą w y s t a r c z a j ą c e , a b y s t w ie r d z ić c z y
x < y, czy t e ż y < x. I s t n ie ją p e r m u t a c je n ie s p r z e c z n e z e w s z y s t k i m i w y k o n a n y m i p o r ó w n a n ia m i, w k t ó r y c h w s z y s t k i e e le m e n t y z S s ą m n ie js z e o d x ( p o n ie w a ż m o ż e m y z a s tr z e c , że w s z y s t k ie e le m e n t y z S s ą m n ie js z e o d x i o t r z y m a n y w t e n s p o s ó b c z ę ś c io w y p o rzą d ek za n u rzy ć w p ew n y m
p o r z ą d k u lin io w y m ) . P o d o b n ie is t n i e j ą n ie s p r z e c z n e
p e r m u t a c je , w k t ó r y c h w s z y s t k i e e le m e n t y z S s ą w ię k s z e o d x . T a k w ię c n ie m o ż e m y o k r e ś lić p o z y c j i x, je ś li S j e s t n ie p u s ty . 3 . P r z e c iw n ik m o ż e p o t r a k t o w a ć p r z e g r y w a j ą c e g o w p ie r w s z y m
p o r ó w n a n iu j a k o
n a jg o r s z e g o g r a c z a w o g ó le . 4.
Z a łó ż m y , że k — 1 n a j w i ę k s z y c h e le m e n t ó w t o { a i , . . . , a ^ - i } . K a ż d a ś c ie ż k a w d r z e
w ie p o r ó w n a ń , p r o w a d z ą c a d o w y z n a c z e n i a k n a j w i ę k s z y c h e le m e n t ó w i n ie s p r z e c z n a z p r z y j ę t y m z a ło ż e n ie m , m u s i z a w ie r a ć c o n a jm n ie j n — k p o r ó w n a ń p r o w a d z ą c y c h d o w y z n a c z e n i a n a jw ię k s z e g o e le m e n t u s p o ś r ó d n — k A 1 p o z o s t a ły c h e le m e n t ó w . N a t a k ic h ś c ie ż k a c h z n a jd u je się c o n a jm n ie j n — k b in a r n y c h p u n k t ó w w y b o r u , t a k w ię c ś c ie ż e k m u si b y ć c o n a jm n ie j
2n~k. Z a t e m
w y b o r ó w k — 1 n a jw ię k s z y c h
każd em u z
e le m e n tó w m u si o d p o w ia d a ć c o n a jm n ie j 2n~ k liś c i w d r z e w ie . 5 . W r z e c z y w is t o ś c i Wk (n) ^ Vk(n) + S ( k — 1 ) , c o w y n ik a z ć w ic z e n ia 2 .
6 . N ie c h
. . . , Im) = m — 2 + |"lg( 2 ix + 2*2 H
h 2 im )] i z a łó ż m y , ż e / = g , j e ś li
H (- Im + 2 m < N. U d o w o d n im y , ż e / = g, g d y li A l 2 H------- 1-Im A 2 m — N. M o ż e m y z a ł o ż y ć , ż e l\ ^ ¿2 ^ •• * ^ Im- J e s t t y lk o k ilk a m o ż liw o ś c i w y k o n a n i a
t y lk o £1 + 12
p ie r w s z e g o p o r ó w n a n ia :
Strategia A ( j , k) d la j < k. P o r ó w n a j n a j w i ę k s z y e le m e n t z g r u p y j z n a j w i ę k s z y m e le m e n te m z g r u p y k. T o d a j e z a le ż n o ś ć
f [ll, • . • , Im) ^ 1 T i?(L) • ■• ■ >lj —1) —
g{l 1 ;
• ** ?
lj —1 7 lj ? lj + 1 7
?7; + l ?• ■• 1 lk—1j ¿/c+l ; ■*■j Im) * • • 7
lk —1 7 lj 7 lk +1
) ■■■7
Im)
g{ll
7 * * • 7
Im)-
712
ODPOWIEDZI DO ĆWICZEŃ
5.3.3
Strategia B ( j , k) d la lk > 0 . P o r ó w n a j n a j w i ę k s z y e le m e n t z g r u p y j z j e d n y m z m a ły c h e le m e n t ó w z g r u p y k. T o d a j e z a le ż n o ś ć ^ 1 + m a x ( a , (5) -
1 + /?,
g d z ie
O; = g{l \ }■• • , /j —l , / j - j - l . . , /m) ^ $ — Q{lli * * * ylk —Xylk
1
*• • ) lm)
1)
1 ) ^fc+l j ■• ■; lm ) ^ g{l\ y• • • ylrn)
1*
Strategia C( j ^k) d la j ^ fc, lj > 0, lk > 0. P o r ó w n a j m a ł y e le m e n t z g r u p y j z m a ły m e le m e n t e m z g r u p y k. O d p o w ie d n ią z a le ż n o ś c ią j e s t /(¿l, . . . , Im) ^
1+
9 ^ 1 f *• • yl k - l y lk — I
5i f c + 1 ) • ■ ■ j l m
) ^
a(ii , . . . , Im) •
W a r t o ś ć / ( / 1 , . . . , l m) z n a jd u je m y , b io r ą c n a j m n i e j s z ą p r a w ą s t r o n ę p o w s z y s t k ic h s t r a t e g ia c h ; s t ą d / ( / 1 , . . . , lm) ^
g(h , • . . ,
lm) - D l a m > 1 , s t r a t e g i a A ( m — 1 , m) p o k a z u
5■■■i lm)y p o n ie w a ż $ (Z l, • • • ylm—1 ylm) — g{J>1 j • •• ) lm—1 j lm—1 f i g ( M + 2 6)] d la 0 ^ a ^ 6, g d y M je s t d o d a t n ią w i e lo k r o t n o ś c ią 2b). D l a m ~ 1 s t o s u je m y s t r a t e g i ę C ( l , 1 ) .
j e , Że / ( / l , . . . , /m) ^ g d y /i ^
^ lm- {Dowód: f l g ( M + 2 a )] =
[ W p r a c y S . S . K i s l i c y n a z o s t a ł a p o d a n a o p t y m a ln a s t r a t e g i a A ( m — l , m ) , j a k t e ż z a m k n i ę t a p o s t a ć d la / (¿ ,
o g ó ln y w z ó r n a / i je g o u p r o s z c z o n y d o w ó d z o s t a ł y
p o d a n e p r z e z F l o y d a w 1 9 7 0 r o k u ]. 7.
D l a j > 1, je ś li j + 1 j e s t w c/, t o Cj r ó w n a się 1 p lu s lic z b a p o r ó w n a ń p o t r z e b
n y c h d o w y b r a n i a n a s t ę p n e g o n a jw ię k s z e g o e le m e n t u z a'. P o d o b n e r o z u m o w a n ie m a z a s t o s o w a n ie , g d y j + 1 j e s t w a"; a C\ j e s t z a w s z e r ó w n e 0 , p o n ie w a ż n a k o n ie c d r z e w o z a w s z e w y g lą d a t a k sa m o .
8 . I n n y m i s ło w y , c z y is t n ie je r o z s z e r z o n e d r z e w o b in a r n e o n w ę z ła c h z e w n ę tr z n y c h , d la k t ó r e g o s u m a o d le g ło ś c i o d k o r z e n ia k — 1 n a j o d le g le j s z y c h w ę z łó w w e w n ę t r z n y c h j e s t m n ie js z a o d t a k ie j s u m y d la z u p e łn e g o d r z e w a b in a r n e g o ? O d p o w ie d z ią j e s t n ie, p o n ie w a ż n ie t r u d n o p o k a z a ć , ż e k - t y n a j w i ę k s z y e le m e n t z ti{ct) j e s t n ie m n ie js z y o d I M ™ — k)\ d la w s z y s t k i c h a . 9.
( N a k a ż d e j ś c ie ż c e m a m y s z e ś ć p o r ó w n a ń , m im o t o t a m e t o d a n ie j e s t o p t y m a ln a
d la F 3 ( 5 )) .
5.3.3 10 .
ODPOWIEDZI DO ĆWICZEŃ
713
( P o n iż s z y a lg o r y t m z o s t a ł o d k r y t y m e t o d ą p r ó b i b łę d ó w z a p o m o c ą ć w ic z e n ia 6
w y k o r z y s t a n e g o d o z n a jd o w a n ia w ł a ś c i w y c h p r z e jś ć ) .
11.
Z o b a c z Information Processing Let te rs 3 ( 1 9 7 4 ) , 8 - 1 2 .
{X\, X ,X ,X }
1 2 . P o p o z b y c iu się n a jm n ie js z e g o e le m e n t u s p o ś r ó d 2 3 4 o t r z y m u je m y k o n fig u r a c ję — p lu s n — 3 e le m e n t ó w iz o lo w a n y c h ; t r z e c i n a j w i ę k s z y s p o ś r ó d n ic h m o ż n a z n a le ź ć w d a ls z y c h Vz(n — 1) — 1 k r o k a c h . 13.
P o z n a le z ie n iu m e d ia n y w ś r ó d p ie r w s z y c h f ( n ) e le m e n t ó w , p o w ie d z m y X j , p o
r ó w n u je m y j ą z k a ż d y m in n y m e le m e n te m ; w t e n s p o s ó b w y z n a c z y m y w p r z y b li ż e n iu
n / 2 ~ k e le m e n t ó w m n ie js z y c h o d
Xj
i n/2 + k e le m e n t ó w w i ę k s z y c h o d
Xj
d la p e w n e g o
k. P o z o s t a j e z n a le ź ć |&|-ty n a j w i ę k s z y lu b n a j m n i e j s z y e le m e n t w w i ę k s z y m z t y c h z b io r ó w , c o w y m a g a n/2 - f 0 (|fc| l o g n ) d o d a t k o w y c h p o r ó w n a ń . Ś r e d n ią w a r t o ś c ią |fc| ( r o z w a ż a m y p u n k t y z [0 . . 1 ] o r o z k ła d z ie j e d n o s t a j n y m ) j e s t 0 ( 1 / y/n ) + 0 ( n / y // ( n ) ). N ie c h T ( n ) b ę d z ie ś r e d n ią lic z b ą p o r ó w n a ń d la f ( n ) =
n 2/"3 ; w ó w c z a s T ( n ) — n —
T ( n 2^3) — n 2y/3 + n/2 + 0 ( n 2^3 ), z c z e g o d o s t a j e m y j u ż p o s z u k iw a n y w y n ik . J e s t in t e r e s u ją c y m fa k t e m t o , ż e d la n =
5, t a m e t o d a w ś r e d n im p r z y p a d k u
w y m a g a t y lk o 5 j | p o r ó w n a ń ; j e s t t o t r o c h ę le p ie j n iż d la d r z e w a z ć w ic z e n ia 9. 14 .
k r o k a c h , w y z n a c z a j ą c fc-ty n a j w i ę k s z y e le m e n t w ś r ó d z
Uk(n) ^ Vk(n —1 ) + 1 { X \ , ... , X n~i} i p o r ó w n u ją c g o
W o g ó ln o ś c i k n a j w i ę k s z y c h e le m e n t ó w m o ż n a z n a le ź ć w
X n, co
w y n ik a z ć w ic z e n ia 2. ( K i r k p a t r i c k p o k a z a ł w r z e c z y w is t o ś c i, ż e ( 12 ) j e s t d o ln ą
g r a n ic ą d la
Uk(n- 1-1) —1.
P r z y w ię k s z y c h k le p s z e o g r a n ic z e n ie d la
J o h n , S I C O M P 1 7 (1 9 8 8 ), 6 4 0 - 6 4 7 ) .
Uk(n)
z n a la z ł J. W .
714 15.
ODPOWIEDZI DO ĆWICZEŃ
5.3.3
m in (fc, n + l — k). Z a łó ż m y , ż e k ^ n + l — k. W ó w c z a s , j e ś l i n ie z a p a m ię t a m y k a ż d e g o
z p ie r w s z y c h k s łó w p o d c z a s w c z y t y w a n i a ic h p o r a z p ie r w s z y , m o ż e m y z g u b ić k - t y n a j w i ę k s z y e le m e n t, z a le ż n ie o d k o le jn y c h , je s z c z e n ie z n a n y c h w a r to ś c i. N a o d w r ó t , k lo k a c ji j e s t w y s t a r c z a j ą c y c h , p o n ie w a ż m o ż n a p o r ó w n y w a ć k a ż d y n o w o w p r o w a d z a n y e le m e n t z d o t y c h c z a s o w y m k ~ ty m n a j w i ę k s z y m , z a p a m ię t u j ą c w a r t o ś ć z r e je s t r u w t e d y i t y l k o w t e d y , g d y j e s t w ię k s z a . 16 .
W
każd ym
a lg o r y t m i e
rozp oczyn am y
z ( 0 , l , l , n — 2). J e ś li p r z e c iw n ik n ie u d z ie la
od
( a , 5, c, d) =
(n , 0, 0, 0)
i kończym y
„ n ie s p o d z ie w a n y c h ” o d p o w ie d z i, j e d y n e
p r z e j ś c ia p o k a ż d y m p o r ó w n a n iu p r o w a d z ą z (a , 5, c, d) d o t e j s a m e j c z w ó r k i lu b d o czw ó rk i ( a — 2 , 5 + 1 , c + 1 , d ), ( a — 1 , 5, c + 1 , d) lu b ( a — 1 , 5 + 1 , c, d ),
je ś li a ^ 2 ; je ś li a ^
1;
(a , 5— 1 , c, d + 1 ),
je ś li 5 ^ 2 ;
( a , 5, c — 1 , d + 1 ),
je ś li c ^ 2.
W y n i k a s t ą d , ż e a b y p r z e jś ć z ( a , 5, c, d) d o ( 0 , 1 , 1 , a + 5 + c + d — 2 ), p o t r z e b a [ | a ] + 5 + c — 2 p o r ó w n a ń . [Bibliografia: C A C M 1 5 ( 1 9 7 2 ) , 4 6 2 - 4 6 4 . W F O C S 1 6 ( 1 9 7 5 ) , 7 1 - 7 4 ; P o h l u d o w o d n ił, ż e t e n a lg o r y t m m in im a liz u je t a k ż e średnią lic z b ę p o ró w n a ń ]. 17.
Z a s t o s u j ( 6 ) n a j p i e r w d o w y b o r u e le m e n t ó w n a jw ię k s z y c h , a p o t e m d o w y b o r u
e le m e n t ó w n a jm n ie js z y c h , z a u w a ż a j ą c ż e [ n/2 J z t y c h p o r ó w n a ń j e s t w s p ó ln y c h . 18 .
Vk{n) ^
2 1.
Krok 0 . U t w ó r z d w a d r z e w a t y p u p r z e g r y w a j ą c y o d p a d a o r o z m ia r a c h 2l i 2l ~k+1. Krok j d la 1 ^ j ^ k. ( W t y m m ie js c u w y p r o w a d z iliś m y j u ż j — 1 n a jw ię k s z y c h
1 8 n — 1 5 1 d la w s z y s t k i c h , w y s t a r c z a j ą c o d u ż y c h
n.
e le m e n t ó w . P o z o s t a ł e e le m e n ty , r a z e m z e s z t u c z n y m i z n a c z n ik a m i r ó w n y m i — o o, z n a j d u j ą się t e r a z w d w ó c h d r z e w a c h A i B , g d z ie A m a 2l liś c i, n a t o m ia s t B m a 2l ~k+j liś c i) . N ie c h a b ę d z ie z w y c i ę z c ą z A i z a łó ż m y , ż e a p o k o n a ł a 0, a i , . . . , a ^ - i , g d z ie
ai j e s t z w y c ię z c ą w ś r ó d 2l e le m e n t ó w . P o d o b n ie , n ie c h 5 b ę d z ie g łó w n y m z w y c ię z c ą , a 5o, 5 i , . . . , 5 / - f c + j - i z w y c ię z c a m i „ e lim in a c ji” w B . J e ś li
j
= k, w y p r o w a d ź m a x ( a , 5)
i z a k o ń c z w y k o n y w a n ie t e g o k r o k u . W p r z e c iw n y m r a z ie „ z b u d u j” k o le jn y p o z io m n a d o le d r z e w a B , w p r o w a d z a j ą c 2l ~k+j z n a c z n ik ó w s w ó j p i e r w s z y p o je d y n e k z z a w o d n ik ie m
— o o, z k t ó r y c h k a ż d y p r z e g r y w a
z B . ( N a s z a s t r a t e g i a b ę d z ie p o le g a ła n a
w ł ą c z e n i u B w A , j e ś l i j e s t t o m o ż liw e , p r z e z z a m ie n ie n ie B z p o d d r z e w e m A! d r z e w a A , k t ó r e z a w ie r a a o , a i , . . . , a i -k + j] z a u w a ż m y , ż e A ' , p o d o b n ie j a k w ła ś n ie p o w ię k s z o n e d r z e w o £?, j e s t d r z e w e m t y p u p r z e g r y w a j ą c y o d p a d a , o 2l ~k+j+1 liś c ia c h ) . P o r ó w n a j 5 z a i - k + j + 1 , n a s t ę p n ie z w y c ię z c ę p o r ó w n a j z a i - k + j +2 i t d . , a ż z o s t a n ie z n a le z io n e c = m a x ( 5 , O i - f c + j - i , . . . , a / _ i ) . P r z y p a d e k 1 : 5 < c; w y p r o w a d ź a i z a m ie ń B z A f . P r z y p a d e k 2: 5 = i 5 >
c i 5 <
a ; w y p r o w a d ź a i z a m ie ń B
z A f. P r z y p a d e k 3: 5 = c
a ; w y p r o w a d ź 5. P o r o z p a t r z e n iu t y c h t r z e c h p r z y p a d k ó w z o s t a j e m y z ( b y ć
m o ż e n o w y m i) d r z e w a m i A i B , w k t ó r y c h z w y c ię z c a z B z o s t a ł w ła ś n ie z n a le z io n y . U s u w a m y t e n e le m e n t z B i z a s t ę p u j e m y g o p r z e z — oo, w y k o n u ją c w s z y s t k i e n ie z b ę d n e p o r ó w n a n ia w c e lu p r z y w r ó c e n i a s t r u k t u r y d r z e w a t u r n ie jo w e g o t y p u p r z e g r y w a j ą c y o d p a d a ( p o d o b n ie j a k w w y b o r z e d r z e w o w y m ) . T o k o ń c z y k r o k
j.
W k r o k u 0 j e s t w y k o n y w a n y c h 2l — 1 + 2 i+1_fc — 1 p o r ó w n a ń , a w k r o k u k je d n o . W k a ż d y m z k r o k ó w 1 , 2, . . . , k — 1 j e s t w y k o n y w a n y c h c o n a j w y ż e j l — l p o r ó w n a ń , z w y j ą t k i e m p r z y p a d k u 2 , k ie d y t o m o ż e b y ć w y k o n a n y c h l p o r ó w n a ń . J e d n a k je ś li w y s t ę p u j e p r z y p a d e k 2 , z a o s z c z ę d z a m y j e d n o p o r ó w n a n ie n a s t ę p n y m r a z e m , g d y z a jd z ie p r z y p a d e k 1 lu b 2, p o n ie w a ż w ó w c z a s ao b ę d z ie r ó w n e — oo. T a k w ię c w k r o k a c h o d 1 d o k — 1 j e s t w y k o n y w a n y c h łą c z n ie c o n a j w y ż e j (k — 1 )(/ — 1 ) + 1 p o r ó w n a ń .
ODPOWIEDZI DO ĆWICZEŃ
5.3.3 N a p o d s t a w ie ć w ic z e n ia 3 m a m y n ^ 2l + n — k + |"lg(2/
g d y / ^ k ^ 2. J e ś li
A k —2) —
Wk(n) ^ n ^ 2l A k
715
n + (fc — 1)(Z — 1) d ła w s z y s t k i c h
— 2, ć w ic z e n ie 4 m ó w i, ż e U 4 ( n ) ^
] , c o j e s t r ó w n e n — k A (k ~ 1)1 + 1 d la k ^ 3. T a k w ię c
o p is a n a m e t o d a j e s t o p t y m a ln a d la 2l A k — 2 ^ n ^ 2l A 2 l + l ~ t , g d y l ^ k ^ 3. ( T a k ż e d la k ilk u m n ie js z y c h w a r t o ś c i n , j e ś l i k j e s t d u ż e ) . P o d o b n a m e t o d a , w k t ó r e j d o p r z e b u d o w y d r z e w a B n a k o n ie c k r o k ó w 1 , . . . , fc — 2 u ż y w a się e le m e n tu z r e z e r w y z a m ia s t — oo ( z o b a c z d o w ó d ( n ) ) , d o w o d z i, ż e 1 4 ( n ) ^
n A (k — 1)(/ — 1) d la n ^ 2l A 2l+1~k A k — 2 i l ^ k ^ 3 .
[ Z o b a c z J . A l go ri t hms 5
(1 9 8 4 ), 5 5 7 - 5 7 8 ] . 2 2 . W o g ó ln o ś c i, g d y 2 r * 2l < n A 2 — k ^ (2 r + 1 ) • 2l i k < 2r ^ 2k, z a s t o s o w a n ie t e j p r o c e d u r y z /+ 1 p o c z ą t k o w y m i d r z e w a m i o r o z m ia r a c h 2l d a p o r ó w n a ń n iż ( n ) ,
o [(& — 1 ) / 2j
p o n ie w a ż c o n a jm n ie j t y l e p o r ó w n a ń , ile z o s t a ł o
m n ie j
u ż y t y c h d la
z n a le z ie n ia m in im u m w (ii), m o ż e z o s t a ć „ w y k o r z y s t a n y c h p o n o w n ie ” w ( iii) .
23.
Z g o d n ie z ( 15 ) w ie lk o ś ć
Vfn/21 (n ) / n
m o ż n a o g r a n ic z y ć p r z e z 2, g d y n
—>00;j e d n a k
D . D o r [ P h .D . t h e s is , T e l A v i v U n iv e r s it y , 1995] p o k a z a ł, ż e w r z e c z y w i s t o ś c i d o ln a g r a n ic a j e s t o s t r o w ię k s z a o d 2. D . D o r i U . Z w ic k p o k a z a li t a k ż e , ż e g ó r n a g r a n i c a z b ie g a d o 2 .9 4 2 [ S O D A
28
( 1 9 9 9 ) , 1 7 2 2 - 1 7 5 8 ] ; u d o w o d n ili r ó w n ie ż a s y m p t o t y c z n e
g ó r n e o g r a n ic z e n ie
Va n(n) ^ ^1 + a l g i
+ O ^ a lo g lo g
k t ó r e n ie o d b ie g a z a b a r d z o o d ( 1 5 ), g d y a j e s t m a łe [Combinatorica 1 6 ( 1 9 9 6 ) , 4 1 - 5 8 ] . 24.
P o n ie w a ż z ( 6 ) m a m y Wk (n) = n A 0 ( k l o g n ), s t w ie r d z e n ie z e w s k a z ó w k i j e s t n ie
w ą t p liw ie p r a w d z iw e d la k ^ y/n/ I n n . Z a łó ż m y , ż e s t w ie r d z e n ie t o j e s t p r a w d z iw e d la n i n ie c h r a n g a m i u i v, w ś r ó d p ie r w s z y c h n z 2 n lo s o w o u p o r z ą d k o w a n y c h e le m e n t ó w , b ę d ą k - = [k — y/ k l n n \ i k+ = \ k A y/k I n n ] . ( R a n g ą n a jm n ie js z e g o e le m e n t u j e s t 1 ) . P o r ó w n u je m y p o z o s t a łe n e le m e n t ó w z u , a m n ie js z e o d v p o r ó w n u je m y t a k ż e z u. P r a w d o p o d o b ie ń s t w o p s , ż e e le m e n t x o r a n d z e k w ś r ó d p ie r w s z y c h n e le m e n t ó w m a w o g ó ln o ś c i r a n g ę s, w y n o s i ( skZ\) A - k ) A n ) ' Ś r e d n ią w a r t o ś c ią s j e s t J2 SP « = A
f k’
j e s t t o ś r e d n ia lic z b a e le m e n t ó w < x , a z a t e m ś r e d n ia l ic z b a p o r ó w n a ń z u w y n o s i ( „ + i ) k + ” k A O ( n \ o g n ) x/2. N ie c h r a n g a m i u i v w ś r ó d w s z y s t k i c h 2 n e le m e n t ó w b ę d ą
s - i s + o r a z n ie c h K - — [ 2 k — y / 2 k l n 2 n \ , i ć + — \2k A V%k l n 2 n ] . J e ś li ^ ^ A T , e le m e n t y o r a n g a c h K i K ; m o ż n a z n a le ź ć , w y b i e r a j ą c s + — s _ + 1
i s+
e le m e n tó w m ię d z y u a v. U d o w o d n im y , ż e j e s t b a r d z o m a ło p r a w d o p o d o b n e , ż e b y
s - > K - lu b s - < K - — 2 y/n ln n , lu b s + < K + lu b s + > K + A 2 y/n I n n ; d la t e g o 0 ( n lo g n ) 1^2 d o d a t k o w y c h p o r ó w n a ń p r a w ie z a w s z e w y s t a r c z a . W s k a z ó w k ę d o w o d z i się in d u k c y jn ie ze w z g lę d u n a n , je ś li p o t r a f i m y p o k a z a ć , ż e „ b a r d z o m a ło p r a w d o p o d o b n e ” o z n a c z a „ z p r a w d o p o d o b ie ń s t w e m Ö ( n - 1 “ €) d la w s z y s t k i c h w y s t a r c z a j ą c o d użych n ” , Z a u w a ż m y , ż e p s+ i / p s = s (n — s A k ) / ( s A l — k ) (2 n — s) m a le je p r z y s r o s n ą c y m o d k d o n A k i j e s t ^ 1 w t e d y i t y lk o w t e d y , g d y s ^ 2 n( k — l ) / ( n — 1 ); t o j e s t ^ 1 — | c n _1//2 + 0 ( n - 1 ), d la s = s(c) = 2 k A c k ( n — k ) / n 3^2 . D l a t e g o p r a w d o p o d o b ie ń s t w o , ż e s ^ ś ( c ) , j e s t ^ 2 c ~ 1 n 1/ 2p ś ( c ) ( l + 0 ( n _1//2) ) . P o d o b n ie , p s - i / p s
< 1 — \ c n ~ x^2 — 0 ( n _ 1 ) d la
s = s(c) = 2k — 1 — c(k — l ) ( n + 1 — k ) / n 3^2, w ię c s ć s ( c ) z p r a w d o p o d o b ie ń s t w e m ^ 2c~1n 1/2pŁ(c) ( l A O ( n ~ 1/2) ) . W p r z y p a d k a c h , k t ó r e n a s in t e r e s u ją , s t o s o w n e w a r t o ś c i c s ą ^ 0 .5 5 n 3^2( l n n ) 1^2k ~ l ^2(n — k ) ~ l , d la w s z y s t k i c h d u ż y c h n , a w z ó r a p r o k s y m a c y jn y S t ir lin g a im p lik u je , ż e pg(c) i Ps{c) s ą o b a r z ę d u
716
ODPOWIEDZI DO ĆWICZEŃ 0 ( n 1^2s ly/2 ( 2n — s)
5.3.3
ly"2) e x p ( — 2 s c 2 (n — k ) 2/ n 3 — 2 ( 2n — s ) c 2k 2/ n 3) ^ 0 (fc- 1 ^2 e x p ( — 4/c(n — k ) c 2/ n 2)) ^ 0 { k ~ 1^2n ^ 1'2).
T a k w ię c p r a w d o p o d o b ie ń s t w o 0 { n ~ 12 (log n ) 1^2) j e s t i s t o t n ie b a r d z o m a łe . [P o d o b n ą k o n s t r u k c ję m o ż n a z n a le ź ć w C A C M 1 8 ( 1 9 7 5 ) , 1 6 5 - 1 7 2 , j e d n a k a n a li z a t a m p o d a n a j e s t n ie p o p r a w n a ] . 25.
D l a d a n e g o a lg o r y t m u w y b o r u i p e r m u t a c ji i r z b io r u { 1 , . . . , n ) o b c i ą ż a m y k a ż d y m
p o r ó w n a n ie m
m:7Tj e le m e n t 7^ , je ś li \ir* — A;| >
\ i — k |; je ś li |m — k | =
\iXj — k |,
t a k i m p o r ó w n a n ie m o b c i ą ż a m y o b a e le m e n t y p o p o ło w ie . O b c ią ż e n ie i r* j e s t n a z y w a n e
użytecznym , j e ś l i 7u <
ttj
^ k lu b 7u > nj ^ k; w p r z e c iw n y m r a z ie t a k ie o b c ią ż e n ie
j e s t bezużyteczne. N ie c h x t b ę d z ie o g ó ln y m o b c ią ż e n ie m e le m e n t u t. W ó w c z a s łą c z n a lic z b a w y k o n a n y c h p o r ó w n a ń w y n o s i X\ + • • • + x n . O c z y w iś c ie Xk — 0; a le x t ^ 1 d la w s z y s t k i c h t ^ k, p o n ie w a ż k a ż d y e le m e n t, r ó ż n y o d k, m a je d n o u ż y t e c z n e o b c ią ż e n ie . U d o w o d n im y , ż e E x f c + t + E Xk-t ^ 3 d la 0 < t < k . N ie c h A t {7r) = [ p ie r w s z e o b c ią ż e n ie t + k b y ł o b e z u ż y t e c z n e ] . W ó w c z a s A t {n) = 1 — A - t { n ) , g d z ie 7r' j e s t t a k i e j a k 7r, z w y j ą t k i e m t e g o , ż e e le m e n t y (k — t , . . . , k + t — l , k + t) z o s t a ł y z a m ie n io n e o d p o w ie d n io p r z e z (k — H I , . . . , k + t , k — t). D l a t e g o E Ą + E 4 _ f = 1. N ie c h l ? i ( 7r) — [ p ie rw s z e o b c ią ż e n ie k + 1 i k — t m ia ło w a r t o ś ć
a H
i z o s t a ło
o b c ią ż o n e p o r a z d r u g i, z a n im z o s t a ł o o b c ią ż o n e p o r a z d r u g i k — t}. N ie c h t a k ż e C t {tt) =
[xk+t ^ 2 + A t ]. W ó w c z a s B t {n) ^ C t { ty'), g d z ie irf w y g lą d a j a k 7r, a le z e le m e n ta m i (k — t , k — t + l , . . . , k + t — l ) z a s t ą p i o n y m i p r z e z {k + t — 1, k — t , . . . , k + t — 2 ). P o d o b n ie B - t { tt) ^ C ~ t { 7r " ) , g d z ie irff o t r z y m u je s ię z 7r p r z e z z a m ia n ę (A:— H I , . . . , k + t — 1 , k + t ) n a ( k —t + 2 , . . . , k + t , k —t + l ) . S t ą d w y n ik a , ż e E B t ^ E Ct E B ~ t ^ E C - t . D o w ó d k o ń c z y m y , z a u w a ż a j ą c , ż e Xk-t + %k+t ^ 2 + A k + A ^ t — B t — B - t + Ct + C - t . [ D a ls z e w y n i k i m o ż n a z n a le ź ć w J A C M 3 6 (1 9 8 9 ), 2 7 0 - 2 7 9 ] . G ó r n a g r a n i c a z ( 1 7 ) m a t a k ż e o d p o w i a d a j ą c ą j e j d o ln ą g r a n ic ę : A n d r e w i F r a n c e s Y a o u d o w o d n ili w S I C O M P 1 1 ( 1 9 8 2 ) , 4 2 8 - 4 4 7 , ż e Vk (n ) ^ n + | k (In In n — ln k — 9) d la k > 1 i n ^ ( S k) 18k. 26.
(a ) O z n a c z m y w ie r z c h o łk i w d w ó c h t y p a c h s k ła d o w y c h p r z e z a; b < c. P r z e c iw n ik
n a n ie r e d u n d a n t n y c h p o r ó w n a n ia c h z a c h o w u je s ię j a k n a s tę p u je : P r z y p a d e k 1 :
a:a;
p r z e c iw n ik p o d e jm u je d o w o ln ą d e c y z ję . P r z y p a d e k 2 : x : 5 ; o d p o w ia d a , że x > 5; w y n i k ie m w s z y s t k i c h p r z y s z ł y c h p o r ó w n a ń y : 6, z t y m w ła ś n ie 5, b ę d z ie y > b, w p r z e c iw nym
r a z ie o w y n ik a c h p o r ó w n a ń d e c y d u je p r z e c iw n ik d la Uk{n — 1 ), c o d a j e ł ą c z
n ie ^ 2 + Uk{n — 1) p o r ó w n a ń . T ę r e d u k c ję o p is u je m y w s k r ó c ie
„ n ie c h b =
m in ;
2 + U k { n — 1 ) ” . P r z y p a d e k 3: x : c ; n ie c h c = m a x ; 2 + U k - i { n — 1 ). (b ) O z n a c z m y n o w e t y p y w ie r z c h o łk ó w p r z e z
a\a! lu b o d p o w i a d a a < c.
padek
1:
d,2 < e; / < g < h > i. P r z y
c : c '; p r z e c iw n ik p o d e jm u je d o w o ln ą d e c y z ję . P r z y p a d e k 2 : a : c ;
P r z y p a d e k 3: x:b; n ie c h b = m in ; 2 + Uk{n — 1 ). P r z y p a d e k 4: x\d\ n ie c h d — m in ; 2 + Uk{n — 1 ). P r z y p a d e k 5: x : e ; n ie c h e = m a x ; 3 + Uk-i{n — 1 ). P r z y p a d e k 6 : x : f ; n ie c h / = m in ; 2 + Uk{n — 1 ) . P r z y p a d e k 7: x : g ; n ie c h / i g = m in ; 3 + Uk{n — 2 ). P r z y p a d e k 8 : x : h ; n ie c h h = m a x ; 3 + Uk-i{n — 1 ). P r z y p a d e k 9: x\i\ n ie c h i = m in ; 2 + Uk{n — 1 ). (c) D l a k — 1 m a m y H ( n )
— n — 1 , z a t e m n ie r ó w n o ś ć j e s t p r a w d z iw a . D la
1 < k ^ n / 2 — 1 s t o s u je m y in d u k c ję i ( b ) . D l a k = (n — l ) / 2 s t o s u je m y in d u k c ję i (a ). D l a k — n/2, Uk{n — 1) = U k - i { n — 1 ) ; s t o s u je m y in d u k c ję i (a ), 27.
(a ) W y s o k o ś ć h s p e łn i a n ie r ó w n o ś c i 2h ^
1 ^ !C/ P r ( 0 / P “
Vp*
5.3.4
ODPOWIEDZI DO ĆWICZEŃ (b ) J e ś li
r^
k, d o c h o d z im y d o A 3 p o c o n a jm n ie j
717
n — |5o| — \Ko\ — n — |5o| — r
r z u t a c h m o n e t ą . E le m e n t e m A :-tym n a j w i ę k s z y m b ę d z ie a lb o n a jm n ie js z y , a lb o n a j
Q n ie b y ł y je s z c z e z e s o b ą p o r ó w n y w a n e , t a k w ię c b ę d z ie m y p o t r z e b o w a li c o n a jm n ie j \Q\— 1 d o d a t k o w y c h r z u t ó w m o n e t ą . J e ś li |5o| < Q, m a m y |Q| = r, a je ś li n ie , t o m a m y |Q| ^ |5o| — |C (y o )| + 1 ^ |5o| — (q — r) + 1 ; t a k w ię c w o b u p r z y p a d k a c h w y k o n a n y c h b ę d z ie c o n a jm n ie j n — q r z u t ó w m o n e t ą . I s t n ie je n + 1 —k z b io r ó w K z a w i e r a ją c y c h h — 1 n a j w i ę k s z y c h e le m e n t ó w w y z n a c z a n y c h p r z e z d a n y liś ć , a d la k a ż d e g o t a k ie g o K p r a w d o p o d o b ie ń s t w o o s ią g n ię c ia t e g o liś c ia w y n o s i a lb o z e ro , a lb o 2 ~ ^ /( ” ) , g d z ie / ^ n — ą j e s t lic z b ą r z u t ó w m o n e t ą o d p o w i a d a j ą c y c h K . [T en p r z e c iw n ik z o s t a ł p o d a n y n ie ja w n ie w p r a c y B e n t a i J o h n a , STOC 1 7 ( 1 9 8 5 ) , w ię k s z y e le m e n t z
Q.
A l e e le m e n t y z
2 13 -2 16 ]. (c) J e ś li k < r , z a m ie ń k n a n + 1 — k; t o d a j e k ^ r d la r m a k s y m a l iz u ją c e g o p r a w ą s tr o n ę , p o n ie w a ż r b ę d z ie r ó w n e 0 ( ^ / n ) , J e ś li m o ż n a d o j ś ć d o
A3 z
| C ( y ) | > q — r d la
w s z y s t k ic h y G K o, w a lg o r y t m i e z o s t a n ie w y k o n a n y c h n — 1 p o r ó w n a ń , ż e b y w y z n a c z y ć z a le ż n o ś c i fc-te g o n a jw ię k s z e g o e le m e n t u w z g lę d e m p o z o s t a ły c h , o p r ó c z c o n a jm n ie j ( r — l ) ( q — r + 1) p o r ó w n a ń w y k o n a n y c h m ię d z y 5 a K \ { 2/0}. (d ) W y b i e r z r = [ \ / m ] i q = 2r — 2 . ( T r o c h ę le p ie j j e s t w z i ą ć q = r + [_y/rn-\- \ J — 2 ; t e n w y b ó r m a k s y m a liz u je d o ln ą g r a n ic ę o t r z y m a n ą w (c )).
5.3.4 1.
( G d y m = 2k — 1 j e s t n ie p a r z y s t e , n a jle p ie j z a Vk u m ie ś c ić Vk+1 , Wk+i, ^fe+2 , - *.
z a m ia s t Wk+1 , i>k+i, Wk+2 , **• j a k p o d a n o w o p is ie s c a la n ia . T a z m ia n a z a c h o w u je p o p r a w n o ś ć k o n s tr u k c ji, p o n ie w a ż z a m ie n io n e lin ie s ą ze s o b ą p o r ó w n y w a n e ) .
(3,5) scalanie nieparzysto-parzyste xi -vi x2 ■wi
£3
-V2
-V3 ■ U )2 9 ¿5 w2— # Zq ■ V 4
2/1
V2 2/3 2/4
X X -WX
sortowanie 8-elementowe P a tta
%)ą —
— (1—
3— i
■U V 55
2/5
Z
7
--------- Zg
•----•
y-
<»—<»—•
y
<► *—
i
— i --------- i ---------------------
^ >—
i ---------i — -------- ---- i -------,,-----
2 . S o r to w a n ie z e s k o k ie m h w y m a g a 2 — [2h ^ n] p o z io m ó w ; z o b a c z p o w y ż s z y sch em ; d la n = 8 . 3 . C ( m , m — 1) = C ( m , m) — 1 d la m ^ 1.
4.
J e ś li T ( 6 ) = 4, t o w k a ż d y m t a k c ie m u s i a ł y b y p r a c o w a ć t r z y k o m p a r a t o r y , p o n ie
w a ż 5 ( 6 ) = 12 . J e ś li j e d n a k u s u n ie m y d o ln ą lin ię i c z t e r y z w ią z a n e z n ią k o m p a r a t o r y , t o m ie lib y ś m y 5 ( 5 ) T (7 ) =
^
8 , t o j e s t s p r z e c z n o ś ć . [W t e n s a m s p o s ó b p o k a z u je m y , ż e
T (S) — 6 . ł a n P a r b e r r y p o k a z a ł z a p o m o c ą k o m p u t e r o w e g o p r z e s z u k iw a n ia = T ( 1 0 ) = 7; z o b a c z Math. S ys tems T h e o r y 24 ( 1 9 9 1 ) ,
w y c z e r p u ją c e g o , ż e T ( 9 ) 10 1-116 ]. 5.
N ie c h f ( n ) = f ( \ n / 2 ] ) + 1 + | " lg fn / 2 ] ] d la n ^ 2. W ó w c z a s p r z e z in d u k c ję z e
w z g lę d u n a n m a m y f ( n ) = ( l + [ l g n ] ) [ l g n j / 2 .
6 . M o ż e m y z a ł o ż y ć , ż e w k a ż d e j fa z ie j e s t w y k o n y w a n y c h [n/2] p o r ó w n a ń ( d o d a t k o w e p o r ó w n a n ia n ie m o g ą p r z e s z k a d z a ć ) . P o n ie w a ż T ( 6 ) = 5, w y s t a r c z y p o k a z a ć , ż e T ( 5 ) = 5. G d y n = 5, w ó w c z a s p o d w ó c h fa z a c h m u s im y d o s t a ć j e d e n z c z ę ś c io w y c h p o r z ą d k ó w X ^ * lu b
, k t ó r y c h n ie m o ż n a s o r t o w a ć w d o d a t k o w y c h d w ó c h fa z a c h .
718 7.
5.3.4
ODPOWIEDZI DO ĆWICZEŃ
Z a łó ż m y , ż e w e jś c io w y m i k lu c z a m i s ą { 1 , 2 , . . . , 1 0 } . P o d s t a w o w ą o b s e r w a c ją je s t ,
ż e p o z a s t o s o w a n iu p ie r w s z y c h 16 k o m p a r a t o r ó w lin ie 2, 3, 4 i 6 n ie m o g ą z a w ie r a ć a n i
8 , a n i 9, a n i j e d n o c z e ś n ie 6 i 7. 8 . P r o s t e u o g ó ln ie n ie t w i e r d z e n i a F . 9.
N a p o d s t a w ie ć w ic z e n ia 8 M ( 3 , 3)
^
5 ( 6 ) — 2 5 ( 3 ) ; A f ( 4 , 4)
M ( 5 , 5 ) ^ 2 A f ( 2 ,3 ) + 3; o r a z M ( 2 , 3 ) ^ 5 ( 5 ) -
5 (2 ) -
^
5 (8 ) — 2 5 (4 );
5 ( 3 ) . P o d o b n ie M ( 3 ,4 ) = 8 .
J a k ie s ą j e d n a k w a r t o ś c i M { 3, 5) i M { 4, 5 )? 1 0 . W s k a z ó w k a w y n i k a z m e t o d y d o w o d u t w ie r d z e n ia Z . N a s t ę p n ie d o w o d z im y , ż e l ic z b a z e r w p o d c ią g u p a r z y s t y m , m in u s l ic z b a z e r w p o d c ią g u n ie p a r z y s t y m , j e s t r ó w n a
± 1 lu b 0 . 1 1 . ( R o z w ią z a n ie z a p r o p o n o w a n e p r z e z M . W . G r e e n a ) S ie ć j e s t s y m e t r y c z n a w n a s tę p u j ą c y m z n a c z e n iu : k i e d y Zi j e s t p o r ó w n y w a n e z z 3 , is t n ie je o d p o w i a d a j ą c e t e m u p o r ó w
\z2t ^ X- i ' K a ż d a s y m e t r y c z n a s ie ć z d o ln a p o s o r t o w a ć c i ą g {zo , . . . , z 2t _ i)
n a n ie
p o s o r t u j e t a k ż e c i ą g ( — z 2t _ 1 , . . . , — ^o)B a t c h e r z a u w a ż y ł , ż e t a k a s ie ć b ę d z ie w r z e c z y w is t o ś c i s o r t o w a ła k a ż d e c y k lic z n e p r z e s u n ię c ie ( z j , 2j + i , . . . , z 2t _ i , z o , . . . , Zj~i) d o w o ln e g o c i ą g u b it o n ic z n e g o . T o w y n ik a z z a s a d y 0 —1 . [T en w y n i k nie j e s t p r a w d z i w y d la s o r te r ó w b it o n ic z n y c h o r z ę d z ie n ie b ę d ą c y m p o t ę g ą 2 . N a p r z y k ł a d s ie ć z r y s u n k u 52 n ie p o s o r t u je c i ą g u ( 0 , 0 , 0 , 0 , 0 , 1 , 0 ) . O r y g in a ln a d e fin ic ja B a t c h e r a c i ą g ó w b it o n i c z n y c h b y ł a b a r d z ie j s k o m p lik o w a n a i m n ie j u ż y t e c z n a o d d e fin ic ji p r z y j ę t e j p r z e z n a s].
1 2 . x V y j e s t c ią g ie m b i t o n i c z n y m ( r o z w a ż c i ą g i 0 - 1 ) , a le x A y n ie ( r o z w a ż ( 3 , 1 , 4 , 5 ) A ( 6 , 7 , 8 , 2 )). 13.
E f e k t e m d o s k o n a łe g o t a s o w a n i a j e s t z a s t ą p ie n ie Zi p r z e z Zj, g d y b in a r n a r e p r e
z e n t a c ja j j e s t r e p r e z e n t a c ją i p r z e s u n ię t ą c y k l ic z n i e o j e d n ą p o z y c j ę w p r a w o ( z o b a c z ć w ic z e n ie 3 .4 .2 - 1 3 ) . R o z w a ż m y t a s o w a n ie k o m p a r a t o r ó w z a m ia s t t a s o w a n ia lin ii. P ie r w s z a k o lu m n a k o m p a r a t o r ó w d z i a ł a n a p a r a c h z[i] i z[i 0 2 r ~ 1], n a s t ę p n a k o lu m n a n a
z[i] i z[i 0 2 r_ 2 ], . . . , k o lu m n a t n a z[i] i z[i 0 1 ], k o lu m n a (t + 1 ) p o n o w n ie n a z[i] i z[i 0 2 r _ 1 ] itd . T u t a j 0 o z n a c z a w y k l u c z a j ą c e L U B n a r e p r e z e n t a c ja c h b in a r n y c h . T o p o k a z u je , ż e r y s u n e k 5 7 j e s t r ó w n o w a ż n y r y s u n k o w i 56; p o s fa z a c h m a m y g r u p y p o 2 S e le m e n t ó w , k t ó r e s ą n a p r z e m ia n p o s o r t o w a n e n ie m a le ją c o i n ie r o s n ą c o . C . G . P l a x t o n i T . S u e l [ M a ih . S ys tems T h e or y 2 7 ( 1 9 9 4 ) , 4 9 1 - 5 0 8 ] p o k a z a li, ż e k a ż d a t a k a s ie ć w y m a g a c o n a jm n ie j i l ( ( l o g n ) 2/ l o g l o g n ) p o z io m ó w o p ó ź n i a ją c y c h . 14.
(a ) N ie c h yis = x j 3, y j s = x isJ yk = Xk d la i s # fc # j s ; w ó w c z a s y a s = x a . (b ) T o
j e s t o c z y w i s t e z w y j ą t k i e m p r z y p a d k u , w k t ó r y m w z b io r z e {isyj syit yjt } s ą t y l k o t r z y r ó ż n e e le m e n t y ; z a łó ż m y , ż e i s — i t • W ó w c z a s , je ś li s < i , p ie r w s z e s — 1 k o m p a r a t o r ó w z a m ie n ia o d p o w ie d n io ( i a, j s , j t ) n a (jsyjtyis), z a r ó w n o w ( c ć ) * , j a k i w ( c ć ) s .
(c) (os)s = a oraz a 1 = a, tak więc możemy założyć, że Si > S2 > • • • > Sk > 1 . (d ) N i e c h P — a[i :j ]; w ó w c z a s g ^ { x i , . . . , x n ) = { x i \/xj )A{g a { x i 1 . . . , X i , . . . , X j , . . . , x „ ) Vgoc{x i , . . . , x j , . . . , X i , . . . , a:n ))- I t e r u ją c p o w y ż s z ą t o ż s a m o ś ć , d o s t a n ie m y s z u k a n y w y n ik . (e) f a (x) = 1 w t e d y i t y l k o w t e d y , g d y ż a d n a ś c ie ż k a w Ga n ie p r o w a d z i o d i d o j , g d z ie X{ > x j . J e ś li a j e s t s ie c ią s o r t u ją c ą , t o t a k ż e s p r z ę ż e n ia a s ą s ie c ia m i s o r t u ją c y m i; t a k ż e f a ( x ) = 0 d la w s z y s t k i c h x z Xi > Xi+1 . W e ź m y x — e(*); t o p o k a z u je , że G m a t y l k o k r a w ę d ź z i d o k\ d la p e w n e g o k\ ^ i . J e ś li k i ^ i + 1 , x = e^ ) V e t fei) p o k a z u je , ż e
G ma
k r a w ę d ź z i lu b ki d o
d la p e w n e g o k 2 ^ { Â k i } . J e ś li H ^ i + 1 , p o s t ę p u je m y
d a le j w t e n s a m s p o s ó b , a ż z n a jd z i e m y ś c ie ż k ę w
G
o d i d o i + 1 . N a o d w r ó t , je ś li
5.3.4
ODPOWIEDZI DO ĆWICZEŃ
719
a n ie je s t s ie c ią s o r t u ją c ą , n ie c h x b ę d z ie w e k t o r e m z Xi > x t +1 i ga (x) = 1. D l a 1 , t a k w ię c G a/ n ie m o ż e z a w ie r a ć ś c ie ż k i o d i d o i + 1. [W o g ó ln o ś c i, ( x a ) i ^ (%a)j d la w s z y s t k i c h x w t e d y i t y l k o w t e d y , g d y w G a> is t n ie je ś c ie ż k a s k ie r o w a n a o d i d o j d la k a ż d e g o a ' s p r z ę ż o n e g o z a\. p e w n e g o s p r z ę ż e n ia a , / a ' H ) =
15.
[1:4 ] [3:2] [1 :3 ] [2:4] [2 :3 ].
16 .
T e n p r o c e s je s t o c z y w iś c ie s k o ń c z o n y . E f e k t e m k a ż d e g o w y k o n a n i a k r o k u T 2 j e s t
z a m ia n a w y j ś ć i q i j q, t a k w ię c w w y n i k u d z i a ła n i a a lg o r y t m u d o s t a j e m y p e w n ą p e r m u t a c ję lin ii w y jś c io w y c h . P o n ie w a ż o t r z y m a n a s ie ć s t a n d a r d o w a n ie d o k o n u je ż a d n y c h z m ia n d la d a n y c h w e jś c io w y c h ( 1 , 2 , . . . , n ) , lin ie w y jś c io w e m u s i a ł y z a t e m p o w r ó c ić n a s w o je o r y g in a ln e p o z y c je . 17.
Z a p o m o c ą a lg o r y t m u z ć w ic z e n ia 1 6 n a le ż y p r z e k s z t a łc ić d a n ą s ie ć n a s ie ć s t a n d a r
d o w ą ; n a s tę p n ie r o z w a ż y w s z y c i ą g ( 1 , 2 , . . . , n ) , w id z im y , ż e s t a n d a r d o w a s ie ć w y b o r u m u s i p r z e m ie s z c z a ć k n a j w i ę k s z y c h e le m e n t ó w n a lin ie o k n a j w i ę k s z y c h n u m e r a c h ; n a t o m ia s t s ie ć Vk{n) m u s i u m ie ś c ić fc-ty n a j w i ę k s z y e le m e n t n a lin ii n + 1 — k. N a l e ż y z a s to s o w a ć z a s a d ę z e r o - je d y n k o w ą . 1 8 . W d o w o d z ie t w ie r d z e n ia A p o k a z u je się , ż e Vk(n) ^ (n — k)\\g(k + 1 )] + [lg A :]. 19 .
S ie ć [1 : n] [2 : n ] . . . [1:3 ] [2:3] z n a jd u je n a jm n ie js z e d w a e le m e n t y z a p o m o c ą 2n — 4
k o m p a r a to r ó w ; d la V2 (n ) n a le ż y d o d a ć [ 1 :2 ] . D o ln e g r a n ic e p o c h o d z ą z d o w o d u t w ie r d z e n ia A ( z o b a c z p o p r z e d n ią o d p o w ie d ź ) . A
20.
A
Z a u w a ż m y n a jp ie r w , ż e V 3 (n ) ^ ^ ( n — 1) + 2, g d y n ^ 4; z s y m e t r i i w y n ik a , ż e
p ie r w s z y m k o m p a r a to r e m m o ż e b y ć [ l : n ] ; n a s t ę p n ie m u s im y m ie ć s ie ć , k t ó r a z n a jd u je t r z e c i n a j w i ę k s z y e le m e n t w ś r ó d { x2, x 3 , . . . , x n), o r a z je s z c z e k o m p a r a t o r d o t y k a j ą c y lin ii 1 . Z d r u g ie j s t r o n y V s ( 5 ) ^ 7 , p o n ie w a ż c z t e r y k o m p a r a t o r y w y z n a c z a j ą m in i m a x w ś r ó d { x i , X 2 , X 3 , x ą } i w y s t a r c z y p o s o r t o w a ć t r z y e le m e n ty .
2 1 . F a łs z ; r o z w a ż m y n a p r z y k ł a d d w ie s ie c i [1 :2] [3 :4 ][ 2 :3] [ 1 :4 ] [1 :2] [3 :4] i [1 : 2] [3:4 ] [2 :3] [3:4] [1:4 ] [1 : 2] [3 :4 ]. ( J e d n a k , N . G . d e B r u ij n u d o w o d n ił w Di screte Math. 9 ( 1 9 7 4 ) , 3 3 7 , ż e n o w e k o m p a r a t o r y n ie p s u ją s ie c i s o r t u ją c y c h , k t ó r e s ą s ie c ia m i prostymi w z n a c z e n iu z ć w ic z e n ia 3 6 ). 22.
(a ) P r z e z in d u k c ję z e w z g lę d u n a d łu g o ś ć a , p o n ie w a ż Xi ^ pi i x j ^ yj i m p lik u ją ,
że Xi A Xj H i A Vj o r a z Xi V Xj H i ^ Vj- (b ) P r z e z in d u k c ję z e w z g lę d u n a d łu g o ś ć a , p o n ie w a ż (Xi A Xj)(yi A pj) + (Xi V Xj)(yi V yj ) ^ Xiyi + x j p j . [W r e z u lt a c i e v { x A y) ^
v ( x a A y a ), o b s e r w a c ja p o c h o d z ą c a o d W . S h o c k le y a ] . 23.
N ie c h Xk — 1 w t e d y i t y l k o w t e d y , g d y pk ^ jy Pk = 1 w t e d y i t y l k o w t e d y , g d y
Pk > j] w ó w c z a s {xa)k — 1 w t e d y i t y l k o w t e d y , g d y (po)/e + j itd .
l[
z =
x A y ta k ie ja k { z a ) j = 0. Z ć w i c z e n ia 23 m a m y , ż e p o d o d a n iu d o d a t k o w y c h j e d y n e k d o z z n a jd z i e m y p e r m u t a c j ę p z { pa' )j ^ C (z)* Z a le ż n o ś c i d la u- i Uj d o s t a j e m y p r z e z o d w r ó c e n ie p o r z ą d k u . 24. W zór na
j e s t o c z y w is t y , n a t o m ia s t d la
n a le ż y w z i ą ć
w e w s k a z ó w c e i z a u w a ż y ć , k o r z y s t a j ą c z ć w ic z e n ia 2 1 , ż e {za)t =
25.
( R o z w ią z a n ie z a p r o p o n o w a n e p r z e z H . S h a p ir o ) N ie c h p i q b ę d ą p e r m u t a c ja m i,
d la k t ó r y c h {pa)k — lk i (q&)k = Uk . P e r m u t a c ję p m o ż n a p r z e k s z t a łc ić n a q , w y k o n u ją c c i ą g k r o k ó w , z k t ó r y c h k a ż d y p o le g a n a z a m ia n ie p a r y {i, i + 1 ) s ą s ie d n ic h l ic z b c a łk o w it y c h ; t a k a z a m ia n a n a w e jś c iu w p ł y w a n a A;-te w y j ś c i e c o n a j w y ż e j o ± 1 . 2 6 . I s tn ie je
w z a je m n ie
je d n o z n a c z n a
o d p o w ie d n io ś ć ,
( p i y • tPn) z PnOt p r z y p o r z ą d k o w u je „ c ią g p o k r y w a j ą c y ”
k tó ra
każd em u
e le m e n t o w i
p o k ryw a x ^
p o k ryw a
720
5.3.4
ODPOWIEDZI DO ĆWICZEŃ
. . . p o k r y w a x^n\ g d z ie x ^ n a le ż ą d o D na\ w t e j o d p o w ie d n io ś c i x ^ - 1 ^
—
x ^ V eO
w t e d y i t y l k o w t e d y , g d y pj — i. N a p r z y k ł a d { 3 , 1 , 4 , 2 ) o d p o w ia d a c ią g o w i ( 1 , 1 , 1 , 1 ) p o k r y w a { 1 , 0 , 1 , 1 ) p o k r y w a ( 1 , 0 , 1 , 0 ) p o k r y w a ( 0 , 0 , 1 , 0 ) p o k r y w a ( 0 ,0 ,0 ,0 ) . [ A n d r e w Y a o z a u w a ż y ł , ż e w y n i k a s t ą d , ż e s ie ć s o r t u j ą c ą w y s t a r c z y t e s t o w a ć n a (^n” 2j) — 1 o d p o w ie d n io w y b r a n y c h p e r m u t a c ja c h . N a p r z y k ł a d k a ż d a 4 - e le m e n to w a s ie ć , k t ó r a s o r t u je ( 4 , 1 , 2, 3 ), ( 3 , 1 , 4 , 2), ( 3 , 4 , 1 , 2 ), { 2 , 4 , 1 , 3) i (2, 3 , 4 , 1 ) , s o r t u je k a ż d ą p e r m u t a c ję . Z o b a c z ć w ic z e n ie 6 . 5 - 1 ; z o b a c z t a k ż e ć w ic z e n ie 56]. 27.
Z a s a d a p o d a n a w ć w ic z e n iu j e s t p r a w d z iw a , p o n ie w a ż
s z y m e le m e n t e m z
x.
y Xi ^ yi
J e ś li
s ą p o so rto w a n e ta k , że
x
i
d la k a ż d e g o ¿, i je ś li x a ,
p o s o r t o w a n iu , t o n a p o d s t a w ie p o d a n e j z a s a d y m a m y , ż e ¿, p o n ie w a ż m o ż n a w y b r a ć i e le m e n t ó w z e le m e n t y z
y.
(xa)i
j e s t ¿ -ty m n a jm n ie j
o z n a c z a j ą r ó ż n e k o lu m n y w m a c ie r z y , k t ó r e j w ie r s z e
x
y a o z n a c z a ją (xa)i ^ (y&)i
k o lu m n y p o d la k a ż d e g o
z t y c h s a m y c h w ie r s z y c o d o w o ln e i d a n e
[ U ż y w a liś m y j u ż t e j z a s a d y , d o w o d z ą c n ie z m ie n n ik a w s o r to w a n iu S h e lia ,
t w ie r d z e n ie 5 .2 . 1 K . O p is d a ls z e g o w y k o r z y s t a n i a t e g o p o m y s łu m o ż n a z n a le ź ć w p r a c y D a v i d a G a l e ’a i R . M . K a r p a , J. C o m p u t e r and System Sciences 6 ( 1 9 7 2 ) , 1 0 3 - 1 1 5 . F a k t , ż e s o r t o w a n ie k o lu m n , z a c h o w u je u p o r z ą d k o w a n ie w ie r s z y z o s t a ł n a jp e w n ie j p o r a z p ie r w s z y z a u w a ż o n y w z w i ą z k u z o p e r a c ja m i n a t a b le a u x ; z o b a c z H e r m a n n B o e r n e r ,
Darstellung von Gru p pe n ( S p r in g e r , 1 9 5 5 ) , C h a p t e r V , §5]. 28.
J e ś li { x i 1 , . . . , Xik } s ą k n a j w i ę k s z y m i e le m e n t a m i, t o Xi1 A . . . A x i k j e s t fc-tym
n a jw ię k s z y m
e le m e n t e m . J e ś li { x ^ , . . . , X i k } nie s ą k n a jw ię k s z y m i e le m e n ta m i, t o
Xix A . . . A Xtk j e s t mniejsze od k - t e g o n ą jw ię k s z e g o e le m e n tu .
(xi A j/i, ( x 2 A yi ) V (xi A y2), {x8 A yi) V (x 2 A y2) V ( x x A y3), yi V ( x 3 A y2) V {X2 A y 3) V (xi A y 4), y 2 V ( x 3 A y 3) V ( x 2 A y 4) V ( x x A y 5), y3 V (x 3 A y 4) V (x 2 A y 5) V x x, y4 v ( x 3 A y5) V x 2, y5 V x 3). 29.
30.
K o r z y s t a j ą c z p r a w r o z d z ie ln o ś c i i łą c z n o ś c i, k a ż d ą fo r m u łę m o ż n a s p r o w a d z ić *do
s u m y (V) ilo c z y n ó w (A); w ó w c z a s p o s t a ć k a n o n ic z n ą d o s t a je m y , k o r z y s t a j ą c z p r a w p r z e m ie n n o ś c i, id e m p o t e n t n o ś c i i p o c h ła n ia n ia . Z b io r y S% t o d o k ła d n ie t e z b io r y S , d la k t ó r y c h w a r t o ś c ią o m a w ia n e j f o r m u ły j e s t 1 , g d y Xj = [j 6 5 ] , i 0, g d y x j = [j C S'] d la d o w o ln e g o p o d z b i o r u S f z b io r u S. 3 1.
04 =
16 6 . R . C h u r c h [Duke Mat h. J. 6 (1 9 4 0 ) , 7 3 2 - 7 3 4 ] o d k r y ł, ż e ó5 = 7 5 7 9 ,
M . W a r d [Bull. Amer . Ma th. Soc. 5 2 ( 1 9 4 6 ) , 423] p o d a ł, ż e ¿6 = 78 2 8 3 5 2 i ż e k o le jn y m i w a r t o ś c ia m i s ą S7 =
2 4 14 6 8 2 0 4 0 9 9 6 , S8 =
56130 437228 68 755790 778 6
[R. C h u r c h ,
Notices Amer . Math. Soc. 1 2 ( 1 9 6 5 ) , 72 4 ; J. B e r m a n i P . K ö h le r , Mitteilungen Math. Seminar Gießen 1 2 1 ( 1 9 7 6 ) , 1 0 3 - 1 2 4 ; D . W ie d e m a n n , O r d e r 8 ( 1 9 9 1 ) , 5 - 6 ] . Ż a d e n p r o s t y w z ó r n a Sn n ie j e s t o c z y w i s t y ; D . K l e i t m a n [Proc. Amer. Math. Soc. 2 1 (1 9 6 9 ), 6 7 7 - 6 8 2 ] u d o w o d n ił, ż e ( lg ^ n ) / ( ^ n / 2j) “ > 1 P r z y n s k o m p lik o w a n ą a r g u m e n t a c ją . 32.
0 0 , P o s *u g uj 4 c
w y ją t k o w o
G t + i j e s t t a k ż e z b io r e m w s z y s t k i c h s łó w 9'tp t a k ic h , że 0 , xj) n a le ż ą d o G * , a 6 ^ 'ip1
je ś l i p o t r a k t u j e m y t e s ło w a j a k o w e k t o r y z e r i j e d y n e k . W y n i k a s t ą d , iż Gt je s t z b io r e m w s z y s t k i c h s łó w z e r o - je d y n k o w y c h z 0 . . . z 2t - x o t a k ie j w ła s n o ś c i, że Zi ^ zj, z a w s z e g d y b i n a r n a r e p r e z e n t a c ja i j e s t
o d b in a r n e j r e p r e z e n t a c ji j , je ś li t e r e p r e z e n t a c je
p o t r a k t o w a ć j a k o w e k t o r y z e r o - je d y n k o w e . K a ż d y e le m e n t z 0 . . . z 2t _ x z O t , z w y j ą t k i e m 0 0 . . . 0 i 1 1 . . . 1, r e p r e z e n t u je j e d n ą fu n k c ję / ( x x, . . . , X t ) p o s t a c i A-V, o d w z o r o w u ją c ą z b ió r D 2t w { 0 , 1 } , p r z y z a c h o w a n iu o d p o w ie d n io ś c i / ( x x, . . . , x t ) — z[ (xi . . . x t ) 2]. 33.
J e ś li t a k a s ie ć b y i s t n i a ł a , d la p e w n e j fu n k c ji / m ie lib y ś m y ( x x A x 2) V (x2 A
x 3) V (x 3 A x 4) = f ( x i A x 2, Xi V x 2, x 3, x 4) lub f ( x \ A x 3, x 2, x\ V x 3, x 4) lub . . . lub
5.3.4
ODPOWIEDZI DO ĆWICZEŃ
721
f ( x i , X 2 , x s A x ą , X 3 V x 4 ). B io r ą c ( x \ , x 2, x 3 , x 4) — ( x , x , 1 , 0 ) , ( x , 0 , x , l ) , ( x, 1 , 0 , x ) , ( 1 , 0: , x , 0 ), ( 1 , x , 0 , x), ( 0 , 1 , x) , w id z im y , ż e ż a d n a t a k a fu n k c ja / n ie is t n ie je . 3 4 . T a k ; p o u d o w o d n ie n iu t e g o , j e s t e ś m y g o t o w i w y k a z a ć p o p r a w n o ś ć s ie c i d la n = 16 z r y s u n k u 49 ( c h y b a ż e w y k o r z y s t u j ą c t w ie r d z e n ie Z , s p r a w d z im y p o p r o s t u w s z y s t k i e
2n w e k t o r y b ito w e ) . 35. W
p r z e c iw n y m r a z ie p e r m u t a c ja , w k t ó r e j t y l k o i o r a z i + 1 n ie s ą n a s w o ic h
m ie js c a c h , n ig d y n ie z o s t a ł a b y p o s o r t o w a n a . N ie c h Dk b ę d z ie lic z b ą k o m p a r a t o r ó w
[i:i+k\ w s t a n d a r d o w e j s ie c i s o r t u ją c e j. W t e d y D i + 2D 2 + D s ^ 2{n — 2 ), p o n ie w a ż m u s z ą is t n ie ć d w a k o m p a r a t o r y ł ą c z ą c e { i , i + 1 } z { ¿ + 2 , ¿ + 3 } d la 1 ^ i ^ n — 3, j a k r ó w n ie ż [1 : 2] i [n— 1 :n\. P o d o b n ie D i + 2 D 2 H b k D k + (k — l ) D k+i H \~D 2k~i ^ k ( n — k ), w z ó r p o d a n y p r z e z J. M . P o lla r d a . M o ż n a t a k ż e u d o w o d n ić , ż e 2 D i + D 2 ^ 3 n — 4: J e ś li w y r z u c im y p ie r w s z e k o m p a r a t o r y p o s t a c i [ j ' j + 1 ] d la w s z y s t k i c h j , t o m u s i is tn ie ć co n a jm n ie j je d e n k o m p a r a t o r p o ło ż o n y w e w n ą t r z {z, H I , H 2 } d la 1 ^ i ^ n —2 . P o d o b n ie k D i + (k - 1 ) D 2 H b D k ^ S ( k + l ) ( n - k) -b k ( k - 1 ). 36.
(a) K a ż d y s ą s ie d z k i k o m p a r a t o r z m n ie js z a lic z b ę in w e r s ji o 0 lu b 1 , a p e r m u t a c j a
(n , n - 1 , . . . , 1) m a (” ) in w e r s ji, (b ) N ie c h a = (3\p:p+l\. N a l e ż y p r z e p r o w a d z ić d o w ó d o r a z ( x(3)p > ( xf 3) j , (x/?)p+i > {xf3)j\ s t ą d (y(3)p > [yP)j i (y/3)p+i > ( y/3)j . J e ś li p = i - 1 , t o a lb o (xf3)pj a lb o (x/3)p+i je s t > (x/3)j\ z a t e m a lb o ( y/3)p , a lb o (yj3)p+1 je s t > (y/3)j. D l a p = j — 1 lu b j u z a s a d n ie n ie j e s t p o d o b n e . D la in n y c h p u z a s a d n ie n ie j e s t t r y w i a ln e . Uwagi: J e ś li a j e s t p r o s t ą s ie c ią s o r t u ją c ą , t o r ó w n ie ż i a R ( k o m p a r a t o r y w y s t ę p u j ą in d u k c y jn y z e w z g lę d u n a a . J e ś li p = i , t o j > p + l
w p o r z ą d k u o d w r o t n y m ) . U o g ó ln ie n ia i in n y d o w ó d
(c) m o ż n a z n a le ź ć w
p racach
N . G . d e B r u ijn a , Discrete Ma th emat i cs 9 ( 1 9 7 4 ) , 3 3 3 - 3 3 9 ; Indagationes Math. 4 5 (1 9 8 3 ), 1 2 5 - 1 3 2 . W
d r u g ie j z t y c h p r a c d e B r u ij n u d o w o d n ił, ż e p r o s t a s ie ć s o r t u je
w s z y s t k ie p e r m u t a c je m u lt iz b io r u { m • 1 , . . . , n m • m } w t e d y i t y l k o w t e d y , g d y s o r t u je p e r m u t a c ję r a Cm . . . 1 C1. R e l a c j a x < y, d e fin io w a n a d la p e r m u t a c j i x i y , o z n a c z a j ą c a is tn ie n ie s t a n d a r d o w e j sie c i a t a k ie j, ż e x = y a , j e s t n a z y w a n a porządkiem B r uh a ta ; a n a lo g ic z n a r e la c ja , a le o g r a n ic z o n a d o p r o s t e j s ie c i a , n a z y w a się słabym porządkiem
Bruhata ( z o b a c z o d p o w ie d ź d o ć w ic z e n ia 5 .2 .1 - 4 4 ) . 3 7 . W y s t a r c z y p o k a z a ć , że je ś li k a ż d y k o m p a r a t o r z a s t ą p i m y p r z e z o p e r a c ję zamiany , o t r z y m a m y „sie ć o d w r a c a j ą c ą ” , k t ó r a p r z e k s z t a łc a ( x i , . . . , x n ) n a ( x n , . . . , Xi ) . P r z y t a k ie j in t e r p r e t a c ji n ie j e s t t r u d n o p r z e ś le d z ić d r o g ę
Z a u w a ż m y , ż e d la p e r m u
(1 2 ) (3 4 ) . . . ( 2 n — l 2 n ) ( 2 3 ) (4 5 ) . . . ( 2 n - 2 2 n - l ) = ( 1 3 5 . . . 2 n - l 2) z a c h o d z i 7rn = ( 1 2 n ) ( 2 2 n — 1 ) . . . ( n — 1 n ) . N i e p a r z y s t o - p a r z y s t e
t a c ji TT 2 n 2 n —2
xk•
...
s o r to w a n ie p r z e s t a w ia j ą c e z o s t a ło z a s y g n a liz o w a n e p r z e z H . S e w a r d a w 1 9 5 4 r o k u ; b y ł o t a k ż e o m a w ia n e p r z e z A . G r a s s e llie g o [1 R E Trans. E C - 1 1 ( 1 9 6 2 ) , 483] o r a z K a u t z a , L e v i t t a i W a k s m a n a [I E E E Trans. C - 1 7 ( 1 9 6 8 ), 4 4 3 - 4 5 1 ] . W ła s n o ś ć o d w r a c a n i a z o s t a ł a z a o b s e r w o w a n a d u ż o w c z e ś n ie j p r z e z H . E . D u d e n e y a w je d n e j z z a p r o p o n o w a n y c h p r z e z n ie g o ła m ig łó w e k [ A m u s e m e n t s in M at hemat i cs ( 1 9 1 7 ) , 19 3 ]. 3 8 . W s t a w e le m e n t y ¿ 1 , . . . , H
d o p o c z ą t k o w o p u s t e g o t a b le a u w y k o r z y s t u j ą c w t y m
c e lu a lg o r y t m 5 .1 .4 1 , a le z j e d n ą i s t o t n ą z m ia n ą : w y k o n u j Pij
Xi w k r o k u 13 t y l k o w t e
d y, g d y Xi / P i ( j - 1 ) - M o ż n a u d o w o d n ić , ż e Xi b ę d z ie w t y m k r o k u r ó w n e P ^ j - i ) t y lk o w te d y , g d y x H
1 = P i j , d la d a n y c h w e jś c io w y c h i i . . . H
d e f in iu ją c y c h p r o s t ą s ie ć s o r
t u ją c ą . ( A s e r c je u m ie s z c z o n e w n a w ia s a c h w o p is ie a lg o r y t m u m u s z ą b y ć o d p o w ie d n io z a k t u a liz o w a n e ) . P o w s t a w ie n iu 5 .1 .4 A . P o
N
ij
d o P n a le ż y w y k o n a ć
Qst
j
t a k j a k w t w ie r d z e n iu
k r o k a c h t a b le a u P b ę d z ie z a w s z e z a w i e r a ło (r, r + 1 , . . . , n — 1 ) w w ie r s z u r ,
p o d c z a s g d y Q b ę d z ie t a b le a u , z k t ó r e g o c i ą g i i . . . I n m o ż n a o d t w o r z y ć , o d w r a c a j ą c c a ły p roces.
722
ODPOWIEDZI DO ĆWICZEŃ
5.3.4
N a p r z y k ł a d d la n — 6 c i ą g i\ .. A n — 4 1 3 2 4 3 5 4 3 1 2 3 5 1 4 o d p o w ia d a p a r z e t a b le a u x
P=
Q=
1
4
5
8 13
2
6
7
15
3
9 12
10 11 14 T r a n s p o z y c j a Q o d p o w i a d a s ie c i d o p e łn ie n io w e j [n —ii : n — ż i + 1 ] . . . [n—ijv : n — ¿iv + l]-
Bibliografia: A . L a s c o u x i M . P . S c h ü t z e n b e r g e r , C o m p t e s Re ndu s Acad. Sei. Paris (I) 2 9 5 ( 1 9 8 2 ) , 6 2 9 - 6 3 3 ; R . P . S t a n le y , E u r . J. Combinatorics 5 (1 9 8 4 ), 3 5 9 - 3 7 2 ; P . H . E d e lm a n i C . G r e e n e , Advance s in Mat h. 6 3 ( 1 9 8 7 ) , 4 2 - 9 9 . S c h e m a t y p r o s t y c h s ie c i s o r t u j ą c y c h o d p o w i a d a j ą t a k ż e r o z m ie s z c z e n io m p s e u d o lin ii i in n y m
p o ję c io m
z w i ą z a n y m z w y p u k ł o ś c i ą d w u w y m ia r o w ą ; z o b a c z D . E . K n u t h , Lecture Not es in Comp.
Sei. 6 0 6 (1 9 9 2 ) p o d a ls z e in fo r m a c je . 39.
G d y n a p r z y k ł a d n = 8 , t a k a s ie ć m u s i z a w ie r a ć w s z y s t k i e p o k a z a n e t u t a j
k o m p a r a t o r y ; w s z y s t k i e in n e k o m p a r a t o r y s ą d la c ią g u 10101010 n ie e fe k t y w n e . W ó w c z a s lin ie [n / 3 ] . . [2n/3~| = 3 . . 6 s o r t u j ą 4 e le m e n t y j a k w ć w ic z e n iu 3 7. ( T o ć w ic z e n ie j e s t o p a r t e n a r o z w a ż a n ia c h D a v i d a B . W ils o n a ) .
Uwagi: I s t n ie je w z a je m n ie j e d n o z n a c z n e o d w z o r o w a n ie m ię d z y s ie c ia m i p r o s t y m i o m in im a ln e j d łu g o ś c i, k t ó r e s o r t u j ą d a n e s ło w o b ito w e , a t a b le a u x Y o u n g a , k t ó r y c h k s z t a ł t j e s t o g r a n ic z o n y z y g z a k o w a t ą ś c ie ż k ą z d e fin io w a n ą p r z e z t o s ło w o b it o w e . W t e n s p o s ó b , k o r z y s t a j ą c z ć w ic z e n ia 38, d o s t a n ie m y w z a je m n ie je d n o z n a c z n e o d w z o r o w a n ie m ię d z y s ie c ia m i p r o s t y m i o ( n/^+ 1 ) k o m p a r a t o r a c h s o r t u ją c y c h ( 10 )n/2 a s ie c ia m i p r o s t y m i o (n ^2+ 1 ) k o m p a r a t o r a c h , k t ó r e s o r t u j ą n/2 + 1 d o w o ln y c h lic z b . J e ś li s ie ć p r o s t a s o r t u j e s ło w o b it o w e i n/2Qn/2i) t o n a s z e s t w ie r d z e n ie m o ż e m y w z m o c n ić : W s z y s t k i e „ p o ł ó w k i ” s ie c i, s k ł a d a j ą c e s ię z p o d s ie c i o lin ia c h o d k d o fc + n / 2 w łą c z n i e , s ą s ie c ia m i s o r t u j ą c y m i d la 1
k
n / 2 . ( Z o b a c z t a k ż e t w ie r d z e n ie d e B r u ij n a
c y t o w a n e w o d p o w ie d z i d o ć w ic z e n ia 3 6 ). 40.
W y n i k o t r z y m u je m y p r z e z z a s t o s o w a n ie n ie r ó w n o ś c i d o s z a c o w a n ia o g o n ó w w in
t e r e s u ją c e j k o n s t r u k c ji z t w ie r d z e n ia 7 p r a c y H . R o s t a , Zeitschrift für Wahrscheinlich -
keitstheorie und verwandte G e b ie t e 5 8 ( 1 9 8 1 ) , 4 1 - 5 3 , je ś li w e ź m ie m y b = i t = 4 n + y/n\nn.
a = \
D o ś w ia d c z e n ie p o k a z u je , ż e o c z e k iw a n y c z a s o t r z y m a n i a dowolnej p r o s te j sie c i s o r t u ją c e j - n ie m u s i t o b y ć k o n ie c z n ie s o r to w a n ie b ą b e lk o w e - j e s t b a r d z o b lis k i 2n 2 . O s o b liw ie , R . P . S t a n l e y i S. W . F o m in u d o w o d n ili, że je ś li k o m p a r a t o r y [ ik' .i k+ 1] s ą w y b i e r a n e n ie je d n o s t a jn ie w t a k i s p o s ó b , ż e ik = j w y s t ę p u j e z p r a w d o p o d o b ie ń s t w e m j / Q ) , t o o d p o w ie d n i o c z e k iw a n y c z a s w y n o s i d o k ła d n ie (” )H^ny 42.
M u s i is t n ie ć ś c ie ż k a o d łu g o ś c i
f i g rz"| lu b w ię k s z e j z p e w n e g o w e jś c ia d o n a j
w ię k s z e g o w y j ś c i a ( r o z w a ż m y m n z t w i e r d z e n i a A ) ; je ś li n a t y m w e jś c iu p o d a m y oo, k o m p a r a t o r y n a t e j ś c ie ż c e z a c h o w u ją s ię w z g ó r y u s t a lo n y s p o s ó b , a c a ł a p o z o s t a ła s ie ć m u s i b y ć (n — l) - s o r t e r e m . [ I E E E Trans, on Comput ers C - 2 1 ( 1 9 7 2 ) , 6 1 2 - 6 1 3 ] . 45.
P o / p o z io m a c h d a n a X\ m o ż e z n a le ź ć s ię w c o n a j w y ż e j 2l r ó ż n y c h m ie js c a c h . P o
z a k o ń c z e n iu s c a l a n i a x\ m o ż e z n a jd o w a ć s ię w n + 1 r ó ż n y c h m ie js c a c h . 46.
[J. A l go ri t hms 3 ( 1 9 8 2 ) , 7 9 - 8 8 ; n a s t ę p u ją c y , a lt e r n a t y w n y d o w ó d p o c h o d z i o d
W . S. G r in b e r g a ] M o ż e m y z a ł o ż y ć , ż e 1 ^ m ^ n i ż e w k a ż d e j fa z ie j e s t w y k o n y w a n y c h
m p o r ó w n a ń . N ie c h l =
[ ( n — m)/2~\ i p r z y p u ś ć m y , ż e s c a la m y x\
^
xm
5.3.4
ODPOWIEDZI DO ĆWICZEŃ
723
z yi ^ ^ Vn- Przeciwnik może w następujący sposób wym usić |"lg(m + n)] faz. W fazie pierwszej pewne xj jest porównywane z elementem yk , gdzie albo k ^ Z, albo k ^ l + m. Przeciwnik decyduje, że Xj~\ < y\ i Xj +1 > y n ; a także, że Xj > y k , jeśli k ^ Z, oraz Xj < y k, jeśli & ^ Z + m. To, co pozostaje, to w zasadzie scalenie Xj albo z yk +1 ^ * ** ^ 2/n, albo z 2/i ^ ^ y k - 1 ; tak więc możliwych jest jeszcze co najmniej m in(n—fc+1, k) ^ m in(n—Z+l, Z+m) = |"(mH-n)/2] wyników. D latego niezbędnych jest jeszcze co najmniej [lg|~(ra + rc)/2]] = [lg(m 4- n)] — 1 dodatkow ych faz. 48. Niech u będzie najm niejszym elementem z (xot)j i niech y ^ będzie dowolnym wektorem z Dn takim , że (j/0^)* = 0 implikuje, iż (xa)k zawiera element ^ u, ( y ^ ^ k = 1 implikuje, iż ( xa)k zawiera element > u. Jeśli a = ¡3\p:q], m ożna znaleźć wektor y ^ spełniający te same warunki, ale z a zastąpionym przez (3 i takim , że y ^ \ p -’q] = y ^ . R ozpoczynając od ( y ^ ) i — 1, ( y ^ ) j = 0, dostajem y na koniec wektor y = y ^ spełniający żądane warunki. G. Baudet i D. Stevenson zauważyli, że łącząc wyniki ćwiczeń 37 i 48 dostaniem y prostą metodę sortowania, d ziałającą w (n \ n n ) / k + 0(n) cyklach porównań na k pro cesorach. Najpierw sortowanych jest k podciągów o rozmiarze ^ \ n j Af|, następnie scala się je w k przebiegach za pom ocą „scalania nieparzysto-parzystego z przestawieniam i” rzędu k. [IEEE Trans. C-27 (1978), 84-87]. 49. Zarówno ( x ^ y ) ^ z , ja k i x\^ ( y ^ z) reprezentują największe m elem enty multizbioru x & y \ S z; (x fay) z i x (y z) reprezentują najm niejsze m elementy. Jeśli x = y = z — {0 ,1}, to (a; ^ z) V (y h z ) = (x h y) V ix h z ) V (y b z ) = 0}> a^e Środkowymi elementami w { 0 ,0 ,0 ,1 ,1 ,1 } są {0 ,1}. Sieci sortujące dla trzech elementów i w ynik ćwiczenia 48 implikują, że środkowe elementy w x l±J y W z m ożna w yrazić albo jako ((æ V y) b z ) V (x b y)i a^ ° j ak ° ((# A y) ¥ z ) b (x V 2/)> alko za pom ocą dowolnej innej formuły otrzymanej przez przepermutowanie w tych wyrażeniach x , y, z. (W ydaje się, że nie istnieje żadna sym etryczna form ula dla środkowych elementów). 50. Z twierdzenia Z wynika, że jest to równoważne znalezieniu w szystkich tożsam ości spełnionych przez operacje
x V y — min(x+î/, 1),
x ^ y = max(0, x + y —1)
dla wymiernych wartości x y y z [0 .. 1]. [Jak zauw ażył J. M. Poilard, ta operacja polega na przelaniu tyle płynu, ile się da z naczynia, zapełnionego do x objętości, do naczynia zapełnionego do y objętości]. W szystkie takie tożsamości m ożna otrzym ać w system ie z czterema aksjom atam i i jedną regułą wnioskowania dla logiki wielowartościowej za proponowanej przez Łukasiewicza; zobacz Rose i Rosser, Trans. Amer. Math. Soc. 87 (1958), 1 - 5 3 . 5 1 . Niech oc = a[i:j\ i niech k będzie indeksem / i , j . Jeśli (xa)i ^ (xa)k dla wszystkich x, to (xa')i ^ (xa')k\ jeśli (xa)fc ^ (xoc)i i {xoć)k ^ (xa)j dla w szystkich x, to wówczas zachodzi to samo, gdy a zastąpim y przez c/; jeśli (xa)fe ^ (xa)i dla wszystkich x, to (xa')k ^ (xa')j. W ten sposób widzimy, że dla a' mam y co najm niej tyle samo znanych zależności co dla a , plus jedną więcej, jeśli kom parator [i:j\ nie jest redundantny. [Bell System Tech. J. 49 (1970), 1627-1644].
52. (a) Rozważam y sortowanie zer i jedynek; niech w = xq + xi + ■• • + x n • Sieć nie sortuje w tedy i tylko wtedy, gdy w ^ t i xo — 1 przed zakończeniem iV-sortowania. Jeśli w tym miejscu xo — 1, to 1 m usiała tam ju ż być na samym początku, a dla 1 ^ j ^ n musieliśmy mieć na początku albo X2 j - \ + 2 nk ~ 1 dla 0 ^ k ^ m, albo X2 j+2 nk = 1 dla 0 ^ k ^ m; dlatego w ^ 1 + (m + l ) n = t. Tak więc błąd w sortowaniu implikuje, że w — t i Xj = Xj+2nk dla 1 ^ k ^ m oraz X2 j — x 2 j - i dla 1 ^ j ^ n.
724
ODPOWIEDZI DO ĆWICZEŃ
5.3.4
Ponadto wyróżniona podsieć musi przekształcać takie dane wejściowe w taki sposób, że X2 m+2 n+j = 1 dla 1 ^ j ^ m. (b) N a przykład siecią specjalną dla ( yi V y 2 V £3 ) A (£2 V y$ V £4 ) A . . . mogłoby być [1 + 2 n : 2m n + 2n + 1] [3 + 2 n : 2m n + 2n + 1] [6 + 2 n : 2mn + 2n + 1]
[4 + 4 n : 2m n + 2n + 2] [5 + A n : 2m n + 2n + 2] [ 8 + 4 n : 2mn + 2n + 2] ..., gdzie X2 j - \ + 2 kn i X2 j+2 kn reprezentują y j i y j z fc-tej klauzuli, a X2m+2n+k reprezentuje samą klauzulę. 53. Pokolorujm y linie na czerwono i niebiesko zgodnie z następującym i zasadami: jeśli i mod 4 wynosi
wówczas linia i w przypadku (a) jest
a w przypadku (b) jest
0 1 2 3
czerwona niebieska niebieska czerwona
czerwona; czerwona; niebieska; niebieska.
Zauważm y teraz, że na pierwszych t — 1 poziomach sieć składa się z dwóch rozłącznych sieci, jednej dla 2 l ~1 czerwonych linii i drugiej dla 2t~1 niebieskich linii. K om paratory na poziomie t dopełniają tę sieć do sieci sortującej, podobnie ja k w scalaniu bitonicznym lub nieparzysto-parzystym . W ten sposób dostajem y żądany wynik dla k — 1. Podział czerwono-niebieski m ożna również wykorzystać do przypadku k — 2. Jeśli dane wejściowe są 4-uporządkowane, linie czerwone zaw ierają 2i~1 liczb, które są 2-uporządkowane, i to samo dotyczy linii niebieskich. Zatem po t — 1 poziomach mamy
x 0yoyix1x 2y 2 y 3 X3 . . . (przypadek (a))
lub
xoXiyoyix2x 3y2y 3 • • • (przypadek (b));
ostatecznie ciąg ( x 0A y o ) ( x o V y 0)(yi A x i ) ( y i V a ; i ) . . .
lub
x 0(xi Ay0){xi Vyo)(yiAx2)(yi V x 2) . . .
jest w oczyw isty sposób 2-uporządkowany. Teraz dla k ^ 2 możemy założyć, że k ^ t. Na pierwszych t — k + 2 pozio mach sieć dzieli się na 2k~2 rozłącznych sieci rozmiaru 2i-fc+2, z których każda jest 2-uporządkowana (przypadek k = 2); wynika stąd, że po t — k + 2 poziomach linie są 2fe-1-uporządkowane. Kolejne poziom y oczywiście zachowują 2fe~1-uporządkowanie, ponieważ m ają one własność „pionowej” okresowości rzędu 2fe-2. (W yobraźm y sobie — 00 na liniach —1, —2, . . . + 0 0 na liniach 2£, 2£ + 1, . . . ) . Bibliografia: Sieć (a) została zaproponowana przez M. Dowda, Y . Perlą, L. Rudolpha i M. Saksa, JA C M 36 (1989), 73 8 -7 5 7 ; sieć (b) przez E. R. Canfielda i S. G. W illiam sona, Linear and Multilinear Algebra 29 (1991), 4 3 - 5 1 . Jest interesujące, że w przypadku (a) mam y D not = Gt dla Gt zdefiniowanego w ćwiczeniu 32 [Dowd i inni, twierdzenie 17]; tak więc sam obraz Dn nie jest w ystarczający do scharakteryzowania zachowania się sieci okresowej.
54. Poniższa konstrukcja pochodząca od A jtai, Kom lósa i Szemerediego [FOCS 33 (1992), 686-692] pokazuje, w jaki sposób posortować m 3 elementów za pom ocą czterech poziom ów m odułów m 2-sortujących: M ożem y założyć, że wszystkie sortowane elementy są zerami i jedynkam i; ponum erujm y linie (a, 5, c) = am2 + bm + c dla 0 ^ a, 5, c < m. Pierw szy poziom sortuje linie {(a, 6, (b + k) mod m) \ 0 ^ a, b < m} dla 0 ^ k < m;
ODPOWIEDZI DO ĆW ICZEŃ
5.3.4
725
niech ak będzie liczbą jedynek w fc-tej grupie m 2 linii. Na drugim poziom ie są sortowane linie {(a, 6 , k) | 0 ^ a, b < m } dla 0 ^ k < m; liczba jedynek w fc-tej grupie wynosi wówczas m2 —i rrr
3=0
a stąd wynika, że bo ^ 6i + 1 , b\ ^ 62 + 1 , . . •, bra- 1 ^ &o + 1 * N a trzecim poziomie sortujem y {(&,«, b) \ 0 ^ a, b < m } dla 0 ^ k < m \ liczba jedynek w fc-tej grupie wynosi m—1 m—1 bi + k m + j i —0
m*
3—O
Jeśli 0 < Cfc+i < m 2, to cjt ^ ( " T 1) 1 CJ = 0 dla j < k. Podobnie, jeśli 0 < Ck < m 2, to Cjt+i ^ m 2 — (m2_1) i cj = 0 , dla j > k + 1. W konsekwencji sortowanie zakończy poziom czwarty, który sortuje linie m 2k — * *m 2& + (m2^1) — 1 dla 0 < k < m. W ynika stąd, że cztery poziom y m odułów m -sortujących posortują f ( m ) = [y/m J3 elementów, a 16 poziomów posortuje f { f ( m ) ) elementów. To kończy dowód, ponieważ / (/ (m )) > m 2 d la m > 24. (Ta konstrukcja nie jest „zwarta” , tak więc prawdopodobnie można sortować za pom ocą mniej niż 16 poziomów). •----- [Jeśli P(n) oznacza minimalną liczbę przełączników potrzeb— nych w sieci perm utacyjnej, to jest jasne, że P(n) ^ [lg n !]. — Rozszerzając nieco konstrukcję pochodzącą od L. J. Goldsteina i W . Leibholza, IEEE Trans. (1967), 6 3 7 -6 4 1, można pokazać, że P(n) ś P ( l» / 2 j) + P (r»/2 l) + n - l , stąd P(n) ^ B(n) dla każdego n, gdzie B(n) jest funkcją dla wstaw iania binarnego zdefiniowaną w 5.3.1-(3). M. W . Green udowodnił (nie publikując), że P (5 ) = 8]. 55.
I
r t 1
~
S.
EC-16
56. W rzeczywistości standardową sieć a x m ożna skonstruować indukcyjnie tak, żeby n~k~ 1 gdy x zawiera k zer. W przypadku bazow ym a io jest pusta. 0 fc_11 0 1 W przeciwnym razie m a zastosowanie co najm niej jeden z następujących przypad ków, gdzie y nie jest posortowany: (1) x = 7/0, a x = a y [n—l:n ] [ n —2: n —l] . . . [1:2]. (2) x — y l , a x — a y [l:n ][2 :n ]. . . (3) x = 0y, a x = a + [ l :n][l : n - l ] ...[ 1 :2 ] . (4) x — l y , otx = ety [1:2 ][2 :3 ]... [n—l:n ] . Sieć otrzym uje się z a przez zam ianę każdego kom paratora [i:j] na [i+ 1: j + l ] . [Zobacz M. J. Chung i B. Ravikum ar, Discrete Math. (1990), 1 - 9 ] . W tej konstrukcji zastosowano tylko ( 2 ) — 1 komparatorów; czy można to samo zrobić przy użyciu znacząco mniej komparatorów?
XOti =
81
14
5 7. [Zobacz H. Zhu i R. Sedgewick, STOC (1982), 296-302] Łatwo m ożna pokazać przez indukcję, że wzmiankowany czas opóźnienia spełnia podane nierówności. Jednak problem analizy rekurencji
A(m, n) = A( [m/2J, [n / 2] ) + A{\m/2], |n /2 j) + [m / 2] + [n / 2] - 1 , gdy A (0 ,n ) = A(m, 0) = 0, jest trudniejszy. W scalaniu bitonicznym wykonywanych jest B ( m , n ) ~ C !(m + n) porównań; zobacz ( 1 5 ). Dlatego możemy skorzystać z faktu, że {[m/2\ + [n/2], [m/2] + l_n./2j} = { |_(m + n)/2J, \(m + n )/ 2 ]} w celu pokazania, iż
B(m, n) = £ ( [ 771/ 2 ], \ n / 2]) + B ( \ m / 2], [n/2j) + |_(m + n )/2 j. Wówczas przez indukcję A (m , n) ^ B ( m , n ).
726
ODPOWIEDZI DO ĆW ICZEŃ
5.3.4
D ( m , n) = C ( m + 1, n + 1) + C (m , n) — C(m 4 1, n) — C ( m , n 4 1 ). Mamy D (m , 0) = 1 i D ( m ,n ) — 1 dla m 4 n nieparzystego. W przeciwnym razie parzyste, m n ^ 1 i mam y D (m , n) — £)(|_m/2j, [n/2\) — 1 . W konsekwencji 1 dla w szystkich m, n ^ 0 . Równanie rekurencyjne na A jest równoważne równaniu rekurencyjnemu na C z w yjątkiem , gdy zarówno m i n są nieparzyste. W tym przypadku przez indukcję dostajem y A ( m , n ) ^ C ( [ m /2 j, |"n/2 ]) 4 C(|"m/ 2 ], [n/ 2J) 4 |"m/2 ] 4 |"n/2 ] — 1 — C ( m , n ) 4 1 — D(|_m/2 _|, |_rfc/2 j ) ^ C (m ,n ). Niech Z = |4gmin(ra, u ) ] . N a poziomie k parzysto-nieparzystej rekursji, dla 0 ^ k < Z, wykonujem y 2k scaleń o poszczególnych rozmiarach (mjk, n j k) — ( |_(m 4 j) / 2 feJ, L(n 4 2k - 1 - j ) / 2 k\ ) dla 0 ^ j < 2k. K oszt rekursji, J2j(\m j k / 2] 4 \njk/ 2 ] - l), wynosi //c(m) 4 //c(n) — 2 fe; możemy napisać f k(p) — m ax(n/fc,n — n'k), gdzie n(k = 2 /cLn/2 fe+ 1 4 1 / 2 J jest wielokrotnością 2k najbliższą n / 2 . Ponieważ 0 ^ fk(n) — n/2 ^ 2k~1, całkow ity koszt rekursji na poziomach od 0 do Z — 1 leży między l( m 4 n)l — 2l a \ (m 4 n)l. N a koniec, jeśli m ^ n, to dla 2 * scaleń na poziomie Z mamy rriji — 0 dla 0 ^ j < 2l — m, oraz mji = 1 dla pozostałych m wartości j. Ponieważ A{ 1 , n) = n, całkow ity koszt poziomu Z wynosi L^/^J ^ k / m — ]22y ^' + n Niech D(0, n) = m + n jest D (m , n) ^
T ak więc w scalaniu parzysto-nieparzystym , w przeciwieństwie do scalania bitonicznego, wykonywanych jest 0 ( m 4 n) porównań więcej niż ich optym alna licz ba M (m , n). Tak naprawdę nasze rozważania pokazują, że A ( m ,n ) = Sfc=o(/fc(m ) 4 f k (n) — 2k) 4 gi(m 4 n) — £;(m ax(rn,n)), gdzie gi{n) m ożna wyrazić w postaci Z k Z l W ^ i = [n/2l\ { n - 2 l- \ \ n / 2 l\ + l ) ) . 58. Jeśli h[k 4 1] = h[k] 4 1 i plik nie jest uporządkowany, coś się z nim dzieje w następnym przebiegu; na podstawie ćwiczenia 5.2.2-1 zmniejsza się liczba inwersji, co gwarantuje, że w końcu plik zostanie posortowany. Jednak, jeśli h[k 4 1] ^ h[k] 4 2 dla 1 ^ k < m, to najm niejszy klucz nigdy nie zostanie przesunięty na właściwe miejsce, gdy początkow o znajduje się w R 2 . 59. Skorzystam y ze wskazówki i uwzględnimy, że K n + 1 = K n + 2 = ■• • = 1. Jeśli w kroku j zachodzi Kh[i]+j = * • • = Kh[m\+j = 1 i jeśli Ki = 0 dla pewnego i > h[l]+j, musi zachodzić i < h[m] 4 j, ponieważ mam y mniej niż n jedynek. Załóżmy, że k oraz i są minimalne, takie że h[k] 4 j < i < h[k 4 1] 4 j i Ki = 0. Niech s = h[k 4 1] 4 j —i\ m am y s < h[k 4 1] — h[k] ^ k. W kroku j — s, co najmniej k 4 1 zer musi znajdować się pod głowicam i, ponieważ ići = Kh[k+i]+j-s zostały w tym kroku ustawione na zero; s kroków później, m iędzy K ^ i \ +j i Ki włącznie, pozostaje co najmniej k 4 1 — s ^ 2 zer, co przeczy minimalności i. W drugim przebiegu kolejnych n — 1 elementów zostaje umieszczonych na swoim miejscu itd. Jeśli rozpoczynam y od pcrm utacji N N — 1 . . . 2 1, to pierwszy przebieg zmieni ją na 7V 4 l - n
N ~ n . . . 1 N + 2 - n . . . N - 1 N,
ponieważ Kh[i]+j > Kh[m]+j, kiedy tylko 1 ^ h[ 1 ] 4 j i h[m] 4 j ^ N; dlatego podane ograniczenie jest najlepszym z możliwych. 60. Przypuśćm y, że h[k 4 1] — s > h[k] i h[k] ^ s; najm niejszy klucz znajdzie się na koniec na pozycji Ri dla i > 1 , jeśli na początku znajduje się w R n- S. Dlatego warunek h[k 4 1 ] ^ 2 h[k\ jest warunkiem koniecznym; ten warunek jest także w ystarczający, co wynika z następującego twierdzenia dla przypadku t = 0 :
5.3.4
ODPOWIEDZI DO ĆW ICZEŃ
727
Jeśli n = N i jeśli K i ... K ^ jest permutacją zbioru {1, 2 , . . . , n}, to po wykonaniu pojedynczego przebiegu mamy Ki — i dla 1 ^ i ^ t 4 1 , jeśli h[k + 1] ^ h[k\ 4 h[k — i] + i dla 1 ^ k < m oraz 0 ^ i i. (Przyjm ujem y, że h[k] = k dla T w ie r d z e n ie .
Dowód. Indukcja ze względu na t; jeśli w kroku t klucz ¿ 4 1 nie znajduje się pod żadną głowicą, możemy założyć, że jest on na pozycji R h[k+i]+t^ s, dla pewnego s > 0 , gdzie h[k 4 1] — s < h[k\] stąd h[k — t\ + t — s > 0 . A le to jest niemożliwe, jeśli rozw ażym y krok t — s, w którym przypuszczalnie ¿ 4 1 powinno zostać umieszczone na pozycji /?h[fc+i]-K_s> chociaż co najm niej ¿ 4 1 dolnych głowic było aktyw nych.
|
(Omawiany warunek jest konieczny dla t = 0 ,1, ale nie dla t = 2 ).
61. Jeśli sortowane są liczby { 1 , . . . , 23}, twierdzenie z poprzedniego ćwiczenia mówi, że liczby { 1 , 2 ,3 ,4 } znajdą się na swoich docelowych pozycjach. G d y sortowane są zera i jedynki, łatwo można sprawdzić, iż nie jest możliwe w krokach —2 , — 1 i 0 , żeby pod wszystkim i głowicami b yły zera, podczas gdy w szystkie pozycje poza głowicam i zawierają jedynki; tak więc dowód z poprzedniego ćwiczenia m ożna rozszerzyć w celu pokazania, że { 5 ,6 ,7 } znajdą się na swoich docelowych pozycjach. Z uzasadnienia w ćwiczeniu 59 wynika, że { 8 , . . . , 23} muszą zostać posortowane. 63. G d y r ^ m — 2 , głowice p rzekształcają słowo 0i>l 1 01 3 0170 . . . 01 2r_ 1 01g na słowo 0P+1 1 1 01 30170 . . . O l 2 -iQ ^ 2r - i + q. ta k w -ęC m _ 2 przebiegów jest koniecznych. [Dla głowic znajdujących się na pozycjach 1, 2,3, 5 , . . . , 1 4 2 m_2, P ra tt pokazał podobny rezultat: Słowo 0pl a01 2 _ 10 1 2 + ~ 1 0 . . . 0 1 2 _ 1 0 1 g, dla 1 ^ a ^ 2 b_1, przechodzi na qp+i l a~^Ql^k —1 0 1 ^ + - 1 q _ _Q l2r “ 10 1 2T+9, stąd w najgorszym przypadku, dla takie go ciągu głowic, koniecznych jest co najm niej m — |~log2 m] — 1 przebiegów. O statni ciąg głowicowy jest szczególnie interesujący, ponieważ był podstaw ą niezwykle pom ysłowego urządzenia sortującego wynalezionego przez P. N. Arm stronga [zobacz U.S. Patent 3399383 (1965)]. P ra tt postaw ił hipotezę, że te ciągi wejściowe są rzeczyw iście najgorsze wśród wszystkich danych wejściowych]. 64. Podczas szybkiego sortowania każdy klucz K %,. . . , K n jest porównywany z K i; niech A = {i | Ki < K \ ] , B — {j | Kj > K\}. Następnie A i B są niezależnie szybko sortowane; zarówno w sortowaniu szybkim , ja k i w ograniczonym sortowaniu statycz nym nie są wykonywane porównania K i : K : dla i należącego do A i j należącego do 5 , a żadne inne porównania nie są pomijane w algorytm ie statycznym bez ograniczeń. W tym przypadku moglibyśm y ograniczyć nasz algorytm jeszcze bardziej, om ijając przypadki 1 i 2 tak, że do G są dodawane krawędzie tylko wtedy, kiedy porównania są wykonywane jawnie, nadal rozpatrując tylko ścieżki o długości 2 do badania redundan cji. Inny sposób rozwiązania tego problemu polega na rozpatrzeniu równoważnego algo rytm u sortowania przez wstawianie do drzewa z punktu 6 .2 .2 , w którym wykonywane są w tej samej kolejności, dokładnie te same porównania co w algorytm ie statycznym .
65. (a) Prawdopodobieństwo, że K ai jest porównywane z Kbi jest prawdopodobień stwem, że Ci innych wyszczególnionych kluczy nie znajduje się m iędzy K ai a Kby, to jest prawdopodobieństwo, że dwie liczby wybrane losowo z { 1 , 2 , . . . , C j4 2 } są kolejnymi liczbami, czyli
< W (T )(b) Pierwszym i n — 1 wartościam i c* są zera, następnie mam y (n — 2) jedynek, (n - 3) dwójek itd. Tak więc średnia wynosi 2 ]T£= 1(n — k) /(k 4 1) = 2 ^ £ _ 1 ((ri 4 1 ) / (k 4 1) — l) = 2(n 4 l){Hn+1 - 1) - 2n.
728
ODPOWIEDZI DO ĆW ICZEŃ
5.3.4
(c) Z „dwudzielnej” natury scalania wynika, że dla tego ciągu ograniczone sor towanie statyczne jest tym samym co sortowanie statyczne. Dla par z wierzchołkiem N wartościami c są odpowiednio 0 ,1 ,..., N —2\ zatem średnia liczba porównań jest dokładnie taka sama jak w sortowaniu szybkim. 6 6 . Nie; dla N = 5 żaden ciąg par o końcówce (1 , 5)(1, 2)(2,3)(3,4)(4, 5) nie wymaga więcej niż 10 porównań. [Oto interesujący problem badawczy: znajdź dla każdego N metodę (ograniczonego) sortowania statycznego, dla której najgorszy przypadek jest najlepszy z możliwych].
67.
(Gil Kalai zaanonsował nieformalnie dowód minimalności w przypadku ograniczo nego sortowania za pomocą metod odwołujących się do jego artykułu w Graphs and Combinatorics 1 (1985), 65-79; jednakże swojego dowodu nigdy nie opublikował). 6 8 . W każdej fazie każdemu elementowi może ubyć co najwyżej jedna inwersja, tak więc minimalna liczba przebiegów jest równa co najmniej maksymalnej liczbie inwer sji dowolnego elementu w permutacji wejściowej. W strategii sortowania bąbelkowe go ta granica zostaje osiągnięta, ponieważ każdy przebieg zmniejsza o jeden wartość wszystkich niezerowych liczników inwersji dla elementów wejściowych (zobacz ćwiczenie 5.2.2- 1 ). Dodatkowa faza może być potrzebna, żeby stwierdzić, czy sortowanie jest już zakończone, ale sformułowanie tego ćwiczenia pozwala nam uniknąć takich rozważań. Nie jest być może zbyt szczęśliwym faktem to, że pierwsze twierdzenie w bada niach nad złożonością obliczeniową za pomocą automatów dotyczyło „optymalności” metody sortowania, która z programistycznego punktu widzenia jest niewiele warta! Ta sytuacja jest analogiczna do historii generatorów liczb losowych, gdzie potrzeba było wielu kroków zanim generatory, które są „optymalne” z jednego szczególnego punktu widzenia, zostały zarekomendowane do ogólnego użytku. (Zobacz komentarz po 3.3.3- ( 3g)). Wypływa stąd wniosek, że wyniki dotyczące optymalności często istotnie zależą od zastosowanego abstrakcyjnego modelu; takie wyniki są całkiem interesujące, ale muszą zostać mądrze zastosowane w praktyce. [Demuth poszedł dalej i rozważał uogólnioną maszynę z r rejestrami (oszczędzając na czynniku r), jak i maszynę podobną do maszyny Turinga, w której kierunek przeglą dania ciągu wejściowego mógł oscylować między lewy-prawy a prawy-lewy. Zauważył, że w takim przypadku można wykonać sortowania przez proste wstawianie koktajlo we; jednak każda taka jednorejestrowa maszyna musi wykonać średnio co najmniej ~ ( N 2 — N) kroków, ponieważ w każdym kroku ogólna liczba inwersji zmniejsza się co najwyżej o 1. Na koniec rozważał także r-rejestrową maszynę o dostępie bezpośrednim do pamięci i pytanie o sortowanie za pomocą minimalnej liczby porównań. Ta część jego pracy została przedrukowana w IEEE Transactions C-34 (1985), 296-310].
5.4 1 . Fazę sortowania wewnętrznego można pominąć, ale byłoby to ogólnie dużo wolniej sze, ponieważ zwiększyłoby liczbę odczytów i zapisów danych z i do pamięci zewnętrz nej. 2 . Sekwensy zostają rozrzucone tak jak w (i), następnie na taśmie 3 pojawiają się Ri ... £ 2000000; £2000001 • • • £ 4000000; £4000001 • •*£ 5000000- Po przewinięciu wszystkich taśm, w wyniku „jednowejściowego scalania” na taśmach Ti i T2 dostajemy odpowied nio zawartości z T3 i 2 Następnie Ti i T2 są scalane na T3 i ponownie informacja jest kopiowana i scalana, łącznie w pięciu przebiegach. W ogólności, powyższa proce dura jest podobna do czterotaśmowego scalania zrównoważonego, ale z przebiegami T
ą
z
(
) ,
5.4.1
ODPOWIEDZI DO ĆW ICZEŃ
729
kopiowania między każdymi przebiegami scalania. Zatem tutaj liczba przebiegów jest dwa razy większa minus jeden przebieg. 3. (a) [logp S~\. (b) logB 5, gdzie B = y /P ( T — P) jest nazywane „rzeczywistą mocą scalania”. Dla T = 2P rzeczywistą mocą jest P; gdy T ~ 2P —1 rzeczywistą mocą jest \ / P ( P — 1) = P —f f P ' 1 + 0 (P -2 ), a to jest trochę mniej niż |T . 4. |T . Jeśli T jest nieparzyste, a P musi być liczbą całkowitą, obie wartości [T/2j i \T/2\ dają tę samą maksymalną wartość. Z ćwiczenia 3 wynika, że najlepiej mieć P ^ T —P, tak więc dla scalania zrównoważonego powinniśmy wziąć P — [T /2]. 5.4.1 ( 503 ( 503 .I l 908 1. 087 154 170 426 ć 426 l 4261 612
00 co 653 oo co
2. Ścieżka [061] - (512) - (087) - (053) - (061) zmieniłaby się na [612] - (612) - (512) - (¿54) ). (W istocie na takiej ścieżce jest wykonywane „sortowanie bąbelkowe”). 3. and fourscore our seven y ears/ ago brought fa th e rs fo rth on t h i s / a conceived continent in lib e r ty nation new the t o / and dedicated men p roposition th a t/ a l l are created equal. 4. (W tym przypadku zadanie jest trochę dwuznaczne; w tej interpretacji nie czyści my pamięci wewnętrznej aż do momentu, w którym zbiornik miałby się przepełnić). and fourscore on our seven th is y ears/ ago brought continent fa th e rs fo rth in lib e r ty nation new to / a and conceived dedicated men proposition th a t th e / a l l are created equal. 5. Fałsz; zupełne drzewo binarne z P węzłami zewnętrznymi definiuje się dla każdego P ^ l.
6 . Dodaj na początku kroku R6 instrukcję „jeśli T = L0C(X[0]), to przejdź do R2, w przeciwnym razie” i usuń podobną instrukcję z kroku R7. 7. Nic nie zapisuje na wyjściu, a wartością UMAX pozostaje 0. 8 . Jeśli jakikolwiek z pierwszych P rzeczywistych kluczy jest równy oo, odpowiada jący mu rekord zostałby zagubiony. Żeby uniknąć oo, można wykonać dwie prawie identyczne kopie programu; w pierwszej kopii pomijamy w kroku R4 sprawdzanie warunku z LASTKEY, a gdy w kroku R3 po raz pierwszy RQ ^ 0, wówczas przechodzimy do kopii drugiej. W kopii drugiej nie jest potrzebny krok R 1 i nigdy nie trzeba sprawdzać RQ w kroku R3. 9. Załóżmy dla przykładu, że bieżący sekwens jest sekwensem rosnącym, podczas gdy następny powinien być sekwensem malejącym. Wówczas algorytm R będzie działał właściwie, jeśli dokonamy tylko jednej zmiany: w kroku R6, jeśli RN(T) = RQ > RC, należy odwrócić porównanie KEY(L0SER(T)) z KEY(Q). Gdy wartość RC ulega zmianie, należy odpowiednio zmienić sposób porównywania kluczy w krokach R4 i R6. 10. Niech -j = L0C(X[j]). Z opisu algorytmu R wynika, że jeśli na początku wykonamy L0SER(*0) <— Q i RN(-0) <— RQ, to kiedykolwiek dochodzimy do kroku R3, spełnione są następujące warunki. Wartościami LOSER(O), . . . , L0SER(-(P —1)) są odpowied nio elementy permutacji {-0, -1, . . . , *(P —1)}; istnieje także permutacja wskaźników
730
ODPOWIEDZI DO ĆW ICZEŃ
5.4.1
(LOSER(-j) | RN( j) — 0}, k tó ra o d p o w ia d a rzeczy w istem u tu rn iejo w i. In n y m i sło wy? gdy R N (-j) je s t rów ne zero, w a rto ść KEY(LOSEROj)) je s t bez znaczenia; m ożem y p rz e p e rm u to w a ć ta k ic h „p o k o n an y ch ” . P o P k rokach w szystkie RN O j) b ę d ą różne od zera, a więc c a łe drzew o b ęd zie p o p ra w n ie zbudow ane. (O d p o w ie d z ią do w skazów ki je s t „ ta k ” ).
Puryści mogą narzekać, że w tym algorytmie są porównywane wartości KEY, które nie zostały zainicjowane. Jeśli to jest zbyt szokujące, wystarczy w kroku R1 ustawić wszystkie KEY na 0. 11. Prawda. (Oba klucze pochodzą z tego samego podciągu z dowodu twierdzenia K).
13.
Klucze pozostające w pamięci po sformowaniu pierwszego sekwensu są zazwyczaj mniejsze od średniej, ponieważ nie udało się ich umieścić w pierwszym sekwensie. Tak więc drugi sekwens może pomieścić więcej mniejszych kluczy.
14. Załóżmy, że śnieg przestaje nagle padać w chwili, gdy pług znajduje się w losowym punkcie u, 0 ^ u < 1 , po tym, jak osiągnął już stan równowagi. Wówczas przedostatni sekwens zawiera (1 + 2u —u2)P rekordów, a ostatni sekwens zawiera u2P rekordów. Cał kując po du, dostajemy, że średnio w przedostatnim sekwensie jest (2 —| ) P rekordów, natomiast w ostatnim jest średnio | P rekordów. 15.
Fałsz; ostatni sekwens może być dowolnie długi, ale tylko w stosunkowo rzadkim przypadku, w którym wszystkie rekordy w pamięci należą do tego samego sekwensu, gdy dane wejściowe zostają wyczerpane.
16. Wtedy i tylko wtedy, gdy zawiera on mniej niż P inwersji. (Zobacz punkty 5.1.1, 5.4.8). Gdy N ^ P, P n ~ pP \/N \ dla N ^ P, poszukiwane prawdopodobieństwo wynosi 1 , co otrzymamy rozważywszy wektory inwersji. (W codziennej praktyce jednoprzebiegowe sortowanie nie jest wcale takie niezwykłe, ponieważ ludzie są skłonni sortować pliki nawet wtedy, kiedy podejrzewają, że są już uporządkowane - tak na wszelki wypadek). 17.
Dokładnie \ N / P } sekwensów, z których wszystkie, z wyjątkiem ostatniego, mają długość P („przypadek pesymistyczny”). 18. Nie będzie żadnych zmian, ponieważ można pokazać, że k-ty rekord w sekwensie jest mniejszy od co najmniej P + 1 — k rekordów z sekwensu go poprzedzającego dla 1 ^ k ^ P. (Wydaje się jednak, że trudno scharakteryzować wynik zastosowa nia P^wejściowego wyboru z podmianą do pliku powstałego w wyniku wykonania P-wejściowego wyboru z podmianą, gdy P ' > P).
19.
Uzasadnij podobnie jak przy wyprowadzeniu ( 2 ), że h(x, t) dx = K L d t , gdzie tym razem h(x,t) —I + K t dla każdego x, a P = L /. Wynika stąd, że x(t) ~ L \ n ( ( I + K t)/I ), więc dla x(T) = L mamy K T = ( e ~ l ) I . Ilość śniegu, który spadł od ¿ = 0, wynosi zatem (e —1)LI = (e —1)P. 20. Podobnie jak w ćwiczeniu 19 mamy (I + K t ) d x — K(L — x) dt\ stąd x(t) — L K t / ( I + K t ). Ilość śniegu w zbiorniku wynosi LI = P = P f = J ^ x ( t ) K d t = L ( K T —/ln ((7 + K T )/ I)); stąd K T = a /, gdzie a 2.14619 jest pierwiastkiem z 1 + a = ea_1. Poszukiwana długość sekwensu jest równa opadowi śniegu w czasie 0 ^ t ^ T, czyli L K T = aP.
21.
Postępujemy tak, jak opisano w głównym tekście, ale po sformowaniu każdego sekwensu wstrzymujemy pług do chwili, gdy spadnie P — P' nowego śniegu, a na stępnie uruchamiamy go ponownie. To oznacza, że wartością h(x(t),t) jest teraz KT\ (zamiast KT), gdzie Ti — T jest czasem dodatkowego opadu śniegu. Poszukiwana długość sekwensu wynosi LKTi, x(t) = L( 1 —e_i//Tl), P = LKTie~T^Tl, a P f —
5.4.1
ODPOWIEDZI DO ĆW ICZEŃ
731
J ^ x ( t ) K dt = P 4 - L K ( T — T i). Innymi słowy, sekwensy o długości e°P otrzym uje się, gdy P ' = (1 - ( 1 - 0)e6)P dla 0 ^ 0 ^ 1. t ^ (k — 1 )T mam y dx • h = K dt (x(t + T) — x (i)), natom iast dla (k — 1 )T ^ t ^ T jest dx * h = K d t ( L — x(t)), gdzie h jest stale równe K T w miejscu położenia pługu. W ynika stąd, że dla 0 ^ j ^ fc, 0 ^ u ^ l i i = (k — j ~ u ) T mamy x(t) = L ( l — eu~eF j( u ) / P (« )). Poszukiwana długość sekwensu wynosi L K T , co 2 2 . D la 0 ^
jest równe wielkości opadu śniegu m iędzy chwilami, w których kolejne pługi opuszcza ją punkt 0 w stanie równowagi; P jest ilością śniegu zgarnianego przez każdy pług w ostatniej „niesamowicie szybkiej” fazie, czyli K T ( L — x ( kT)) = L K T e ~ e/ F ( k ). M ożna pokazać, że P' — f * T x ( t ) K dt ma poszukiwaną postać. Uwagi: Okazuje się, że podane w zory są także prawdziwe dla k = 0. G d y k ^ 1 , liczba elementów na sekwens, które w padają do zbiornika dwukrotnie , wynosi P /f =
x ( t ) K dt] łatwo pokazać, że (długość sekwensu) — P f + P " = (e — 1 )P , co zauważyli Frazer i Wong. C zy jest przypadkiem , że funkcja tw orząca dla Fk(0) jest podobna do funkcji tworzącej z ćwiczenia 5 .1.3 -11? 23. Niech P = p P f i q — 1 — p. W pierwszych Ti jednostkach czasu śnieg „pada” ze zbiornika zawierającego q P f elementów, z którego początkowo usunięto w losowej kolejności p P ’ elementów; gdy stary zbiornik zostaje opróżniony, śnieg ponownie za czyna jednostajnie padać. Bierzem y Ti takie, że L K T \ — q P f. D la 0 ^ t ^ Ti mamy h(x,t) = (p + qt/Ti)g(x), gdzie g(x) jest wysokością śniegu umieszczanego w zbiorniku z pozycji x ; dla T i ^ t ^ T je s t h ( x f t) = g{x)-\-{t~~T\)K. D la 0 ^ t ^ Ti funkcja g(x(t)) wynosi (q(Ti — t)/T\)g{x(t)) 4 - (T —T\)K\ a dla T i ^ t ^ T m amy g(x(t)) — (T — t)K. Stąd h(x(¿), t) — (T — T i) iG d la 0 ^ t ^ T oraz x(t) — L{ 1 — e x p (—t / ( T — T i))). Całkow ita długość sekwensu wynosi L K { T —T i); ogólna liczba „odzysków” ze zbiornika (zobacz ćwiczenie 22) wynosi L K T \ \ natom iast łączna ilość zgarniętego śniegu po czasie T wynosi P = K T ( L - x (T )). Tak więc przy założeniach z tego ćwiczenia i przy przyjęciu rozm iarów zbiornika ( l + (s — l) e 5/ s )P , dostajem y sekwensy o długości (es/ s ) P . To jest znacząco gorzej od wyników z ćwiczenia 22. Jednakże w ćwiczeniu 22 elementy w zbiornikach są w ykorzy stywane w dużo lepszej kolejności. (Fakt, że h(x(t), t) jest stała w tak wielu z tych problemów, nie jest zadziw iający, ponieważ jest to równoważne powiedzeniu, że rozkład elementów każdego sekwensu otrzym ywanego podczas stanu równowagi jest jednostajny).
24. (a) W zasadzie możemy przeprowadzić ten sam dowód; w każdym z podciągów znajdują się sekwensy o takim samym kierunku uporządkowania ja k sekwensy w yjścio we. (b) W spom niane prawdopodobieństwo jest prawdopodobieństwem tego, że sekwens, o którym mowa, m a długość n -t-1 , a następnym elementem po nim jest y; wynosi ono (1 —x ) n/n!, gdy x > y, oraz ( 1 —x ) n/n! — (y—x ) n/n\, gdy x ^ y. (c) Indukcja. D la p rzykła du, jeśli n-ty sekwens jest sekwensem rosnącym, to sekwens (n — l)-szy b ył sekwensem malejącym z prawdopodobieństwem p, tak więc możemy zastosować pierwszą całkę, (d) Widzimy, że f f(x) = f ( x ) —c—p f ( l —x ) —qf(x)> a wówczas f /f(x) = —2pc, co ostatecznie daje f( x ) = c ( l — qx — p x 2), c = 6/(3 + p). (e) Jeśli p > eg, to funkcja pex + qe1~x jest funkcją monotonicznie rosnącą dla 0 ^ x ^ 1 ; Jq \pcx + qel ~x — e ^ l d x
=
(p — g)(e 1//2 — l ) 2 < 0.43. Jeśli q ^ p < eg, to pex + qe1~x leży m iędzy 2yjpqe a p + ge, ta k ż e /o |pex + ge1~x — | ( p + g e + 2\/pge)| dx ^ ^(y/p —y/o^)2 < 0.4; d la p < g możem y przeprowadzić rozumowanie sym etryczne. Zatem dla w szystkich p i g istnieje sta ła C ta ka, że £ |pex + qex~x ~ C\ dx < 0.43. Niech Sn (x) = f n (x) —f (x ). W ówczas Sn+i(y) —
732
ODPOWIEDZI DO ĆW ICZEŃ
5.4.1
ey 1)J^(p ex + q e 1 x - C)ó n (x) dx + p y ey 1+Xón (x) dx + q ey X5n (x)dxstąd wynika, że jeśli Sn (y) ^ a n, to \Sn+i(y)\ ^ (1 — ey~1) • 1.43o;n < 0.91a:n. (f) Dla każdego n ^ 0 , ( 1 — x ) n/n\ jest prawdopodobieństwem tego, że długość sekwensu jest większa od n. (g) fo(pex + qe1~x) f( x ) dx — 6/(3 + p). (1 -
i
i U
__ i
26. (a) Rozważ, ile jest perm utacji o n + r + 1 elementach i n lewostronnych minimach, w których skrajnie prawy element nie jest elementem najm niejszym , (b) Skorzystaj z faktu, że r k i n k = n —r — 1 . co wynika z definicji liczb Stirlinga w dodatku B. (c) Żeby dostać X^n>otnnr i/(n "*"r “ ^)’ ’ dodaj r + 1 do średniej i skorzystaj z faktu, że
+ r )/(n + r + !)■ — 1 *
W zór w (b) pochodzi od P. Appella, Archiv der Math, und Physik 65 (1880), 171 - 1 7 5 . Przypadkiem [[” ]] = ( r + k)\ [xkz r] ex^ z\ gdzie f ( z ) = z /2 + z 2/ 3 + • ■• = —z - 1 ln (1 — z) — 1; stąd cr = [zr ] ( r + 1 + f ( z ) ) e ^ z\ Liczba nieporządków n-elementow ych o k cyklach, czasam i oznaczanych przez [” ] , wynosi [[n/ fc]]; zobacz J. Riordan,
An Introduction to Combinatorial Analysis (Wiley, 1958), §4.4. 27. G d y P ' ¡ P — 2{e~9 — 1 + 0)/{l — 20 + O2 + 26e~9) dla 0 ^ 9 ^ 1 , wówczas sekwens formowany w stanie równowagi będzie m iał długość 2P / (1 — 20 + O2 + 29e~e). [Zobacz Information Processing Letters 21 (1985), 239-243]. D obosiewicz zauw ażył także, że mechanizm w yboru z podm ianą można stosować jeszcze dłużej, ponieważ elem enty m ożna wprowadzać z początku zbiornika-kolejki, a elementy wyprowadzane m ożna umieszczać na jej końcu. Na przykład, jeśli P' = 0.5P i wykonujem y w ybór z podm ianą aż do momentu, w którym bieżący sekwens zawiera 0.209P rekordów, to przy tej modyfikacji średnia długość sekwensu w zrasta z około 2 .55 P do około 2 .6 1P . Jeśli P' = P i kontynuujemy wybór z podm ianą aż do chwili, gdy tylko 0 .314P rekordów znajduje się w bieżącym sekwensie, to średnia długość sekwensu w zrasta z e P do około 3.034P. [Zobacz Comp. J. 27 (1984), 334-339, gdzie przedstawiono jeszcze efektywniejszą m etodę zwaną „scalaniem z podm ianą” ]. 28. W scalaniu z podm ianą m am y stosunkowo mniejszy problem, ponieważ P nie zmienia się, a rekordy w każdym pliku są przetwarzane sekwencyjnie. Jednak podczas początkow ego formowania sekwensów chcielibyśmy zmieniać liczbę rekordów w pamięci w zależności od ich długości. M oglibyśm y trzym ać na stercie tyle rekordów, ile się da, w ykorzystując dynam iczną alokację pamięci opisaną w podrozdziale 2.5. M. A . Goetz [Proc. AFIPS Joint Computer Conf. 25 (1964), 602-604] zaproponował inne rozwią zanie: rozbijanie każdego rekordu na części o ustalonym rozmiarze i „wiązanie” ich razem w listy. W szystkie zajm ują miejsce w liściach drzewa turniejowego, ale tylko część czołow a bierze udział w turnieju.
29. N ajw yższe 2h węzłów zostaje przypisanych do odpowiadających im węzłów-gospodarzy. Pozostałe w ęzły tw orzą 2k poddrzew, po 2n — 1 węzłów w każdym z nich. Przypisujem y je do węzłów-gospodarzy w porządku sym etrycznym - skrajnie lewe drzewo do skrajnie lewego węzła-gospodarza itd. [Zobacz K . Efe i N. Eleser, A cta Informatica 34 (1997), 429-447]. 30. Przypuśćm y, że wśród t węzłów-gospodarzy znajdują się w ęzły spójnego 2n-węzłowego podgrafu 2n+fe-węzłowego zupełnego drzewa przegranych. Takie drzewo ma jeden węzeł na poziomie 0 i 2l~1 węzłów na poziomie l dla 1 ^ ^ n-\-k. Poddrzewo o korzeniu z poziomu l ^ 1 m a 2n+k+1~l — 1 węzłów; dlatego korzenie t rozłącznych poddrzew
ODPOWIEDZI DO ĆW ICZEŃ
5.4.2
733
2n-węzłowych muszą w szystkie leżeć na poziom ach ^ k . Dodatkowo każde z tych drzew musi zawierać co najmniej jeden węzeł na poziomie k , ponieważ na poziom ach < k znajduje się tylko 2k~l < 2n węzłów. W ynika stąd, że t 2k~1. Z drugiej strony liczba krawędzi w grafie-gospodarzu wynosi co najm niej t + 2(2fc — i) — 1. To ostatnie wynika z (ii) i (iii), ponieważ istnieje co najm niej tyle węzłów, których rodzic został przypisany do innego węzła w grafie-gospodarzu. [Założenie n ^ k jest konieczne: dla n = k — 1 istnieje stosowny graf-gospodarz o 2k + 2k~l — 2 krawędziach].
5.4.2 1.
1 6 10
13 18 20
24 29
2
3
7 11
14 19
8 12
15
21
22
25 30
26 31
4 9 16 23 27 32
_5 II
28 33
2 . Po pierwszej fazie scalania wszystkie pozostające domyślne sekwensy znajd ują się na taśmie T i jest ich co najw yżej an — a n- i ^ Un-i- I tego powodu w szystkie znikają w drugiej fazie scalania.
3. M am y (D[ 1 ] , D[2] , . . . ,D [T ]) = (an —a n_ p ,a n —a n_ p + i,. . . , a n —a n), ta k więc za chodzenie podanego warunku wynika z faktu, że ciąg a jest niemalejący. Ten warunek jest ważny dla poprawności algorytm u, ponieważ w krokach D2 i D3 wartość D [ j + 1] nie maleje więcej niż o D [ j ] .
4. (1 — z — • ■• —z 5)a(z) — 1 na podstawie (3 ), natom iast t(z) — J2n>i(an + + cn + dn + en) z n = (z H + z 5)a(z) + (z H b z 4)a(z) -I 4- za(z) = (5z + 4z 2 + 3z3 + 2z4 + z5)a(z). 5. Niech gP(z) — (z —l ) f p(z) = zp+1 —2zp + l i niech hp(z) — zp+1 — 2 zp. Twierdzenie Rouchégo [J. Ecole Polytechnique 2 1 ,3 7 (1858), 1-34] mówi nam, że hp(z) i gP(z) m ają tyle samo pierwiastków wewnątrz koła \z\ — 1 + e, pod warunkiem, że na brzegu \hp(z)\ > \hp(z) - gP(z)\ — 1. Jeśli ^ _1 > e > 0, to \hp(z)\ ^ (1 + e)p( l — e) > (1 + ~1)2(l ~ (¡)~1) = 1. Stąd gp ma p pierwiastków o module ^ 1 . To są różne pierwiastki, ponieważ gcd (gp(z),gp(z)) — g cd {gP{z) ,(p + 1 )z ~ 2p) = 1 . [A M M 6 7 (1960), 745-752],
—ap(a~l )/q'( a~1). W ówczas p(z)/q(z) — C o / ( l — a z) jest funkcją analityczną w obszarze \z\ ^ R dla pewnego R > \oi\~1; stąd [zn]p{z)/q{z) — Coctn + 0 ( R ~ n). Tak więc l n 5 = n l n a + ln c 0 + 0 ( ( a i? ) _n). Z n = (ln S / \ n a ) + 0 (1 ) wynika, że 0 ( ( a R ) - n ) = 0 ( S ~ e). Podobnie niech c\ = a 2p(a~1) / qf ( o - 1 ) 2 oraz C2 = ~ a p ' (o - 1 ) /q ( a - 1 ) 2 + ap{a~lqn(a~x)/ q1{a~lY ; rozważm y p(z) /q(z)2 —Ci/(1 —a z ) 2 — c2/( 1 - az). 6 . Niech co =
734
ODPOWIEDZI DO ĆW ICZEŃ
5.4.2
7. Niech a p = 2x,& z = — 1 / 2 P+1. Wówczas x p+1 — xp + z i z 1 . 2 .6 - ( 2 5 ) otrzymujemy, że szereg a p = 2 Y k ^ o ~ ^p) = 2 — 2 _p - p2 ~ 2p~~1 + 0 (p22 “ 3p) jest zbieżny.
Uwaga: W ynika stąd, że wartością p z ćwiczenia
6 jest w przybliżeniu log 4 5 , gdy
p jest dostatecznie duże. Podobnie w obu tabelach 5 i
6 współczynnik
c zbiega do
l / ( ( 0 + 2 ) ln<£) przy dużej liczbie taśm. = 0 dla m < 0. Rozw ażając różne możliwości w yboru pierwszego składnika, otrzymujemy, że N H h , gdy ra > 0. Stąd [Lehrbuch der Combinatońk (Leipzig: Teubner, 1901), 136-137]. 8 . Łatwo m ożna zobaczyć, że
N qP^ = 1 i
9. Rozw ażm y pozycję skrajnie lewego 0, jeśli takie jest; widzimy, że Km' = F ^ l .
Uwaga: Istnieje prosta wzajem nie jednoznaczna odpowiedniość między takimi cią gami 0 i 1 a reprezentacjam i liczby m + 1 , o których była mowa w ćwiczeniu 8 : należy umieścić 0 na prawym końcu ciągu i rozpatrzyć wszystkie pozycje 0 .
10. Lemat: Jeśli n — F ^ H ----- 1~ F ^ jest taką reprezentacją i jeśli j\ > • ■■> j m ^ P, to n < . Dowód: D la m < p lem at jest oczywisty. W przeciwnym razie niech k będzie minimalne, takie że jk > jk+i + 1- M am y k < p i przez indukcję F-p] JfC 1 + • • • + F.-JTYl < F ^ . Stąd n < F j f + ... + F«>_k l ^ F ^ +1. Teraz m ożna ju ż przeprowadzić w łaściw y dowód przez indukcję względem n. Dla
n > 0 niech j będzie m aksymalne, takie że F ^ ^ n. Z lem atu wynika, że każda reprezentacja n musi składać się z F ^ i dodanej reprezentacji n — F j p\ Z założenia indukcyjnego n — F f p^ ma jednoznaczną reprezentację o wymaganej postaci i ponieważ j jest m aksym alne, to ta reprezentacja nie zawiera żadnej z liczb F j p\ , . . . , F ^ p+1. Uwagi: Przypadek p =
2 został zbadany przez E. Zeckendorfa [Simon
Stevin 29
(1952), 190-195] i b ył ju ż rozważany w ćwiczeniu 1.2.8-34. Istnieje prosty algorytm przejścia od reprezentacji dla n do reprezentacji dla n- h i, d ziałający na ciągu Cj . . . c ic 0 zer i jedynek takim , że n = Y cjFj+Pi dla przykładu, jeśli p = 3, to patrzym y na skraj nie prawe cyfry i zam ieniam y . . . 0 na . . . 1 , . . . 0 1 na . . . 1 0 , . . . 0 1 1 na . . . 1 0 0 ; następnie, jeśli jest to konieczne, wykonujem y „przeniesienie” w lewo, zastępując . . . 0 1 1 1 . . . przez . . . 1 0 0 0 .... (Przyjrzyj się ciągom zer i jedynek z ćwiczenia 9 w podanej kolejności). Podobny system liczbow y badał W . C. Lynch [Fibonacci Quarterly 8 (1970), 6-22], który odkrył bardzo interesujący sposób w ykorzystania takiego systemu do organizacji zarówno fazy rozrzucania, ja k i scalania w sortowaniu wielofazowym. 1 2 . Kolejne wiersze k-tej potęgi podanej m acierzy zaw ierają doskonałe rozkłady dla poziom ów od k — 4 do /e, z najw iększym i elementami po prawej stronie.
13. Indukcja względem poziomu. 14. (a) n ( l) = 1, zatem załóżm y, że k > 1. Z równania Tnk = T^n-i)(k-i) + ■* ■+ T( n - P)(k-i) wynika, że Tnk ^ T (n+i )fe w tedy i tylko wtedy, gdy T (n_P)(fc- 1 ) ^ Tn{k-i)Niech r będzie dowolną dodatnią liczbą całkow itą i niech n / będzie minimalne, takie że T(n/_r)(fc_i) > wówczas dla każdego n ^ n f m amy T(n_r.)(fc- i) ^ ponieważ ta zależność jest tryw ialn a dla n ^ n( k — 1 ) + r, natom iast w przeciw nym przypadku !(„_,.)(*_!) ^ ^ Tn/(*_i) ^ Tn(fc_i). (b) Takie samo uzasadnienie, ale z r == n — n ', pokazuje, że dla każdego j 0 warunek T n >k r < Tnk> im plikuje ^ T{n_j)k>, a stąd T{nf- j )k ^ T{n- j)k dla każdych j ^ 0 i k ^ kf. (c) Niech £(S) będzie najm niejszym takim n, dla którego E n(S) przyjm uje najm niejszą wartość. Żądany ciąg M n istnieje w tedy i tylko wtedy, gdy dla każdego S zachodzi
5.4.2
ODPOWIEDZI DO ĆW ICZEŃ
£(S) ^ £(S 4 - 1). Załóżmy, że n = £(S) > £(S +
735
n\ co daje E n (5) < E n/(5) oraz £ n (S 4- 1) ^ E n'( 5 + 1). Nie istnieje najm niejsze S f takie, że £ n (5 ') < £ ^ ( 5 ') , i mamy m = £ n (5 ') - £ n (5 ' - 1 ) < £ n/( 5 ') - £ n, (5 ' - 1 ) = m '. W ówczas Tn'k < s ' < E r =1 Tii/cj zatem istnieje pe^vne k ^ tm takie, ze ^ ’i.'nkf * Podobnie zachodzi l = £ „ (S + 1 ) —£ „(S ) > E n/ ( 5 + l ) - E n/(5) = J'; stąd £ * '=1 ^ 5 + 1 > £ l ' =1Tnfe. Ponieważ V ^ m ! > m, zatem istnieje k > m takie, że Tn^ > Tn*, ale to jest sprzeczne 1) =
z (b).
15.
To twierdzenie udowodnił D. A. Zave, którego pracę cytow aliśm y w głównym tekście.
16.
D. A. Zave pokazał, że liczba w czytyw anych (i zapisywanych) rekordów wynosi S l o g ^ 5 + \ S l o g r .! łog T _ 1 5 + 0 ( 5 ) .
17.
Niech T = 3; A u ( x ) — 6x6 4 - 35x 7 + 56x8 4-----, B\\( x) — x 6 + 15 x 7 + S5x8 4-------, T n ( x) = 7 x 6 + 50a:7 + 9 1x 8+64a:9 + 19a:lo + 2a:11. W optym alnym rozkładzie dla 5 = 144 na taśmie T2 musi znaleźć się 55 sekwensów, a to wym usza nieoptym alny rozkład dla 5 = 145. D. A. Zave badał prawie optym alne algorytm y tej postaci.
18.
Niech 5 = 9, T — 3 i rozważm y następujące schematy. O ptym alny wielofazowy: Tl
T2
T3
02 1 6
02 1 3
_
l3
—
0 22 3
—
1 23 ł
32 31
31
—
91
-
A lternatyw ny: Tl
T2
T3
OH 6
O1 ! 3
—
6
i3
—
0123
6
22
5
—
21
—
6
31
7 3
61
6
-
32 31
—
61
6
—
9
91
—
—
K oszt
i
^ 2
32
K oszt
9 31
(Jeszcze inny sposób polepszenia „optym alnego” algorytm u wielofazowego polega na ponownym rozważeniu, gdzie po każdej fazie powinny na taśm ie wyjściowej znaleźć się domyślne sekwensy. D la przykładu w ynik scalania 02 1 3 z 02 1 3 m ożna by potrakto wać jako 2 1 01 2 1 01 2 1 zam iast 02 23. Jak widać, wiele pytań dotyczących optym alności pozostaje ciągle bez odpowiedzi).
19. Poziom
T1
T2
T3
T4
0
1
0
0
0
1
Łącznie
1
0
1
1
1
2
1
1
1
0
3 4 5
1
2
1
1
2
2
2
1
3 3 5 7
2
4 5
3 4
2
11
2
8
6
4
15 23
d-rt
tn
6
7
4 5
n
5n
n 4- 1
cn +a 'Ti
Cn 4" fln
tn 4~2un
O stateczny w ynik Tl T6 T5 T4 T3 T2 Tl T6 T (k) T (fc -l)
20. a(z) = 1 / ( 1 - z 2 -- z 3 - z 4), t(z) = (3z 4~ 3z2 4~ 2^3 4~ z 4)/( 1 - z 2 - ^ E n ^ l Tn (x)z n = x(3z + 3z 2 4 - 2z3 4 - z 4) /( 1 - x(z 2 4- z 3 4- 24)). D n — A n - 1 C n = A n~ i A n--2 + 1 , B n — A rŁ_ 1 A n —2 A n - _3 + 1, An = A n_ 2 A n- 3 A n.- 4 + 1-
21. 22.
5.4.2
ODPOWIEDZI DO ĆW ICZEŃ
736
333343333332322 3333433333323 33334333333 3333433 333323 T 5
tn —tn- i —tn - 2 ~ — H -3 [n m o d 3 = 1]. (To równanie jest podobne do równania na liczby Fibonacciego i wynika z faktu, ze l —z 2—2z3—z 4 = (1—4>z)(1 —Ę>z)(1—wz)(1—lJz), gdzie u; 3 = 1 ).
23.
Zam iast ( 2 5 ) mamy, że długości sekwensów w pierwszej połowie n-tej fazy są równe s n , natom iast w drugiej połowie są równe t n, gdzie Sn = t n —2 T t n —3 “b Sn
3 4“ Sn —4,
tn —
t n —2
Sn —2 “ł" Sn —3 H- Sn —4*
T u taj przyjmujemy, że sn = tn = 1 dla n ^ 0. [W ogólności, jeśli vn+i jest sumą pierwszych 2 r składników z + ■■■+ un- p , to sn = tn “ tn - 2 + ■■ ■+ tn -r + 2 tn—r —i + t n - r - 2 + * • • + tn~p\ jeśli i>n+i jest sumą pierwszych 2 r — 1 składników, to tn
—2 + • ■• + t n —r —1 “¡“ Sn —r —1 T * * ' “h Sn —P ,
Z am iast
( 27 ) i ( 28 ) m a m y
. . . , D n — (U n - i V n - l ) +
(Vn-- 2 U n —3 V n - 3
An
l8
—
l 12 l8
l4
R
-
24
R
R 16° 161 R
s1^ 1 R 161 161
81
8°
81
-
8°
R 24°
161
161
16°
16°
R 321
tn
— t n —2 H” ' ' *~ł” t n —r “I- S n - r “h ' ’ 1
( b rn - l F n - l L rn -
2T
n^
2 b rn - 3^
lj Vn + \ “
3b rn - 4V
Sn —p ] ■
n - 4) +
1,
(U n - i V n - l U n -2 ) +
1,
n -
1
l8
00
l 16
-
=
1 , E n — ( ? 7 n —2V n —2t 7 n —3 ) +
Un-4 V n -4) +
to
t—‘
Sn =
24°32° (R)
26.
D la S = 2n podczas scalania jest przetwarzanych n • 2 n początkow ych sekwensów; w każdej połówce jednej fazy (z kilkom a w yjątkam i) jest scalanych 2 n_2, a przewijanych 2 n “ 1 sekwensów. D la S = 2 n + 2 n_ 1 podczas scalania jest przetwarzanych n * 2 n + (n — 1 ) * 2 n_ 1 początkow ych sekwensów; w każdej połówce fazy (z kilkoma wyjątkam i) jest scalanych 2 n “ 2 lub 2n~1 sekwensów, a przewijanych 2 n_1 + 2 n_2 sekwensów.
27.
To pracuje w tedy i tylko wtedy, gdy najw iększy wspólny dzielnik liczb sekwen sów na taśm ach jest równy 1. D la przykładu rozważmy sześć taśm; jeśli wstępnym rozkładem sekwensów na taśm ach od T l do T 5 jest (a, b, c, d, e), gdzie a ^ b ^ c ^ d ^ e > 0 , to po pierwszej fazie dostajem y rozkład (a —e, b—e, c—e, d—e, e) i g c d (a —e, b—e, c —e, d —e, e) ~ g c d (a , 6 , c, d, e), ponieważ każdy wspólny dzielnik liczb w pierw szym zbiorze jest wspólnym dzielnikiem liczb w drugim zbiorze. W tym procesie w każdej fazie liczba sekwensów zm niejsza się aż do momentu, w którym gcd(a, 6 , c, d, e) sekwensów znajdzie się na jednej taśmie. [B. Sackm an zauw ażył około 1963 roku, że rozkłady „niewielofazowe” okazują się czasam i lepsze dla algorytm u wielofazowego przy pewnych rozmieszczeniach domyśl nych sekwensów, co pokazujem y w ćwiczeniu 18].
28.
K a żd y taki rozkład (a, b, c, d, e) dostajemy, biorąc (1,0 ,0 ,0 ,0 ) i wykonując nastę pującą operację dokładnie n razy: wybierz x z {a, b,c, d, e}, a następnie dodaj x do każdego z czterech pozostałych elementów (a, b, c, d, e). Żeby pokazać, ż e a + 6 + c + d + e
ODPOWIEDZI DO ĆW ICZEŃ
5.4.3
737
(b+aiC-\-a,d-\-af e-\-a,a), (a+fe, c + 6 , d+b, e + 6 , b), (a+c,b+c,d+c,e-\-c,c), (a+d, b+d, c+d, e+d, d ), (a+ e, 6 + e, c+e, d+e, e ). 30. Poniższa tabela została obliczona przez J. A . Mortensona. Poziom
r = 5
T = 6
r = 7
T =S
T =9
1
2
2
2
2
2
2
2
4 4
5 5
6
8
6
7 7
8
8
10
12
14
5
10
14
18
20
8
26 44
32
46 74
17 27 47 82
20
6
18 26
32 56 92
9 9 16 23 31 42 92
9
68
122
111
138
139
m
10
112
83 134
11
178 290
197 350
206 317 401
140 324
177 208
196 241
M io Mn
466
566
933
917 1481 2313
1371 1762
595 838 1064 1258
4060
2907
3839
288 860 1177 1520 1821
Mi2 Ml3
756
488 640 769 2078
3 4
7
12
13 14 15
1220
16
1976
53
'
T=
8
10 M i
m2 m3 m4 m5 m6 m7 m8
9
M 14 M i5 Ml6
3 1 . [Random Structures & Aigorithms 5 (1994), 102-104] K d(n) = F^d } 2 — N ^ } d_ 1. Jeśli drzewo ma r + 1 liści, a (k -f l)-szy liść ma — 1 przodków różnych od przodków pierwszych k liści, to wówczas n —d — 1 = a i H b a r . (Siedem przykładow ych drzew odpowiada kolejno 1 -b 1 ~b 1 "b 1, 1 -b 1 T 2, 1 — E2 — E 1 ; l - l - 3, 2 — |—1 — 1, 2-|-2 oraz 3 -b 1).
5.4.3 1 . Scalanie wielofazowe z podziałem taśm jest lepsze ze względu na średnią liczbę
przetwarzań pojedynczego rekordu (tabela 5.4.2-6) w przypadku 6 , 7 lub 8 taśm. 2 . G d y liczba początkow ych sekwensów jest liczbą Fibonacciego, obie m etody są w za
sadzie identyczne. Jednak sposób rozm ieszczania domyślnych sekwensów w pozostałych przypadkach czyni sortowanie wielofazowe lepszym rozwiązaniem. A lgorytm kaskadowy umieszcza 1 na T l , następnie 1 na T2, 1 na T l , 2 na T 2, 3 na T l , 5 na T2 itd. i w kroku C 8 nigdy nie zachodzi D\p — 1 ] = M\p — 1 ], gdy p — 2. W efekcie w szystkie domyślne sekwensy znajdą się na jednej taśmie, a to jest mniej efektywne od m etody używanej w algorytmie 5.4.2D, 3. (Rozrzucanie kończy się w kroku (3, 3) po umieszczeniu 12 sekwensów na T3), Tl
T2
T3
T4
T5
T6
i 26 l5
l 21
l 14 1 22 7
22412
6293 91
63
l 15 l 15 l1
—
84
l 24 l 12 52 231
171
251
261
—
—
—
—
—
-
.
1001
—
4. Indukcja. (Zobacz ćwiczenie 5.4.2-28).
-
738
ODPOWIEDZI DO ĆWICZEŃ
5.4.3
5. D la a„ początkow ych sekwensów w fc-tym przebiegu zostaje sformowanych an-k sekwensów o długości au, następnie bn-k o długości l>k itd. 6*
/I 1
1 1
1 1 0
1
1
1
1
1
0
\l
1\
1
1
0 0 0
0
0 0 0 0/
7. O szczędzam y e 2 e n - 2 -h + • ■■4- eneo na długości początkowych sekwensów (zobacz 5), co można także zapisać jako a i a n _3 4- a2aJX-ĄLH b « ^ - 2 ^0 ; to jest równe [z” - 2] ( A ( z f - A{z)). 8 . Mianownik w
A(z) ma różne pierwiastki i stopień większy od licznika, stąd A{z) —
S 43(p)/(1 ~~ Pz )p( 1 — <74(p))j gdzie sumowanie odbywa się względem wszystkich pier wiastków p równania <74(p) — p. Szczególna postać p jest pom ocna w obliczaniu <73(p) i
q'4(p).
9. Te w zory zachodzą dla w szystkich dużych n, co wynika z (8 ) i ( 1 2 ), ze wzglę du na wartość qm (2sm9k)- Żeby pokazać, że są one prawdziwe dla wszystkich n, musimy wiedzieć, że qm- i ( z ) jest wynikiem dzielenia qr- i ( z ) q m(z) przez qr (z) - z dla 0 ^ m < r. To m ożna udowodnić albo korzystając z ( 1 0 ) i zauważając, że po wykonaniu uproszczeń stopień wielomianu qr- i ( z ) q m(z) — qr{z)qm~i(z) obniża się, albo zauw ażając, że A ( z ) 2 + B ( z ) 2 -\ b E ( z ) 2 —►0 przy 2 —►00 (zobacz ćwiczenie 5), albo znajdując otw arte w zory na liczniki B(z)j C(z) itd.
10. E(z) = r i{ z )A ( z ); D(z )
= r 2(z)A(z) - ri(z)\ C(z) = r3{z)A(z) - r2(z ); B(z) = r4(z)A(z) - r3(z); A(z) = r5(z)A(z) + 1 - r4(z). Zatem A(z) = ( l - r Ą z ) ) / { l - r5(z)). [Zauważmy, że r m(2sin0) = sm(2m0)/cos6; zatem rm(z) jest wielomianem Czebyszewa ( _ ! ) - + ! U2m - l ( z / 2 ) \ .
1 1 . Udowodnij, że f m (z) = q[m/ 2 \(z) - r rm/2i (2 ) i że f m( z ) f m- i ( z ) = 1 - rm(z). Następnie skorzystaj z w yniku ćwiczenia 10. (O tw artą postać mianownika jako pierwszy podał D avid E. Ferguson). 1 3 . Zobacz ćwiczenie 5.4. 6 - 6 .
5.4.4 1 . Podczas zapisyw ania rosnącego sekwensu najpierw zapisujem y strażnika zawiera jącego —0 0 , a potem ca łą resztę. (Jeśli zapisane rekordy trzeba będzie czytać w przód, ja k na przykład w ostatnim przebiegu, to na końcu sekwensu należy także umieścić rekord zaw ierający + 00 ). D la m alejących sekwensów zamieniamy rolami — 00 i + 00 .
2. N ajm niejsza liczba z poziomu n + 1 jest równa największej liczbie z poziomu n; ta k więc kolumny są niemalejące, niezależnie od porządku liczb w wierszach. 3. W rzeczyw istości, podczas procesu scalania pierwszy sekwens na T 2 - T 6 będzie zawsze malejący, natom iast pierwszy sekwens na T l będzie zawsze rosnący. (Przez indukcję).
4. Takie rozwiązanie w ym aga wielu operacji „kopiowania” w drugiej i trzeciej fazie; dodatkow y koszt w przybliżeniu wynosi (log 2 ) / (log p) przebiegów, gdzie p jest „współ czynnikiem w zrostu” z tabeli 5.4.2-1.
ODPOWIEDZI DO ĆW ICZEŃ
5.4.4
739
5. Dla słowa a , niech a R będzie tym sam ym słowem, ale z odwróconą kolejnością znaków.
Poziom
Tl
T2
T3
T4
T5
2
12
12
12
12
2
3
1232
1232
1232
232
32
4
12323432
12323432
2323432
323432
3432
Tl
An
Bn
Dn
En
n+ 1
B n( A* + l)
C n(A* + l)
E n (A* + 1)
A* + l
D n( A * + l)
Mamy
E n = A R_i + 1 , = A R_2A R_ i 4- 1 , 1
Bn — A R^ ąA R^ 3A R^ A n = A r^ 3A r ^ ąA r ^
+ 1) /i i + l
= n - Qn , gdzie
Qn ~ Q n - 1{ Q n- 2 + l) ( Q n - 3 + 2 )(Q n_4 + 3 )(Q n-5 + 4),
Tl ^ 1,
Qo = O oraz Qn = e dla n < 0. Słowa A ni B n , . . . skład ają się z tych samych elementów co odpow iadające im słowa z punktu 5.4.2, ale w ystępujących w innej kolejności. Zauważmy, że sąsiednie liczby scaleń zawsze różnią się o 1. Początkow ym sekwensem musi być A w tedy i tylko wtedy, gdy jego liczba scaleń jest parzysta, D w tedy i tylko wtedy, gdy nieparzy sta. Proste schem aty rozrzucania, takie ja k algorytm 5.4.2D, nie są zbyt efektywne w rozmieszczaniu sekwensów domyślnych na pozycjach z dużym i numerami scaleń. Dlatego prawdopodobnie lepiej obliczyć Qn m iędzy fazam i 1 a 2 , żeby móc kontrolować rozmieszczanie domyślnych sekwensów.
6. yw=(+l,+l,-l,+l) y(2)=(+l,-l,+l,+l) y (3) = ( + 1 ,
0, - 1 ,
0)
v (1) = C - i , + i , + i , + i ) y m = ( 1 , 0 , 0 , 0)
740
ODPOWIEDZI DO ĆW ICZEŃ
5.4.4
7. (Zobacz ćwiczenie 15).
Nawiasem mówiąc, 34 jest najm niejszą liczbą Fibonacciego F n , dla której wielofazowość nie definiuje optym alnego scalania z czytaniem wstecz na trzech taśmach dla Fn początkow ych sekwensów. Długość ścieżki zewnętrznej w tym drzewie wynosi 178 i jest większa od 176 dla wielofazowości. 8 . D la
T = 4 drzewo o ścieżce zewnętrznej o długości 13 nie jest T-drzewem typu
lifo, a każde drzewo o ścieżce zewnętrznej o długości 14 zawiera w sobie scalanie jednowejściowe. 9. Na podstaw ie ćwiczenia 2.3.4.5-6 możemy rozważać drzewo zupełne o stopniu
(T — 1 ); stopień „ostatniego” w ęzła wewnętrznego jest z przedziału od 2 do T — 1. Spośród (T — l ) q — m węzłów zewnętrznych, [ m / ( T —2 )J z nich leży na poziomie q —1, a pozostałe na poziomie q. 1 1 . Praw da, co m ożna udowodnić przez indukcję względem liczby początkowych se kwensów. Jeśli istnieje poprawny rozkład S sekwensów z dwoma sąsiednimi sekwensami 0 takich sam ych kierunkach uporządkowania, to istnieje rozkład z mniej niż S sekwen sami; jednak dla 5 — 1 taki rozkład nie istnieje.
12 . W arunki (a) i (b) są oczywiste. D la każdej konfiguracji z (4 ), dla pewnej etykiety A i pewnych i < j < k węzeł j musi znajdować się w poddrzewie poniżej węzła i 1 na lewo od w ęzła k , co wynika z definicji porządku prefiksowego. Tak więc przypadek j — nje może zachodzić i A musi być „szczególną” etykietą, ponieważ pojaw ia się na zewnętrznej krawędzi. To jest jednak sprzeczne z faktem, żc o szczególnej etykiecie w ym aga się, żeby znajdow ała się na skrajnie lewej krawędzi poniżej węzła i. 1 3 . W ęzły o numerach 4, 7, 11, 13 m ogłyby być węzłam i zewnętrznymi, a nie reprezen tować scalenia jednowejściowe. (W takim przypadku długość ścieżki zewnętrznej jest o 1 większa niż w drzewie wielofazowym ). 1 5 . Niech etykietam i taśm owym i będą A , B i C. Skonstruujemy kilka gatunków drzew rozróżnianych ze względu na strukturę korzenia i liści (węzłów zewnętrznych): T y p r(A )
K orzeń A
T y p s(A , C)
K orzeń A , brak liści C
5.4.4
ODPOWIEDZI DO ĆWICZEŃ T yp t(A)
Korzeń A , brak liści A
T yp u(A,C)
Korzeń A , brak liści C , brak sprzężonych liści B
T yp v(A , C)
Korzeń A , brak liści C , brak sprzężonych liści A
T yp w(A,C)
Korzeń A , brak liści A , brak sprzężonych liści C
741
„Liściem sprzężonym ” nazywam y liść, którego brat nie jest liściem. 3-drzewo lifo typu r(A ) możemy dostać, rozbudowując najpierw lewe poddrzewo typu s ( B , C ) t a następ nie prawe poddrzewo typu r(C). Podobnie typ s(A , C) dostajem y z typ u s(B, C), a następnie t(C); typ u (A , C) z v(B, C) i w(C,B); typ v(A ,C ) z u(B, C) i w(C, A ). 3-drzewo lifo typu i (A), z lewym poddrzewem typu u ( B , A ) i prawym poddrzewem typ u s(C , A ), dostajemy, pozw alając najpierw rozrosnąć się lewemu poddrzew u z w yjątkiem (niesprzężonych) liści C i jego lewego poddrzewa; w tym miejscu lewe poddrzewo ma tylko liście A i B , tak więc możemy rozbudowywać prawe poddrzewo całego drzewa, następnie spowodować rozrost z liści A z lewego poddrzewa lewego poddrzewa, a na koniec rozbudować prawe poddrzewo lewego poddrzewa. Podobnie drzewo typu w (A , C) można utworzyć z drzew u(B, A) i u(C, A ). [Drzewo z ćwiczenia 7 jest drzewem typu r(A ) otrzym ywanym właśnie w ten sposób]. Niech r ( n ) , . . . , w(n) oznaczają minimalne długości ścieżek zewnętrznych, po wszystkich drzewach z n liśćmi o stosownych typach, które konstruuje się w pow yższy sposób. M am y r ( l ) = s ( l ) = u ( l ) = 0, r ( 2 ) = t( 2) = w(2) = 2, i ( l ) = v ( l ) = u ? ( l ) = s(2) = u( 2) = v(2) = oo; a dla n ^ 3, = n 4 - minfc(s(fc) s(n) = n 4 minfc(s(A;) £(n) = n 4 minfc(n(A:)
4 - r ( n — &)),
r(n )
u(n)
+ — A:)), ?;(n) 4 - s(n — A:)), u;(n)
=
n
4 minfc(i;(A:)4
w(n — k )),
= n + minfc(u(A;)4 w (n — A;)), = n + minfc(u(A;)4 v(n — k)).
W ynika stąd, że dla każdego n, r(n ) ^ s(n) ^ u(n), s(n) ^ v(n) i r(n) ^ t(n) ^ w (n); ponadto s(2n) = t(2n 4 1) = oo. (To drugie jest oczyw iste a priori). Niech A (n) będzie funkcją zdefiniowaną ja k następuje: uA( 1 ) — 0, A (2n) = 2 n 4- 2 A (n), A ( 2 n 4 1) = 2n 4 1 4 A (n) 4 A(ra 4 1); wówczas A(2n) = 2n 4 A (n — 1) 4 A(n 4 - 1 ) — (0 lub 1 ) dla każdego n ^ 2 . Niech C będzie stałą taką, że dla 4 ^ n ^ 8 , i) jeśli n jest parzyste, to w(n) ^ A (n) 4 C n — 1 ; ii) jeśli n jest nieparzyste, to u(n) i v(n) są ^ A (n ) 4 C n — 1 . (Tak naprawdę, jest tak dla każdego C ^ | ) . Wówczas dowodzimy przez indukcję, biorąc k — \n/2\ 4 1 , że powyższe zależności są prawdziwe dla każdego n ^ 4. A le A (n) jest dolną granicą w (9 ) dla T = 3, a r(n) ^ m in(n(n), u(n), w (n )), stąd udowodniliśmy, że A (n) ^ Kz{n) ^ r(n ) ^ A (n) 4 §n — 1 . [Stalą | można poprawić].
17.
[Następująca metoda, zaprezentowana na sym pozjum A C M w 1962 roku na tem at sortowania, b yła stosowana na maszynie UNIYAC III]. Poziom
Tl
T2
T3
T4
T5
0
1
0
0
0
0
1
5 55
4 50
3 41
2
1
29
15
2
n n4l
an Cn frn, dn Cn 4 4 bn 4 4an + 46n4 3an 4 3 6 n4 2an 4 2 6 n4 un 4*&n + 3cn 4- 2dn 4 Cn 3cn 4 "2 dn cn 3Cn 4 2dn 4" Cn 2cn 4- 2dn 4 Cn cn 4 dn 4 e
Żeby przejść z poziomu n na poziom n 4 1 podczas wstępnego rozrzucania sekwensów, należy umieścić ki „podpoziom ów” z (4,4, 3, 2 ,1) sekwensami dodanym i odpowiednio
742
ODPOWIEDZI DO ĆW ICZEŃ
5.4.4
do taśm ( T l, T 2 , . . . , T 5), k2 „podpoziom ów” z ( 4 ,3 ,3 , 2 , 1 ) dodanymi sekwensami, k3 z (3 ,3 ,2 , 2 ,1), k4 z (2, 2 ,2 ,1 ,1 ) , k5 z ( 1 ,1 ,1 ,1 ,0 ) , gdzie ki ^ a n , k2 ^ bn , k3 ^ cn , k4 ^ dn , k5 ^ en . [Jeśli (fci,. . . , k$) = (an , . . . , en), to osiągnęliśmy poziom n + 1]. Jeśli jest taka potrzeba, to dodajem y domyślne sekwensy, tak żeby zapełnić podpoziom. Następnie scalam y ki + k2 + k3 + k4 + k$ sekwensów z ( T l , . . . , T5) na T 6 , scalamy fciH Vk4 z ( T l , . . . , T4) na T 5, . . . , scalam y ki z T l na T2 i scalam y fci z ( T 2 ,. . . , T 6 ) na T l , k2 z ( T 3 ,. . . , T 6 ) na T 2, . . . , k3 z T 6 na T5. 18 . (Rozwiązanie zaproponowane przez M. S. Patersona) Niech Tj będzie ciągiem numerów taśm , na które jest zapisyw any rekord j. Ten sam ciąg r może odpowiadać co najw yżej C\r\ rekordom, gdzie C zależy od rozmiaru pamięci wewnętrznej (zobacz punkt 5.4.8). Stąd |ri| + • * * + |tjv| = Q(N logT N).
20.
Drzewo jest T-drzewem silnie typu fifo, jeśli jest T-drzewem typu fifo, w którym nie istnieją trzy krawędzie o następujących postaciach:
©
©
© lub
®
©
©
© lub
a
d
0
A
□
dla pewnej etykiety A i pewnych i < j < k < l < s . Nieformalnie, jeśli drzewo rozrasta się na A 1 musi urosnąć we w szystkich innych A , zanim utworzone zostaną nowe A. 2 1 . To drzewo jest bardzo słabym drzewem fifo:
A (s) A/
(21)
\B
(22)
b/
\
^1
5.4.4
ODPOWIEDZI DO ĆWICZEŃ
743
22. Tak dzieje się dla dowolnych reprezentacji drzewowych powstających przez kolejne podmiemy wszystkich wystąpień, na przykład
przez
□
dla pewnych ustalonych etykiet taśmowych A, B , C, D. Ponieważ wszystkie wystąpie nia są zastępowane przez to samo, porządki „lifo” lub „fifo” nie czynią żadnej różnicy w strukturze drzewa.
23.
(a) Załóżmy, że v\ ^ V2 ^
o
^ vt; etap „kaskadowy”
..... 1 , - i . o r - 1... (i,-i, o,..., o r
przeprowadza C(v) na v. (b) Bezpośrednio, ponieważ dla każdego A;, C(v)k ^ C(w)k(c) Jeśli v otrzymuje się w q etapach, to u —»■ = v dla pewnego wektora jednostkowego u i pewnych wektorów u ^ \ ... Stąd 4 C(u), u ^ 4 C(C(n)), ... , v < C ^ (u ). Stąd uH \-vt jest mniejsze lub równe od sumy elementów C ^(u ). Ten ostatni wektor otrzymujemy w scalaniu kaskadowym. [To twierdzenie jest uogólnieniem wyniku z ćwiczenia 5.4.3-4. Niestety pojęcie „etapu” zdefiniowane tutaj nie wydaje się mieć jakiegokolwiek praktycznego znaczenia].
24.
Niech y ^ ... y^l+1^ będzie etapem, który redukuje w do v. Jeśli zachodzi y ^ = —1, = 0 , . . . , yjk+^ = 0 i y ^ — —1 dla pewnego A; < i — 1, możemy wstawić y ^ między y^ oraz y ^ ~ V). Powtarzamy tę operację aż do momentu, w którym w każdej kolumnie wszystkie wartości ( —1) będą sąsiadowały ze sobą. Wówczas, jeśli —0 i y ^ ~ 1^ 0, to można przypisać y ^ +— 1; na końcu każda kolumna zawiera wartości + 1, za którymi są wartości —1, a na końcu wartości 0. W ten sposób skonstruowaliśmy etap, który redukuje wf do v dla pewnego w* y w . Po przepermutowaniu kolumn etap ten przyjmuje postać (1 , . . . , 1 , - 1 ) ^ . . . (1 , - 1 , o, . . . , o) ° 2( - i , o , . . . , o p . Z ciągu T —1 zależności (x i, . . . ,XT ) 4
( X 1 + X T , •. • , x t - i + z t , 0 )
4 (x i + x T~ i + x T, ... ,XT-2+XT-1+X t ,XT ,0) ■< ( #1 - \ - X T - 2 + X t ~ 1 + X t , • • • , X T - Z + X t ^ + X t - I + X T i X T - I + X t ^ X t , ® )
4
( x i + X 2 + x 3 -i
\ - X T , X 3-1------ h X T , . . . , X T - 1 + X t , X t , 0 )
wynika, że najlepszym wyborem elementów a jest ar = clt- i = v t - i, .. . , 02 = V2, 01 = 0. Najlepszy wynik dostaniemy zaś, gdy przepermutujemy kolumny tak, że v\ ^ • ** ^ vt -
25.
(a) Załóżmy, że Vr-k+1 ^
^
vt
^ V\ ^
^ v r-k i weźmy
(li • • •, 1 , ” 1 , 0 , . . . , 0 ) VT~ fc+1 . . . ( 1 , . . . , 1 , 0 , . . . , 0 , — l ) Vr.
(b) Dla 1 ^ l ^ T —k suma l największych elementów z Dk(v) wynosi (l — l)sfc + Sfc+f-
ODPOWIEDZI DO ĆW ICZEŃ
744
5.4.4
(c) Jeśli w fazie, w której używ anych jest k taśm wyjściowych, v => w, to możemy w oczyw isty sposób przyjąć, że faza ta jest postaci
z każdą z pozostałych T — k taśm używanych w każdej operacji jako wejście. Najlepszym wyborem jest a i — u r-fc+ i, • ■■, = v t - (d) Zobacz ćwiczenie 22(c). Zawsze mamy k\ = 1 ; natom iast k — T — 2 jest zawsze lepsze od A: = T — 1 , ponieważ zakładamy, że co najm niej jedna składow a v jest zerem. Zatem dla T = 3 mamy k ± ... kq = l q i początkow ym rozkładem jest (F q+ i , F g, 0). D la T — 4 strategiam i nie do pokonania i odpow iadającym i im rozkładam i okazują się być 9 = 2
1 2 (3 ,2 ,0 ,0 )
9 = 3
121 (5 ,3 ,3 ,0 ); 122 (5 ,5 ,0 ,0 )
9 = 4
1211 (8 , 8 , 5,0); 1222 (10 ,10 ,0 ,0 ); 1212 (11,8 ,0 ,0 )
9 = 5
1 2 1 2 1 ( 1 9 ,1 1 ,1 1 ,0 ) ; 12222 (20,20,0,0); 1 2 1 1 2 (2 1 ,1 6 ,0 ,0 )
9 = 6
122222 (40,40, 0,0); 121212 (41,30,0, 0)
9^7
1 2 tJ_1 ( 5 - 2 9 _ 3, 5 - 2 ?_ 3,0 ,0)
Tak więc dla T = 4 i q ^ 6 scalanie z minimalną liczbą faz jest podobne do scalania zrównoważonego, z niewielką zm ianą na samym końcu (przechodzimy od (3,2,0 ,0 ) do ( 1 , 0 , 1 , 1 ) zam iast do (0 , 0 , 2 , 1 )). D la T = 5 strategiam i nie do pokonania są l(3 2 )n - 1 2, l(3 2 )n_13 dla q = 2n ^ 2; l(3 2 )n_132, l(3 2 )n - 1 22, l(3 2 )n_123 dla q — 2n + 1 ^ 3. (Pierwsza z wymienionych strategii m a najwięcej sekwensów w swoim rozkładzie). D la sześciu taśm są to 13 lub 14, 142 lub 132 lub 133, 1333 lub 1423, a następnie 13g_1 dla q ^ 5.
5.4.5 1 . Poniższy algorytm w ykorzystuje tablicę A [L — 1] . . . A [1] A [0] do reprezentacji liczby w system ie pozycyjnym przy podstaw ie P . G dy kolejno dodajem y jedynkę do tej liczby, przeniesienia mówią nam, kiedy należy scalać. Taśm y są ponumerowane od 0 do P . 0 1 . [Inicjowanie] (A [L —1 ] , . . . , A [0]) <— ( 0 , . .. , 0), q < — 0. (W czasie wykonywa nia tego algorytm u q będzie równe (A [L —1] + • • * + A [0]) mod T).
0 2 . [Rozrzucanie] Zapisz jeden początkow y sekwens na taśmie q w porządku rosnącym. W ykon aj l +— 0. 0 3 . [Dodanie jedynki] Jeśli / = L , przerwij; wynikowy plik znajduje się na taśmie (—L) mod T w porządku rosnącym w tedy i tylko wtedy, gdy L jest parzyste. W przeciwnym razie w ykonaj A [/] <— A [Z] -f 1, q <— (q + 1) mod T. 0 4 . [Przeniesienie?] Jeśli A [Z] < P , wróć do 02. W przeciwnym razie scalaj na taśm ę (q — l) m o d T , w ykonaj A [Z] 0 i q <— (q 4- 1) m o d T , zwiększ l o 1, a następnie wróć do 0 3.
|
2. P am iętaj, ile sekwensów jest na każdej taśmie. Po wyczerpaniu danych wejściowych dodaj domyślne sekwensy, jeśli trzeba, i wykonuj dalej scalanie aż do momentu, w któ rym na każdej taśm ie pozostanie co najw yżej jeden sekwens i co najmniej jedna taśm a będzie pusta. Następnie zakończ sortowanie, wykonując jedno dodatkowe scalanie, przewinąwszy wcześniej, jeśli trzeba, niektóre taśmy. (Z tablicy A wynika, w jaki sposób są zorientowane poszczególne sekwensy).
ODPOWIEDZI DO ĆW ICZEŃ
5.4.5
Op Roz Sca Roz Sca Roz Sca Sca
TO
Tl
-
2 D 2A i d2 d2 d 2d 2 d2 d
-
-
d2 D 2A i d2 -
T2 Ai Ai A! Ai -
Ai -
a
4
Op Roz Sca Sca Roz Kop Kop Sca
TO D 2A i d2 -
-
-
Db
Tl Ai -
4 a4 A 4D i a4 a
_
745
T2 4 a 4d 2 a4 A4 A 1 a4 A 4A i a4 a
W tym miejscu T 2 zostałaby przewinięta i ostateczne scalanie zakończyłoby całe sor towanie. Żeby uniknąć bezużytecznego kopiowania, w którym sekwensy są po prostu prze suwane w ty ł i w przód, możemy na koniec kroku B3 powiedzieć „jeśli dane wejściowe zostały wyczerpane, przejdź do kroku B 7 ” i dodaj następujący, nowy krok:
B7. [Zakończenie] W ykonaj s <--- 1 , a następnie przejdź do B 2 , pow tarzając wcze śniej poniższe operacje aż do momentu, gdy Z = 0: W ykonaj sf < — A [/ — 1, ę ] , a następnie przypisz do qf rf wartości indeksów, takie że A[Z — 1 ,
i
T utaj „prom ocja” oznacza pow tarzanie następującej operacji, aż ( ę + ( —l ) s) mod T = r: W ykonaj p <— (q + (—l ) s) m o d T i skopiuj jeden sekwens z taśm y p na taśm ę g, a następnie wykonaj A[Z,ę] s + 1, A[/,p] — 1, q < — p . N atom iast „degrada cja” oznacza powtarzanie następującej operacji, aż (q — ( — l ) s) mod T = r : W ykonaj p ( q — ( - l ) s) m o d T i skopiuj jeden sekwens z taśm y p na taśm ę q , a następnie wykonaj A [/, gr] <— s, A[/,p] < ------1, q p. W operacji kopiowania z taśm y p czytam y wstecz, tak więc kierunek kopiowanego sekwensu zostaje odwrócony. Jeśli podczas kopiowania z p na q, D\p] > 0 , zam iast kopiować, należy po prostu zm niejszyć D\p] i zwiększyć D[q], [Podstawowy pom ysł polega na tym , że chcemy, gdy tylko dane wejściowe zostaną wyczerpane, zredukować ilość sekwensów do co najw yżej jednego na każdej taśmie. Parzystość każdego nieujemnego elementu A[/,y] mówi o tym , czy sekwens jest ro snący, czy malejący. Najm niejsze 5 , dla którego ta zm iana czyni jakiekolwiek różnice, wynosi P 3 + 1 . D la dużych P ta zm iana z rzadka daje jakieś różnice, ale w pewnych okolicznościach pozwala uniknąć „głupich” nieefektywności. Sam algorytm powinno się także zmienić, żeby d ziałał efektywniej w przypadku 5 = 1 ] , 4. W zasadzie możemy pominąć nadawanie początkow ych wartości zmiennym A [0, 0] w kroku B I i A[Z,ę] w krokach B3 i B5. [Jednak A [Z, r] musi zostać nadana stosowna wartość w kroku B3]. W nowym kroku B 7, z poprzedniej odpowiedzi, nie ma potrzeby nadawanie wartości początkowej zmiennej A [Z, ql (chyba, że jaw nie korzystam y z faktu, iż q' — r, tak ja k się to właśnie tam dzieje).
5. P 2k - (P - l ) P 2fc~ 2 < S ^ P 2k dla pewnego k > 0 .
ODPOWIEDZI DO ĆW ICZEŃ
746
5.4.6
5.4.6 1.
[23000480/(n + 480)J n.
2. W przypadku pokazanym na rysunku wszystkie rekordy z tego bufora zostały umieszczone na wyjściu. K rok F2 wym aga, żeby w czasie scalania warunek „czy bufor w yjściow y jest pełny?” był sprawdzany przed warunkiem „czy bufor wejściowy jest pusty?” , w przeciwnym razie mielibyśm y kłopoty (chyba, że poczynione zostały zmiany zaproponowane w ćwiczeniu 4). 3. Nie; dla przykładu, jeśli plik i zawiera klucze i, i + P, i + 2 P , . . . dla 1 ^ i ^ P , to m oglibyśm y dojść do stanu, w którym P buforów jest w 1 / P zapełnionych, a P —1 bufo rów jest pełnych. Ten przykład pokazuje, że 2P buforów wejściowych jest niezbędnych do zapewnienia ciągłości w ypisyw ania rekordów, nawet gdy dopuścimy jednoczesny od czyt (chyba, że dokonamy realokacji pamięci na częściowe bufory). [Dobrze, nie potrzebujem y 2P buforów, jeśli bloki zaw ierają mniej niż P — 1 rekordów; to jest jednak bardzo m ało prawdopodobne]. 4. N ależy ustalać wartości S wcześniej (w krokach F I i F4 zam iast w F3). 5. Jeśli na przykład w szystkie klucze we wszystkich plikach są takie same, to nie możem y podczas przewidywania podejmować dowolnych decyzji; przewidywanie musi być zgodne z decyzjam i podejm owanym i w procesie scalania. Jeden z bezpiecznych sposobów polega na znajdowaniu w krokach F I i F4 najm niejszego możliwego m, czyli uznaniu, że rekord z pliku C[i\ jest m niejszy od wszystkich rekordów z tym samym kluczem z pliku C[j\, jeśli tylko i < j. (W istocie do klucza jest dodawany numer pliku). <— T + 1. W kroku C 8 scalanie powinno być wykonywane na TAPEfp + 2] zam iast na TAPEfp + 1]. W kroku C9 w ykonaj (TAPEfl] , . . . , T A P E [T + 1]) <- (TAPE[T+1] , . . . , TAPEfl] ). 6 . W kroku C l należy dodatkowo wykonać TAPE[P + 1]
7. W m etodzie z w kładki A mam y (AiDi) 4 AoDo(AiDi) 2 AqD 0 (AiDi) 3 Ao, D\ {A iD\)a
AqD o(AiDi) 3 AqDqocAoDoAq, D i A oD o(A iD i) 3 AoDoaAiDiAo, D i A i D i a A i D i A o , gdzie a = (AoDo) 2AiDiAqDo(AiDi) 2 (AoDo) 7AiDi(AqDq) 3AiDiAoDo. W pierwszej fazie scalania na taśm ie 5 zostaje zapisane D 0 A 3 D 3 A 1 D 1 AąDąAoDoAiDi A 1 D 1 A 4 D 4 A 0 D 0 A i D i A 0 Dq(AiDi)a, w następnej na taśm ie 1 A 4 D 4A 4D 4A 1 D 1 A 4D 4A 0D 0A 1 D 1 A 1 D 1 A 7 ; w następnej D 1 3 A 4 D 4 A 0 D 0 A 10 na taśm ie 4. Końcowym i fazami są
AąDąAą
-
A4 “ A 77
D23A u D 23 -
D 19 A 3 D 3 A 12 D 19A 3 7?19 -
D 13A 4 D 4 A 4 D 13A 4
8 . Nie, ponieważ zaoszczędzilibyśm y co najw yżej
D 13 _
D0 A 3 D 22 _
S zatrzym ań/rozruchów taśmy,
i ponieważ prędkość taśm y wejściowej (nie taśm wyjściowych) ma w rzeczywistości najw iększy w p ływ na czas wstępnego rozrzucania. Inne zalety schematów rozrzucania z w kładki A wyrównują z nadwyżką tę niewielką wadę. 9. P = 5, B = 8300, B f = 734, S = [(3 + l/ P )iV / ( 6 P ') l + 1 = 74, w w 1.094, a w 0.795, ¡3 « —1.136, ol = f3' = 0; Czas (9 ) « 855 sekund, do którego dodajem y czas wstępnego przewijania, co daje łącznie 958 sekund. Zaoszczędzenie około jednej minuty z czasu scalania nie rekompensuje straty czasu potrzebnego na wstępne przewijanie i zmianę taśm y (chyba, że pracujem y w środowisku wieloprogramowym).
10.
Podczas standardowego scalania wielofazowego przewinięcia odnoszą się do oko ło 54 procent długości pliku (kolumna „przebieg/faza” w tabeli 5.4.2-1), a najdłuż sze przewijania podczas standardowego scalania kaskadowego wynoszą w przybliżeniu
ODPOWIEDZI DO ĆW ICZEŃ
5.4.6
747
akan-k/cin ~ (4/(2T — 1)) cos 2 (7r/( 4 T — 2)) < ~ długości pliku, co wynika z ćwiczenia 5.4.3-5 i wzoru 5.4.3 -(i3 ).
11.
T ylko na wstępie i na końcu korzysta się z możliwości szybkiego przewijania, ponie waż szpula jest zapełniona w niewiele więcej niż 10/23 swojej pojem ności, gdy zawiera cały przykładow y plik. Biorąc w przykładzie 8 , 7r = [0.946 In S — 1.204], 7r' = 1/8, dostajem y następujące oszacowania czasów działania m etod z przykładów 1 - 9 : 1115 , 1296, 1241, 1008, 1014, 967, 891, 969, 856. 1 2 . (a) W oczyw istym rozwiązaniu z 4 P + 4 buforami po prostu działam y jednocześnie
(czytam y i zapisujemy) na sparowanych taśm ach. Zauważmy jednakże, że w ystarczą trzy bufory wyjściowe. W danej chwili możemy dokonywać drugiej połow y zapisu na wyjście z jednego bufora, pierwszej połow y z innego i pisać do trzeciego. Takie rozwiązanie sugeruje odpow iadające mu rozwiązanie dla buforów wejściowych. Okazuje się, że 3P buforów wejściowych i 3 bufory wyjściowe są konieczne i w ystarczające, gdy zastosujem y lekko osłabione przewidywanie. P rostszy i lepszy sposób, który podał J. Sue, polega na dodaniu do każdego bloku „klucza w yprzedzającego” , określającego ostatni klucz w następnym bloku. W tej m etodzie w ym aga się 2P + 1 buforów wej ściowych i 4 buforów wyjściowych; jest to prosta m odyfikacja algorytm u F. (Zobacz punkt 5.4.9). (b) W tym przypadku najw iększa wartość a oznacza, że musimy wykonać pięć lub sześć przebiegów przez dane, co oznacza stratę korzyści w ynikających z dwukrotnie szybszego scalania. Ten pom ysł znajduje lepsze zastosowanie w przypadku ośmiu lub dziewięciu taśm.
13.
Nie; rozważmy dla przykładu sytuację tuż przed A i qA \ qA ioA ig. Można jednak tego dokonać dla dwóch pełnych taśm.
14. 15.
det
z~ l\ z -l
0
-po z 1 ~piz
1
0
0
0
0
1
...
B in Z
(0
0
Po z
iqZ
B \\Z
/ det
0
\o M acierz A m a postać:
/ B
t
)
/
(l-P ^ iz ~P>2Z ^
~PoZ 1 -P iz
0
Po z
z —1\ z —1
0
-1
1
0
0
0
0
1
/
1 - z\
B\o + B u + ■* * -h B i n — 1, A =
B nQZ 0
\
o
B n\Z
... 0 ... o
... 1
o
B-nnZ
o o
1
(ii)
Z
o o /
B no + B ni + ■■■+ B nn — 1 .
D latego
/1 -B io z
—B u z
BnOZ
BniZ
~Binz \
det(7 — A) — det
\
0
0
...
1
-6 n(n^i)Z
B nnz
-1
Po dodaniu do pierwszej kolumny pozostałych kolumn, możemy w yłączyć czynnik (1 — z). Tak więc gę{z) ma postać Ji q (z )/(1 — z), a a ^ = h ę ( 1), ponieważ /iq(1) ^ 0 i d et (I - A) ^ 0 , dla \z\ < 1 .
748
ODPOWIEDZI DO ĆW ICZEŃ
5.4.7
5.4.7 1 . N ależy sortować od najm niej do najbardziej znaczącej cyfry, w systemie pozycyj nym, w którym podstaw am i są na przemian P i T — P. (Jeśli pary cyfr zgrupujemy, to otrzym am y zw yk ły system pozycyjn y o podstaw ie P- (T —P). Zatem dla P = 2 i T = 7 nasz zapis jest system em „dwupiątkowym ” , związanym w prosty sposób z układem dziesiętnym ). 2 . D la klucza K leżącego m iędzy 0 a Fn — 1 niech a n - 2 F n - i + ■ ■■+ a\F2 będzie reprezentacją Fibonacciego liczby Fn — 1 — K , gdzie aj jest równe 0 lub 1 , i w ciągu a nie w ystępują dwie kolejne jedynki. Po fazie j taśm a (j + 1) mod 3 zawiera klucze z aj = 0, a taśm a (J — 1) mod 3 klucze z aj — 1, uporządkowane malejąco względem aj - 1 . . . a i . [W yobraźm y sobie urządzenie do sortowania kart dziurkowanych o dwóch kiesze niach, „ 0 ” i „1 ” . Rozw ażm y algorytm sortowania Fn kart, które zostały podziurkowane w n — 2 kolumnach, ta k że układ y dziurek odpow iadają kluczom a n ~ 2 - •. cli- Zw ykły algorytm sortowania takich kart w porządku m alejącym , w którym sortowanie roz poczyna się od najm niej znaczącej pozycji, można uprościć, wiedząc, że wszystko co znajduje się w kieszeni „ 1 ” na koniec jednej fazy, powędruje do kieszeni „0 ” w następnej fazie].
4. G d yb y istniał węzeł zew nętrzny na poziomie 2 , nie bylibyśm y w stanie zbudować tak dobrego drzewa. W przeciwnym razie mam y co najwyżej trzy w ęzły na poziomie 3 i sześć na poziom ie 4, ponieważ o każdym węźle zewnętrznym zakłada się, że jest zw iązany z tą samą taśm ą. 5.
2
D 7 6 . 09, 08,
3
D 6
^ D
0
9
„
D
8
, 00, 19, . . . , 10, 29, . . . , 20, 39, . . . , 30, 40, 41, . . . , 49, 59, . . . , 50, 60,
61, . . . , 99. 7. Tak; najpierw rozrzucam y rekordy do coraz mniejszych podplików, aż otrzym am y pliki mogące się pomieścić na jednej taśmie, które następnie pojedynczo sortujemy. Ten proces jest dualny w stosunku do procesu sortowania plików jednotaśmowych. Następnie scalam y pliki jednotaśm owe w coraz większe pliki wielotaśmowe.
5.4.8 1. Tak, Jeśli w drzewie w yboru naprzemiennie użyjem y porządku rosnącego i male jącego, to w efekcie dostaniem y sortowanie koktajlow e rzędu P. (Zobacz ćwiczenie 9).
ODPOWIEDZI DO ĆWICZEŃ
5.4.8
749
2. Niech Zff = Yy — X y . Rozwiązujemy równanie rekurencyjne na Z y , zauważając, że (N + 1)NZn+1 = N { N - 1)ZN + N 2 + N-, stąd
Z N = \ { N + 1) + ( M 3+ 2 ) / i v (i V - 1)
dla N > M.
Teraz eliminujemy Y n i dostajem y
2 / M+2\ / 1 3 V 3 y V(iV+l)JV(iV-l)
1 \ 3M+4 (M +2)(M +1)A /J + M +2 ’
^ >
'
3. Tak; należy w 0(n) krokach znaleźć medianę, stosując w tym celu algorytm z tw ier dzenia 5.3.3L, a następnie w ykorzystać znalezioną medianę do podziału pliku. Inny interesujący sposób postępowania zaproponowali R. W . Floyd i A . J. Smith. Polega on na scalaniu dwóch A-elem entow ych sekwensów w czasie O(N) i w ygląda następująco: „rozciągnij” elementy na taśm ach tak, żeby m iędzy nimi b yły puste miejsca. N astęp nie zapisz w każdym pustym miejscu numer pozycji, na której znajdzie się element bezpośrednio poprzedzający dane miejsce. 4. Można połączyć plan jazd y windy dla pięter { 1 , . . . ,p + 1} z planem dla pięter
{q: . . . , n}: po osiągnięciu piętra p + 1 według pierwszego planu jedziem y na piętro q i jeździm y zgodnie z drugim planem (przyjm ując, że pasażerowie z pięter niższych są dodatkowym i pasażeram i w algorytm ie z twierdzenia K ). Po wykonaniu w szystkich ruchów z tego rozkładu wracam y na piętro 1 i wznawiam y ja zd y zgodnie z pierwszym rozkładem. 5. Rozważm y 6 = 2, m = 4 i następujące zachowanie się algorytmu: Piętro 7: - 4 7 -------------------- ^ 7 7 -------------------------5667 4566 -\ 6 6 -------------------Piętro 6 : - 2 3 --------------- ^ 2 3 5667 2345 Piętro 5: — 1 4 ------------ /-14 ----------- \ A b ----- ----------5667 1234 2345 Piętro 4: - 7 1 ----------- f -1 5 ------------------ ^ 1 1 ----------5566 Piętro 3: — 6 3 --------- 1-23-------------------------------------2556 Piętro 2: — 6 2 ------- if- 0 0 ---------------------------------------0055 Piętro 1: — 55 ---- -4-00-----------------------------------------0000
/ Teraz 2 (w windzie) jest mniejsze od 3 (na piętrze 3). [Po takim przykładzie Czytelnik powinien umieć pokazać słabszą własność po trzebną w dowodzie twierdzenia K ]. 6 . Niech i , j będą najm niejsze, takie że 6^ < 6 - i bj > bj. D odajem y nową osobę, która chce przejechać z piętra i na piętro j . To nie zwiększa m a x ( ^ , dfc+i, 1) lub m ax( 6 fc, 6 ^) dla dowolnego k. Postępujem y tak dalej, aż dla każdego j , bj — 6 '. Zauważm y teraz, że algorytm z głównego tekstu pracuje nawet wtedy, kiedy w krokach K I i K 3 zastąpim y 6 przez 6^.
ODPOWIEDZI DO ĆW ICZEŃ
750
5.4.8
Pn i niech Qn będzie liczbą perm utacji takich, że Uk = 1 dla 1 ś: k < n . Wówczas Pn = Q iP n- i + Q 2 Pn - 2 H------- h QnPo, Po = 1* Można pokazać, że Qn = 3 n - 2 dla n ^ 2 (patrz niżej). Zatem, korzystając z m etody funkcji 8 . Niech poszukiwaną liczbą będzie
tworzącej, dostajem y ^ ^ Pn^n ~ ( 1 ~ 3 z)/(I — 4z -b 2 z ) = 1 -b z + 2 z +
+ 2 tte4 -ł- 68^5 + * • *;
2 P n = (2 + V 2 ) n _ 1 + ( 2 - A / 2 )n_1.
Żeby udowodnić, że Qn = 3n~~2, rozważm y ciąg trójkow y X\X2 - " X n taki, że xi = 2 , x n = 0 1 0 ^ Xk ^ 2 dla 1 < k < n. Poniższa zasada definiuje wzajemnie jednoznaczną odpowiedniość m iędzy takim i ciągam i i poszukiwanymi permutacjami d 1 0>2 ■■• Q>n• ' m a x { j | (j < k i Xj — 0 ) lub 7 = 1 },
ah =
k, ^m in {j | (j > k i Xj = 2 ) lub j — n },
jeśli Xk = 0 ; jeśli Xk = 1 ; jeśli Xk — 2 .
(Tę odpowiedniość autor otrzym ał wspólnie z E. A . Bendere). 9. L iczba przebiegów w algorytm ie koktajlow ym wynosi 2 m a x (u i, . . . , un ) — (0 lub 1), ponieważ każda para przebiegów (z lewa-na prawo-na lewo) zm niejsza każde niezerowe u o 1.
10.
R ozpoczynam y od algorytm u rozrzucania (sortowanie szybkie lub pozycyjne przez zamienianie), aż dostaniem y pliki jednotaśmowe. I zachowajm y spokój.
5.4.9 1 . - — (æ mod | ) 2 obrotu.
2. Prawdopodobieństwo, że k = diq i k + 1 — a^r dla ustalonych k , g, r oraz i 7 ^ z', wynosi /(ę, r, k) L \L \( P L — 2L)\/(PL)\i gdzie
tf
( k - l \ ( k - q \ ( P L - k - l \ ( P L - k - l - L + q\ _ /
k —1
+ r — 2 \ / PL — k — 1 W 2 L — q — r \
Vç + r - 2 / V
q- 1
) \ 2L — q — r ) \
L ~q
/’
Prawdopodobieństwo, ze k = diq i k 4 - 1 — £¿(9+ 1 ) dla ustalonych fc, ę oraz z, wynosi
PL\
, ;
„ * .,> / ( ? ) .
„ k m
, / fc -l\ / P L - fe - 1 ' ) - e u - x1 /™V L- - ,ę* ' . ) ’
i
e
1 ^k
k *.,)- e
l^q
[SICOMP 3.
l^q
(“ V ) '
1 (1972), 16 1 -1 6 6 ].
N ależy w ( 5 ) w ziąć minimum po przedziale 2 ^ m ^ min(9, n).
ODPOWIEDZI DO ĆW ICZEŃ
5.4.9
751
4. (a) (0.000725(-\/P + l ) 2 + 0.014)L. (b) We wzorze (5 ) zamień „a m n + fin” na „( 0 .0 0 0 7 2 5 ( 0 7 1 + l ) 2 + 0 .0 1 4 ) 71” . [Eksperymenty komputerowe pokazują, że optym alne drzewa definiowane przez tę nową zależność rekurencyjną są bardzo podobne do drzew zdefiniowanych w twierdzeniu K z a — 0.00145, ¡3 = 0.01545; w rzeczyw istości dla 30 ^ n ^ 100 istnieją drzewa, które są optym alne przy obu zależnościach rekurencyjnych. D la n — 64 lub 100, podobnie jak w przykładzie z tekstu głównego, zm iana zaproponowana w tym ćwiczeniu pozwala oszczędzić około 10 procent czasu scalania. Ten sposób alokowania buforów był ju ż rozważany w 1954 roku przez H. Sewarda, który odkrył metodę scalania czterowejściowego m inim alizującą czas przeszukiwania]. 5. Niech A m(n) i B m(n) będą kosztam i optym alnych zbiorów złożonych z m drzew, których wszystkie n liści znajduje się odpowiednio na poziomach parzystych i nieparzy stych. Wówczas A i ( l) = 0 , i? i( l) = a+/3; dla m ^ 2 , A m(n) i J5m(n) definiuje się tak ja k w (4 ); Ai(n) = m m i ^ rn^ ri(amn~\-j3n-\-Bm{n)), B x (n) = m ini^ m^n (am n+ /3n + A m(n)). Te ostatnie równania są dobrze zdefiniowane pomimo tego, że A\(ń) i Bi( n) definiuje się w zależności od siebie!
A i (23) = B i (23) — 268. [Zadziwiające, że n = 23 jest jed yn ą wartością ^ 50, dla której żadne drzewo o takiej samej parzystości poziomów zaw ierających liście nie jest optymalne, jeśli tylko dopuścimy liście na poziom ach o różnej parzystości. B yć może jest to jedyna taka wartość dla a = (3\. 7. Rozważm y wartości adi + /3ei, . . . , adn + f3en w dowolnym drzewie, gdzie dj jest sumą stopni, a ej jest długością ścieżki dla j -tego liścia. D la optym alnego drzewa z wagami w\ będziem y mieli adi + f3e 1 ^ ^ adn + ¡3en . Zawsze można zmienić kolejność indeksów w taki sposób, żeby adi + f3e1 = • • • = adk + /Je*, gdzie pierwsze k liści jest scalanych razem. 9. Niech d minimalizuje (a m + f3)/lnm. Przez prostą indukcję i korzystając z w y pukłości pokazujemy, że A i(n ) ^ (ad + (3)n logd n, gdzie równość zachodzi dla n — dl . Stosowne górne ograniczenie dostajem y, rozpatrując drzewa zupełne stopnia d, ponie waż wówczas D( t ) = dE(r), E(r) = tn + dr dla n — dl + (d — l ) r , 0 ^ r ^ dl .
10. 11.
Zobacz STOC
6
(1974), 2 16 -2 2 9 .
Na podstawie ćwiczenia 1.2.4-38, f m ( n ) = 3qn + 2 ( n —3qm), gdy 2 - 3 q~ 1 ^ n / m ^ 39; /m(n) = 3qn + 4 (n - 39 m), gdy 3q ^ n / m ^ 2 * 3+ Zatem f 2 (n) + 2 n ^ f ( n ) , gdzie równość zachodzi w tedy i tylko wtedy, gdy 4 * 3q~ 1 ^ n ^ 2 ■3q] f 3(n) + 3n — /(n); f Ą n ) + 4n ^ f(n ), gdzie równość zachodzi w tedy i tylko wtedy, gdy n ~ 4 ■3q; f m ( n ) + m n > f ( n ) dla każdego m ^ 5. 1 2 . Rozważ specyfikacje - , 1:1, 1:1:1, 1 :1 :1 : 1 lub 2:2, 2:3, 2:2:2, , . . , |_n/3]: |_(™+1 )/ 3 j :
L(n + 2 )/ 3 j, . . . ; w ten sposób otrzym ujem y drzewa o wszystkich liściach na poziomie q + 2 dla 4 • 3
14.
Następujące specyfikacje drzew dla n = 1 , 2 , 3, . . . odnaleziono, przeszukując wszystkie podziały n: 1:1, 1:1:1, 1:1:1:1, 1:1:1:1:1, 1:1:1:1:1:1, 1:1:1:1:3, 1:1:3:3, 3:3:3, 1:3:3:3, 3:4:4, 3:3:3:3, 3:3:3:4, 3:3:4:4, 3:4:4:4, 4:4:4:4, . . . , 5:6:6:6:12, 6 :6 :6 :6 :1 2 ,
752
ODPOWIEDZI DO ĆW ICZEŃ
5.4.9
6:6:6:6:13, . . . . (Stopnie w yd ają się być zawsze ^ 6, ale to okazuje się dość trudne do udowodnienia). 1 5 . Jeśli na początku do w indy wsiadło a osób, to na pierwszym postoju zgodność rośnie co najw yżej o a + b. G d y następnym razem winda zatrzym a się na dole, zgodność rośnie co najw yżej o b + m — a. Tak więc po k postojach zgodność wzrośnie co najwyżej o kb 4- (k — 1 )m . 1 6 . Jedenaście postojów: 123456 na piętro 2, 334466 na 3, 444666 na 4, 256666 na 5, 466666 na 6, 123445 na 4, 112335 na 5, 222333 na 3, 122225 na 2, 111555 na 5, 1 1 1 1 1 1 na 1. [To jest minimalna liczba postojów, ponieważ rozwiązanie z 10 postojam i, przy dowolnej pojem ności windy, można tak zaprojektować (przez symetrię), żeby winda zatrzym yw ała się kolejno na piętrach 2, 3, 4, 5, 6, p 2 , p 3 , Pa , Ps, 1, gdzie P 2P3P4P 5 jest perm utacją zbioru {2, 3,4, 5}; takie plany są możliwe, tylko gdy 6 ^ 8 . Zobacz M artin Gardner, Knotted Doughnuts (New York: Freeman, 1986), rozdział 10]. 1 7 . Istnieje co najm niej (bn)\/b\n konfiguracji; a liczba konfiguracji, które można otrzy mać z danej konfiguracji po s postojach, wynosi co najw yżej ((n — l ) ( bH6m) ) 5 - 1 , co na podstawie ćwiczenia 1.2.6-67 jest mniejsze od (n((b + m)e/b)b)s. Tak więc z ćwiczenia 1.2.5-24 wynika, że pewne konfiguracje w ym agają s (ln n + 6(1 -f ln (l + m / b ))) > ln(6n)! — n ln 6! > bn ln bn — bn — n((b + 1) ln b — b + l) postojów.
Uwagi: W ykorzystując fakt, że l / ( x -\- y) ^ ~ min(l/a;, l/y), dla dodatnich x i y, naszą dolną granicę m ożna w yrazić w wygodniejszej postaci n ( m in u V V
+ ") Y ). lo g (l + m/b) J )
Pokrewne w yniki otrzym ali A . A ggarw al i J. S. V itter, CACM 3 1 (1988), 1 1 1 6 - 1 1 2 7 , którzy także podali ograniczenie górne odpowiadające ograniczeniu dolnemu
o U i J n b , ,Wy V
V
+ " > ))■ lo g (l + m/b) / J
Zobacz także M. H. Nodine i J. S. V itter, A C M Symposium on Parallci Aigorithms and Architectures 5 (1993), 12 0 -12 9 , gdzie rozszerza się te wyniki na wiele dysków. 18 . O czekiwana liczba postojów jest równa ^2s>1Pst gdzie ps jest prawdopodobień stwem tego, że co najm niej s postojów jest potrzebnych. Niech qs = 1 — ps+i będzie prawdopodobieństwem, że co najw yżej s postojów jest potrzebnych. Wówczas z ćwicze nia 17 mamy, że qs ^ f ( s — 1 + [s = 0]), gdzie f(s ) — b\na s/(bn)\ i a — n((b + m)e/b)b. Jeśli f ( t - 1) < 1 ^ f(t), to J2s^i Ps ^ Pi + * ' ‘ + Pi = i - (?o + ■ ■■4t - (/(O) + /(O) + ■■■+ f ( t - 2 )) - ( a 1-* 4- a 1** + • • ■4- a - 1)
qt- 1 ) ^
19 . Rozw ażm y wykonanie kroku (vii) w drugą stronę, rozrzucając rekordy do koszyka 1, potem do koszyka 2. Ta operacja to dokładnie to samo, co dzieje się w kroku (iv) na pliku kluczy. [Princeton Conférence on Information Sciences and Systems 6 (1972), 14 0 -144]. 20. M ając na uwadze stronicowanie, należy starannie dobrać metodę sortowania we wnętrznego. Takie m etody ja k sortowanie Shella, z wyliczaniem adresów, sortowanie kopcowe, sortowanie listowe w ym agają dużego „roboczego zbioru” stron i mogą się okazać katastrofalne, gdy rzeczyw ista pamięć wewnętrzna jest mała. Takie algorytm y
ODPOWIEDZI DO ĆW ICZEŃ
5.4.9
753
jak sortowanie szybkie, sortowanie pozycyjne przez zamienianie, scalanie z alokacją sekwencyjną czy zw ykłe sortowanie pozycyjne są dużo lepsze dla stronicowania. Są pewne rzeczy, o których projektant sortowania zewnętrznego powinien pamię tać, a których nie daje się zautom atyzow ać w procesie stronicowania. N ależą do nich: (i) przewidywanie, który z plików wejściowych powinien być w czytany jako następny, tak żeby dane b yły dostępne wtedy, kiedy są potrzebne; (ii) dobieranie rozmiarów buforów i ustalanie kolejności scalania w zależności od właściwości sprzętu i danych. Z drugiej strony programowanie na m aszynę w irtualną jest dużo łatw iejsze i daje niezłe rezultaty, jeśli tyko program ista jest uważny i zna własności rzeczyw istej m aszy ny, dla której pisze program. Pierwsze poważne badania nad tym problemem zo stały przeprowadzone przez Brawna, Gustavsona i M ankina [CACM 13 (1970), 483-494]. 2 1.
\(L —j)/D~\; zobacz CMath , równanie (3 .2 4 ).
2 2 . Po wczytaniu grupy D bloków, która zawiera a j , potrzebna jest znajom ość a j +o - 1 przed wczytaniem następnej grupy D bloków. Jeśli pam iętam y a j+ D - i z a j, to potrze bujemy także wartości ao, . . . , a o - 2 w jakiegoś rodzaju nagłówku pliku, żeby można było rozpocząć ca ły proces. Jednak przy takiej organizacji nie możemy wypisać bloków ao . . . f l o - i , zanim nie obliczym y ao • • • 0,2 0 - 2 - Tak więc, żeby utrzym ać ciągłość wypisywania, potrzebujem y 3 D — 1 buforów wyjściowych (zamiast 2 D). Dlatego lepiej jest umieścić klucze a w oddzielnym (krótkim) pliku. [Taką samą analizę można przeprowadzić dla m etody z losowym podziałem danych na pasma].
23. (a) A lgorytm 5.4.6F potrzebuje 4 buforów wejściowych, każdy o rozmiarze superbloku DB. (Jeśli doliczym y bufory wyjściowe, wówczas przy algorytm ie 5.4.6F na bufory jest przeznaczana pamięć, w której można pomieścić 6DB rekordów, natom iast przy algorytm ie SyncSort jest potrzebna pamięć na 5 DB rekordów. (b) Podczas w czytyw ania grupy D bloków jest potrzebna przestrzeń buforowa na poprzednie D bloków i na jeden nieukończony blok, razem na (2 D + 1 )B rekordów. (W yjście w ym aga dodatkowej przestrzeni na 2 D B rekordów. Jednak wiele operacji przetwarzania danych, wykonywanych podczas scalania dwuwejściowego na wejściu, wypisuje w rzeczywistości stosunkowo m ało na wyjście). 24. Niech /-tym chronologicznie blokiem będzie blok ji z sekwensu k i ; w szczególności, ji = 0 i ki = l dla 1 ^ l ^ P. Ten blok zostanie przeczytany w chwili ti = Ylk^i^ikd, gdzie
tikd = |{r | 1 ^
t ^ /,
kr — k oraz (xk T- j r) mod D = d}\
jest liczbą bloków z sekwensu k na dysku d, które są chronologicznie ^ /, a d = (Xkt + ji) mod D . Niech uik = |{r | 1 ^ r ^ / oraz kr = k }|; wówczas
tikd ~
uik - (d - x k) mod D D
ponieważ j r przyjm uje kolejno wartości 0 , 1 , . . . , uik - 1 , gdy 1 ^ r ^ / i kr — k. Ciągiem ti dla przykładu z ( 1 9 ), (2 0 ) i (2 1 ) jest 1 1 1 1 1 22223 43456 34567 82345 67893 . . . . Jeśli Z > P , to liczbą potrzebnych bloków buforowych, gdy rozpoczynam y scalanie od Z-tego chronologicznie bloku, jest Ii + D + P , gdzie Ii jest liczbą „inwersji-z-równością” dla czyli \{r \ r > l oraz tr ^ £/}|, to znaczy liczbą pełnych buforów, które zostały przeczytane, ale nie są gotowe do użycia; D reprezentuje bufory, do których
754
ODPOWIEDZI DO ĆW ICZEŃ
5.4.9
są kierowane następne dane wejściowe, a P reprezentuje częściowo zapełnione bufo ry, z których odbyw a się aktualne scalanie. (P rzy szczególnej uwadze, wykorzystując dowiązania tak ja k w algorytm ie SyncSort, moglibyśm y P zm niejszyć do P — 1 , ale dodatkowe komplikacje nie są prawdopodobnie warte zachodu). T ak więc problem sprowadza się do znalezienia górnego ograniczenia na I i . Mo żem y założyć, że wejściowe sekwensy są nieskończenie długie. Przypuśćm y, że s ele mentów spośród jest większych od ti; wówczas dla ti mam y tiD — l + s inwersji-z-równością, ponieważ dokładnie tiD elementów jest ^ t i . W ynika stąd, że najw iększe Ii dostajemy, gdy s = 0, a ti jest lewostronnym maksimum. M amy uik = Z; zatem z pow yższych wzorów na ti
p Ii ^ m a x(tiD — Z) ^ ^ ^ ( u i k — (d — Xk) mod D + D — 1 — uik) i^ p k= 1 P
= P ( D - 1) -
(d -
Xk)
mod D
1 P
^ P( D — 1) — min Y 0^d
(d — Xk) mod D 1
i istnieje porządek chronologiczny, dla którego ta górna granica jest osiągalna. Przypuśćm y, że rt z Xk jest równych t. Naszym celem jest taki w ybór Xk, żeby zm aksym alizować mino^d
s0 = (JD - l ) n + p - 2 )r 2 + - - - + r D _ 1 ^ ^ [ k P / D ] = - ( ( P - l ) ( D - l ) + g c d ( P ,D ) - l ) . ' k=1 To ograniczenie jest osiągalne, gdy Xj = \jD/P~\ — 1 dla 1 ^ j ^ P. P rzy takich Xj możemy na pełnej szybkości przetworzyć każdy ciąg chronologiczny, jeśli tylko m am y /max+ T > + P = \ P D + §£> + \ P + § gcd(F, D) - 1 buforów wejściowych, każdy o pojem ności B rekordów. (Jest naprawdę nieźle, gdy D = 2 lub 3). 25. Zauważmy, że w kroku 4 wracam y do czytania fi z dysku 0:
K rok K rok K rok K rok K rok K rok K rok K rok
1 2
3 4 5 6 7 8
A ktyw ne czytanie eo bo go ao cq f i dodid2/o « 2 ^062 ^1^3
fieibigiai a 2 / 2 ń ie 3 £2 ^403/3 ¿>2 e4 c i 03/3 ? e4 ? d5d6 7 ?
A ktyw ne scalanie
do a0bo c0do ----------a-o bo co do eo /o go ho do £>ocodiei/o£ońo a 2bi co d 3 e 2 .fi g\ ho <12 bi co d4 e 3 / 2 gi ho a 2 bi ci d 4 e 3 / 2gi ho
Obszar Oczekiv roboczy na ( -------------------- ) do
bo co (eo go --------) eofogo(did2fi — )
do ho
di (d2e 2 d 3 /iy ia 2) d2e2d 3 a i/i b\ p i() /2e3(ńi^2 --------) (hi 62^2 «3/364 — ) hi 62 ^2 ^3/364 ( 7 )
ei a2 d4 Cl d5
26. P rzy założeniach z (2 4 ), w czasie czytania D bloków i wypisywania D bloków, procedura scalająca m ogłaby wygenerować do P + Q — 1 bloków wyjściowych. (Nie P + Q1 ponieważ tylko jeden bufor scalający staje się zupełnie pusty). Czytanie jest ta k samo szybkie ja k wypisywanie, zatem D + P + Q — 1 buforów wyjściowych jest koniecznych i w ystarczających, żeby nie powodować przestojów.
ODPOWIEDZI DO ĆW ICZEŃ
5.4.9
755
Jednak średnio na każde D bloków wejściowych otrzym ujem y co najw yżej D bloków wyjściowych, tak więc w praktyce 3D powinno być odpowiednią liczbą buforów.
27. (a) E n ( m i , . . . , m p) — S t U i Qt* gdzie qt jest prawdopodobieństwem, że jakaś urna zawiera co najmniej t kul. O czywiście qt ^ 1 i n —1
qt $5 ^ Pr(urna k zawiera co najm niej t kul) = rcP r(S n ( m i , . . . , m p) ^ t). k~0 (b) Funkcją tworzącą prawdopodobieństwa dla S n ( m i , . . . , m p) jest
P(z) = U fc= l
+ (z - l)ffc/n ),
gdzie qk = [rrik/n\ i rk ~ rrik m o d n . Teraz 1 + a ^ (1 + a / n ) n i 1 + a r / n ^ (1 + a / n )r , gdy a ^ 0; stąd mamy, że P r(£ n ( m i ,. . . , mp) ^ t) ^ (1 + a ) _ip ( l + a) ^ ( i + <*)"* n L i U + <*Mmk = (i + « ) " * ( ! + Jeśli t ^ m /n, z podanego minimum bierzemy „1” . Jeśli t > m / n , najm niej szą wartością ( 1 + a ) - *(l + a / n ) m jest (n — l ) m~tm rri/ ( n rntt (m — gdy a = (nt — m )/(m — £). 28. Przykładowe obliczenia zd ają się potwierdzać tę hipotezę: £7io(l, 1 , 1 , 1 , 1 , 1 , 1 , 1 ) = 2.3993180, E 10(2y 2 ,2 , 2 ) = 2.178, £?io(2 , 1 , 1 , 1 , 1 , 1 , 1 ) - 2.364540, E 10(3, 2 , 2 , 1 ) - 2.166,
£ i 0 (4 ,3 ,1) - 2.00, E 10(5, 2 , 1 ) - 1.98,
E i 0 (2 , 2 , 1 , 1 , 1 , 1 ) = 2.32076,
E 10(3, 3 , 1 , 1 ) - 2.152,
£ 10 (6 , 1 , 1 ) = 1.94,
£?io(3,1 , 1 , 1 , 1 , 1 ) = 2.29958,
£ i 0 (4, 2 , 1 ,1 ) -
£ io ( 2 , 2 , 2 , 1 , 1 ) = 2.2628, £io(3, 2 ,1 ,1 ,1 ) = 2.2460,
E 10(4 , 1 , 1 , 1 , 1 ) = 2.2076,
2.138,
£ io (4 ,4 ) - 1.7,
E 10(5, 1 , 1 , 1 ) = 2.090,
£ i 0 ( 5 ,3) - 1.7,
£7i0 (3, 3, 2) = 2.02, E i 0 (4, 2 , 2 ) = 2 .0 1 ,
£?io(6,2) - 1.7,
E 10{7, 1 ) - 1.7.
29. (a) W chwili t ze wszystkich dysków są czytane bloki, które w ystępują nie wcześniej niż blok zamarkowany w chwili t. Następnych Q bloków nigdy nie jest usuwanych z buforów roboczych, po tym ja k tylko zostaną przeczytane. W ynika stąd, że w szystkie interesujące nas bloki na dysku j zostaną przeczytane do czasu ^ t + Nj; w szystkie one muszą wziąć udział w scalaniu do czasu t + m ax(iVo,. . . , N d - i )(b) Jeśli (Q + l)-szy blok po bloku zamarkowanym nie został usunięty, możemy zastosować to samo rozumowanie. W przeciwnym razie żaden z poprzednich Q bloków nie jest zamarkowany, a w szystkie Q T 2 bloki nie mogą się znajdować na różnych dyskach. (c) Podzielm y uporządkowane chronologicznie bloki na grupy o rozmiarze Q + 2 i rozważmy dowolną taką grupę. Jeśli Mk bloków pochodzi z sekwensu fc, to liczba Nj jest równoważna liczbie kul w j- tej urnie z problemu cyklicznej zajętości z n = D i m = Q + 2. Tak więc oczekiwana liczba zamarkowanych komórek w każdej z grup jest równa co najw yżej górnemu ograniczeniu z ćwiczenia 27(b). O znaczając to górne ograniczenie przez en (m), możemy wziąć r(d ,m ) = (d/m)ed (m ). [W rzeczywistości funkcja r ( 2 , m) nie jest funkcją monotoniczną dla m ałych m. Dlatego wartości odpow iadające w tabeli 2 r ( 2 ,4) i r ( 2 ,12) są ta k naprawdę wartościa mi r ( 2 , 3) i r ( 2 , 1 1 ); dodatkowe bufory m ogą zwiększyć liczbę zam arkowanych bloków].
756
30.
ODPOWIEDZI DO ĆWICZEŃ
5.4.9
Niech l = f(s + V 2 s ) In d ], a = \ / 2 / s . Wówczas
ed{sdlnd)l
- / + d (l + a / Ą 5dlnd/ a ( l + a ) i ^ / 4 - a ” 1 e x p ((ln d )(l + sa — (s + >/2 s) ln (l + a ))), i (s + y/2s) ln (l + a) > sa + 1 — a/3. Dlatego jeśli s/ (lo g d ) 2 —►oo, to
1 « ’' « “ ' I ' “ ') = £2 7 E T e
< 1 + / ! +
+ 4
n
Pow yższa zbieżność jest dość wolna (zobacz tabelę 2 ).
31.
(G dy Q = 0 , to m arkujem y pierwszy blok, a następnie pow tarzam y markowanie następnego bloku, który dzieli dysk z jednym z bloków z grupy zaczynającej się od poprzednio zamarkowanego bloku. Na przykład, jeśli 112020121210122 jest chrono logicznym porządkiem dostępów do dysku, to markowanie w yglądałoby następująco: I I 2 0 2 0 1 2 1 2 1 0 1 2 2 . D latego przy P —» oo w n jednostkach czasu wczytujem y średnio Q(D )n bloków, gdzie Q jest funkcją Ram anujana, zdefiniowaną w 1 .2 .1 1 .3 - ( 2 ). Dla kontrastu, r(d, 2 ) = ( d + l ) / 2 daje dużo gorsze oszacowanie).
5.5 Trudno jest zdecydować, który z algorytmów sortowania jest najlepszy w danej sytuacji. | 1.
2. D la m ałych N wstawianie na listę; dla średnich N , powiedzmy N = 64, scalanie listowe; dla dużych N sortowanie pozycyjne na listach.
3.
(Rozwiązanie zaproponowane przez V . P ratta) M ając dane dwa niemalejące sekwensy a i ¡3, które mam y scalić, w prosty sposób wyznaczam y podsekwensy a io : 2 a 3 /3i/?2/d3 , takie że a 2 i P2 zaw ierają dokładnie te klucze z a i /3, których wartość jest równa wartości mediany całego pliku. W ykonując wielokrotnie odwracanie przechodzimy najpierw do potem do o t i f i i i na koniec do ai a 2 0 2 (^3 0 3 , redukując w ten sposób problem do scalania podciągów a\j3\ i 0:3 ^3 , których długości są ^ N/2. Znacząco bardziej skomplikowany algorytm zaproponowany przez L. Trabba Parda jest asym totycznie najlepszym rozwiązaniem dla tego problemu: Możemy wykonać stabilne scalanie w czasie 0 ( N ) 1 a stabilne sortowanie w czasie 0 (iV lo g iV ), korzy sta jąc tylko z 0 (logiV ) bitów dodatkowej pamięci potrzebnych na zapamiętanie stałej liczby zmiennych indeksowych, bez potrzeby jakiejkolwiek zmiany postaci sortowanych rekordów [SICOMP 6 (1977), 3 5 1-3 7 2 ]. Te same ograniczenia czasowe i pamięciowe można otrzym ać z dużo mniejszym i stałym i współczynnikam i, co pokazali B .-C . Huang i M. A . Langston, Comp. J. (1992), 643-650 . Zobacz także A. Symvonis, Comp. J. (1995), 68 1-69 0 , gdzie opisano stabilne scalanie M elementów z N elementami, gdy M jest dużo mniejsze od N.
38
35
4. T ylko proste wstawianie, wstawianie na listę i scalanie listowe. Niektóre warianty szybkiego sortowania m ożna uczynić oszczędnymi, ale tylko kosztem dodatkowej pracy w pętlach wewnętrznych (zobacz ćwiczenie 5.2.2-24). M etody oszczędne są szczególnie przydatne, gdy wynik porównania nie jest w 100% pewny; zobacz D. E. K nuth, Lecture Notes in Comp . Sci. 606 (1992), 6 1 - 6 7 .
ODPOWIEDZI DO ĆW ICZEŃ
6.1
757
6.1 1 . \ J (N 2 — 1)/12; zobacz 1 .2 . 1 0 - ( 2 2 ). 2. S i l [Inicjowanie] P <— FIRST. S2l [Porównywanie] Jeśli K = KEY(P), algorytm kończy się sukcesem. S3l [Dalej] P 4- LINK(P). S4l [Koniec pliku?] Jeśli P ^ A, wróć do S2'. W przeciwnym razie algorytm kończy się niepowodzeniem. | KEY LINK START
EQU EQU LDA LD1 CMPA 2H JE LD1 J1NZ FAILURE EQU
3 :5
1:2 K FIRST 0 , 1 (KEY) SUCCESS 0 , 1 (LINK) 2B *
1 1
C c c-s c-s 1- 5
|
Czas działania wynosi ( 6 C — 3S -f 4)u.
4.
Tak, jeśli istnieje sposób przypisania do „KEY(A)” klucza K. [Jednak m etoda dublowania pętli z programu Q' nic tu nie wnosi]. 5. Nie. Program Q zawsze wykonuje co najm niej tyle operacji co program Q'.
6 . Zamień wiersz 8 na JE *+4; CMPA KEY+N+2,1; JNE 3B; INC1 1; i zam ień wiersze 03-04 na ENT1 -2-N ; 3H INC1 3. 7. Zauważmy, że C n — \ C n ~ x + 1 * 8 . Ze wzoru sum acyjnego Eulera mamy
1
+ (T^T) + l n~* ~ ^ W n~l ~X + B3X{x + ) n~2~* -
= ^
0(n~3~x).
[Z teorii zmiennej zespolonej wynika, że £(x) =
2xn x~ 1 s i n ( - 7 r a : ) r ( l
— x)((l —
x).
Ten wzór jest szczególnie użyteczny dla x < 0].
9. (a) Tak: C N = N - N~eH ^ l = N +
(b) C n =
1
- N~eH {~9) =
+ \ + 0(N ~9).
(1 + N / ( 1 - (V ) ) ) = £ g { N + N 1~ 9/ T{1 - 6) + l) + 0 ( N 1~ 29).
(c) D la 6 < 0, ( n ) nie jest rozkładem prawdopodobieństwa; dla ( 1 6 ) dostajem y C n = - T f ^ l - 6 ) N 1+e + 0 ( N 1+29) + 0 (1 ) zam iast ( 1 5 ).
10. pi ^
^
p n ',
(maksimum C n ) = ( N + 1) — (minimum C n )- [Podobnie w przy-
padku rekordów o zmiennej długości m aksym alny średni czas w yszukiw ania wynosi L i( l+ p i) + + L at( 1 + p jv ) minus minim alny średni czas wyszukiwania], 1 1 . (a) Składniki f m~i , • - *, x im- i )p * ^° prawdopodobieństwa m ożliwych ciągów żądań, których obsługa pozostawia Ri na pozycji m. (b) D rugą tożsam ość otrzym ujem y w wyniku zsumowania pierwszej dla (^) różnych m-podzbiorów zbioru X i licząc, ile razy występuje każde Pnk . Tożsamość trzecia wynika z drugiej - jest jej odwrotnością.
758
ODPOWIEDZI DO ĆWICZEŃ
6.1
[Alternatywnie można zastosować zasadę włączania i wyłączania], (c) T lQ n n Q n ( n —l ) i Stąd
£ > * = N - ■£ i i
= N - £ (p, + Pi i
m Pnm =
= równość ( i 7). srj
Uwagi: W . J. Hendricks [J. Applied Probability 9 (1972), 231-233] znalazł prosty wzór na prawdopodobieństwo stanu stacjonarnego dla każdej per mutacji rekordów. Na przykład dla N = 4 takim prawdopodobieństwem granicznym dla ciągu R 3 R\ Rą R 2 będzie ________Pą_______________ P i_________ Pa P2 P 3 + P 1 + P 4 + P 2 P 1 + P 4 + P 2 P 4 + P 2 P2 ' James Bitner [SICOMP 8 (1979), 82-85] udowodnił, że jeżeli początkowa lista jest upo rządkowana losowo, to oczekiwany czas wyszukiwania, po wykonaniu t losowych wyszu kiwań, jest większy od C n o | ]T\ ■(p*—P j) 2( l —Pi—p j Y / (pi+Pj)* Tak więc t wyszukiwań w ym aga łącznie średnio mniej niż ICn 4- \ J2ij(Pi ~ Pj)2/(Pi + Pj ) 2 < tCn + \ (^) po równań. W pracy P. Flajolet, D. G a rd y’ego i L. Thimoniera, Discrete Applied Math. 39 (1992), 20 7-22 9, §6, m ożna znaleźć inny, pouczający dowód z wykorzystaniem funkcji tworzących. 12 . Cn = 21-iV + 2 Yln=o l/ (2 n + 1), co zbiega szybko do 2 a f « 2.5290. W ćwiczeniu 5.2.4-13 podajem y wartość a 1 z dokładnością do 40 cyfr po kropce dziesiętnej.
13. Po dość żmudnym wyliczeniu sumy V^,.2rr n(n + l ) ( 2 n + l ) / , Krin +k ~ -----k=l
~ Hn)
n( n + l)(10n - 1) --------—------
otrzym ujem y poszukiwaną odpowiedź
C n = ± N - 1(2 N + 1 )(H2n - H n) + I - | ( 1V + l ) - 1 » 0.409A. 14. M ożem y założyć, że xi ^ X2 ^
^ x n - Wówczas, argumentując podobnie jak w twierdzeniu S, maksimum dostaniem y dla yai ^ ya2 ^ ^ Pan , a minimum dla yai ^ ^ yan •
15. Na podstaw ie tych samych argumentów co w twierdzeniu S dowodzimy, że roz mieszczenie R 1 R 2 . . . R n jest optym alne w ted y i tylko wtedy, gdy P 1 / L l ( l - P 1)
^P n /L n (1 -P n ).
16. O czekiwany czas Ti + P 1 T 2 + P 1 P 2T 3 H b p iP 2 * * ■ Pn ~ i T n jest minimalizowany w tedy i tylko wtedy, gdy T i / ( 1 — p i) ^ ^ T n / { 1 — p/v)- [BIT 3 (1963), 255-256; pewne interesujące rozszerzenie tego zadania można znaleźć w pracy Jamesa R. Slagle’a, JA CM 1 1 (1964), 253-264]. 17. Prace należy w ykonać w kolejności czasów zakończenia, niezależnie od czasów ich wykonania Tj\ [Oczywiście w praktyce pewne prace są ważniejsze od innych i mogli byśm y chcieć minimalizować m aksym alne ważone opóźnienie. M oglibyśm y także chcieć zm inim alizować sumę m ax(T a i H \~Tai — D a i, 0 ). Okazuje się, że żaden z tych problemów nie m a prostego rozwiązania].
ODPOWIEDZI DO ĆW ICZEŃ
6.1
759
18 . Niech h = [ s jest obecne]. Niech A = {j \ q3 < rj }, B = {j \ qj —rj }, C — {j \ qj >rj}, D — { j \ t j > 0 }; wówczas suma jPiPjd\i-j \ dla rozmieszczenia (g, r), pom niejszona 0 taką samą sumę dla rozmieszczenia (qf, r'), wynosi 2 ^ ]
(qi
L?)(^K—j\
ie.4, i e c
dh-\-i-\-2k~i—j ) "I- 2 ^ ^ (i/i Ti)tj{dh-\-2k—i+j iec,jeD
di~i-\-j}.
W artość tego wyrażenia jest dodatnia, chyba że C = 0 lub A u D = 0. Stąd otrzym ujem y już poszukiwany przez nas wynik, ponieważ dla m — 0 , 1 rozmieszczenia „organowe” są jedynym i perm utacjam i, których nie m ożna poprawić za pom ocą tej konstrukcji 1 dualnej do niej konstrukcji „lewy-prawy” . [Ten wynik w istocie pochodzi od G. H. H ardy’ego, J. E. Littlew ooda i G. Pólya,
Proc. London Math. Soc . ( 2 ), 25 (1926), 2 65-282, którzy tak naprawdę udowodnili, że suma J T . ptqjd\i-j\ jest minimalizowana dla każdego niezależnego rozm ieszczenia wartości p i q zgodnego z porządkiem organowym. Dalsze uwagi i uogólnienia moż na znaleźć w książce tych autorów Inequalities (Cam bridge U niversity Press, 1934), rozdział 1 0 ]. 19 . K ażde rozmieszczenie jest równie dobre. Przyjm ując I > P i d( h j ) = 5 £ p * P i ( d ( U ) +
= 0, mamy
= \c.
[Szczególny przypadek d(i,j) = 1 + (j — i) mod W, dla i ^ był badany przez K. E. Iversona w książce A Programming Language (New York: W iley, 1962), 138. R. L. Baber, JACM 1 0 (1963), 478 -486, zajm ow ał się innymi problemami związanym i z wyszukiwaniem taśm owym , przy założeniu, że m ożliwy jest odczyt w przód, przewi janie i cofanie o k bloków bez czytania. W . D. Frazer zauw ażył, że czas w yszukiw ania można znacząco zredukować, jeśli umożliwimy powielanie pewnych informacji w pliku. W pracy E. B. Eichelbergera, W . C. Rodgersa i E. W . Stacy, IB M J . Research & Development 1 2 (1968), 13 0 -13 9 , znajdziem y eksperym entalne rozwiązanie podobnego problemu].
20. P rzy przejściu od (q, r) do {q\ r '), podobnie ja k w ćwiczeniu 18 z m — 0 lub m = h = 1 , wartość różnicy T l
{<łi -
r i)(qj -
rj)(d \i~ j|
-
m m (d h+i + 2 k -i~ j,d i+ j- i ) )
ie A ,je c
jest zawsze dodatnia, poza przypadkiem , gdy A lub C są 0. Z sym etrii cyklicznej w yni ka, że jedynym i optym alnym i rozmieszczeniami są przesunięcia cykliczne konfiguracji organowych. [O różnych klasach problemów z taką samą odpowiedzią m ożna przeczytać w pracy T. S. M otzkina i E. G. Strausa, Proc. Amer. Math. Soc. 7 (1956), 10 14 -10 2 1].
21. Ten problem w zasadzie jako pierwszy rozw iązał L. H. Harper, SIAM J. Appl. Math. 12 (1964), 1 3 1 - 1 3 5 . W J. Applied Probability 4 (1967), 3 9 7 -4 0 1, znajdziem y uogólnienie tego problemu i odnośniki do innych prac. 22. Kolejka priorytetowa o rozmiarze 1000 (reprezentowana za pom ocą kopca, zo bacz punkt 5.2.3). W staw iam y pierwsze 1000 rekordów do kolejki z elementem o naj większej wartości d ( K j , K ) jako pierwszym. D la każdego kolejnego K 3 z d{K 3, K ) < d(pierwszy, K). zamieniamy pierwszy element w kolejce przez Rj i poprawiam y kolejkę.
ODPOWIEDZI DO ĆW ICZEŃ
760
6.2.1
6 . 2.1 1 . Udowodnij przez indukcję, że i ć _1 < K < K u+1 , za każdym razem, gdy docho dzim y do kroku B 2 ; oraz że / ^ i ^ u za każdym razem, gdy osiągam y B3.
u — 1 i K > K u. (b) Tak, to działa. Jeśli jednak K nie będzie w tablicy, często zapętli się z l = u i K < K u. 2 . (a, c) Nie; zapętli się, jeśli Z =
3. To jest algorytm 6 .1 T dla N = 3. W przypadku sukcesu średnio jest wykonywanych (N + l)/ 2 porównań; w przypadku niepowodzenia N /2 + 1 — 1 / ( N + 1 ). 4. To musi być wyszukiwanie zakończone niepowodzeniem dla N = 127; tak więc na podstaw ie twierdzenia B odpowiedzią jest 138u. ✓ . Średni czas działania programu 6.1Q wynosi 1.757V 8.5 (N mod 2)/4iV; to jest lepiej od czasu d ziałania programu B w tedy i tylko wtedy, gdy N ^ 44. [Jest lepszy od programu C tylko dla ^ 1 1 ].
5.
+ —
7.
(a) O czyw iście nie. (b) Uwagi w nawiasach z algorytm u U nadal pozostają w mocy, zatem to będzie działało, jednak tylko wtedy, kiedy dla nieparzystego N są obecne oba klucze Ko ~ —oo i K n +i = +oo.
N. Interesującym jest udowodnić ten fakt przez indukcję, zauważając, że do kładnie jedna z „delt” wzrośnie, gdy zamienimy N przez N + 1 . [Pewne uogólnienie m ożna znaleźć w A M M 77 (1970), 884]. (b) Maksimum = Ylj&j ~ minimum = 25\ — £ \ Sj — N m od 2. 8 . (a)
9. 10.
W te d y i tylko wtedy, kiedy
N ~ 2k — 1.
N ależy napisać program z makrorozwinięciami zaw ierający „delty” ; tak więc dla
N = 10 :
START
C4A
C4B
C4C
ENT1 LDA CMPA JL JE INC1 CMPA JL JE INC1 CMPA JL JE INC1 CMPA JE JMP
5 K KEY, 1 C3A SUCCESS 3 KEY, 1 C3B SUCCESS
C3A
C3B
1 KEY, 1 C3C SUCCESS
1 KEY, 1 SUCCESS FAILURE
C3C
EQU DEC1 CMPA JGE EQU DEC1 CMPA JGE EQU DEC1 CMPA JE JMP
* 3 KEY, 1 C4B *
1 KEY, 1 C4C *
1 KEY, 1 SUCCESS FAILURE
I
[W ćwiczeniu 23 pokazujemy, że m ożna wyeliminować większość z instrukcji „JE” , otrzym ując program zaw ierający około 6 lg N wierszy i d ziałający w czasie około 4 lg iV jednostek; jednak ten program będzie szybszy dopiero dla N ^ 1000 (w przybliżeniu)]. 1 1 . R ozw ażm y drzewo takie ja k na rysunku 6 . G d y N jest nieparzyste, lewe poddrzewo korzenia jest zwierciadlanym odbiciem prawego poddrzewa, zatem K < Ki pojaw ia się tak samo często ja k K > K ^ średnio C l = \ {C + S) i C 2 = | ( C - 5 ), A = | ( 1 — 5). G d y N jest parzyste, nasze drzewo w ygląda tak samo jak drzewo dla 7V-f 1, tylko każda
ODPOWIEDZI DO ĆW ICZEŃ
6.2.1
etykieta jest pomniejszona o 1 , z w yjątkiem w ęzła średnio, biorąc k = [Ig N \ ,
Ci = £ ± 1 - A 2 2N ’ Cl -
(fc + l)JV
^ + ± 2 2 iV ’ (fc + l)(JV + 2 )
C2 = C2
2(JV + 1 ) ’
2 ( iV + l)
(o), który
staje się redundantny;
A = 0,
jeśli 5 = 1 ;
W A = “ 2( N 4 - 1
’
761
,
jeśli 5 = 0 .
)
(Średnia wartość C została podana w głównym tekście). 12 .
13.
N = 1 2 CN = 1 C'n = 1
3
4
1 § 2l 2 2f
5
6
7
8
9
H 2|
2 -6
27
3-8
3
3
3 -9
3
10
3 3A 3— 6 ó 10 u
13
14
15
11
12
3
3— 3— °3 — 12 0 13 ^ 14
ó 15
4
4
°
12
4
4
16 16 ^41— 7
14. Jeden z pom ysłów polega na znalezieniu najm niejszego M ^ 0 , takiego że N + M jest postaci Fk+i — 1, a następnie wykonaniu na początku kroku F I przypisania i Fk M i wstawieniu na początek kroku F 2 instrukcji „jeśli i ^ 0, to przejdź do F4” . Lepszym rozwiązaniem jest adaptacja pom ysłu Shara do przypadku Fibonacciego: Jeśli już w pierwszym porównaniu K > K p k , to wykonujem y i i — M i przechodzim y do F4 (postępując dalej ja k zwykle). W ten sposób unikamy spędzania dodatkowego czasu w pętli wewnętrznej.
—
15. W ęzły zewnętrzne znajdują się na poziomach od \_k/2J do k — 1; różnica m iędzy tym i poziomami jest większa niż jeden, z w yjątkiem k = 0 ,1 , 2, 3, 4. 16 . Drzewo Fibonacciego rzędu k , z zamienionymi dowiązaniami lew y z prawym , jest drzewem binarnym, które w „sposób naturalny” odpowiada diagram owi do fc-tego poziomu zdefiniowanemu w punkcie 2.3.2, jeśli z diagramu usuniemy najw yżej położony węzeł.
17. Niech k —A(n) będzie długością tej ścieżki; wówczas dla i A(Fj + m) = 1 + A(m).
0 <
m < Fj-i,A(Fj) = j
18. W yszukiwanie zakończone sukcesem: Ak = 0 , C* = (3 kFk+1 + (fc - 4 )Fk) / 5(Ffc+i — 1) — 1, Clk = Ck-i(Fk — l)/(Ffc+i — 1). W yszukiwanie zakończone niepowo dzeniem: A lk = Fk/Fk+ 1 , C'k = ( 3kFk+i (k — 4)Ffc)/5Ffc+i, Cl*. = Ck_\Fk/Fk+\ + Fk~\/Fk+\. C2 = C — C l . (W ćwiczeniu 1 .2 .8 - 1 2 znajdziesz rozwiązania pokrewnych rekurencji). 2 0 . (a)
b = p~pq~q. (b) Zawiera ono co najm niej dwa błędy. Pierw sza gruba pom yłka
wynika stąd, że dzielenie nie jest funkcją liniową, a więc nie m ożna tak po prostu „uśredniać” . W rzeczywistości z prawdopodobieństwem p pozostaje p N elementów, a z prawdopodobieństwem q pozostaje (p2 + q2) N elementów. Zatem średni w spół czynnik redukcji naprawdę wynosi 1 / (p 2 + q2). Po k iteracjach w spółczynnik redukcji wynosi 1 /(p2 + q2)k, ale nie możemy z tego wnioskować, że b = 1 / (p 2 + q2), ponieważ
ODPOWIEDZI DO ĆWICZEŃ
762
6.2.1
liczba iteracji potrzebnych do zlokalizowania jednych elementów jest dużo większa niż liczba iteracji potrzebnych do zlokalizowania innych. To jest druga złuda. [Bardzo ła two przeprowadzić wiarygodne, a jednocześnie fałszywe probabilistyczne rozumowanie. D latego zawsze musimy być przygotowani na tego rodzaju pułapki!] 2 1 . To jest niemożliwe, ponieważ w tej m etodzie jesteśm y zależni od wartości kluczy.
22.
FOCS
17 (1976),
1 7 3 - 1 7 7 . Zobacz także Y . Perl, A. Itai i H. Avni, CACM 2 1 (1978), 5 50 -554 ; G. H. Gonnet, L. D. Rogers i J. A. George, A c ta Informática (1980), 3 9 -5 2 ; G. Louchard, RAIRO Inform . Théor. (1983), 365-385; Computing (1991), 19 3 -2 2 2 . W ariancja wynosi G (lo g lo g N). Obszerne eksperymenty przepro wadzone przez G. M arsagliego i Narasimhana, Computers and Math. (1993), 3 1 - 4 2 , pokazują, że średnia liczba odwołań do tablicy jest bardzo bliska lg lg N, plus około 0.7, jeśli wyszukiwanie kończy się niepowodzeniem. D la przykładu, gdy N = 2 20, wyszukiwanie losowego elementu, zakończone sukcesem, zabiera około 4.29 odwołań, natom iast w przypadku niepowodzenia około 5.05.
13
17
46
B.
26,8
23. N ależy iść w prawo dla ^ , a w lewo dla < ; po dojściu do węzła [7 ], z (i) wynika, że Ki K < Ki+ 1 , a zatem ostatni test na równość powie nam, czy wyszukiwanie kończy się sukcesem, czy niepowodzeniem. (Zawsze powinniśmy mieć klucz K q = —oo). A lgorytm C należałoby zmienić w następujący sposób. W kroku C 2 należy przejść do C4, jeśli K — Ki. W C3, jeśli DELTA[j] = 0, należy wykonać i <— i — 1 i przejść do C5. W C4, jeśli DELTA[j] = 0, należy od razu przejść do C5. D odajem y nowy krok C5: „Jeśli K — Ki, algorytm kończy się sukcesem, w przeciwnym razie kończy się niepowodzeniem” . [Te usprawnienia przyśpieszają program C dopiero dla N > 2 26; średni czas wyszukiw ania zakończonego sukcesem zmienia się z (8.51gJV — 6 )u na (81g7V + 7)uj.
^
24.
K lucze można rozmieścić w taki sposób, że najpierw i 1 , następnie i < — 2i lub 2i + 1, w zależności od tego, czy K < Ki lub K > K¿; wyszukiwanie kończy się niepowodzeniem, gdy i > N. N a przykład dla N — 12 klucze powinny być rozmieszczone w następujący sposób:
R8
25.
(a) Ponieważ ao = 1 — bo, a± — 2ao — b\,
= 2 a i — 62 itd., zatem A(z) + B(z) =
1 + 2zA(z). K ilka wzorów otrzym anych w podpunkcie 2.3.4.5 wynika natychm iast z tej
zależności, jeśli rozważyć A ( l) , R ( l) , R ( | ) 5 A f{1 ) i B f( 1 ). Jeśli użyjem y dwóch zmien nych, żeby rozróżnić na ścieżce kroki w lewo i w prawo, dostaniem y dużo ogólniejszą zależność A(x,y) + B ( x , y ) = 1 + (x + y)A(x,y), która jest szczególnym przypadkiem wzoru dla drzew o stopniu t [zobacz R. M. K arp, IRE Transactions I T - 7 (1961), 2 7-3 8 ]. (b) var (g ) = ( ( N + 1)/ N ) var ( h ) — ((N + 1 ) / N 2) m ean(h ) 2 + 2.
26.
Drzewo scalania w scalaniu wielofazowym na trzech taśmach, z doskonałym rozkła dem na poziom ie k, jest drzewem Fibonacciego rzędu k+1, jeśli odpowiednio zamienimy lewe i prawe dzieci. (Jeśli przerysujem y drzewo wielofazowe z rysunku 76 z punktu 5.4.4 w taki sposób, że zam ienim y lewe i prawe poddrzewa A i C, to otrzym am y drzewo z rysunku 8 ).
6.2.2
ODPOWIEDZI DO ĆW ICZEŃ
763
2 7. Spośród 2k wyników porównań, m ożliwych jest tylko co najw yżej k + 1, ponieważ możemy tak uporządkować indeksy, żeby K i x < F ?2 <■■■ < K lk. Zatem wyszukiwanie można opisać za pom ocą drzewa o co najw yżej (k + 1 ) rozgałęzieniach w każdym węźle. Liczba elementów, które można znaleźć w m -tym kroku, wynosi co najw yżej k(k + l ) m_1; zatem średnia liczba porównań wynosi co najm niej IV - 1 razy sum a najm niejszych N elementów w m ultizbiorze { k - 1 , k ( k + l)-2,h(h + 1 ) 2 *3,. . . } . G d y N ^ (A ;+ l)n — 1 , średnia liczba porównań jest ^ ((& + l ) n — 1 ) _1 J2m=i ^{k-\~l)rn~l m > n — l/k .
28. [Skrifter udgivne a f Videnskabs-Ściska bet i Christiania, M athem atisk-N aturvidenskabelig Klasse (1910), No. 8 ; przedrukowane w książce z w ybranym i pracam i Thuego Selected Mathematical Papers (Oslo: Universitetsforlaget, 1977), 2 73 -3 10 ] (a) Tn ma F n+i + F n_i = F 2 n/Fn liści. (To są tak zwane liczby Lucasa L n = >n + (^n). (b) Podany aksjomat mówi, że To(T 2 (:r)) = T i(x ), i w oczyw isty sposób m am y T-m{rPn(x)^ — Tm+n- i ( x ) dla m — 1 lub n = 1. Przez indukcję względem n otrzym ujem y, że teza jest prawdziwa dla m = 0; na przykład T o(Ts(x)) = To(T 2 {x)*Ti(x)) = T o (T i(T 2 (:c)) * To(T 2 (a:))) = To(T 2 (T 2 (x))) = T 2 (x). Na koniec możemy zastosować indukcję wzglę dem m.
29. Załóżmy, że K q — —oo i lijv+i = K n + 2 = 00 . N ajpierw wykonujem y w yszuki wanie binarne na K 2 < F 4 < • • •; to w ym aga co najw yżej [Ig N J porównań. Jeśli to wyszukiwanie zakończyło się porażką, to w yznaczyliśm y przedział K 2 j ~ 2 < K < K 2 3 ; K nie występuje, jeśli 2j = N p 2 . W przeciwnym razie wykonujem y wyszukiwanie binarne z kluczem K 2 j - i , żeby w yznaczyć takie i, że FsT2ż—2 < ^ 2 j - i < • W ówczas albo K — K 2 i~i, albo K jest nieobecne. [Zobacz Theor. Comp. Sci. 58 (1988), 67]. 30. Niech n = j_7V/4j. R ozpoczynając od F i < F 2 < • ** < K n , możemy ustawić F i , F 3 , . . . , F 2n- 1 w dowolnym porządku, zam ieniając je z perm utacją F 2n+ 1 , F 2n+ 3 , . . . , F 4n - i; to nowe rozmieszczenie spełnia warunki z poprzedniego ćwiczenia. Niech teraz F i < F 3 < • • • < F 2t+ i _ 3 reprezentują granice m iędzy w szystkim i m ożliwym i liczbami ¿-bitowymi i wstawm y F 2t+ i_ i, F 2t+ i+ 1, . . . , F 2i+ i + 2m - 3 m iędzy te „opłot ki” , zależnie od wartości x\, X2 , ■■■, x m . D la przykładu, jeśli m = 4, t = 3, x± = (001)2, X2 = ( 1 1 1 ) 2 i X3 — xą — ( 10 0 )2, poszukiwanym uporządkowaniem jest F i < F 15 < F 3 < F 5 < F 7 < F 19 < F 21 < F 9 < F u < F 13 < F 17 .
(Moglibyśmy także pozwolić, żeby F 21 poprzedzało F 19 ). Za pom ocą wyszukiwania binarnego dla F 2t+i +2j-_3 w podtablicy F i < F 3 < ** * < F 2t+ i_ 3, znajdziem y teraz najbardziej znaczące bity liczby xj. [Zobacz F iat, Munro, Naor, Schaffer, Schmidt i Siegel, J. Comp . S y s t Sci. 43 (1991), 406-424].
6 .2.2 1. Zastosuj dodatkow y węzeł nagłówkowy HEAD, dla którego, powiedzmy, R00T = RLINK(HEAD); rozpocznij wykonywanie algorytm u w kroku T 4 od instrukcji P <— HEAD. K rok T 5 wykonujemy tylko wtedy, kiedy F > KEY (HEAD). [Tak więc w programie T należy zamienić linijki 04 i 05 na „ENT1 R00T; CMPA K” ]. 2. W kroku T 5 wykonaj RTAG(Q) 1. Dodatkowo, gdy wstawiasz na lewo, w y konaj RLINK(Q) <— P; przy wstawianiu na prawo wykonaj RLINK(Q) -i— RLINK(P) i RTAG(P) 0. W kroku T4 zmień sprawdzanie warunku „RLINK(P) ^ A ” na „RTAG(P) 7^ 0” . [Jeśli w ęzły są umieszczane w kolejnych rosnących lokacjach Q i jeśli w szystkie usuwania odbyw ają się w kolejności „ostatni na wejściu, pierwszy na w yjściu” , to
764
ODPOWIEDZI DO ĆW ICZEŃ
6.2.2
m o ż n a w y elim inow ać p o la RTAG, po n iew aż RTAG(P) b ędzie rów ne 1 w te d y i tylko w tedy, g d y RLINK(P) < P. P o d o b n e uw agi m a ją zasto so w an ie, gdy drzew o je s t jed nocześnie lew o stro n n ie i p ra w o s tro n n ie sfa stry g o w an e ]. 3. M oglibyśm y zastąpić A przez rzeczyw isty adres i na początku algorytm u wykonać KEY (A ) K\ wówczas sprawdzanie warunków, czy LLINK lub RLINK = A, m ogłoby być wyelim inowane z wewnętrznej pętli. Jednakże, żeby prawidłowo wykonać wstawianie, potrzebujem y dodatkowej zmiennej wskaźnikowej, która podąża za P; to można zrobić bez u traty już uzyskanego przyśpieszenia, pow ielając kod ja k w programie 6 .2 .1 F. Na m aszynie MIX uzyskalibyśm y w ten sposób redukcję czasu do około 5.5 C jednostek. 4. C n ~ l + (0-l + l*2+- ■ *+ (n —l) 2 n —iH- * * = (l+l/ATjC^r —1 dla N ^ 2 n — 1 . Rozwiązaniem tych równań dla N ^ 2 n — 1 jest C'N = 2 ( H n + i - # 2™) + n. O szczędzam y 2H.2^ — n — 2 « n (ln 4 — 1) porównań. Rzeczywistym i zyskami dla n — 1 , 2 ,3 ,4 są odpowiednio 0 , ~, ||^ |||; tak więc zarabiam y stosunkowo nie wiele dla m ałych ustalonych n. [W pracy Frazera i M cKellara, JACM 1 7 (1970), 502, m ożna znaleźć bardziej szczegółowe wyprowadzenie m ające związek z równoważnym problemem sortowania]. 5 . (a) Pierw szym elementem musi być CAPRICORN; następnie należy pomnożyć liczbę sposobów otrzym ania lewego poddrzewa przez liczbę sposobów otrzym ania prawego poddrzewa, razy ( 3°) liczba sposobów przetasowania obu ciągów razem. Tak więc odpowiedzią jest
M O Q m C X S X D Q Q -™ [W ogólności odpowiedzią jest iloczyn po w szystkich węzłach dwumianów ( ^ r) , gdzie l i r oznaczają rozm iary lewego i prawego poddrzewa węzła w drzewie. To jest równe N \ y podzielone przez iloczyn rozmiarów poddrzew. W ten sposób dostajem y taki sam wzór ja k w ćwiczeniu 5.1.4-20; rzeczywiście, jeśli w drzewie wyszukiwania zastąpim y przez k (przy oznaczeniach z ćwiczenia 6 ), to znajdziem y oczywistą, wzajemnie jedno znaczną odpowiedniość m iędzy perm utacjam i, z których otrzym ujem y dane drzewo wyszukiwania, a perm utacjam i „topologicznym i” zliczanymi w tym ćwiczeniu], (b) 2 iV_1 = 1024; w każdym kroku, poza ostatnim , wstawiam y albo największy, albo najm niejszy z pozostałych elementów.
Pnk perm utacji a x. . . a n_ ia n o koszcie £;, konstruujemy n + 1 perm utacji a [ ... an_ xm afn , w których a'j = aj lub aj + 1 , zależnie od tego, czy aj < m, czy też aj ^ m. [Zobacz punkt 1.2.5, m etoda 2], Jeśli m = an lub an -h i , to kosztem takiej perm utacji jest k 4 - 1 , w przeciwnym razie jej koszt wynosi k. (b) Gn(z) = (2z + n — 2 ) (2z + n — 3 ) . . . (2 z). Stąd 6 . (a) D la każdej z
T a funkcja tw orząca została w istocie otrzym ana przez W . C. Lyncha, Comp. J. 7 (1965), 299-30 2. (c) Funkcją tw orzącą dla prawdopodobieństw jest gn(z) = Gn(z)/n\. To jest iloczyn prostych funkcji tw orzących prawdopodobieństwa, tak więc wariancją C ń - 1 jest
ODPOWIEDZI DO ĆW ICZEŃ
6.2.2
765
[Z ćwiczenia 6.2.1-25(b) wynika, że możemy w ykorzystać wartość oczekiwaną i warian cję C'n do policzenia wariancji C n, która wynosi (2 + 10 / n ) H n - 4(1 + l / n ) { H {2) + H n 2 /n ) + 4; ten wzór pochodzi od G. D. K notta]. 7. Poszukiwany element jest porównywany z A;-tym najw iększym elementem w tedy i tylko wtedy, gdy podczas w stawiania A;-ty element w ystępuje przed m -tym i przed wszystkim i elementami, które leżą pom iędzy k-tym i m-tym; to zdarza się z prawdopo dobieństwem 1 /(|m — k | -j- l) . Sumując po k dostajem y odpowiedź Hm + i7 n+ i-m — 1* [CACM 1 2 (1969), 77 -8 0 ; zobacz także L. Guibas, A c ta Informatica 4 (1975), 2 9 3 -298].
8.
(a) gn {z)
=
J2k=i 9k ^ i { z ) g n - k { z ) / n , g0(z) = 1 .
(b) 7 n 2 — 4 ( n + 1 )2H„^ — 2(n + l ) H n + 13n. [P. F. W indley, Comp. J. 3 (1960), 8 6 , podał zależności rekurencyjne, za pom ocą których tę wariancję m ożna obliczyć numerycznie, ale nie udało mu się otrzym ać tego rozwiązania. Zauważmy, że ten wynik nie ma prostego związku z wariancją Cn podaną w odpowiedzi do ćwiczenia 6 ]. 10. D la przykładu, każde słowo x z klucza m ożna zamienić na ax mod m, gdzie m jest rozmiarem słowa maszyny, natom iast a jest losowym mnożnikiem, względnie pierw szym z m. Zalecam y wybranie wartości bliskiej { — l) m (zobacz podrozdział 6.4). Elastyczność alokacji pamięci w m etodzie drzewowej może uczynić ją atrakcyjniejszą od haszowania. 11.
N — 2 ; ale to zdarza się z prawdopodobieństwem 1 / ( N NI) tylko w usuwaniu ©
N N —l . . .
2.
1 2 . l ( n + l) ( n + 2) z usunięć w dowodzie twierdzenia H odpowiada przypadkowi 1 ,
tak więc odpowiedzią jest (N + 1)/2N. 13 . Tak. W rzeczywistości z dowodu twierdzenia H wynika, że jeśli dla ustalonego k usuniemy k -ty ze wstawianych elementów, to otrzym ane drzewo będzie zawsze losowe. (G. D. K n ott [Ph.D. thesis, Stanford, 1975] pokazał, że zawsze otrzym am y losowe drze wo, jeśli po wykonaniu losowego ciągu wstawień usuniemy kolejno elem enty wstawiane jako fci-szy z k o le i,.. fcd z kolei dla każdego ustalonego ciągu k \, . . . , kd)> 14 . Niech NODE(T) leży na poziomie k i niech LLINK(T) = A, RLINK(T) = Ri, LLINK(Ri) = R2 , LLINK(Rd) = A, gdzie R<* ^ A i d ^ 1. Niech NODE(Ri) ma ni węzłów wewnętrznych w swoim prawym poddrzewie dla 1 ^ i ^ d. Zastosowanie kroku D l^ zmniejsza długość ścieżki wewnętrznej o k + d-\-n\ H + n^; bez tego kroku długość ścieżki zmniejsza się k + d + Ud1 5 . 1 1 , 13, 25, 11, 12. [Jeśli aj jest (najm niejszym , środkowym, najw iększym ) ele mentem wśród { a i , a 2 , a 3 }, to po wykonaniu usuwania dostaniem y (4 ,2 ,3 ) x 4 razy drzewo v\^ ]. 16 . Tak; nawet operacja usuwania dla perm utacji, tak ja k zdefiniowano w dowodzie twierdzenia H, jest przemienna (jeśli pominiemy aspekt przenum erowania). Jeśli istnieje element między X a 7 , usuwanie jest oczywiście przemienne, ponieważ w ynik operacji zależy wówczas tylko od względnego położenia X , Y i ich następników, a operacje usuwania X i Y nie oddziałują na siebie. Z drugiej strony, jeśli Y jest następnikiem X i Y jest największym elementem, usuwanie w dowolnej kolejności daje ten sam efekt co po prostu usunięcie X , a potem Y. Jeśli Y jest następnikiem X i Z jest następnikiem
y,
766
ODPOWIEDZI DO ĆW ICZEŃ
6.2.2
wykonanie usunięć w dowolnej kolejności daje ten sam efekt polegający na zastąpieniu pierwszego w ystąpienia X , Y lub Z przez Z i usunięciu drugiego i trzeciego wystąpienia tych elementów z perm utacji, o której mowa w dowodzie twierdzenia H. 18 . Skorzystaj z ćwiczenia 1.2 .7-14. 19 . 2H n — 1 - 2X]£Li(& “ l ) $/ k N e = 2H n - 1 - 2 /0 + 0 ( N ~ e). [Ten asym ptotyczny wynik, z dokładnością do 0 ( n ~ e lo g n ), dostajem y także dla rozkładu Pareto 6 . 1 - ( i 3 )]. 20. Tak, może. Załóżmy, że K \ < * • • < K n , a zatem drzewo zbudowane za pomocą algorytm u T jest drzewem zdegenerowanym; jeśli, powiedzmy, pk = ( l + ((N + l)/2 — k)e)/N, to średnia liczba porównań wynosi (N + l ) / 2 — (N 2 — l)e / 12 , podczas gdy drzewo optym alne w ym aga mniej niż [lg 7V~| porównań. 21. |,
| . (W iększość z kątów ma 30°, 60° lub 90°).
22. To jest oczyw iste dla d — 2, a dla d > 2 mieliśmy r[i,j —1] ^ r[i + l, j — 1 ] ^ r[z + l , j ] . 23.
[Powiększanie wagi pierwszego w ęzła spowoduje w końcu przesunięcie go do korzenia; to wskazuje, że dynam iczne utrzym yw anie w pełni optym alnego drzewa jest trudne]. 24. Niech c będzie kosztem drzewa otrzym anego w w yniku usunięcia n-tego węzła z drzewa optym alnego. Wówczas c ( 0 ,n —1) ^ c ^ c(0, n) — qn~i, ponieważ operacja usuwania zawsze przesuwa \n —1 o jeden poziom wyżej. Również c(0, n) ^ c(0, n —1 ) + qTl i • ponieważ opisana zam iana daje drzewo o koszcie z prawej strony nierówności. W ynika stąd, że c(0, n —1) — c — c(0, n) — qn~ i.
25. (a) Załóżm y, że A ^ B i B ^ C , i niech a £ A , 6 € 5 , c £ C , c < a. Jeśli c ^ 6 , to c £ £?; stąd c £ A i a £ S ; stąd a £ C. Jeśli c > 6 , to a £ £?; stąd a £ C i c G 5 ; stąd c £ A . (b) Nietrudno to udowodnić. 26. K oszt każdego drzewa jest postaci y + lx dla pewnej liczby rzeczywistej y ^ 0 i pewnej liczby całkowitej / > 0. M inimum ze skończonej liczby takich funkcji (brane po w szystkich drzewach) jest zawsze opisanej postaci. 27. (a) Z odpowiedzi do ćwiczenia 24 (szczególnie z faktu, że c = c (0 ,u —1)) wynika, że R(0, n —1) = i?(0, n) \ {n }. (b) D la l = V w ynik ze wskazówki jest oczywisty. W przeciwnym razie niech ścieżkami prowadzącym i do [n\ będą n
soJ ; [si
Si>
Ponieważ r = ro > so = s i ry < sv — n, możemy znaleźć poziom fc ^ 0, taki że rfe > i r fc+i ^ Sfc+i. P rzez indukcję mam y r fe+i £ R ( r k,n), sk+1 £ R (s fe,n ) oraz R(sfc,n) ^ i?(rfc,n), a stąd r k+i £ R ( s k,n) i sk+i £ R(rk,n)] z tego już dostajem y wynik ze wskazówki.
ODPOWIEDZI DO ĆW ICZEŃ
6.2.2
767
Teraz, żeby pokazać, że R fh R h, niech r £ R'h, s £ R h , s < r i rozważm y przedstawione optym alne drzewa dla x — Xh\ musimy mieć l ^ lh i możemy założyć, że l* — lh- Żeby udowodnić, że Rh ^ R/i+i> niech r C Rh, s £ R'h+1 , s < r, i rozważm y przedstawione optym alne drzewa, gdy o: = Xh+1 ; musimy mieć lf ^ lh i możemy założyć,
ze l ~ lh. 29. Jest to zdegenerowane drzewo (zobacz ćwiczenie 5), w którym YOU jest na szczycie, a THE na spodzie. W tym przypadku wyszukiwanie w ym aga średnio 19.158 porównań. Douglas A. Hamilton udowodnił, że pewne zdegenerowane drzewo jest zawsze najgorsze, a co za tym idzie istnieje algorytm d ziałający w czasie G (n 2), który znajduje „pesymalne” drzewa wyszukiwań binarnych. 30. Zobacz R. L. Wessner, Information Processing Letters 4 (1976), 9 0 -94; F. F. Yao, SIAM J. Algebraic and Discrete Methods 3 (1982), 532-540 .
31. Zobacz Acta Informática 1 (1972), 3 0 7 -3 10 . 32. Jeśli M jest w ystarczająco duże, optym alne drzewo musi być takiej postaci, ja k opisano w ćwiczeniu, a minimalny koszt musi wynosić M razy minimalna długość ścieżki zewnętrznej plus rozwiązanie naszego problemu. [Uwagi: W pracy Wessnera, cytowanej w odpowiedzi 30, m ożna znaleźć opis tego, w jaki sposób znajdować optym alne drzewa wyszukiwań binarnych o wysokości ^ L. Szczególny przypadek, gdy pi = ■• • = pn = 0, był badany przez T . C. Hu i K . C. Tana, M R C Report 1 1 1 1 (Univ. of W isconsin, 1970). A . M. Garsia i M. L. Wachs udowodnili, że gdy minfc=1 (gfc-i + qk) ^ n x a x ^ ^ =0^ , to w szystkie w ęzły zewnętrzne znajd ą się na co najwyżej dwóch sąsiednich poziomach. Podali oni także algorytm znajdowania optymalnego, dwupoziomowego drzewa w czasie 0(n)]. 33. Zobacz A. Itai, SICOMP 5 (1976), 9 - 1 8 , gdzie om awiany jest sformułowany przez nas problem. Omówienie alternatyw nych problemów można znaleźć w pracy D. Spulera, A cta Informática 31 (1994), 729-740 . 34. Z przybliżenia Stirlinga wynosi ona 2 H(P1 ,...,Pn)iV(27r iv )(l-n )/ 2 (pi
jeśli pi .. .p n
pn)- 1 /2 ( 1 + 0 (1/N)),
0.
35. Minimalną wartość z prawej strony nierówności dostajemy, gdy 2x = (1 — p)/p, i jest ona równa 1 — p + H(p, 1 — p). A le z (2 0 ), biorąc k = 2, m am y H(p,q,r) ^ 1 - p + H(p, 1 - p ) .
36. Najpierw udowodnimy wskazówkę; ten wynik pochodzi od Jensena [Acta Math. 30 (1906), 17 5 -19 3 ]. Jeśli / jest wklęsła, funkcja g(p) = f ( p x + (1 — p)y) — p f ( x ) — (1 — p)f(y) jest w klęsła i spełnia #(0) = g( 1 ) = 0. Jeśli g(p) < 0 i 0 < p < l , to musi istnieć wartość po < p, dla której g*(po) < 0 , i wartość pi > p, dla której g'(pi) > 0 , co wynika z twierdzenia o wartości średniej; ale to przeczy założeniu o wklęsłości. Dlatego f ( p x + (1 - p)y) ^ pf{ x) + (1 - p)f{y) dla 0 ^ p ^ 1, co jest faktem , który jest także geom etrycznie oczywisty. Teraz możemy udowodnić przez indukcję, Że f(piXi + ■ * ■+ PnXn) ^ P l f ( x i ) + * ' * + P n f ( x n ), gdyż f + ■• ’ + pnXn) ^ P l f ( x i ) + ■■■ + Pn~2f(Xn~2) + (Pn-1 + P n ) / ( ( P n - l X n - l + PnXn) / (Pn- 1 + P n ) ) , jeśli n > 2. Z lematu E mamy
m H(XY)
=
H( X ) +
Pi H( rn / p i , r in/pi)\
ODPOWIEDZI DO ĆW ICZEŃ
768
6.2.2
a ta ostatnia suma jest równa £ " =1 S i l i Pi f ( rij/Pi) ć S " = i / ( S U i rij) = H( Y) , gdzie f ( x ) — x l g ( l / x ) jest wklęsła. 37. Z części (a) ćwiczenia 3.3.2-26 mamy, że Pr (Pi ^ s) — (1 — s)n_1. Dlatego E H ( P u . . . t Pn) = n E P x lg ( l/ P i) =
-
-~(A + P ) / l n 2 ,
gdzie A ~ n / ^ (l - s)n~1ds — 1 i
B =nj
( 1 - s ) n_ 1 ln s
^
ds = ^ k
(—l ) /es fc
- Ins^ I — - H n ,
1
10
co w ynika z ćwiczenia 1.2 .7-13. Tak więc odpowiedzią jest (H n —1 )/ ln 2 . (To jest równe lg n + ( 7 — l ) / l n 2 + 0 (n - 1 ) i jest bardzo bliskie maksymalnej entropii Z f( ^ ,. . . , = lg n . D latego H ( p x, . . . ,p n) jest równe z dużym prawdopodobieństwem f2(logn)). 38. Jeśli Sk~i = Sfc, to mam y ćpc_i = Pk = = 0; zobacz (2 6 ). Zbudujmy drze wo dla n — 1 prawdopodobieństw ( p i ,. . . ,p fc_ i,p fc+i , . . . ,p n ; q0, . • •, <7k-
+ qkl + qk- 2 l k - 2 ~ qk)(l ~ h - 2 ); jest
2
Podobnie, jeśli k ^ s + 4, to opisane przemieszczenie zmienia koszt o £ = ęs+4 , . . . , qk- 2 >
Dlatego widzimy, że
£ ^ (^fc- 2 — qk){l — Zfe-2 ) + (
^
q k -z {l — ls+ i)
+
qk-~2{l — l s +
2) +
q k -3 {ls+ i
¿s+3) + ■■* 4-
q k - 2 ( l k - 4 : ~~ l k -
2)
4 qk—1 (Zfc—3 —l) 4- qk(lk~2 — l) i podobnie, gdy k — s jest nieparzyste. W ynika stąd, że ó jest ujemna, chyba że lk -
2
= Z.
4 1. E F G H T U X Y Z V W B C D A P Q R J K L M I N O S u * 42. Niech qj = WT(Pj). K luczow ą obserwacją jest to, że po wykonaniu kroków C 2 - C 6 wszystkie q są większe od lub równe początkowej wartości qk - 1 4 qk43. W yw o łaj rekurencyjną procedurę mar k (P i,0 ), gdzie mar&(P,Z) oznacza: LEVEL(P) <- Z; jeśli LLINK(P) ^ A, to mark (LLINK(P),/ + 1); jeśli RLINK(P) ^ A, to mark (RLINK(P) ,1 + 1).
ODPOWIEDZI DO ĆW ICZEŃ
6.2.3
44. W ykonaj dla zmiennych globalnych przypisania t rencyjną procedurę build ( 1 ), gdzie build (l) oznacza:
769
0, m <— 2n i w yw ołaj reku-
j m; jeśli LEVEL(X*) = /, to wykonaj LLINK(Xj) <- t i t <- t + 1, w przeciwnym razie wykonaj m <— m — 1, LLINK(X^) +— Xm ibuild (l + 1); jeśli LEVEL(Xt ) = Z, to wykonaj RLINK(Xj) <- t i t t + 1, w przeciwnym razie wykonaj m < — m — 1, RLINK(Xj) <— Xm ibuild (l + 1). Zmienna J jest zmienną lokalną w procedurze build. [To eleganckie rozwiązanie pochodzi od R. E. Tarjana, SICOMP 6 (1977), 639]. Ostrzeżenie: D la liczb /o, .. -, Zn, które nie odpowiadają żadnemu drzewu binarnemu, algorytm zapętli się]. 45. Należy zorganizować roboczą tablicę Po, . . . , Pt w listę dwukierunkową, na której także znajdują się dowiązania pewnego drzewa zrównoważonego (zobacz punkt 6.2.3). Jeśli 2 -malejącymi wagami są qo, . . . , qt, z qj w korzeniu drzewa, możemy zdecydować, czy pójść w drzewie w lewo, czy w prawo, na podstawie wartości qj i qj+\\ lista dwukierunkowa umożliwia bezpośredni dostęp do qj+1 . (Nie potrzebujem y żadnych pól RANK na pamiętanie elementów na liście; rotacje zachowują porządek sym etryczny, a zatem nie w ym agają żadnych zmian na liście). Hu i Morgenthaler, Lecture Notes in Comp. Sci . 1 1 2 0 (1996), 234-2 43, poka zali szereg rodzin wag, dla których ten problem m ożna rozwiązać w czasie 0(n)\ nie wiadomo, czy w ogólnym przypadku 0( n ) kroków wystarcza.
46. Zobacz IEEE Trans. C -23 (1974), 2 6 8 -2 71; zobacz także ćwiczenie 6.2.3-21. 47. Zobacz Altenkam p i Mehlhorn, JA CM 27 (1980), 4 12 -4 2 7 . 48. Nie należy się przestraszyć skomplikowaną analizą przypadków N — 3 [Jonassen i Knuth, J. Comp . Syst. Sci. 16 (1978), 301-322] lub 7V = 4 [Baeza-Yates, B I T 29 (1989), 378-394]; należy myśleć pozytywnie! Pewien postęp został dokonany przez Loucharda, Randrianarim anana’ego i Schotta, Theor. Comp. Sci. 93 (1992), 2 0 1-2 2 5 .
49. Ten problem jako pierwsi badali J. M. Robson [Australian Comp. J. 11 (1979), 1 5 1 -1 5 3 ], B. P ittel [J. Math. Anal. Applic. 103 (1984), 461-480] i Luc Devroye [JACM 33 (1986), 489-498; A c ta Inf. 24 (1987), 2 77-298 ], którzy podali graniczne w zory zachodzące z prawdopodobieństwem —> 1 , przy n —►oo; zobacz omówienie H. M. Mahmouda, Evolution of Random Search Trees (Wiley, 1992), rozdział 2. Później do kładniejsze wyniki podali Luc Devroye i Bruce Reed, SICOMP 24 (1995), 1 1 5 7 - 1 1 6 2 , którzy udowodnili, że średnia wysokość wynosi a Inn + O (lo g lo g n ), a w ariancja jest równa O (lo g lo g n )2, gdzie a = l/ T ( l/ 2 e ) w 4.311070407001005 03504 70760 96446 890 2783916a T(z) =
n n~1z n/n\ jest funkcją drzewową.
6.2.3 1 . Operacje na drzewie muszą zachowywać porządek sym etryczny, w przeciwnym
razie drzewo nie byłoby drzewem wyszukiwań binarnych.
2. B(S) = 0 może zdarzyć się tylko wtedy, kiedy S wskazuje na korzeń drzewa i wszystkie w ęzły z S do miejsca wstawienia b y ły zrównoważone ( B(S) nigdy nie ulega zmianie w krokach A3 lub A4). 3. Niech ph będzie najw iększym m ożliwym stosunkiem węzłów niezrównoważonych do wszystkich węzłów w drzewie zrównoważonym o wysokości h. Tak więc pi = 0, p 2 = p 3 = | . Udowodnimy, że ph = {Fh+1 — l) / ( ife +2 — !)• Niech Th będzie drzewem, które
770
ODPOWIEDZI DO ĆWICZEŃ
6.2.3
m aksym alizuje ph\ możemy wówczas założyć, że jego lewe poddrzewo ma wysokość h — 1 , a jego prawe poddrzewo wysokość h — 2 , ponieważ gdyby oba poddrzewa m iały wysokość h —1 , nasz stosunek b yłb y m niejszy od ph-i . Tak więc poszukiwany stosunek dla Th wynosi co najw yżej (ph- i N i + p h- 2N r 4 l) / ( A ^ 4 iV r 4 l) , gdzie ( N i ,N r) to liczby węzłów w lewym i prawym poddrzewie. To wyrażenie przyjm uje największą wartość, gdy (Ni, N r) są najmniejsze; zatem możemy przyjąć, że Th jest drzewem Fibonacciego. N atom iast z ćwiczenia 1.2.8-28 mam y ph < < />— 1. 4. G d y h = 7, drzewo
m a ścieżkę wewnętrzną o większej długości. [Uwaga: C. C. Foster, Proc. AC M Nat. Conf. 20 (1965), 1 9 7 -1 9 8 , podał niepoprawny algorytm konstrukcji N-w ęzłow ych drzew zrównoważonych o ścieżkach wewnętrznych maksymalnej długości; Edward Logg zauw ażył, że rozwiązanie Fostera, przedstawione w jego pracy na rysunku 3, daje nieoptym alny w ynik po 24 krokach (można usunąć węzeł z numerem 22 na korzyść w ęzła o numerze 25)]. Drzewo Fibonacciego rzędu h minimalizuje jednak wartość (h 4 a)N — (długość ścieżki zewnętrznej (T )) po w szystkich drzewach zrównoważonych T o wysokości h — 1, gdy a jest nieujemną stałą; to m ożna łatw o udowodnić przez indukcję względem h. D łu gość ścieżki zewnętrznej w tym drzewie wynosi Ę-hFh-i + ^(h —l)Fh = {/V5)hFh+i 4
0(Fh+ 1 ) = 0(h>h). C o za tym idzie, długość ścieżki w dowolnym drzewie iV-węzłowym wynosi co najw yżej mm(hN - e(hk) + O(N)) sC N log. N - N log. log. N + O(N). h Ponadto, jeśli N jest duże i k = [lg AT], h = [k/ Ig < f>- log^ k\ = log 0 N - log^ log 0 N + 0 ( 1 ), to w następujący sposób możemy skonstruować drzewo zrównoważone o długości ścieżki h N + O(N). Zapisujem y N + 1 = Fh + Fh ~i + • • * 4- Fk+i 4- N ' = F h + 2 — Ffc+2 + N* i budujem y zupełne drzewo binarne o N f węzłach; następnie łączym y je kolejno z drzewam i Fibonacciego rzędu k, k + 1, h —1. [Zobacz R. Klein i D. Wood, Theoretical Comp . Sci. 72 (1990), 2 51-264]. 5. To m ożna udowodnić przez indukcję; jeśli przez T m oznaczym y budowane drzewo, to mamy jeśli 2 n ^ N < 2 n + 2 ” " 1; T 2n-l_ x
Tn —2n~ 1
Tn = / ^ \ , Tn - 2n
jeśli 2n 4 2 n_1
< 2 n+1.
T2- _ i
6 . W spółczynnikiem przy z n w z B j ( z ) B k {z) jest liczba n-węzłowych drzew binar nych, których lewe poddrzewo ma wysokość j, a prawe poddrzewo jest drzewem zrów noważonym o wysokości k.
7. Cn+i = C'n + 2Bn- i B n-2] zatem, jeśli weźmiemy eto = l n 2 , cti — 0 i a n+2 = ln (l 4- 2Bn+iBn/ C i‘ +2) = 0 ( l / B nCn+2) oraz 6 = e x p (a 0/ 2 4- cti/4 4- ct2/ 8 4 ■■ *),
ODPOWIEDZI DO ĆW ICZEŃ
6.2.3
771
widzimy, że 0 ^ O2™— Cn = Cn (exp(an/2 4 a n+1 / 4 + ■•■) — l) < 1 ; stąd Cn = [O2™J. Ogólniejsze wyniki dla ciągów podwójnie w ykładniczych znajdziem y w czasopiśmie Fibonacci Quarterly 1 1 (1973), 4 2 9 -4 3 7. W yrażenie dla 6 zbiega szybko do wartości
6 = 1.43687 28483 94461 87580 04279 84335 54862 92481+. 8 . Niech bh = B h l (l) /B h{l) 4 1 i niech en ~ 2BhB h- 1{bh - bh- i ) / B h+i. W ówczas bi = 2 , bh + 1 = 2bh - t h i th = 0 ( b h / B h - 1 ); stąd bh - 2h/3 4 rh, gdzie
¡3 =
1 - le i - § e2 ------- = 0.70117981510202633972 44868 92779 46053 746164
ar/t = €h/24€h+i/4H jest niezmiernie m ałe dla dużych h. [Żurnał Wyczisl. Matiem. i Matiem. Fiziki 6 , 2 (1966), 38 9-394. Analogiczny w ynik dla 2-3-drzew uzyskał E. M. Reingold, Fib. Quart. (1979), 1 5 1 -1 5 7 ] .
17
9.
Andrew O dlyzko pokazał, że liczba drzew zrównoważonych jest asym ptotycznie równa crl/ (lo g (vT 0+ 2)/3 n)/n , gdzie c w 1.916067 i f ( x ) = f ( x 4 1). Zastosowana przez niego m etoda pozw ala także uzyskać asym ptotyczną średnią wysokość. [Zobacz pracę w Congressus Numerantium (1984), 2 7 -5 2 , w której przelicza się także 2-3-drzewa].
42 10.
17
[Inf. Proc. Letters (1983), 17 -2 0 ] Niech Xi, . . . , Xyv będą węzłam i, których współczynnikami zrównoważenia są B (X^). Żeby zbudować żądane drzewo, wykonujem y k< — 0, a następnie w yw ołujem y TREE(oo), gdzie TREEChmax) jest poniższą procedurą rekurencyjną ze zmiennymi lokalnymi h, h! i Q. W ykonaj h 0, Q A; następnie dopóki h < hmax i k < N wykonuj fc +— /c 4 1, hł h + B(Xfc), LEFT(Xfc) <— Q, RIGHT(Xfc) TREEC/i'), h m ax(h, h') + l, Q X^; zwróć Q. (Drzewo Q ma wysokość h i odpowiada współczynnikom zrównoważenia, które zostały pobrane po w yw ołaniu tej procedury). Ten algorytm działa także dla wartości |B(X*)| > 1.
11.
+A +A -A,
Jest oczywiste, że dla n ^ 2 mam y tyle samo węzłów typu co — B i +-B. Istnieje także sym etria między + a -. Jeśli istnieje M węzłów typu lub to rozważenie wszystkich możliwych przypadków dla n ^ 1 pokazuje, że w w yniku następnego losowe go wstawienia dostaniem y M — 1 takich węzłów z prawdopodobieństwem 3 M / ( n 4 1), a w przeciwnym razie dostaniem y M 4 1 takich węzłów. Z tego wynika ju ż teza ćwiczenia. [SICOMP 8 (1979), 3 3 -4 1]; K urt Mehlhorn rozszerzył tę analizę na zadanie usuwania [SICOMP 1 1 (1982), 748-780]. R. A. B aeza-Yates [Computing Surveys (1995), 10 9 -119 ], przedstawił podsumowanie późniejszych wyników uzyskanych za pomocą takiej właśnie „analizy frędzelkowej” , w której zazw yczaj korzysta się z m etod przedstawionych w ćwiczeniu 6 .2 .4-8.
27
12 . Maksimum pojaw ia się, gdy nowy węzeł wstaw im y do drugiego w ęzła zewnętrznego w drzewie z rysunku ( 1 2 ); C = 4, C l — 3, D = 3, A = C2 = F = G1 = H I = U 1 = 1, co daje łączny czas 132u. Minimum pojaw ia się, gdy nowy węzeł wstaw im y do trzeciego od końca węzła zewnętrznego w drzewie z rysunku ( 1 3 ); C = 2 , C l = C 2 = 1 , D — 2 , co daje łączny czas 61u. [Odpowiednimi wielkościami dla programu 6.2.2T są 74 u i 26u].
13.
O
G d y drzewo zmienia się, wówczas w ystarczy tylko (log N) zm ian wartości „proste” rozwiązanie m ogłoby wym agać bardzo wielu zmian.
RANK;
14.
Tak. (Jednak typowe operacje listowe są m ało losowe, tak więc prawdopodobnie pojaw iłyby się drzewa zdegenerowane).
15.
W ykonaj algorytm 6.2.2T z m inicjowanym na zero w kroku T l . Następnie w kroku T2, zawsze gdy K , wykonuj m <— m 4 .
^ KEY(P)
RANK(P)
772
ODPOWIEDZI DO ĆWICZEŃ
6.2.3
16 . Usuwam y E; wykonujem y wyważanie w D z przypadku 3. Usuwamy G; zastępujemy F przez G; wykonujem y wyważanie w H z przypadku 2; poprawiamy współczynnik zrównoważenia w K.
19 . (Rozwiązanie zaproponowane przez Clarka Crane’a) T ylko w jednym przypadku nie w ystarcza pojedyncza lub podw ójna rotacja w korzeniu, a mianowicie
.
Zmieniamy na
ODPOWIEDZI DO ĆW ICZEŃ
6.2.3
773
i rozwiązujemy problem nierównowagi za pom ocą pojedynczej lub podwójnej rotacji w C. 20. Trudno jest wstawić nowy węzeł jako skrajnie lewy w drzewie
jednak K.-J. Raiha i S. H. Zweben znaleźli ogólny algorytm , który d ziała w O (logW ) krokach. [CACM 2 2 (1979), 508-512].
N l o g N kroków (zobacz ćwiczenie 5); poniższy algorytm buduje takie same drzewa w O(N) krokach za pomo 2 1 . Algorytm A potrzebuje na wykonanie tej pracy rzędu
cą interesującej, iteracyjnej interpretacji m etody rekurencyjnej. W ykorzystujem y trzy pomocnicze listy: Di , . . . ,Dj (licznik binarny służący w zasadzie do kontroli rekursji); J i , . . . , J i (lista wskaźników na w ęzły łączące); T i , . . . , Ti (lista wskaźników na drzewa). Tutaj l = [~lg(A+l)~|. D la w ygody przyjmujemy, że mam y także Do <— 1, Jo <— Ji+i G l . [Inicjowanie] l <— 0, Jo
A.
Ji <— A, Do <— 1.
G 2 . [Pobranie następnego elementu] Niech P wskazuje na następny węzeł wejścio wy. (Możemy w yw ołać jeszcze jeden podprogram , żeby otrzym ać P). Jeśli nie ma już więcej danych na wejściu, to przejdź do G5. W przeciwnym razie wykonaj A: — 1, Q A i dokonaj zam iany P <-+ J i. G 3 . [Przeniesienie] Jeśli k > l (lub równoważnie jeśli P = A), to w ykonaj l < — 1+ 1, Dk 1 , Tfc «— Q, Jfc+i A i wróć do G 2 . W przeciwnym razie wykonaj Dk <— 1 — Dfc, zamień Q <-+ T*,, P Jfc+i i zwiększ k o l . Jeśli teraz Dk- i ~ 0, to powtórz ten krok. G 4 . [Sklejanie] W ykonaj LLINK(P) <- Tfe) RLINK(P) <- Q, B(P) <- 0, Tk <- P i wróć do G 2 . G 5 . [Zakończenie] W ykonaj LLINK(Jfc) <— T*,, RLINK(Jfe) <— Jfc_i, B(Jfc) 1 —D^-i dla 1 ^ k /. Następnie zakończ wykonywanie algorytmu; J/ wskazuje na korzeń poszukiwanego drzewa. | Krok G3 jest wykonywany 2N — v(N) razy, gdzie v( N ) jest liczbą jedynek w reprezen tacji binarnej liczby N . 2 2 . W ysokość drzewa zrównoważonego wagowo o
N węzłach wewnętrznych zawsze leży
między Ig (A -j-l) a 21g(7V + l). Żeby otrzym ać górne ograniczenie zauważmy, że cięższe poddrzewo korzenia ma co najw yżej ( N + l)/\/2 węzłów zewnętrznych. 23. (a) Weź drzewo, którego prawym poddrzewem jest zupełne drzewo binarne o 2n — 1 węzłach, a którego lewym poddrzewem jest drzewo Fibonacciego o F n+i — 1 węzłach, (b) Weź zrównoważone wagowo drzewo, dla którego wysokość prawego poddrzew a wynosi około 2 lg A , a wysokość lewego poddrzewa wynosi około lg AT (zobacz ćwiczenie 2 2 ).
774
ODPOWIEDZI DO ĆWICZEŃ
6.2.3
24. Rozw ażm y najm niejsze drzewo, które spełnia podany warunek, ale nie jest dosko nale zrównoważone. W ówczas jego lewe i prawe poddrzewa są doskonale zrównoważone i m ają odpowiednio 2l i 2r węzłów zewnętrznych, gdzie l ^ r. To jest jednak sprzeczne z podanym warunkiem. 2 5. Po wstawieniu nowego w ęzła na dole drzewa posuwamy się w górę, spraw dzając wa runek równowagi w każdym węźle na ścieżce wyszukiwania. Załóżmy, że nierównowaga pojaw ia się w węźle A z (i), po wstawieniu nowego węzła do jego prawego poddrzewa, gdzie B i jego poddrzewa są zrównoważone wagowo. Wówczas, jeśli (|a| -f |/?|)/|7 | ^ \/2 + l , gdzie |x| oznacza liczbę węzłów zewnętrznych w drzewie x, to pojedyncza rotacja przyw raca równowagę. W przeciwnym razie m ożna pokazać, że w ystarcza podwójna rotacja. [Zobacz SICOMP 2 (1973), 33-43]. 2 7. Czasam i w węźle zaw ierającym dwa klucze musimy wykonywać dwa porównania. N ajgorszy przypadek w ystępuje dla drzewa podobnego do tego z rysunku poniżej, kiedy to czasam i potrzebnych jest 2 lg(iV + 2 ) — 2 porównań.
29. A. Y ao dał częściowe rozwiązanie. D la N ^ 6 kluczy najniższy poziom będzie zawierał średnio 1 ( ^ + 1 ) węzłów z pojedynczym i kluczami i y (IV + 1 ) węzłów dwukluczowych. D la dużych N średnia liczba wszystkich węzłów leży między 0.70N a 0.79A. [Acta Informatica 9 (1978), 15 9 -17 0 ].
30. W przypadku najlepszego dopasowania rekordy należy rozmieścić w porządku ich rozmiarów, przy dowolnej zasadzie rozstrzygania kolejności w przypadku równo ści. (Zobacz ćwiczenie 2.5-9). W przypadku strategii pierwszy dobry, rekordy należy rozmieścić w porządku ich lokacji. Dodatkowo każdy węzeł należy rozszerzyć o pole mówiące, jaki jest rozmiar największego obszaru w poddrzewie o korzeniu w tym węźle. Praw idłow ą wartość tego pola można zachować podczas wstawiania i usuwania. (Chociaż czas działania w tym przypadku wynosi O (lo g n ), to w praktyce metoda „WĘDROWCA” z ćwiczenia 2.5-6 nadal w yd aje się być lepsza; jednak rozkład wolnych obszarów powinien być lepszy tu ta j, ponieważ zazw yczaj znajdzie się duży, pusty obszar na potrzeby sytuacji w yjątkow ych). Lepszą m etodę znalazł R. P. Brent, A C M Trans. Prog. Languages and Systems 11 (1989), 388-403. 31. K orzystam y z prawie zrównoważonego drzewa, w którym na skrajnie lewej ścieżce m am y dowiązania w górę. Dodatkowo mam y stos, na którym pam iętam y przesunięte na później aktualizacje wskaźników zrównoważenia z tej ścieżki. (W każdym wstawieniu wykonujem y ograniczoną liczbę takich aktualizacji). Ten problem daje się uogólnić w taki sposób, żeby m ożna było w O (logra) krokach znajdować, w staw iać i/lub usuwać elementy, które znajdują się w odległości co najwyżej m kroków od dowolnego danego „słupka” , gdzie za słupek w dalszych operacjach może służyć dowolny raz zlokalizowany klucz. [Zobacz S. Huddleston i K . Mehlhorn, Acta Inf. 17 (1982), 15 7 -18 4 ]. 32. K ażd a rotacja w prawo zwiększa jedną z wartości r, nie zm ieniając pozostałych; zatem r k ^ rk jest warunkiem koniecznym. Żeby pokazać, że jest to warunek w ystar
6.2.4
ODPOWIEDZI DO ĆW ICZEŃ
775
czający załóżmy, że r\, = r ' dla 1 ^ j < k, ale r k < r'k. W ówczas istnieje rotacja w prawo, która zwiększa wartość rk do wartości ^ r k, ponieważ liczby r i r 2 - -- r n spełniają warunek z ćwiczenia 2.3.3-19(a). Uwagi: Ten częściowy porządek, wprowadzony po raz pierwszy przez D. Tamariego w 1951 roku, ma wiele interesujących własności. K ażde dwa drzewa m ają największe dolne ograniczenie T A T ( wyznaczone przez rozm iary praw ych poddrzew m in(r 1 ,r'1) m in(r2, r 2) . . . m in(rn ,r^ ), ja k i najm niejsze górne ograniczenie T v T ' w y znaczone przez rozm iary lewych poddrzew min(/x, l[) min(/2, ¡2 ) • • • min(Zn , lfn ). Rozm ia ry lewych poddrzew są oczywiście o jeden mniejsze od wartości pól RANK z algorytm ów B i C. Dalsze informacje na ten tem at można znaleźć w pracach: H. Friedm an i D. Tam ari, J. Combinatorial Theory 2 (1967), 2 15 -2 4 2 , 4 (1968), 201; C. Greene, Europ. J. Combinatorics 9 (1988), 225-240; D. D. Sleator, R. E. Tarjan i W . P. Thurston, J. Amer. Math. Soc. 1 (1988), 6 4 7 -6 8 1; J. M. Pallo, Theoretical Informatics and Applic. 2 7 (1993), 341-348 ; M. K . Bennett i G. Birkhoff, Algebra Universalis 32 (1994), 1 1 5 -1 4 4 ; P. H. Edelm an i V . Reiner, Mathematika 43 (1996), 1 2 7 - 1 5 4 . 33. Najpierw możemy zm niejszyć pamięć do jednego bitu A(P) w każdym węźle P, tak że B(P) = A(RLINK(P)) - A(LLINK(P)), zawsze kiedy LLINK(P) i RLINK(P) są niepuste; w przeciwnym razie wartość B(P) jest ju ż znana. Ponadto możemy założyć, że A(P) = 0, jeśli oba dowiązania LLINK(P) i RLINK(P) są puste. Wówczas A(P) m ożna wyelim ino wać z pozostałych węzłów, zamieniejąc LLINK(P) z RLINK(P), gdy tylko A(P) = 1; porównanie KEY(P) z KEY(LLINK(P)) lub KEY(RLINK(P)) w yznaczy A (P ). O czywiście na maszynach, na których wskaźniki są zawsze parzyste, w każdym węźle mam y już dwa nieużywane bity. Możliwe są dalsze oszczędności podobne do tych z ćwiczenia 2.3.1-37.
6.2.4
(Oczywiście w 5 *-drzewie żaden z węzłów różnych od korzenia nie może zawierać 3 kluczy, chociaż tak jest w przypadku drzewa z rysunku 30).
776
ODPOWIEDZI DO ĆW ICZEŃ
6.2.4
3. (a) 1 + 2 ■50 + 2 • 51 • 50 + 2 ■51 ■51 ■50 = 2 * 5 13 - 1 = 265301. (b) 1 + 2 -5 0 + (2 -5 1 * 1 0 0 - 1 0 0 )+ ( ( 2 - 5 1 - 1 0 1 - 1 0 0 ) - 1 0 0 - 1 0 0 ) = 101 3 = 1030301. (c) 1 + 2 • 66 + (2 • 67 • 66 + 2) + (2 • 67 • 67 *66 + 2 • 67) = 601661. (Mniej niż w (b)!) 4. Przed podziałem w ęzła różnego od korzenia należy upewnić się, że ma on dwóch pełnych bliźniaków. Wówczas należy podzielić te trzy w ęzły na cztery. Korzeń należy dzielić tylko wtedy, kiedy zawiera więcej niż 3 |_(3m — 3)/4j kluczy. 5. Interpretacja 1, w której próbujem y zm aksym alizować podane minimum: 450. (N ajgorszy przypadek zdarza się, gdy m am y 1005 znaków, a klucz przesuwany w górę ma długość 50 znaków: 445 znaków + wskaźnik + klucz 50-znakowy + wskaźnik + klucz 50-znakowy + wskaźnik + 445 znaków). Interpretacja 2, w której próbujem y wyrównywać liczby kluczy po podziale w celu zagw arantow ania wysokiego stopnia rozgałęzienia w węźle: 155 (15 krótkich kluczy, a następnie 16 długich kluczy). Dalsze uwagi na ten tem at znajdziem y w pracy E. M. M cCreighta, CACM 20 (1977), 6 70 -6 74 . 6 . Jeśli usuwany klucz nie znajduje się na poziomie / — 1 , należy zastąpić go przez
następnika, a później przystąpić do usuwania następnika. Usunięcie klucza z poziomu l — 1 polega po prostu na w ym azaniu go; jeśli to spowoduje, że węzeł staje się zbyt m ało zapełniony, patrzym y na jego prawego (lub lewego) bliźniaka i próbujemy pobrać trochę kluczy od bliźniaka tak, żeby oba w ęzły m iały mniej więcej taką samą ilość danych. Taka operacja „przepływ u” kluczy nie udaje się tylko wtedy, kiedy bliźniak ma minimalne zapełnienie. Jednak w tym przypadku możemy oba w ęzły połączyć w jeden węzeł (razem z jednym z kluczy przynależnych do rodzica). Połączenie węzłów może spowodować, że teraz rodzic będzie m iał za mało kluczy, wówczas postępujemy analogicznie itd. W przypadku kluczy o zmiennej długości, takich o których mowa w ćwiczeniu 5, może zaistnieć potrzeba podziału węzła-rodzica w momencie, gdy jego klucze sta ją się dłuższe. D la danego drzewa T o N węzłach wewnętrznych niech będzie liczbą węzłów zewnętrznych, które w ym agają k dostępów i dla których węzeł-rodzic należy do stro ny zawierającej j kluczy. Niech A ^ \ z ) będzie odpowiednią funkcją tworzącą. Zatem A ^ ( l ) + • • • + A^m^(1 ) = N + 1. (Zauważmy, że jest wielokrotnością j + 1 dla 1 ^ j < M). Następne losowe wstawienie daje N + 1 jednakowo prawdopodobnych 8.
drzew, których funkcje tworzące otrzym ujem y, zm niejszając pewien współczynnik aj^ o j + l i dodając j + 2 do aj^+1\ lub (jeśli j = M) zm niejszając pewne a o 1 i dodając 2 do a . Teraz (z ) wynosi ( N + l ) ~ 1 razy suma, po w szystkich drzewach T , funkcji tw orzących A ^ \ z ) drzew T , pomnożonych przez prawdopodobieństwa pojaw iania się T . Z tego otrzym ujem y ju ż podane równania rekurencyjne. Te równania są postaci . . . , B (nm \ z ) ) t
=
(I +
(N
1
+
. . . , B {nm_ \ ( z ) ) T
= . . . = g N (W(z))( 0 , . . . , 0 , 1 ) T , gdzie _X
\
/
_
gn (x) = ^1 H-----— r ) • • • ( 1 + — ) = n + 17 "
V
2}
~
1
{X
x + l V
+ 71+1 Ti + l
W ynika stąd, że C'N = ( 1 , . . . , 1 )(B^ 1 )/( 1 ) , . . . , B j + ' ( l ) ) T = 2 B + )1 (l)/ (iV + 1) + = 2 / n ( W ) m m , gdzie f n (x) = gn- i ( x ) / ( n + 1 ) + ••• + go(x)/2 = (gn {x ) - l) / x , a W = VK(1). (Indeks M M wskazuje na element z dolnego-prawego narożnika macierzy).
ODPOWIEDZI DO ĆW ICZEŃ
6.2.4
777
Teraz W — S ~ l diag ( Ai , . . . , A m )5, dla pewnej m acierzy 5 , gdzie diag ( A i , . . . , Am) oznacza macierz przekątniową, której elementami są pierwiastki równania = (A + 2 ) . . . (A + M + 1 ) - (M + 1)!. (Te pierwiastki są różne, ponieważ z x ( A) = (A) — 0 wynika, że 1 / (A + 2) + • • • -f 1 / (A 4 - M + 1) = 0; to ostatnie może mieć miejsce tylko wtedy, kiedy A jest rzeczywiste i —M — 1 < A < — 2 , z czego wynika, że |A+ 2 | . . . |A + M + 1| < ( M + l) !, więc sprzeczność). Jeśli p(x) jest dowolnym wielomianem, p(W) = p ( 5 _1 diag ( A i , . . . , Am )5 ) = 5 _1 diag (p (A i),. . . ,p (A M))5 ; stąd wynika, że element w dolnym-prawym narożniku m acierzy p(W) ma postać cip(Ai)H Kcmp(Am) dla pewnych stałych c i , . . . , c m , niezależnych od p . Te stałe m ożna w yliczyć, biorąc p( A) — X(A)/(A — Aj); ponieważ (W k)u M = (—2)k dla 0 ^ k ^ M —'1 , to m am y p ( W ) m m = p ( - 2) = (M + l) !/ ( A j+ 2 ) = cjP{X3) - c ^ { \ s) = Cj- ( M + l) !( l/ ( A ,- + 2 ) + ■ •■ H-1 / (Aj + M + 1)); stąd Cj = (Aj + 2 ) 1 ( 1 / (Aj + 2) T ■• • + 1 / (Aj + M + 1)) . W ten sposób dostajem y „otwarty” wzór C N f = S j l i 2cj/jv(A j); pozostaje zbadać pierwiastki A j. Zauważmy, że |Aj + M + 1 1 ^ M + 1 dla w szystkich j , w przeciwnym razie m ielibyśm y |Aj + 2 | . . . |Aj + M + 1| > (M + 1 )!. Biorąc Ai = 0, otrzymujemy, że Sft(Aj) < 0 dla 2 ^ j ^ M. Na podstawie 1.2 .5 -(i5 ) mamy, że gn(x) ~ (n + l ) x/ T ( x + 2 ), gdy n —>oo; zatem pn(Aj) —►0 dla 2 ^ j ^ M. W konsekwencji C'N — 2 c i / n ( 0 ) + 0 (1 ) =
Uwagi: Pow yższa analiza ma również związek z algorytm em „sortowania przez próbkowanie” omawianym z grubsza w punkcie 5.2.2. Przeprowadzone obliczenia można łatwo rozszerzyć i pokazać, że £ ? ^ ( 1 ) ~ (H m +i ~ 1 ) -1/(J + 2 ) dla 1 j < M, 2 ? j^ ( l) ~ {Hm +i — l ) _1/2. Zatem ogólna liczba węzłów wewnętrznych na niezapełnionych stronach wynosi w przybliżeniu
( 1 2 M “ 1 ^ N _ fi V 3 x 2 + 4 x 3 + ' " + (M + l ) x A i J i f M + i - l “ V
M \ (M + l ) ( i f M+i ~ 1 ) /
;
a ogólna liczba wszystkich stron wynosi w przybliżeniu /
l
U x 2
N _ N + 4 x 3 + " ' + ( M + l ) x M + M + l ) H m +i ~ 1 ~~ 2(JTm+i - 1 ) ’ l
1
1
\
z czego wynika, że wykorzystanie pamięci wynosi asym ptotycznie 2{H m +i — 1 ) /2W. Powyższą analizę rozszerzyli M ahmoud i P ittel [J. Algorithms 1 0 (1989), 5 2 -7 5 ], którzy odkryli, że wariancja w ykorzystania pamięci przechodzi zaskakującą zmianę: dla M ^ 25 wariancja wynosi O(N)] jednak dla M ^ 26 jest ona asym ptotycznie równa f ( N ) N 1+2a, gdzie f { e * ^ N ) = /(IV), jeśli —~ a ( 3 i i —| + a — ¡3i są niezerowymi pierwiastkami A j z najw iększą częścią rzeczywistą. W ysokość takich drzew analizował L. Devroye [Random Structures and Algorithms 1 (1990), 191-203]; zobacz także B. Pittel, Random Structures and Algorithms 5 (1994), 33 7-3 4 7 . 9. Tak; dla przykładu w (i) moglibyśm y zam iast Ki wziąć i plus liczba kluczy w poddrzewach P o , . . . , P i - i . A lgorytm y wyszukiwania, wstaw iania i usuwania d ają się odpowiednio zmodyfikować. 10. Zgrubny szkic: należy rozszerzyć schemat stronicowania w taki sposób, żeby w da nej chwili dostęp do jednego bufora miał co najw yżej jeden użytkownik; należy także uważnie zmodyfikować algorytm y wyszukiwania, w stawiania i usuwania, żeby w yłączn y dostęp był zagwarantowany tylko przez ograniczony, absolutnie konieczny czas oraz żeby nie spowodować zastoju. Szczegóły można znaleźć w pracach: B. Sam adi, I n f Proc. Letters 5 (1976), 1 0 7 - 1 1 2 ; R. Bayer i M. Schkolnick, Acta Inf. 9 (1977), 1 - 2 1 ; Y . Sagiv, J. Comp. Syst, Sci. 33 (1986), 2 75 -2 9 6 .
778
ODPOWIEDZI DO ĆW ICZEŃ
6.3
6.3 1 . Lieves (liczba mnoga od „lief” ).
2. W ykon aj algorytm T z nowym kluczem jako argumentem; jego wykonywanie zakończy się niepowodzeniem albo w kroku T3, albo w T4. Jeśli jest to T3, po prostu umieść K na pozycji k w węźle NODE(P) i zakończ wykonywanie algorytmu. W prze ciwnym razie na pozycji k w tym węźle umieść adres nowego węzła Q AVAIL za w ierającego tylko puste dowiązania, a następnie wykonaj P Q. Niech teraz k i kł będą kolejnymi znakami odpowiednio w K i X \ jeśli k k\ zapam iętaj K na pozycji k w węźle NODE(P), a X na pozycji k'; jeśli jednak k = k f, znowu na pozycji k zapisz wskaźnik do nowego w ęzła Q <£= AVAIL, wykonaj P «— Q i powtórz ten sam proces, aż w końcu k ^ k '. (M usimy założyć, że żaden klucz nie jest prefiksem innego klucza). 3. Zamień usuwany klucz w jego węźle na puste dowiązanie. Jeśli ten węzeł staje się teraz bezużyteczny, ponieważ w szystkie jego składowe z w yjątkiem klucza X są puste, usuń ten węzeł z drzewa, a odpow iadający mu wskaźnik w węźle-rodzicu zastąp przez X. Jeśli teraz węzeł-rodzic jest bezużyteczny, usuń go w ten sam sposób. 4. W yszukiw ania kończące się sukcesem są wykonywane tak, jak w wyjściowej tablicy, natom iast w yszukiw ania kończące się niepowodzeniem mogą wym agać kilku dodat kowych iteracji. N a przykład argument wyszukiwania taki jak TRASH spowoduje, że program T w ykona sześć iteracji (więcej niż pięć!); to jest najgorszy przypadek. Należy sprawdzić, że program nie zapętli się na pozycjach odpow iadających pustym miejscom z tab licy wyjściowej. (To godne uwagi 49-elementowe upakowanie pochodzi od J. Scota Fishburna, który także w ykazał, że 48 pozycji to za mało). Wolniejszy, ale bardziej uniwersalny sposób oszczędzania pamięci zaproponował K u rt Maly, CACM 19 (1976), 4 0 9 -4 15 . W ogólności, jeśli chcemy skompresować n rzadkich tablic zawierających odpo wiednio x i , . . . , x n niezerowych elementów, stosujem y metodę pierwszego dopasowania. W tej m etodzie j -ta tablica zostaje przesunięta o minimalne takie r j, żeby nie było konfliktów z zapam iętanym i ju ż tablicam i. W ówczas rj ^ (ari H \-xj~i)xj, ponieważ każda wcześniejsza niezerowa wartość może zablokować co najw yżej Xj przesunięć. Dla danych z tab licy to oszacowanie najgorszego przypadku daje rj ^ 93, co gwarantuje, że dowolne dwanaście tablic o długości 30, zaw ierających odpowiednio 10, 5, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2 niezerowych elementów, m ożna upakować na 93 + 30 kolejnych pozycjach, bez względu na rozmieszczenie zer. D alszym i pracam i nad tą m etodą zajm owali się R. E. Tarjan i A . C. Yao, CACM 2 2 (1979), 6 0 6 -6 11. D ynam iczna implementacja drzew trie, zaproponowana przez F. M. Lianga, znalazła zastosowanie do tablic przeniesień w program ie do składania tekstów T£X; zobacz D. E. K nuth, CACM 29 (1986), 4 7 1-4 7 8 ; Literate Programming (1992), 206-233. 5. W każdym drzewie należy najpierw pytać o elementy najbardziej prawdopodob ne, co oznacza, że litery należy rozmieścić z lewa na prawo, w kolejności m alejących prawdopodobieństw. O ptym alność takiego rozmieszczenia można udowodnić tak jak w twierdzeniu 6 . 1 S. [Zobacz CACM 1 2 (1969), 72 -7 6 ].
ODPOWIEDZI DO ĆW ICZEŃ
6.3
779
6.
7. Na przykład 8 , 4, 1 , 2 , 3, 5, 6 , 7, 1 2 , 9, 10, 11, 13, 14, 15. (Bez względu na to, w jakiej kolejności wstawiamy, lewe poddrzewo nie może zawierać więcej niż dwa w ęzły na poziomie 4. To samo dotyczy prawego poddrzewa). Nawet takie najgorsze drzewo ma długość ścieżki tylko o 4 mniejszą od długości ścieżki najlepszego możliwego drzewa. To świadczy o tym , że drzewa wyszukiwań cyfrow ych nie są szczególnie czułe na kolejność wstawiania. 8 . Tak. Pola KEY zaw ierają teraz tylko skrócone klucze; początkow e bity, które w yni
kają z położenia w ęzła są odcięte. (M ożliwa jest też podobna m odyfikacja algorytm u T ). 9 . START LDX K 1 Dl. Inicjowanie. (rX = K). LD1 R00T 1 P R00T. ( r ll = P). JMP 2F 1 4H LD2 0 , 1 (RLINK) C2 D4. Przejdź w prawo. Q <— RLINK ( P ) . J2Z 5F C2 Do D5, jeśli Q = A. 1H ENT1 0,2 C - 1 P^Q. 2H CMPX 1 , 1 D2. Porównaj. C JE Koniec, jeśli K — KEY(P). SUCCESS C SLB 1 C - S Przesuń K w lewo o jeden bit. JAO 4B C - S Do D4, jeśli odrzuconym bitem było 1 LD2 0 , 1 (LLINK) D3. Przejdź w lewo . Q LLIN K (P). Cl J2NZ IB Cl Do D2 z P <— Q, jeśli Q ^ A. 5H Postępuj dalej tak ja k w programie 6.2.2T, zam ieniając rolami rA i rX.
|
Czas działania fazy wyszukiwania wynosi w tym programie ( 1 0 C — 3*S + 4)u, gdzie
C — S jest liczbą przeglądanych bitów. Zatem przybliżone średnie czasy działania są następujące: Program 6 .2 .2 T Ten program
Sukces
Niepowodzenie
15 ln iV - 12.34 14.4 ln AT — 6.17
15 ln N - 2.34 14.4 ln A + 1.26
(W ynika stąd, że dla niedużych N program 6.2.2T jest odrobinę szybszy). 10. Niech 0 oznacza operację w ykluczającego O R na liczbach n-bitow ych i niech
f( x ) ~ n — |~lg(& + 1)] będzie liczbą bitów zero na początku x. Jedno rozwiązanie: (b) Jeśli wyszukiwanie algorytm em T kończy się niepowodzeniem w kroku T3, k jest o jeden mniejsze od liczby dotychczas przejrzanych bitów; w przeciwnym przypadku, gdy wyszukiwanie kończy się w kroku T4, k — f ( K 0 A ) , (a, c) W ykonujem y zw ykłe wyszukiwanie, ale liczym y minimalną wartość x wśród wartości A"0KEY(P) dla w szyst kich kluczy KEY(P) porównanych podczas wyszukiwania z K . W ted y k — f(x ). (N ależy udowodnić, że żaden inny klucz nie będzie miał więcej wspólnych bitów z AT, niż te porównywane z K. W przypadku (a) najw iększe k dostaniem y albo dla największego klucza ^ K , albo najm niejszego klucza > K).
780
ODPOWIEDZI DO ĆW ICZEŃ
6.3
1 1 . Nie; usunięcie węzła z tylko jednym pustym poddrzewem spowoduje „zgubienie”
jednego bitu z kluczy leżących w niepustym poddrzewie. Żeby usunąć węzeł, powinni śm y zastąpić go przez jeden z jego końcowych potomków, na przykład ten, do którego idziem y zawsze w prawo, gdy to tylko możliwe. 1 2 . W s ta w m y do p o c z ątk o w o p u ste g o d rzew a trz y losowe liczby a , /3, 7 , leżące m iędzy 0 a 1 ; następnie usuńmy a z prawdopodobieństwem p, ¡3 z prawdopodobieństwem q 1 7 z p ra w d o p o d o b ie ń stw e m r z a p o m o c ą a lg o ry tm u zap ro p o n o w an eg o w p o p rze d n im ćw iczeniu. D rzew o
dostajem y z prawdopodobieństwem \ p +
+ ^r, a to jest równe
tylko gdy p = 0 .
1 3 . W każdym węźle należy dodać pole-klucz KEY, a następnie w kroku T2 porównywać
K z kluczem, przed spojrzeniem na odpowiedni element wektora. Tabela 1 zm ieniłaby się następująco: w ęzły (1), . . . , (12) zaw ierałyby odpowiednio klucze THE, AND, BE, FOR, HIS, IN, OF, TO, WITH, HAVE, HE, THAT (jeśli wstawiliśm y je w kolejności malejących częstości) i nie byłob y ich na poprzednich pozycjach. [Program w tym przypadku byłby wolniejszy i bardziej skomplikowany od programu T. Bardziej bezpośrednie uogólnienie algorytm u D dla w yższych stopni M daw ałoby drzewo o N węzłach z jednym kluczem i M dowiązaniam i w każdym węźle]. 1 4 . Jeśli j ^ n, jest tylko jedno takie miejsce, a mianowicie KEY ( P ) . Jeśli jednak j > n, zbiór w szystkich w ystąpień można znaleźć, przechodząc poddrzewo o korzeniu w P. Jeśli jest r takich w ystąpień, to w poddrzewie jest r — 1 węzłów (w łączając w to P), a stąd r pól-dowiązań z oznaczeniam i TAG — 1; wartościami tych pól są wskaźniki do miejsc w tablicy TEXT pokryw ających się z K. (Nie m a potrzeby ponownie oglądać tablicy TEXT). 1 5 . Budowę drzewa rozpoczynam y od zapisania w polu KEY(HEAD) pierwszego odsy łacza do TEXT i inicjowania LLINK(HEAD) HEAD, LTAG(HEAD) <— 1. Kolejne odsyłacze do TEXT m ożna wprowadzać za pom ocą następującego algorytm u wstawiania: P rzypisujem y na K nowy klucz, który chcemy wprowadzić. (To jest pierwsze odwołanie do tab licy TEXT wykonywane przez algorytm wstawiania). W ykonujem y algorytm P; jego wykonanie musi zakończyć się niepowodzeniem, ponieważ żaden klucz nie może być prefiksem innego. (W kroku P 6 następuje drugie odwołanie do TEXT; więcej odwołań nie będzie ju ż potrzebnych!) Załóżm y teraz, że klucz zlokalizowany w kroku P 6 zgadza się z argumentem K na pierwszych Z bitach, ale różni się na pozycji Z + 1 , gdy cyfrą w K jest 6 , a cyfrą w tym kluczu jest 1 — 6 . (Nawet jeśli w tym miejscu j jest dużo większe od Z, to można udowodnić, że w sposób opisany tu ta j znajdziem y najdłuższy w spólny prefiks K z dowolnym z istniejących kluczy. Tak więc we wszystkich kluczach w tekście o pierwszych l bitach takich ja k K bitem (Z + l)-szym jest 1 — 6). Teraz pow tarzam y algorytm P z kluczem K zastąpionym przez te pierwsze Z bitów (stąd n ±~~ Z). T ym razem wyszukiwanie kończy się sukcesem, więc nie musimy wykonywać kroku P 6 . Teraz wykonujem y R <= AVAIL, KEY(R) «— pozycja nowego klucza w TEXT. Jeśli LLINK(Q) = P, LLINK(Q) <— R, t «— LTAG(Q), LTAG(Q) 0; w przeciwnym razie RLINK(Q) <— R, t <— RTAG(Q), RTAG(Q) <- 0. Jeśli 6 = 0, LTAG(R) 1, LLINK(R) +- R, RTAG(R) <— t, RLINK(R) P; w przeciwnym razie RTAG(R) <— 1, RLINK(R) <— R, LTAG(R) ¿, LLINK(R) <— P. Jeśli t = 1, SKIP(R) 1 + Z — j; w przeciwnym razie SKIP(R) <- 1 + Z - j + SK IP(P) i SK IP(P) <- j - l — 1.
ODPOWIEDZI DO ĆW ICZEŃ
6.3
781
16. O rganizacja drzewa w ym aga poprowadzenia do każdego w ęzła (klucza) dokładnie jednej kropkowanej linii z w ęzła leżącego niżej; prowadzi ona z m iejsca w drzewie, w którym ten klucz po raz pierwszy różni się od w szystkich pozostałych. Jeśli takiego miejsca nie ma, algorytm załam uje się. O czyw iście moglibyśm y pom inąć klucze, które są prefiksami innych, ale wówczas algorytm z ćwiczenia 1 2 m iałby za m ało danych, żeby znaleźć wszystkie w ystąpienia danego argumentu. 17. Jeśli zdefiniujemy ao = a\ — 0, to wówczas
™V - l ) fcafc/(mfe_ł - 1) —^ ( ? ) ( “ 1) ko>kmk~ 1/ ( m k~ 1 - 1).
x n = an + k^2
k^2
18. Żeby rozwiązać (4 ), potrzebujem y transform aty an = [n> 1 ], czyli 1 + n; zatem dla N ^ 2 otrzym ujem y A n — 1 — Un + V}v, gdzie Un i Vn = K ( N , 1 ,M ) , przy oznaczeniach z ćwiczenia 19. Podobnie, żeby weźmy an — n — [n = 1] = an i wówczas dostaniem y C n = N + Vn dla
an = [n = 0 ] — = K ( N , 0, M) rozwiązać (5 ), N ^ 2.
19. D la 5 = 1 mamy Vn — K(n, 1 , m) — n ((ln n + 7 )/ln m - \ - So(n - 1 )) + 0 ( 1 ) , natomiast dla s ^ 2 mam y JC(n, 5 , m) = ( —l ) sn ( l/ ln m -b Ćs_x(n — s))/s( s — 1) + 0 ( 1 ), gdzie 2 r Sft(r(5 — 27rik/\nm) exp(27rźfc logm n)) ós(n) = -----k^l jest funkcją okresową lo g n . [W tym wyprowadzeniu mamy w/ s fn + s\ n ~ s+1 f 1/2+'°° r ( z ) n s- 1~z dz K( n+ ,, » , „ ) / ( - ! ) • ( ^ ) = - L L I_ _ + 0 ( » - ) . D la m ałych m i s wartości J są zaniedbywalnie małe; zobacz ćwiczenie 5.2.2-46. Za uważmy, że dla ustalonego a, ós(n — a) — 5s{n) + 0 (n - 1 )]. 20. W przypadku (a) niech an = [n>s] = 1 — X^fc=o[n==k]; w PrzyP&dku (b) niech an = n — k[n = k\; a w przypadku (c) chcemy rozwiązać równanie rekurencyjne „
yn
_ , " » 1 - n E fc( f c ) ( m - l ) n- fc!/fc (Tl£ 1)
—
dla n > s, dla n ^ s.
Biorąc x n = yn — n, dostajem y równanie w postaci z ćwiczenia 17, przy czym
an = ( 1 - M
'k'
^ ¿ ( „ ) [ n = fc]. k- 0
Z tego powodu, przy oznaczeniach z poprzednich ćwiczeń, odpowiedzi są następujące: (a) X—K ( N , 0 , M ) - \ - K ( N , l , M ) ----- + ( - l ) 3^ 1K ( N , s ,M ) = N / ( s \ n M ) —N ( 6 - i ( N ) 4 5 o (iV -l)+ < 5 i(lV -2 )/ 2 -l + - ■ ■+<5a_ i ( J V - s ) / s ( s - l ) ) + 0 ( l) ; (b) l V 1 (iV + K (A f, 1 , M ) 2 K ( N , 2 , M ) + ■■■ + = (ln IV + 7 - # s_ i ) / ln M + 1/2 (5o(Ar- l) + < 5 i( lV - 2 ) / l + - • ■+5a- i ( N —s)/(s —l)) + 0 { N ~ 1); (c) A ^ A ^ l - M - 1) x E L 2(~ 1 )k {k 2) K ( N , k , M ) ) = l + i ( l - M “ 1) ^ - l ) / l n M + 51( N - 2) + • • • + 5s- i ( N - s)) + 0 ( N ~ 1). Niech A n będzie liczbą wszystkich węzłów. Liczba niepustych wskaźników wynosi A n — 1 , a liczba niewskaźników jest równa 7V, a zatem w szystkich pustych wskaźników jest M A n — A n + 1 — N. Żeby otrzym ać średnią liczbę pustych wskaźników na każdej ustalonej pozycji, w ystarczy ostatnią wielkość podzielić przez M. [Średnią w artość A n 2 1.
znajdziem y w ćwiczeniu 2 0 (a)].
782
ODPOWIEDZI DO ĆW ICZEŃ
6.3
22 . D la każdego z M l ciągów czołow ych bitów istnieje węzeł taki, że co najmniej dwa klucze odpow iadają takiem u właśnie wzorcowi bitowemu. Prawdopodobieństwo, że dokładnie k kluczy odpowiada jednemu, konkretnemu takiem u wzorcowi wynosi
a zatem średnia liczba węzłów niekońcowych na poziomie l wynosi M l ( l —(1 —M ~ l)N) — 23. Rozw ażm y ogólniejszy przypadek z dowolnym s ja k w ćwiczeniu 20. Jeśli na poziomie l znajduje się ai węzłów, to zaw ierają one aj+i dowiązań i Mai — a/+i pozycji, w których wyszukiwanie może zakończyć się niepowodzeniem. Zatem średnia liczba przeglądanych cyfr wynosi {Ma\ —ai+i) = M ~ lai. K orzystając ze wzoru na ai w losowym drzewie trie, dostajemy, że powyższe równa się x ( K ( N + 1 , 1 , M) — 2 K ( N + 1 , 2, M) + ■• • + (—l ) 5 ( s + l) K ( iV + l, s+ 1, M)
_ a t r + l p » . + 1 _ ^ N ) _ f l f f z i l _ ... _ « i = 2 > + In M 2 1 s 24. M usim y rozwiązać równanie rekurencyjne xq = X\ = yo = y\ = 0,
xn=m- £
ni H------l -nm —n
{ni,.n,nm){Xni+"+Xn-+E N
= a„ + m 1- n J 2 ( nk ) x k> k yn = m ~ n
Y) ( hnrn=n '
n 1’
) ( y ni +- - - + ynm +
J2
^ 0 ]r i j)
’ m'
= ł>n+m1- n 2 2 ( k ) y > ‘ k dla n ^ 2 , gdzie an = m ( l — (1 - l/ m ) 71) i bn = |(m — l ) n ( l — (1 — l/ m ) n_1). Na podstaw ie ćwiczeń 17 i 18 dostajem y następujące odpowiedzi: (a) x n = N + V n ~ U n — [J V = 1 ] = A n + N — 1 (ten w ynik m ożna by otrzym ać bezpośrednio, ponieważ liczba węzłów w lesie jest zawsze o i V - l większa od liczby w odpow iadającym mu drzewie trie!); (b) yN/ N = \ { M - 1)Vn /N = \ ( M - l) ( ( ln N + i ) / \ n M - § - S0( N - 1)) + C K A T 1).
25. (a) Niech A n = M ( N —1 ) / ( M —1)—En', wówczas dla N ^ 2 mamy (1—M 1~n ) En = M - 1 - M(1 - l / M ) ^ - 1 + M 1-JV E o < f c < N ( k ) ( M ~ 1 ) N ~ k E k - Ponieważ M - 1 ^ M( 1 — 1¡ M ) v 1. przez indukcję mamy E n ^ 0. (b) Na podstawie twierdzenia 1.2.7A z a: = 1/(M - 1) i n = N - 1, dostajemy Z?jv = on + M 1-iv (%)(M ~ l ) JV_feD)c, gdzie ai = 0 i 0 < a« < M{ 1 - l / M ) N/ l n M ś ( M - l f / M l n M dla N > 2. Stąd 0 ^ £>jv ^ (M - l ) 2AN/M ln M ^ (M - 1)(JV - l)/ln M . 26. Biorąc g = | , z = — | w drugiej tożsam ości z ćwiczenia 5 .1.1-16 , dostajemy, że 1/3 — l/ ( 3 - 7 ) + l/ ( 3 - 7 - 1 5 ) ----- = 0.28879; zrobim y to trochę szybciej, dla z = — anastępnie w ynik podzielim y przez 2 . A lternatyw nie możemy zastosować wzór Eulera z ćwi czenia 5 .1 .1 -1 4 tylko dla ujemnych potęg 2. (John Wrench obliczył ten iloczyn z dokład nością do 40 miejsc po kropce: 0.28878 80950 86602 42127 88997 21929 23078 00889+).
ODPOWIEDZI DO ĆW ICZEŃ
6.3
783
2 7. (Dla zabaw y dokonamy wyprowadzenia aż do 0 ( N ~ 1)). P rzy oznaczeniach z ćwi czeń 5.2.2-38 i 5.2.2-48 mamy ¿W = UN+ N - l + ^ - a N - l 3 + Y { - l ) n2 - n
=
^ ------ — -----------
N+l
n rB= i ( i - 2 - )
gdzie a = 2/(1 • 1 ) - 4/(3 *3* 1 ) + 8/(7 • 7 - 3 • 1) - 16/(15 • 15 ■7 • 3 ■1) + • • * w 1.60669 5152415291 76378 33015 23190 92458 04806oraz ¡3 — 2/(1-3• 1) — 4/(3■ 7-3■ 1 ) + 8/(7-15• 7 - 3 - 1 ) w 0.60670. O trzym ane wartości pozw alają przypuszczać, że a = ¡3 4- 1, i faktycznie nie jest trudno to udowodnić. Wartość — 2~m)N wynosi 0(JV1_n), co wynika z ćwiczenia 5.2.2-46; natomiast V}v+i / ( N + 1 ) = Un +i — Un ■Stąd C n = Un - i — (a - l)iV - a 4- O iiN P1) = (W + l)lg (W -h l) + AA((7 - l ) / l n 2 + ^ - a + ^ i( i V ) ) + | - l / l n 4 - a - ^ i ( i V ) H - 0 ( i V - 1) na podstawie ćwiczenia 5.2.2-50. W ariancja długości ścieżki wewnętrznej w drzewie wyszukiwania cyfrowego została policzona przez Kirschenhofera, Prodingera i Szpankowskiego, SICOMP 23 (1994), 5 9 8 -616. 28. W yprowadzenia w głównym tekście i ćwiczeniu 27 m ają zastosowanie dla dowol nego M ^ 2 , jeśli w oczyw istych miejscach zastąpim y 2 przez M . Stąd wynika, że średnia liczba bitów oglądanych w losowym wyszukiwaniu kończącym się sukcesem wynosi C n / N = UN+i - o l m + 1+ 0 (J V - 1 ) = logM A/'+(7 - l ) / l n M + | - a M +ń_i(iV)-h (logM N ) / N + 0 ( N ~ 1); w przypadku niepowodzenia taką liczbą jest Cn+i — C n =
VN+2/ ( N + 2 ) - a M + l + 0 ( N - 1) = logM N + 7 / ^ * 4 + ± - a M - S 0( N + l) + O {N -i). U żyta tu taj funkcja Ós (n ) jest zdefiniowana w ćwiczeniu 19, a a M = ] £ ( - l ) J'M i+ 1/ (M i + 1 -
1 ) 2 (M 5' - 1 ) . . . (M - 1 ).
29. Flajolet i Sedgewick [SIC O M P 1 5 (1986), 748 -767] pokazali, że takich węzłów jest w przybliżeniu 0.372iV, gdy M — 2 , i 0.68977, gdy M = 16. Uogólnienie tych wyników znajdziem y w pracy: F lajolet i Richmond, Random Structures and Algorithms 3 (1992), 305-320. 30. Iterując równanie na hn (z), dostajem y, że hn (z) jest sum ą w szystkich możliwych wyrazów postaci
\p i )
2P1 - 1 \ p 2 J 2^2 _ 1
—1 V 1 /
dla n > p i > • • • > p m > 1 .
3 1 . hłn ( 1) = Vn \ zobacz ćwiczenie 5.2.2-36(b). [Wyniki dotyczące wariancji i rozkła dów granicznych dla uogólnionych drzew P atricia stopnia M znajdziem y w pracach: P. Kirschenhofer i W . Prodinger, Lecture Notes in Comp . Sci. 226 (1986), 1 7 7 -1 8 5 ; W . Szpankowski, JACM 3 7 (1990), 6 9 1 - 7 1 1 ; B. Rais, P. Jacąuet i W . Szpankowski, S IA M J. Discrete Math. 6 (1993), 19 7 -2 13 ]. 32. Suma wartości pól SKIP jest liczbą węzłów w odpowiednim drzewie binarnym trie, a zatem odpowiedzią jest A n (zobacz ćwiczenie 2 0 ). 33. T utaj przedstawiamy, w jaki sposób otrzym ać ( 1 8 ): A(2z) — 2A (z) — e2z — 2ez + 1 4 - A{z){ez — 1 ) można przekształcić na A(2z)/(e2z — 1 ) = (ez — l) / ( e z + 1) 4-
784
ODPOWIEDZI DO ĆW ICZEŃ
A(z)/(ez -
H c „ z n,
1). S t ą d A ( z ) = f ( z /23) =
(e z -
6.3
1 ) ' ^ 2 j > 1 ( e z/23 -
H cnZn/ ( 2 rl- l ) .
l ) / ( e z/2:> + 1). Teraz,
jeśli / ( z ) =
W t y m p r z y p a d k u f ( z ) = (e2 - l ) / ( e 2 + l ) =
t a n h ( z / 2 ) ró w ne 1 — 2 z ~ 1 ( z / ( e z — 1) — 2 z / ( e 2z — 1 ) ) =
B n + i z n ( 2 n+1 — l) / ( n + l) ! .
Mając ten wzór reszta jest już oczywista. 34. (a) Rozważmy najpierw sumę E j^ iE /c =2 l n_1H----- [ -(m -l)7*“ 1 (Bn(m) —J3n)/n , na podstawie ćwiczenia 1.2.11.2-4. (b) Przyjmijmy z kolei Sn(m) — “ ki m T 1 Tn{m) = l/( e n/m - 1). Jeśli k ^ m/2, to mamy e~kn/ni > exp(nln(l —k/m)) > exp(—k n / m —k2n / m 2) > e~kn/Tn(l —k2/ m 2), stąd (1 —k /m ) n = e~kn/m _|_ Q^e- kn/ mfc2n j m 2y Ponieważ 5n(m) = E!T=i(1 —k / m ) n + 0 (2 _n) oraz r„(m ) - E r i N “ *"7™ + 0 (e “ ™/2), zatem 5„(m) = Tn(m) + 0(e n/rnn / m 2). Su ma 0 (exp(—n/2j )n/22j) wynosi 0 (n“ 1), ponieważ suma dla j ^ lgn jest rzędu n -1 ( 1 + 2/e + (2/e)2 H ), a suma dla j ^ Ign jest rzędu n -1(l -f 1/4 + (1/4)2 -)-----). (c) Rozumujemy jak w punkcie 5.2,2, kiedy |ar| < 27r, a następnie korzystamy z anali tycznej ciągłości, (d) ~ lg(n/7r) + 7/(2 ln 2) — | + J(n) 4 - 2/n, gdzie £ (n ) = (2 /ln 2 ) E f c ^ i^ ( C ( ~ 2 7 r iA : /ln 2 ) r ( —27rż/c/ln2)exp(27ri/clgn)) = ( l / l n 2 ) E fc ^ i ^ ( C ( l + 27riA:/ln2) e xp(27fifclg(n/7r)))/ cosh(7r2fc /ln 2 ).
Wariancja i wyższe momenty zostały policzone przez W. Szpankowskiego, JACM 37 (1990), 691-711. 35. Klucze muszą być postaci {a0/30u;i, aO/^lu^, a l 70u;3, al7l60u>4, a l 7 lńlu;5}, gdzie a , s ą słowami zbudowanymi z zer i jedynek, dla których |a| = a — 1, \f3\ = 6 —1 itd. Prawdopodobieństwo, że pięć losowych kluczy jest takiej postaci, wynosi 5! 2a_1+b_1+c_1+d_1 36. Niech n będzie liczbą węzłów wewnętrznych. Wtedy mamy wzory dla prawdopo dobieństw: (a) (n\/2J) n ( V s(x)) = n]- n ( l / 2s(a:)-1s(®))) gdzie I jest długością ścieżki wewnętrznej w drzewie, (b) ((n + l)!/2n) J ]( l/(2 S^ — 1)). (Rozważmy zsumowanie odpowiedzi z ćwiczenia 35, po wszystkich a, 6, c, d ^ 1). 37. Najmniejsza długość zmodyfikowanej ścieżki zewnętrznej wynosi 2 —1/2N~2 i jest otrzymywana tylko dla drzew zdegenerowanych (dla których długość ścieżki zewnętrz nej jest największa). [Można udowodnić, że największa długość zmodyfikowanej ścieżki zewnętrznej występuje wtedy i tylko wtedy, gdy węzły zewnętrzne znajdują się na dwóch sąsiednich poziomach! Jednak nie zawsze jest prawdą, że w drzewie, w którym długość ścieżki zewnętrznej jest mniejsza niż w innym drzewie, długość zmodyfikowanej ścieżki zewnętrznej jest większa]. 38. Rozważ jako podproblem znajdowanie k-węzłowych drzew o parametrach (a,/3), ( a , ± ( 3 ) , . . . , ( a , 2 k- n0).
39. Zobacz Miyakawa, Yuba, Sugito i Hoshi, SICOMP 6 (1977), 201-234. 40. Niech N / r będzie rzeczywistą długością okresu danego ciągu. Należy zbudować drzewo podobne do drzewa Patricia, biorąc a o a i... jako TEXT i N / r kluczy zaczyna jących się na pozycjach 0 ,1 ,..., N / r — 1. (Nasz wybór r gwarantuje, że żaden klucz nie jest prefiksem innego). Ponadto do każdego węzła dodajemy pole SIZE zawierające liczbę dowiązań w poddrzewie, które prowadzą w górę drzewa (nie do dzieci). Żeby wykonać zadaną operację, wykonujemy algorytm P; jeśli wyszukiwanie zakończyło się niepowodzeniem, odpowiedzią jest 0, jeśli jednak był sukces, a j ^ n, to odpowiedzią jest r . Na koniec, jeśli wyszukiwanie kończy się sukcesem i j > n, odpowiedzią jest r • SIZE(P).
ODPOWIEDZI DO ĆW ICZEŃ
6.4
785
43. Oczekiwana wysokość jest asymptotycznie równa (1 + l/s) logM W, a jej wariancja jest równa 0(1). Zobacz: H. Mendelson, IEEE Transactions SE-8 (1982), 611-619; P. Flajolet, Acta Informatica 20 (1983), 345-369; L. Devroye, Acta Informatica 21 (1984), 229-237; B. Pittel, Advances in Applied Probability 18 (1986), 139-155; W. Szpankowski, Algorithmica 6 (1991), 256-277. Średnia wysokość drzewa wyszukiwań cyfrowych dla M = 2 jest asymptotycznie równa Ig n + \/21gn [Aldous i Shields, Probability Theory and Related Fields 79 (1988), 509-542], i to samo zachodzi dla losowych drzew Patricia [Pittel i Rubin, Journal of Combinatorial Theory A 55 (1990), 292-312]. 44. Zobacz SODA 8 (1997), 360-369; taka struktura danych dla wyszukiwania jest blisko związana z algorytmem wielokluczowego szybkiego sortowania, o którym była mowa w odpowiedzi do ćwiczenia 5.2.2-30. J. Clément, P. Flajolet i B. Vallée pokazali, że reprezentacja trójkowa czyni wyszukiwanie metodą trie około trzy razy szybszym niż przy zastosowaniu reprezentacji binarnej (2), jeśli liczymy odwołania do węzłów [zobacz SODA 9 (1998), 531-539]. 45. Prawdopodobieństwo tego, że {THAT, THE,THIS} jest przed {BUILT, HOUSE, IS, JACK}, {HOUSE, IS, JACK} przed {BUILT}, {HOUSE, IS} przed {JACK}, {IS} przed {HOUSE}, {THIS} przed {THAT, THE} oraz {THE} przed {THAT} wynosi =
6.4 1 . —37 ^ rll ^ 46. Dlatego trzeba zagwarantować, by komórki poprzedzające i następujące po TABLE nie zawierały żadnych danych zgodnych z jakimkolwiek danym argumentem; ich pierwszym bajtem mogłoby na przykład być zero. Z pewnością nie dobrze byłoby umieścić K w tym zakresie! [Moglibyśmy zatem powiedzieć, że metoda z ćwiczenia 6.3-4 wykorzystuje mniej pamięci, ponieważ granice tamtej tablicy nigdy nie są przekraczane]. 2. T0W. [Czy Czytelnik potrafi znaleźć dziesięć znanych, przynajmniej 5-literowych słów, które wypełnią wszystkie pozostałe luki między —10 a 30?]. 3. Kody znaków alfabetu spełniają zależności A + T = I + N oraz B —E —0 —R, więc mielibyśmy /(AT) = /(IN) albo /(BE) — /(0R). Zwróćmy uwagę, że instrukcje 4 i 5 z tabeli 1 pozwalają dość skutecznie rozwiązać ten dylemat, utrzymując przy tym rll w stosunkowo wąskim zakresie wartości. 4. Rozważ przypadki, w których występuje k par. Najmniejsze n takie, że m “ " n!£ ( „ - f c ) ( n fcfc) 2“ ', < 5 k
dla m = 365
jest równe 88. Jeśli zaprosisz 88 osób (łącznie z Tobą), to szansa na obecność trój ki jednoczesnych jubilatów wynosi 0.511065, jeśli jednak przyjdzie tylko 87 osób, to zmniejsza się ona do 0.499455. Zobacz C. F. Pinzka, AMM 67 (1960), 830. 5. Ta funkcja haszująca jest zła, ponieważ przyjmuje co najwyżej 26 różnych wartości, a niektóre z nich występują znacznie częściej niż inne. Nawet jeśli użyjemy haszowania podwójnego (przyjmując, powiedzmy, h,2 (K) = 1 plus drugi bajt K oraz M = 101), spowolnienie wyszukiwania będzie większe niż czas zaoszczędzony na szybszym haszowaniu. Również wartość M = 100 jest za mała, ponieważ programy w języku FORTRAN często zawierają więcej niż 100 różnych zmiennych. 6 . Nie na maszynie MIX, ponieważ prawie zawsze wystąpi przepełnienie arytmetyczne (za duża wartość dzielnej). [Miło byłoby móc obliczyć (tuK) mod M, zwłaszcza przy
786
ODPOWIEDZI DO ĆW ICZEŃ
6.4
stosowaniu próbkowania liniowego z c = 1 , niestety jednak na większości komputerów jest to niedopuszczalne ze względu na przepełnienie ilorazu]. 7. Jeśli R(x) jest wielokrotnością P ( x ), to R ( a = 0 w GF(2fc) dla każdego j G 5. Niech R(x) = x ai + ■• • + x as, gdzie a\ > • • • > as ^ 0 oraz s ^ t; wybierzmy t — s dalszych wartości aa+ i , ... ,a*, tak żeby a i , ... , a* były różnymi nieujemnymi liczbami całkowitymi mniejszymi niż n. Macierz Vandermonde’a /
V
ai
OL
a 2ai
...
a 2at
Oćt a i
. . . e ć at y
jest osobliwa, ponieważ suma jej pierwszych s kolumn jest równa zero. To jednak przeczy faktowi, że a a i , . . . , a ai są różnymi elementami GF(2fc). (Zobacz ćwiczenie I.2.3-37). [Autorami pomysłu haszowania wielomianowego są M. Hanan, S. Muroga, F. P. Palermo, N. Raver i G. Schay; zobacz IBM J. Research Sc Development 7 (1963), 121-129; U.S. Patent 3311888 (1967)]. 8. Przez indukcję. Silne założenie indukcyjne można uzupełnić o fakt, że dla O ^ r ^ a k zachodzi { ( - l ) fe( r ^ + qk~i)Q} = (-1 )k(r(qk0 - pk) + (qk~\0 ~ pk- 1)). „Rekordowo niskie” wartości {nO} występują dla n = q\ , q2 + q±, 2q^ + qi, .. . , 02^2 + qi = 0 q4 + qs, q4 + ^3, . . . , a4^4 + t/3 = 0^6 + qbi - • *; „rekordowo wysokie” wartości występują dla 71 = ^o, qi + qo, • • -, ai<7i + <7o — O73 + 52, ... . Są to kroki, w których tworzy się przedział numer 0 nowej długości. [Dalsze własności strukturalne można wywnioskować, uogólniając system liczbowy Fibonacciego z ćwiczenia 1.2.8-34; zobacz L. H. Ramshaw, J. Number Theory 13 (1981), 138-175]. 9. Mamy = y/1,1 ,1 ,... // oraz ~2 = //2 ,1 ,1 ,... //. Niech 0 — //a\,a, 2 )... // oraz 6k = //ak+i, ak+2, • *. //, dalej niech Qk = qk + qk- iOk- 2 przy oznaczeniach z ćwiczenia 8. Jeśli a\ > 2, to już pierwszy podział jest zły. Trzema rozmiarami przedziałów z ćwiczenia 8 są (1 —rOk- i ) / Q k, Ok- i / Q k i (l —(r —l)0fc-i)/Qfc> więc proporcja pierwszej długości do drugiej wynosi (ak —r) + 9k. Będzie to mniej niż jeśli r — ak i ak+1 ^ 2; zatem jeśli ma nie być złych podziałów, to wszystkie wielkości {02, 03,-..} muszą być równe 1. [Pokrewne twierdzenia można znaleźć w artykule R. L. Grahama i J. H. van Linta, Canadian J. Math. 20 (1968), 1020-1024, oraz w cytowanych tam pracach]. 10. F. M. Liang podał elegancki dowód w Discrete Math. 28 (1979), 325-326. I I . Powstałby problem dla K — 0. Gdyby zażądać, żeby klucze były niezerowe, jak w programie L, to ta zmiana byłaby opłacalna i moglibyśmy również reprezentować puste pozycje przez 0. 12. Możemy przechowywać K w KEY[0], zastępując wiersze 14-19 przez STA CMPA JE 2H ENT1 LD2 CMPA JNE
TABLE(KEY) TABLE,2 (KEY) 3F 0,2 TABLE, 1(LINK) TABLE,2 (KEY) 2B
A - 51 A - Si A —51 C - 1 - 52 C - 1 - 52 C - 1 - 52 C —1 — 52
ODPOWIEDZI DO ĆW ICZEŃ
6.4
3H J2Z 5F ENT1 0,2 JMP SUCCESS
787
A - SI 52 52 I
„Oszczędzamy” w ten sposób C — 1 —5A + 5 + 451 jednostek czasu, co w rze czywistości stanowi stratę netto, ponieważ C rzadko bywa większe niż 5. (Nie zawsze powinno się optymalizować wewnętrzną pętlę!). 13. Przyjmijmy, że elementy tablicy są dwóch rozróżnialnych typów jak w algorytmie C, z dodatkowym jednobitowym polemTAG[i]w każdymelemencie. W przedstawio nym tu rozwiązaniu zastosowane są listy cykliczne,zgodnie zsugestią Allena Newella, z TAG[ż] = 1 dla pierwszego słowa na każdej liście. A l. [Inicjowanie] Przyjmij i *— j <— h(K) + 1, Q
q{K)-
A2. [Czy istnieje lista?] Jeśli pozycja TABLE [i] jest pusta, to przyjmij TAG[i] 1 i idź do kroku A8. W przeciwnym razie, jeśli TAG[i] = 0, to idź do kroku A7. A3. [Porównywanie] Jeśli Q = KEY[ż], to algorytm kończy działanie sukcesem. A4. [Przejście do następnego] Jeśli LINK [i] ^ j, to przyjmij i «— LINK [i] i wróć do kroku A3. A5. [Znalezienie pustego miejsca] Zmniejsz R raz lub więcej razy, aż do znalezienia takiej wartości, że pozycja TABLE[i?] jest pusta. Jeśli R = 0, to algorytm kończy działanie z sygnalizacją przepełnienia; w przeciwnym razie przyjmij LINK [i] <- R. A6 . [Przygotowywanie do wstawienia] Przyjmij i <—R, TAG[/?] <—0 i idź do kroku A8. A7. [Przemieszczanie rekordu] Powtarzaj i «— LINK[i] raz lub więcej razy do chwili, kiedy będzie LINKH = j. Następnie wykonaj krok A5. Potem przyjmij TABLE [i?] <- TABLE[z] , i «- j, TAG[j] <- 1. A8 . [Wstawianie nowego klucza] Zaznacz pozycję TABLE [z] jako zajętą, z KEY[z] <- Q, LINK [ż] «-¿. | (Zauważmy, że jeśli pozycja TABLE [ż] jest zajęta, to można wyznaczyć pełną wartość odpowiedniego klucza K , znając tylko wartość ż. Mamy q(K) = KEY[z], a jeśli wyko namy operację i <— LINK [i] zero lub więcej razy do chwili, aż będzie TAG[ż] = 1, to będzie h ( K ) = z —1 ). 14. Zgodnie z przyjętymi konwencjami zapis „X <= AVAIL” z 2.2.3-(6) oznacza teraz następujące operacje. „Przyjmij X «— AVAIL; następnie powtarzaj X <— LINK(X) zero lub więcej razy do czasu, aż albo X = A (błąd OVERFLOW), albo TAG(X) = 0; na koniec przyjmij AVAIL LINK(X)”. Żeby wstawić nowy klucz K : przyjmij Q AVAIL, TAG(Q) «— l i zapamiętaj K w tym słowie. [Alternatywnie, jeśli wszystkie klucze są krótkie, to pomiń tę czynność i wstaw K w miejsce Qw poniższym opisie]. Następnie przyjmij R AVAIL, TAG(R) «— 1, AUX(R) «—Q, LINK(R) «—A. Przyjmij P «—h(K) oraz jeśli TAG(P) = 0, to przyjmij TAG(P) «- 2, AUX(P) «- R; jeśli TAG(P) = 1, to przyjmij S AVAIL, CONTENTS(S) «- CONTENTS(P), TAG(P) «2, AUX(P) «- R, LINK(P) «- S; jeśli TAG(P) = 2, to przyjmij LINK(R) «- AUX(P), AUX(P) «- R. Żeby wyszukać klucz K: przyjmij P «—h(K);
788
ODPOWIEDZI DO ĆW ICZEŃ
6.4
jeśli TAG(P) 7^ 2, to klucza K nie ma; jeśli TAG(P) = 2, to przyjmij P AUX(P); następnie powtarzaj P <— LINK(P) zero lub więcej razy, aż albo P — A, albo TAG(P) = 1 i albo AUX(P) = K (jeśli wszystkie klucze są krótkie), albo AUX(P) wskazuje na słowo zawierające K (być może pośrednio poprzez słowa z TAG = 2). Elcock w swoim oryginalnym schemacie [Comp. J. 8 (1965), 242-243] w rzeczywistości korzystał z wartości TAG — 2 i TAG = 3 do rozróżnienia między listami długości jeden (kiedy możemy oszczędzić jedno słowo pamięci) i dłuższymi. To ulepszenie jest warte zastosowania, ponieważ tablica z haszowaniem jest zapewne na tyle duża, że prawie wszystkie listy będą długości jeden. Inny sposób „nałożenia” tablicy z haszowaniem na duży obszar pamięci przy dzielanej dynamicznie przy użyciu sklejających się list zamiast metody łańcuchowej z osobnymi listami zaproponował J. S. Vitter [Inf. Proc. Letters 13 (1981), 77-79], 15. Wiedząc, że zawsze jest wolne miejsce, możemy przyspieszyć wewnętrzną pę tlę, ponieważ nie musimy utrzymywać licznika wykonań kroku L2. Krótszy program szczodrze rekompensuje tę jedną straconą komórkę. [Z drugiej strony, istnieje zgrabny sposób pozbycia się zmiennej N i dopuszczenia do całkowitego wypełnienia tablicy w algorytmie L bez dostrzegalnego spowolnienia tej metody dopóty, dopóki tablica rzeczywiście się nie przepełnia: Sprawdzamy po prostu, czy i < 0 następuje dwukrotnie! Tego triku nie stosuje się do algorytmu D]. 16. Nie: 0 zawsze powoduje skok do SUCCESS, wszystko jedno, czy zostało wstawio ne, czy nie, natomiast skok do etykiety SUCCESS następuje z różnymi wartościami i w różnych momentach.
17. 18.
Druga próba zawsze dotyczyłaby wówczas pozycji 0. Kod (3 1) kosztuje około 3(A —51) jednostek więcej niż (30) i daje oszczędność 4u razy różnica między (26), (27) a (28), (29). W przypadku wyszukiwania zakończonego sukcesem (3 1 ) zyskuje przewagę dopiero dla tablicy wypełnionej więcej niż w 94 pro centach i nigdy nie pozwala oszczędzić więcej niż około ~u. W przypadku wyszukiwania zakończonego niepowodzeniem (3 1) daje zysk dla tablicy wypełnionej więcej niż w około 71 procentach. 2 0 . Chcemy pokazać, że z zależności
( 2 ) ^ ( 2 ) (modul° wynika j — k. Zauważmy, że z kongruencji j ( j —1) = k(k — 1) (modulo 2m+1) wynika (k —j)(k + j — 1) = 0. Jeśli k —j jest nieparzyste, to k + j —1 musi być wielokrotnością 2m+1, to jednak jest niemożliwe, ponieważ 2 ^ k + j — 1 2m+1 —2. Zatem k —j jest parzyste, więc k + j —1 jest nieparzyste i k —j jest wielokrotnością 2rn+1, skąd k — j . [W drugą stronę, jeśli M nie jest potęgą 2, to ten ciąg prób nie działa]. W tym ciągu prób występuje grupowanie wtórne i zwiększa on czas działania programu D (zmodyfikowanego jak w (30)) o około | ( C —1) —(A —51) jednostek, po nieważ wartość B « (Cg / M będzie teraz pomijalna. Stanowi to niewielkie ulepszenie do czasu wypełnienia tablicy w około 60 procentach. 21. Jeśli zmniejszymy iV, to algorytm D może źle zadziałać, osiągając stan, w którym nie ma już wolnych miejsc, i wpadając w nieskończoną pętlę. Z drugiej strony, jeśli nie zmniejszymy iV, to algorytm D może zasygnalizować przepełnienie pomimo tego, że nadal jest miejsce w tablicy. Ta ostatnia możliwość stanowi mniejsze zło, ponieważ
ODPOWIEDZI DO ĆW ICZEŃ
6.4
789
możemy przeprowadzić ponowne przehaszowanie w celu pozbycia się skasowanych ko mórek. (W tym ostatnim przypadku w algorytmie D powinno się zwiększać N i spraw dzać, czy nie następuje przepełnienie, jedynie przy wstawianiu elementu na poprzednio pustą pozycję, ponieważ N reprezentuje liczbę pozycji niepustych). Moglibyśmy również utrzymywać dwa liczniki. 22. Przypuśćmy, że pozycje j — 1, j — 2, . . . , j — k są zajęte, a j — k — 1 jest pusta (modulo M). Klucze, dla których przed ich wstawieniem zaglądamy na pozycję j i stwierdzamy, że jest zajęta, to dokładnie te klucze na pozycjach od j — 1 do j —A;, których adresy haszowania nie leżą między j —1 a j —fc; takie problematyczne klucze występują w kolejności ich wstawiania. Algorytm R przesuwa pierwszy taki klucz na pozycję jf, a następnie powtarza cały proces dla mniejszego zakresu problematycznych pozycji dopóty, dopóki nie znikną wszystkie problematyczne klucze. 23. Schemat usuwania dla metody łańcuchowej ze sklejaniem list opracowany przez J. S. Vitteriego [J. Algorithms 3 (1982), 261-275] zachowuje rozkład czasów wyszuki wania. 24. Mamy P (P - 1)(P - 2) P (P - 1 ) P ( P - 1)/(M P (M P - 1) ... (M P - 6)) = M ~ 7( 1 —(5 —21/M )P _1 + 0 ( P “ 2)). Ogólnie, prawdopodobieństwo uzyskania ciągu haszowania ai...ajv wynosi P~j ) / ( M P ) — = M ~ N + 0 ( P _1), gdzie bj jest liczbą tych Oi, które są równe j. 25. Niech (N + l)-szy klucz będzie haszowany na pozycję a; P& to M ~ N razy liczba ciągów haszowania, które pozostawiają k pozycji a, a —1 , , . . , a —k + 1 (modulo M) zajętych i a —k pustą. Liczba takich ciągów z pozycjami a + 1, . . . , a + t i a + t + 1 pustą wynosi g(M, 7V,t+&), z cyklicznej symetrii algorytmu. 26- ^ r i u ! ^ 3’2) ^ 3’2) ^ 5’4) ^ 2’1) ^ 223554^ 27. Korzystając ze wskazówki,
4252500-
W pierwszej sumie zastępujemy k przez n — k i stosujemy wzór Abela; w drugiej zastępujemy k przez k + 1. Teraz g(M, N, k) = ( ^ ) (k + 1)k~ \ M - k -
(M - N - l ) ,
gdzie 0/0 = 1 dla k = N — M — 1 , i Mn
+ 1 )Pk =
J2(kt
2)g{M, N, k)
= l ( ^ k + 1^ ( M ^N ^ ) + T , ( k + 1^ 9 ( M , N , k ) Pierwsza suma jest równa M N Y^Pk = M N, a druga to s ( N , l , M — 1 ) — M N + 2 N M n ~1 -|- S N (N — 1) M n ~2 + ■• • = M iVQi(M , N). [Dalsze rozważania dotyczące sum takich jak s(n, x, y) można znaleźć u J. Riordana, Combinatorial Identities (New York: Wiley, 1968), 18-23]. 28 . Niech ¿(rz, x, y) = J2k^o (fc) (x + k)k+2(v ” ^)n~k l (v ~ n )i wówczas tak jak w ćwi czeniu 27 stwierdzamy, że ¿(n, x,y) = xs(n,x, y) + nt(n —1, a:+l, y —1), t[N, 1, M —1 ) =
zajętymi
790 M
n
ODPOWIEDZI DO ĆWICZEŃ (3Q3{M, N ) -
6.4
2 Q 2 ( M , N ) ) . T a k w ięc
5 3 (fc + 1 ) 2 P k = M ~
=
n
Q s ( M
5 3 ( | ( f c + l ) 3 + | ( f c + l ) 2 + J(fc + 1 ) ) S ( M ,
,
IV )
-
| q
2 ( M , IV )
+
\
qąm
,IV )
IV ,
fc)
+
Odejmując (C^)2, dostajemy wariancję równą w przybliżeniu | (1 —a )~4 —| (1 —a )” 3 — Odchylenie standardowe jest często większe niż wartość średnia; jeśli na przy kład a = 0*9, to wartość średnia wynosi 50.5, a odchylenie standardowe jest równe ~V27333 « 82.7. 29. Niech M = m+l , i V = n; ciągi bezpiecznych parkowań to dokładnie te, w których po zycja 0 jest pusta, kiedy algorytm L stosujemy do ciągu haszowania ( M—a i ) ... ( M—an). Zatem odpowiedź to /(m + 1 , n) — (m + l ) n —71(771 + l) n_1. [Ten problem pochodzi od A. G. Konheima i B. Weissa, SIAM J. Applied Math. 14 (1966), 1266-1274. Zobacz również R. Pyke, Annals of Math. Stat. 30 (1959), 568-576, Lemma 1]. 30. Oczywiście, jeśli samochody zostają zaparkowane, to definiują taką permutację. W drugą stronę, jeśli pip 2 .. -pn istnieje, to niech qiq2 .. ,qn będzie permutacją od wrotną (qi = j wtedy i tylko wtedy, gdy pj = i) i niech bi będzie liczbą tych aj, które są równe i. Każdy samochód zostanie zaparkowany, jeśli udowodnimy, że bn ^ 1 , bn-i + bn ^ 2 itd.; równoważnie 61 ^ 1, bi + 62 ^ 2 itd. To jednak jest oczywiście prawdziwe, ponieważ wszystkie k elementów aQ1, . . . , aqk jest ^ k . [Niech Tj będzie „lewym zasięgiem widoczności” dla czyli rj — k wtedy i tylko wtedy, gdy qj _ 1 < qj, . . . , qj _ *_ 1 < qj, i albo j = /c, albo qj _ fc > qj. Spośród wszystkich permutacji p \ ... pn dominujących dany „ciąg obudzeń” a\ .., an, algorytm „zaparkuj natychmiast” znajduje najmniejszą (w porządku leksykograficznym). Konheim i Weiss zauważyli, że liczba ciągów obudzeń prowadzących do danej permutacji p \ . . . p n jest równa n ^= i ri''>ciekawe, że suma tych iloczynów po wszystkich permutacjach q\ ... qn wynosi (n + l) 71“ 1].
31.
Istnieje wiele ciekawych związków, a trzy poniższe to te ulubione przez autora [zobacz też Foata i Riordan, Æquat. Math. 10 (1974), 10-22]: a) Przy oznaczeniach z poprzedniej odpowiedzi, liczniki 61, 62, • ■■, bn odpowiadają pełnemu ciągowi parkowań wtedy i tylko wtedy, gdy (61, 62, **•, bn, 0) jest poprawnym ciągiem stopni węzłów drzewa w porządku prefiksowym. (Porównaj z ciągiem 2.3.3-(g), ilustrującym porządek postfiksowy). Każde takie drzewo odpowiada nl/bi!... bnl róż nym etykietowanym wolnym drzewom na zbiorze węzłów {0, . . . , n}, ponieważ możemy przyjąć 0 jako etykietę korzenia i po kolei dla k — 1 , 2, . . . , 71 wybierać etykiety dla synów fc-tego węzła w porządku prefiksowym na (bk H bbn)l/bkl (ófc+i H h&n)! sposobów spośród pozostałych niewykorzystanych etykiet, dołączając etykiety od strony lewej do prawej w kolejności rosnącej. Każdy taki ciąg liczników odpowiada n\/b\ \ .., bn\ ciągom obudzeń. b) Dominique Foata podał następującą zgrabną wzajemnie jednoznaczną odpowiedniość: Niech a\ ... an będzie ciągiem bezpiecznych parkowań, w którym samochód qj zostaje zaparkowany na miejscu j. Etykietowane wolne drzewo na zbiorze węzłów {0, 1 , . . . , 71} konstruujemy, rysując krawędź od j do 0, jeśli Oj — 1 , oraz od j do qa j- 1 w przeciwnym razie dla 1 ^ j ^ n. (Myślmy o węzłach drzewa jako o samochodach; samochód j jest połączony z samochodem, który na końcu ląduje tuż przed miejscem, w którym ocknęła się j-ta żona). Na przykład czasy obudzeń 3 1 4 1 5 9 2 6 5 zgodnie z tą
ODPOWIEDZI DO ĆW ICZEŃ
6.4
791
regułą prowadzą do wolnego drzewa 2 7
Na odwrót, ciąg zaparkowanych samochodów można otrzymać z drzewa za pomocą sortowania topologicznego, zakładając, że strzałki biegną od korzenia 0 i w każdym kroku wybierając najmniejsze „źródło”. Na podstawie tego ciągu można zrekonstru ować fli . . . On c) Najpierw konstruujemy drzewo pomocnicze, jako ojca węzła k biorąc pierwszy element > k następujący po A; w permutacji q\ . .. qn; jeśli nie ma takiego elementu, to ojcem jest 0. Następnie tworzymy kopię drzewa pomocniczego i przeetykietowujemy węzły różne od zerowego w nowym drzewie w porządku prefiksowym w następujący sposób. Jeśli etykietą bieżącego węzła w drzewie pomocniczym było k , to zamieniamy jego aktualną etykietę z etykietą, która jest obecnie (1 + Pk — ak)~ta w porządku rosnącym w jego poddrzewie. Na przykład drzewo pomocnicze 6
drzewo wynikowe 6
Żeby odwrócić tę procedurę, możemy zrekonstruować drzewo pomocnicze, przetwarza jąc węzły w porządku prefiksowym i zamieniając etykietę każdego węzła z aktualnie największą etykietą w jego poddrzewie. Konstrukcje (a) i (b) są ze sobą silnie powiązane, ale konstrukcja (c) jest zupełnie inna. Ma ona tę ciekawą własność, że suma odległości samochodów od ich położeń w momencie, kiedy zażądano ich zaparkowania, jest równa liczbie inwersji w drzewie - liczbie par etykiet a > 6, gdzie a jest przodkiem b. Tę zależność między ciągami parkowań a inwersjami w drzewie jako pierwszy odkrył G. Kreweras [Periodica Math. Hung. 1 1 (1980), 309-320]. Fakt, że inwersje w drzewie są ściśle związane z grafami spójnymi [Mallows i Riordan, Buli. Amer. Math. Soc. 74 (1968), 92-94], umożliwia teraz wywnioskowanie, że suma (Dj^) po wszystkich ciągach parkowań, gdzie D(p) = (Pi - ai)H b(pn —CLn), jest równa łącznej liczbie grafów spójnych o n-\-k krawędziach na etykietowanych wierzchołkach {0, 1 , . . . , n}. [Równania (2.1 1 ), (3.5) i (8.13) w pracy Jansona, Łuczaka, Knutha i Pittela, Random Struct. &; Alg. 4 (1993), 233-358]. 32. Potraktujmy indeksy cyklicznie, czyli przyjmijmy, że cm = Co, c m + i = ci itd. Nie istnieje rozwiązanie takie, że cj = bj + Cj+i —1 dla każdego j, ponieważ, sumując po wszystkich j, dostalibyśmy = cj ~ M cj • Tak więc w każdym rozwiązaniu jest M — ^2 bj wartości j takich, że bj = Cj+i = 0. Gdyby (cf0 j. . . , ctM_ l ) było innym rozwiązaniem, wówczas musiałoby być c' +1 > 0 dla przynajmniej jednego takiego j; stąd jednak wynikałoby c' +2 > ci+ 2, Cj + 3 > Cj + 3 , . . . , więc sprzeczność. Rozwiązanie można znaleźć, określając wartości c m - 1 , c m - 2 , przy założeniu, że Co = 0; wówczas, jeśli co okaże się być większe niż 0, to wystarczy przedefiniowywać c m - 1 , c m - 2 , • * * dopóty, dopóki nie skończą się zmiany. c j
792
6.4
ODPOWIEDZI DO ĆW ICZEŃ
33. Poszczególne prawdopodobieństwa nie są niezależne, ponieważ nie wzięto pod uwagę warunku bo + &i H h&M-i —N; w wyprowadzeniu dopuszcza się z niezerowym prawdopodobieństwem dowolną zadaną nieujemną wartość ^2 bj- Równania (46) nie są ściśle poprawne; wynika z nich na przykład, że qk jest dodatnie dla każdego fc, co stoi w sprzeczności z faktem, że ej nigdy nie może przekroczyć N —1. Gaston Gonnet i łan Munro [J. Algorithms 5 (1984), 451-470] znaleźli ciekawy sposób uzyskania dokładnego wyniku na podstawie wywodu prowadzącego do wzo ru (5 1 ) przez wprowadzenie użytecznej operacji zwanej transformatą Poissona ciągu {Amn)' Mamy e~m2 A mn(mz)n/n\ = J2k akZk wtedy * wtedy, gdy A mn = J2k akn - / m k.
34.
(a) Jest (^) sposobów wyboru zbioru j, takich że aj ma pewną konkretną wartość, oraz (M —1 ) ^ ^ sposobów przypisania wartości pozostałym elementom ciągu a. Tak więc P N k =
( Nk ) ( M - l ) N - k/ M N .
(b) PN (z) = B{z) ze wzoru ( 50 ) . (c) Rozważmy łączną liczbę prób potrzebnych do znalezienia wszystkich kluczy, nie licząc dostępu do wskaźnika w tablicy początków list z rysunku 38, jeśli taka tablica jest używana. Lista długości k wnosi do sumy wartość (k^1); zatem C N = M
j 2 ( k
2
X)
= ( M / N ) ( i p ^ ( l ) + P' N ( 1)).
(d) W przypadku (i) lista długości k wymaga k prób (nie licząc dostępu do początku listy), podczas gdy w przypadku (ii) wymaga ona k + Óko prób. Zatem w przypadku (ii) dostajemy C fN = + SkQ)PNk = K i 1) + PN(0) - N / M + (1 - 1 / M ) N « a + e‘ a , podczas gdy w przypadku (i) jest po prostu CfN — N / M — a. W przypadku (iii) zachodzi zależność M C fN = M —N + N C n , ponieważ dla M — N wartości funkcji haszującej trafimy na pustą pozycję w tablicy, a dla N wartości przeszukamy pewną listę od jakiegoś miejsca do samego końca; to daje wzór (18). 35.
(i) 2 ( 1 + ! * - ( * +
1 + ^ a — ( 1 — e ~ a ) / a . (ii) D o d a j 2
= 1 + N / ( 2 M ) - M { 1 - (1 -
1 / M ) n + 1 ) / ( N + 1) w
S k o P N k — ( 1 — 1 / M ) N ~ e ~ a d o w y n i k u z p u n k t u (i).
(iii) Załóżmy, że jeśli wyszukiwanie kończące się niepowodzeniem rozpoczyna się od j-tego elementu listy długości fc, to dany klucz jest na losowej pozycji wśród pozostałych k elementów, więc oczekiwana długość wyszukiwania to (j ■1 + 2 - f b (k -f 1 —j) + (k + 1 —j ) ) / (k + 1 ). Sumując po j, dostajemy teraz MC'N = M —N + M ¿ (fc 3 + 9k2 + 2k)PNk/(6k + 6) = M —iV + M ( ± N ( N - 1) / M 2 4- \ N / M - 1 + ( M / ( N + l))(l - (1 1/M )n+1))] zatem C'N w 4- \ a 2 + (1 - e " “ )/a .
36. (i) N / M - N / M 2, (ii) J2(Sko + k)2PNk = £ ( ń fc0 + k2)PNk - PN (0) + F&(1) + P n {1). Odejmując (C ^)2, dostajemy wynik, (M - 1)N/M2 + (1 —1/M)N (l —2N /M — (1 —1/M )n ) w a + e~a (1 —2a —e_a ) ^ 1 —e~l —e~2 — 0.4968. [Dla struktury danych (iii) konieczna byłaby bardziej skomplikowana analiza, taka jak w ćwiczeniu 37]. 37.
Niech S n będzie średnią wartością wyrażenia (C — l ) 2, przy założeniu, że wszyst kich M N N sposobów wyboru ciągów haszowania i kluczy jest jednakowo prawdopo dobnych. Wówczas M n N S n = 1 Y , ( fcl N kM)
~
kl ~
+ '''+
" ^ kM ~ ^
6.4
ODPOWIEDZI DO ĆWICZEŃ
= ! m£k ( i ) (M-
793
-!)
= ±M N(N - 1)(N - 2) £ ( ^ “ 33 ) (M - 1)""* k + ^ M N ( N - l ) J£ ( N k ~ ^ ) ( M - l ) N- k k = \ m N (N - 1)(N - 2)Mn ~3 + \M N {N - 1)M N~2. O ¿i
Wariancja wynosi S n — ((N — l ) / 2M ) 2 — (N — l ) ( N + 6M —5)/12M 2 « - a + ^ a 2. W CMath w podrozdziale 8.5 omówione są ciekawe powiązania między obliczoną tu łączną wariancją a dwoma innymi pojęciami wariancji: wariancją (względem losowych tablic z haszowaniem) średniej liczby prób (po wszystkich wstawionych elementach) oraz średnią wartością (względem losowych tablic z haszowaniem) wariancji liczby prób (po wszystkich wstawionych elementach). Łączna wariancja jest zawsze sumą dwóch pozostałych; w tym przypadku wariancja średniej liczby prób jest równa (M — l ) ( N — 1)/(2M2N). 38. Zgodnie z równaniami 6.2.2- ( 5) i 6.2.2-(6), średnia liczba prób w przypadku niepowodzenia wynosi Y ^Nk{2Hk+i - 2 + Sko), a (M/N) Y PNkk(2(1 + 1/ k ) H k - 3) w przypadku sukcesu. Otrzymane sumy są równe i wynoszą odpowiednio 2 f(N) + 2M(1 - (1 - 1/ M ) n+1) / ( N + 1) + (1 - 1/M) n - 2 oraz 2( M / N ) f ( N ) + 2/(JV - 1) + 2M (l —(1 —1/M)n ) / N - 3, gdzie f ( N ) = Y PNkHk■Ćwiczenie 5.2.1-40 mówi nam, że /(IV) —Ina + 7 + E \( ol) 4- 0 (M ~ 1) dla N = aM, M —>oo. [Haszowanie drzewowe jako pierwszy zaproponował P. F. Windley, Comp. J. 3 (1960), 84-88. Analiza przedstawiona w poprzednim akapicie pokazuje, że haszowanie drzewowe nie jest o tyle lepsze od zwykłej metody łańcuchowej, żeby uzasadniać użycie dodatkowych pól z dowiązaniami; listy tak czy owak są krótkie. Co więcej, jeśli M jest małe, to haszowanie drzewowe nie jest o tyle lepsze niż samo wyszukiwanie w drzewie, żeby zrekompensować czas haszowania]. 39. (To podejście do analizy algorytmu C zaproponował J. S. Vitter) Mamy CAr+i(fc) = (M —k)cN(k) -\- (k — 1)cjv(/c —1) dla k ^ 2 oraz Y kcN(k) = N M n . Tak więc S
n
+
i
= ^ 2 (^ )cN + i(k) =
2 =
5^ ( 2) ^ ^ k^2
-
k ) c N {k) + (k -
1)cjv(k -
1))
((M + 2) ( 2 ) + fc) CN (k) = (M + 2)S n + N M n .
Stąd mamy S N = {N + (N - 2) M N~2{M + 2) + • • • + M (M + 2)N~2 = \{M(M + 2)n —M n+1 — 2NM n ). Rozważmy łączną liczbę prób przy wyszukiwaniach zakończonych niepowodze niem, zsumowaną po wszystkich M wartościach h ( K ); każda lista długości k wnosi do tej sumy wartość k + 5ko + (2)» zatem M NJrlCfN — M N+1 + S n 40. Zdefiniujmy Un podobnie jak S n w ćwiczeniu 39, ale z (*) zastąpionym przez (h^ ) . Mamy UN+1 = (M + 3)UN + SN + N M n , zatem UN = ± { M N(M - 6N) - 9M (M + 2)N + 8 M (M + 3)N).
794
ODPOWIEDZI DO ĆWICZEŃ
6.4
Wariancja jest równa 2t/jv/M N+1 + C'N — {C'N)2, a to wyrażenie zbiega do -35. _ J-a _ I a 2 + ( i a _ 5)e2« , 4 3a _ J_ 4Q 144 12 4 “ V4ce 8/ “ 9 16 dla N = aM, M —►oo. Dla a = 1 jest to około 4.50, więc odchylenie standardowe jest ograniczone przez 2.12. 41. Niech Vn będzie średnią długością bloku zajętych komórek na „górnym” końcu tablicy. Prawdopodobieństwo tego, że blok zajętych komórek ma długość k, wynosi Ajsrk(M — 1 — / M N, gdzie jest liczbą ciągów haszowania (35), takich że w wyniku działania algorytmu C zajętych zostaje pierwszych N — k i ostatnich k komórek, a podciąg 1 2 . . . N —k występuje w porządku rosnącym. Tak więc M n Vn = Z k k A Nk(M - 1 - fc)—
= M N+1 - J2k(M - k)ANk(M - 1 - fc)—
= M n+1 - (M - N ) J2k A Nk{M - k ) ^ =
- (M - N ){M + 1)N.
Teraz T n = ( N / M ) (l + Vn — To — **• —T n - 1), ponieważ indeks R był poprzednio zmniejszany średnio To4 l-Tjv-i razy, N / M zaś to prawdopodobieństwo, że zostanie on zmniejszony w bieżącym kroku. Rozwiązaniem tego równania rekurencyjnego jest T n = (N/M)( 1 + 1/M )n . (Taki prosty wzór, aż się prosi o prostszy dowód!). 42. 51 n to liczba elementów wstawionych z A = 0, podzielona przez N. 43. Niech N — a M f oraz M — p M f i niech e~A + A = 1//?, p = a/p. Wówczas C n ^ 1 "I- \ p i Cn ^ p + e p, jcsli p ^ A; C n ^ (e2^ 2A—1 —2p+2A)(3 —2 /P -(-2A) + 1(P + 2A - \ 2/p) i « 1/P + i(c 2p -2A_ !)(3 - 2/p + 2A) - \{p - A), jeśli p ^ A. Dla a — 1 najmniejszą wartość C n ~ 1-69 dostajemy, biorąc p « 0.853; najmniejsza wartość <7^ ~ 1.79 jest osiągana dla p « 0.782. Przyjmując p ~ 0.86, dostajemy prawie optymalną wydajność wyszukiwania dla szerokiego zakresu wartości a. Opłaca się więc umieszczać pierwsze kolidujące elementy w obszarze, który nie jest w konflikcie z adresami haszowania, pomimo tego, że mniejszy zakres adresów haszowania będzie powodował występowanie większej liczby kolizji. Powyższe wyniki uzyskał Jeffrey S. Vitter, JACM 30 (1983), 231-258. 44. (Poniższe siłowe podejście było rozwiązaniem znalezionym przez autora w 1972 roku; znacznie elegantsze rozwiązanie M. S. Patersona jest wyjaśnione w książce Mathematics for the Analysis of Algorithms GreeneJa i Knutha (Birkhauser Boston, 1980), podrozdział 3.4. Paterson znalazł również sposoby znacznego uproszczenia wielu innych analiz przedstawionych w tym podrozdziale). Ponumerujmy pozycje w tablicy od 1 do m, z lewa na prawo. Zakładając, że każdy spośród ciągów operacji zawierających k „p-kroków” i n —k „^-kroków” jest jedna kowo prawdopodobny, jako
(ci,... ,C(_i_fc),
2 ^ Ci ^ m,
prawdopodobieństwa tego, że pierwsza pusta komórka ma numer r, jeśli aj-tą operacją jest p-krok, a pozostałych l — 1 —k operacji to g-kroki, które zaczynają się od od powiedniego wybrania pozycji ci, . . . , q ... i . k- Sumując po wszystkich konfiguracjach spełniających dodatkowy warunek, że a^-ta operacja powoduje zajęcie pozycji bj dla danych 1 ^ &i < • • • < bk < r, otrzymujemy zależność rekurencyjną
6.4
ODPOWIEDZI DO ĆWICZEŃ
g(m, l, fc+1 , r) =
795
(m—b)\
^ 1/ ^ ^ I™ _ mi (m ~ 1 + Odirn , a ’ fc’ (l~r)\
^ a
1śb
(m “ 1 + X) ( p + Ir /
“ p )) ’
gdzie Pi = (m /(m —l)) i_1. Przyjmując G(m ,l,k) = l 4 =i {m + l-r)g (m ,l,k ,r), mamy G ( m , l , k + 1 ) = —— y 2 G{m, a, A;); m —i + 2 a = l
G(m,l,0) = —— t ^ - h m + Pi). m —/ + z
Odpowiedzią na postawiony problem jest wyrażenie m —Sfc=o PkQn~kG(myn+1, k), które (po pewnych manipulacjach) jest równe m —((rn—n)/(rn—n Jrl))(QnĄ-rnR-\-pSR)^ gdzie Qj ~ Pj+1
^ n —1
j
R = fVi - - M )■■■ ^ n + 2 /= TT ( i m + l f/ 1\ - Ł m j ( Ł--------\ m — 3=0
s (‘ - ^ K V
_ yi
(■ -;>
ra + 1 /
V
(1 - l/(m + 1 -
m+ lj\
,
j
m + ^---l —j rJ ,
+i i t 4 + i K i
mj
k))Qk
h ó n j u u - p/(m + 1 - f i ) Jeśli p — l/m , to Qj ~ 1 dla każdego j. Przyjmując w = m -f 1, n = a w , w —►oo, dostajemy lni? = —(Hw - Hw^ - a))p-\- 0 (p 2); zatem R = 1 + w -1 ln(l - a) + 0 ( w ~ 2); podobnie S = aw-\-0( 1 ). Tak więc odpowiedź brzmi (1 —a ) -1 —1 —a —ln (l—a )+ 0 (u ;^ 1). Uwagi: Prostszy problem „z prawdopodobieństwem p zajmij pierwszą z lewej, w przeciwnym razie zajmij dowolną losowo wybraną pustą pozycję” rozwiązuje się, przyjmując Pj — l w powyższych wzorach, a wynikiem jest m — (m + l)(m —n )R f (m —n -f 1 ). Żeby uzyskać wartość C'N dla próbkowania losowego z grupowaniem wtórnym, przyjmij n = N, m = M i dodaj 1 do powyższego wyniku. 45. Tak. Zobacz L. Guibas, JACM 25 (1978), 544-555. 46. Zdefiniujmy liczby [[” ]] dla k ^ 0 wzorem
k
dla każdego x i dla każdej nieujemnej liczby całkowitej n. Przyjmując x = —1 , —2, . . . , —n —1 , mamy [[fc]] =
Y1 ( ^ ) ( - 1)J(n _ j ) n
dlaO^fc^n;
3
przyjmując dalej x — 0, widzimy, że możemy wziąć [[£]] = 0 dla każdego k > n, więc obydwie strony stanowiącego definicję równania są wielomianami względem x stopnia n, które zgadzają się w n+1 punktach. Stąd wynika, że liczby [[£]] mają podaną własność.
796
ODPOWIEDZI DO ĆW ICZEŃ
6.4
Niech f ( N , r ) będzie liczbą ciągów haszowania o i ... a/v, dla których pierwszych r pozycji jest zajętych, a następna jest pusta. Istnieje (MAT^~1) możliwych konfiguracji zajętych komórek, a każda konfiguracja występuje tyle razy, ile jest ciągów a[ ... aN, 1 ^ o!i ^ N, które zawierają każdą z liczb r + 1 , r -h 2, N przynajmniej raz. Na mocy zasady włączania-wyłączania jest [[^/Ir ]] takich ciągów; zatem M ~ r —1 \ f f N Teraz N
/ r r—- l 1
MM- l- l
,,
\
c ; = i+ M -» -'£ /{ jv ,r)(j:r + Y. r —0
k a —0
a,=7’4-1
Z
N = 1 + M _ N ~ 1 ] T /(JV, r ) ( N + ( N -
l)r).
r —0
N i e c h S „ ( x ) = Z ) fc* ( Xfcfc)[[fc]]; m a m y
(.+i)-« .w +E ( * : ‘ ) [ [ ; ] ] - E ( * +i +‘ )
~n _k_
zatem Sn(x) = (x + l)((:r + n + 2)n —(x-\-n+ l ) n). Stąd wynika, że C*N — N ( l + 1/M) — (N - 1)(1 - N / M ) ( l + 1/M )N « N(1 - (1 - a)ea) oraz C n — {N — 1)((1 + l/M )/2 + (1 + 1/M )n ) + (3M2 + 6M + 2 )((1 + 1/M ) n - l)/JV - (3M + 2)(1 + 1 /M )N, czyli (e - 2.5)M + 0(1) dla N = M —1. O dalszych własnościach liczb [[£]] można przeczytać w książce Johna Riordana, Combinatorial Identities (New York: Wiley, 1968), 228-229.
47.
Analiza algorytmu L stosuje się tu niemalże słowo w słowo! Tak samo będzie się zachowywał dowolny ciąg prób z cykliczną symetrią, w którym odwiedzane są tylko pozycje sąsiadujące z wcześniej zbadanymi.
48.
CfN = 1 + p + p2 + • *•, gdzie p = N / M jest prawdopodobieństwem tego, że losowa pozycja zostaje wypełniona; zatem CfN ~ M / ( M —N) i C n = N ~ x @k = N ^ 1M ( H m ~ H m - n )- Te wartości są w przybliżeniu równe tym dla próbkowania jednostajnego, ale nieco większe, ze względu na szansę powtarzania prób w tym samym miejscu. Rzeczywiście, dla 4 = N < M 16 próbkowanie liniowe jest lepsze! W praktyce nie używalibyśmy nieskończenie wielu funkcji haszujących; jako osta teczne wyjście zastosowany byłby jakiś inny schemat, jak na przykład próbkowanie liniowe. Ta metoda jest gorsza niż te opisane w tekście podrozdziału, ale ma znaczenie historyczne, ponieważ zasugerowała metodę Morrisa, która doprowadziła do powstania algorytmu D. Zobacz CACM 6 (1963), 101, gdzie M. D. Mcllroy przypisuje autorstwo tej koncepcji V. A. Vyssotsky’emu; tę samą technikę odkrył już w 1956 roku A. W. Holt, który stosował ją z powodzeniem w systemie GPX na maszynę UNIVAC.
49.
C'N - 1 = J2k>b(k~b)PNk ~ mamy
= abtb(a). [Uwaga: Ogólnie P ' ( 1)
E
(
e
6^0 Vk>b
< *-
w
V
/
- ?
^
, z (P(z) -
+
1)
(1 - z )2
ODPOWIEDZI DO ĆW ICZEŃ
6.4
797
jeśli P(z) —Po + Pi z H— • jest dowolną funkcją tworzącą prawdopodobieństwa]. Dalej,
k>b
=
£ ( * ( * - 1) - 2k(b ~
+ w - 1))Pjvfc
k>b
(6a )b6!_1 (6 + 6a - 26 + 2 + (ba2 - 2a(b - 1) + b - 1 )R(a, b)). = 2' [Analizę zakończonego sukcesem wyszukiwania przy zastosowaniu metody łańcu chowej jako pierwszy przeprowadził W. P. Heising w 1957 roku. Proste wyrażenia (57) 1 (58) znalazł J. A. van der Pool w 1971 roku; rozważał on również kwestię zminimalizowania funkcji reprezentującej łącznie koszt pamięciowy i liczbę dostępów. Możemy wyznaczyć wariancję wielkości C'N i liczby przepełnień przypadających na jeden kubełek, ponieważ ^ k>b(k —b)2P^k = (2N /M )(C n —1) —(C'N — 1 ). Wariancję łącznej liczby przepełnień można określić w sposób przybliżony jako M razy wariancja w pojedynczym kubełku, jednak ta wartość jest w rzeczywistości za wysoka, ze względu na warunek, że łączna liczba rekordów jest równa A. Dokładną wartość wariancji można znaleźć tak jak w ćwiczeniu 37. Zobacz też wyprowadzenie testu chi-kwadrat w punkcie 3.3,1 C]. 50. A następnie, że Qo(M, A —1 ) = (M/N)(Qo(M, A) —l). Ogólnie, rQr (M ,N) = M Q r~2 (M, A) - (M - N - r)Qr- i ( M , N ) = M ( Q r- i ( M , A + 1 ) - Qr_i(M, A)); Qr( M ,N - 1 ) - (M/A)(Qr(M, A) - g r_x(M,A)). 51. R(a,n) = a -1 (n! eotri(an)~n —Qo(an,n)). 52. Zobacz równanie 1.2.11.3-(g) i ćwiczenie 3.1-14. 53. Na mocy równania 1.2.11.3—(8), a (a n )nR ( a , n) — ean7 (n+l , an); zatem zgodnie ze wspomnianym ćwiczeniem R ( a , 71 ) = (1 —a )-1 —(1 —a)~ 3n _1 + 0 ( n ~ 2). [Ten wzór asymptotyczny można otrzymać bardziej bezpośrednio metodą (43), jeśli zauważymy, że współczynnik przy a k w i?(a,n) jest równy —
( h
_
O k
_ L
9
_ L
/ k ^ , 2
1 - ( fci 2) n " + 0 ( f c V 2 ) '
W rzeczywistości współczynnikiem przy a k jest
E
/
-1
\ r
( "
1
)
—
r
n
( TT k 1 1 i k+ 1 I
na mocy równania 1 .2.9- ( 28)]. 54. Korzystając ze wskazówki oraz z równania 1.2.6-(53) i 1.2.6-(4q), mamy
b^l
m>l
V
M
'
k
m ^l
Wskazówka wynika ze znanej hipergeometrycznej tożsamości Kummera e~zF(a; b; z) — F(b —a;b; —z), ponieważ ( n + l ) ! t n (a) = e_na(an)nF( 2;n + 2; an); zobacz Crelle 15 (1836), 39-83, 127-172, równanie 26.4. 55. Jeśli B(z)C(z) = £ Siz\ to mamy c0 = s0 + • • • + s&, ci = s*>+i, c2 = s&+2, . ..; zatem B(z)C(z) = zbC(z) + Q(z). Teraz P(z) = z b ma 6 —1 pierwiastków qj, gdzie \qj\ < 1 , określonych jako rozwiązania równania ea ^ _1) — uj~j qj, u) — e2ni^b. Żeby
798
6.4
ODPOWIEDZI DO ĆW ICZEŃ
rozwiązać równanie ea^q ^ = uj 1q, przyjmijmy t = aq oraz z — atue “ , czyli t = ze1. Ze wzoru Lagrange’a dostajemy 1
. ń n~r~1u>na n~re~na = 1+ E r E (n — r)\ rj; 0 n^r
Na podstawie twierdzenia granicznego Abela, przyjmując, że |u>| —►1 od wewnątrz koła jednostkowego, można przekształcić to wyrażenie do postaci L z ^
+ y y m _ 2 V - i ) " wn+1(n + i r - 1. 1I_- ae w E 5^m\L \(-_ ii r r E /f\ m _2' j m^2 n^O n j
Zastępując teraz o; przez o/ i sumując po 1 ^ j < 6, otrzymujemy
m^2
^
n^l
'
skąd po pewnych dalszych manipulacjach z użyciem wskazówki z ćwiczenia 54 uzysku jemy żądany wynik. Tę analizę, stosowaną do wielu rozmaitych problemów, zapoczątkowali N. T. J. Bailey, J. Roy. Stat. Soc. B16 (1954), 80-87; M. Tainiter, JACM 10 (1963), 307-315; A. G. Konheim i B. Meister, JACM 19 (1972), 92-108. 56. Zobacz Blake i Konheim, JACM 24 (1977), 591-606. Alfredo Viola i Patricio Poblete [Algorithmica 2 1 (1998), 37-71] pokazali, że
c» ='+w +ï 3£(*7 V ^E(( r-21)<-1>'+“-,‘'-' ^^ ^1 7VM 1 1 1 1 / 7T r\łr—2 »t —1\ + 5fc + h E n T ( , 2, i j / bx ^ + Y A \ N ^ M + 0 { 'h M Sb 36 b y~i (l —T(e27rij/ i>_1)) 24 V 263M gdzie T jest funkcją drzewową z równania 2.3.4.4- ( 3o). 58. 0 1 2 3 4 i 0 2 4 1 3 plus addytywne przesunięcia o 11 1 1 1 mod 5, każda permutacja z prawdopodobieństwem Podobnie, dla M = 6 potrzebujemy 30 permutacji i istnieje rozwiązanie zaczynające się od x012345,
^ x 0132 54,
^ x 0 24315,
^ x 02 3451,
^ x 03412 5.
Dla M = 7 potrzebujemy 49 i rozwiązanie jest generowane przez dg x 0 1 2 3 4 5 6, ^§5 x 015 3 2 4 6 , ¿ x 0243516, 1§5 x 0263145, ~ x 036 1 4 2 5 , x 03 26415, I^ x 0315426. 59. Żadna permutacja nie może mieć prawdopodobieństwa większego niż 1/(lm/2j ) ’ więc musi być co najmniej = exp(M ln2 + 0 (logM)) permutacji z przypisanym niezerowym prawdopodobieństwem.
6.4
ODPOWIEDZI DO ĆW ICZEŃ
799
60. Wstępne wyniki otrzymali Aj tai, Komlós i Szemerédi, Information Processing Leiters 7 (1978), 270-273. 62. Zobacz omówienie w pracy AMM 81 (1974), 323-343, gdzie są podane najlepsze cykliczne ciągi haszowania dla M 9. 63. M H m , w myśl ćwiczenia 3.3.2- 8; odchylenie standardowe to æ ttM/^/6. 64. Średnia liczba przesunięć jest równa ^ ( N — 1 ) / M -f §(7V — 1 )(JV — 2) / M 2 + | ( N — 1 )(N —2)(N —3) / M 3 + *• ■ æ — 4 ln _L_t [Równoważny problem został rozwiązany w pracy Comp. J. 17 (1974), 139-140]. 65. Klucze można przechowywać w osobnej tablicy w sposób sekwencyjny (przy zało żeniu, że usunięcia, jeśli w ogóle występują, to w kolejności LIFO). Elementy tablicy z haszowaniem zawierają wskaźniki do tej „tablicy nazw”; na przykład zawartość TABLE[¿] mogłaby mieć postać 1
u KEY[i] ___ l___ gdzie Lj to liczba słów w kluczu przechowywanym na pozycjach KEYfż], KEYfi] + 1 , . . . . Pozostałą część zapisu w tablicy z haszowaniem można wykorzystać na jeden z wie lu sposobów: (i) jako dowiązanie w algorytmie C; (ii) jako część informacji związanej z kluczem; lub (iii) jako „kod haszowania drugiego rzędu”. To ostatnie rozwiązanie, zaproponowane przez Roberta Morrisa, pozwala niekiedy przyspieszyć wyszukiwanie [kluczowi umieszczonemu w KEYfż] przyglądamy się dokładnie dopiero wtedy, kiedy /12 (K) zgadza się z jego kodem haszowania drugiego rzędu dla pewnej funkcji h,2 (K)\. 6 6 . Tak; przy tym rozmieszczenie rekordów jest wyznaczone jednoznacznie. Średnia liczba prób przypadających na wyszukiwanie zakończone niepowodzeniem zmniejsza się do C n - i , chociaż pozostaje równa CfN przy wstawianiu iV-tego elementu. Ta ważna technika nosi nazwę haszowania porządkowego. Zobacz Comp. J. 17 (1974), 135-142; D. E. Knuth, Literate Programming (1992), 144-149, 216-217. 67. (a) Jeśli cj — 0 w (44), to optymalne rozmieszczenie uzyskuje się, sortując ciąg a w nierosnącym „porządku cyklicznym”, przy założeniu, że j — 1 > ■• ■> 0 > M —1 > ••• > j. (b) Między krokami L2 a L3 wymieniamy bieżący rekord z TABLE[i], jeśli ten ostatni jest bliżej adresu bazowego niż pierwszy. [Ten algorytm, zwany „haszowa niem Robin Hooda”, autorstwa Celisa, Larsona i Munro [FOCS 26 (1985), 281-288], jest równoważny pewnemu wariantowi haszowania porządkowego], (c) Niech /i(m, n,d) będzie liczbą ciągów haszowania, dla których co ^ d. Można pokazać [Comp. J. 17 (1974), 141], że (/i(m, n, d) —h(m, n, d ~ l ) ) M jest łączną liczbą wystąpień przemieszcze nia d > 0 we wszystkich M N ciągach haszowania i że zachodzi zależność h(M, N, d) — a(M, N 7d + 1) —Ara(M, 7V—1, d-\-1 ), gdzie a(m, n, d) = Y ^ =0 (]J) {m + d —k)n~k (k —d)k. Pracochłonne obliczenia przy użyciu metod z ćwiczeń 28 i 50 pozwalają teraz pokazać, że średnią wartością dj jest N
M '~ N E d2(h(M, N, d) - h(M, N, d - i)) d= 1
M 2 2M N N2 - 2 + 3 + 6 + 6M
N 6M
- M Î 5 ( r b F - S ( î ^ ) + l + ? + T ) + 0 <1)
800
6.4
ODPOWIEDZI DO ĆWICZEŃ
dla N — a M . Jeśli nie stosujemy tej modyfikacji (zobacz ćwiczenie 28), to K V] c/y jest
równa
y
(Q2
(M , N) -
Q 1
(M , N)) - y (Qo(M, N ) - 1) + j “
1 ( 3 (1 - a ) 3
1 3(1- a ) 2
1 l a\ 2( 1- a ) + 2 + § ) +
. ^
Jeśli wszystkie rekordy mają w przybliżeniu takie samo przemieszczenie d, a wy szukiwania kończące się sukcesem są znacznie częstsze niż kończące się niepowodzeniem, to warto rozpoczynać wyszukiwanie od pozycji hf = h(K) + d, a następnie sprawdzać pozycje h! —1, h! +1, h! —2 itd. P. V. Poblete, A. Viola i J. I. Munro pokazali [Random »Structures and Aigorithms 10 (1997), 221-255], że można uzyskać prawie równie małą wartość co w metodzie Robin Hooda, stosując znacznie prostsze podejście, zwane „ostatni na wejściu - pierwszy obsłużony”, zgodnie z którym każdy nowo wstawiany klucz jest umieszczany na swojej pozycji bazowej; wszystkie inne klucze przesuwają się o jedną pozycję aż do znalezienia wolnego miejsca. Techniki Robin Hooda i „ostatni na wejściu - pierwszy obsłużony” dają się stosować do haszowania podwójnego tak samo jak do próbkowania liniowego, jednak redukcja liczby prób nie rekompensuje zwiększenia czasu jednej próby w przypadku haszowania podwójnego, chyba że tablica jest prawie całkowicie wypełniona. (Zobacz Poblete i Munro, J. Algorithms 10 (1989), 228-248). 68. Można pokazać, że średnia wartość (di + ■■■+ djw)2 jest równa ^ ( ( M - N ) 3 + (N + 3)(M - N f + (8N + 1)(M —N) + 5N2 + 4N — 1 XÂ - ((M - N )3 + 4(M - N f + (6IV + 3)(M - N) + 8N)Q0{M, N - 1)), wykorzystując związek z problemem parkowania i z grafami spójnymi, wspomniany w odpowiedzi do ćwiczenia 31. Żeby wyznaczyć wariancję średniej liczby prób w wy szukiwaniu zakończonym sukcesem, dzielimy to wyrażenie przez N 2 i odejmujemy N —1) —l ) 2? w przybliżeniu jest to ¿ ( ( 1 -f 2ql)/(\ —a )4 - 1) / N + 0 ( N ~ 2). (Zobacz D. E. Knuth, P. Flajolet, P. V. Poblete i A. Viola, Algońthmica 22 (1998), 490-515. D. E. Knuth, Algońthmica 22 (1998), 561-568. Obliczoną tu wariancję powinno się odróżniać od łącznej wariancji, czyli E ^ d ^ / i V —\ N ~ 1) —l ) 2; zobacz odpowiedzi do ćwiczeń 37 i 67). 69. Niech qk = Pk 1 + ■■■; wówczas nierówność qk ^ max(0,1 —(fc —1)(M —rt)/M) daje dolne ograniczenie na C fN — Y k ^ i 70. Zadziwiająco prosty dowód podobnego wyniku, ale z dodatkowym czynnikiem (logM )2 w oszacowaniu O, podają Lueker i Molodowitch [Combinatońca 13 (1993), 83-96]; wynik podany w treści ćwiczenia otrzymuje się w taki sam sposób, korzy stając z dokładniejszych oszacowań prawdopodobieństwa. A. Siegel i J. P. Schmidt pokazali w rzeczywistości, że oczekiwana liczba prób w haszowaniu podwójnym wynosi 1/(1 —a) + 0(1/M ) dla ustalonego a = N/M . [Computer Science Tech. Report 687 (New York: Courant Institute, 1995)]. 72. [J. Comp. Syst. Sci. 18 (1979), 143-154] (a) Dla danych kluczy K\, . . . , K n i K prawdopodobieństwo tego, że Kj jest na tej samej liście co K , wynosi ^ 1/M , jeśli K ^ Kj. Oczekiwany rozmiar listy jest zatem ^ 1 + (N — 1)/M. (b) Przypuśćmy, że jest Q możliwych znaków; wówczas istnieje możliwych sposobów wyboru każdego hj. Losowy wybór każdego hj jest równoważny wybraniu
6.4
ODPOWIEDZI DO ĆW ICZEŃ
801
losowego wiersza z macierzy H o M wierszach i Ql kolumnach, zawierającego element h(xi. ..£() = (hi(xi) + ■■• + hi(xi)) mod M w kolumnie x \ . .. xi. W kolumnach K — x \ . . . x i i K f — x [ ... x fh gdzie xj ^ Xj dla pewnego j, mamy h(K) = (s + hj (Xj)) mod M oraz h ( K f) = (sł + hj (xfj )) mod M, gdzie s = /i*(a;*) i sł = M # ' ) są niezależne od hj. Wartość hj(xj) — hj(x'j) ma rozkład jednostajny modulo M; mamy zatem h(K) = h ( K ł) z prawdopodobieństwem 1/M, niezależnie od wartości s i sf. (c) Tak; dodanie dowolnej stałej do hj(xj) zmienia h(x) o stałą modulo M. 73. (i) Jest to szczególny przypadek ćwiczenia 72(c), w którym każdy klucz jest trak towany jako ciąg bitów, a nie znaków. [Alfred L. Zobist wymyślił go już w 1970 roku. Jego oryginalny raport techniczny został przedrukowany w TCCA Journal 13 (1990), 69-73]. (ii) Z dowodu części (b) wynika, iż wystarczy pokazać, że h j ( x j ) — h j ( x ' j ) ma rozkład jednostajny modulo M, jeśli Xj / Xj. W rzeczywistości prawdopodobieństwo tego, że h j ( x j ) = y i h j ( x jf ) = y , wynosi 1/M 2 dla dowolnych ustalonych y i y f , ponieważ kongruencje a j X j + b j = y i d j X j + b j = y f mają jednoznaczne rozwiązanie ( < i j , b j ) dla dowolnych ( y , y f ) modulo liczba pierwsza M . Jeśli liczba M nie jest pierwsza, p zaś jest liczbą pierwszą > M, to podobny wynik zachodzi, jeśli przyjmiemy hj (xj) = ((aj xj +bj) mod p) mod M, gdzie aj i bj są wybrane losowo mod p. W tym przypadku rodzina nie jest do końca uniwersalna, ale jest wystar czająco bliska uniwersalnej pod względem praktycznym. Prawdopodobieństwo tego, że różne klucze kolidują ze sobą, nie przekracza 1/M + r(M —r) /M p 2 ^ 1/M + M /4p2, gdzie r — p mod M. 74. Stwierdzenie jest w ogólnym przypadku fałszywe. Przypuśćmy na przykład, że M = N = n2, i rozważmy macierz H o (^) wierszach, po jednym na każdy sposób rozmieszczenia n zer w różnych kolumnach; niezerowymi elementami są 1, 2, . . . , N —n od strony lewej do prawej w każdym wierszu. Ta macierz jest uniwersalna, ponieważ każda para kolumn zgadza się w ( ^ 2) “l i n ) ~N77^1 ^ (^) ( 77) 2 ~ R / M miejscach. Jednak liczba zer w każdym wierszu to y/N 0(1) -1- 0 (N /M ). Uwagi: To ćwiczenie wskazuje, że oczekiwany rozmiar listy to zupełnie co inne go niż oczekiwana liczba kolizji przy wstawianiu nowego klucza. Rozważmy funkcje h ( x i . . .x i) = hi(x\), gdzie hi jest wybrana losowo. Ta rodzina funkcji haszujących daje oczekiwany rozmiar każdej listy N / M ; z pewnością nie jest ona jednak uniwersalna, ponieważ dla zbioru N kluczy mających taki sam pierwszy znak x\ powstanie jedna lista rozmiaru N, a wszystkie pozostałe listy będą puste. Oczekiwana liczba kolizji będzie równa N ( N —l)/2, zaś dla uniwersalnej rodziny funkcji haszujących ta liczba nie przekracza N ( N —1)/2M, niezależnie od zbioru kluczy. Z drugiej strony możemy pokazać, że dla rodziny uniwersalnej oczekiwany rozmiar każdej listy to 0(1) + 0 ( N / y / M ) . Przypuśćmy, że w wierszu h jest Zh zer. Wówczas ten wiersz zawiera przynajmniej (z£) par równych elementów. Maksimum ^2k=1x h Przy zachowaniu warunku 0 2 ) ^ ( 2: ) ^ / ^ Jes^ osiągane, kiedy każde Zh jest równe z, gdzie (2) = czyli 1 fl N (N -l) , I N ( N —1 ) Z= 2 V 4 Af < V 75. (a) Oczywiście prawda, nawet wtedy, gdy /12, . . . , hi są tożsamościowo równe zeru. (b) Prawda, w myśl odpowiedzi do ćwiczenia 72(b). (c) Prawda. Jest to jasne, jeśli ić, K ei K ff różnią się na tej samej pozycji. W przeciwnym razie, niech Xj — Xj / x” oraz x k 7^ x k = x k- Wówczas wielkości hj(xj) + ń/c(^fc), hj(xj) + hk(xk) i hj(xłj ) + hk(x'k) są niezależne od siebie nawzajem, mają rozkład jednostajny i nie zależą od pozosta łych l —2 znaków kluczy, (d) Fałsz. Rozważmy na przykład przypadek M — l — 2
802
ODPOWIEDZI DO ĆWICZEŃ
6.4
z 1-bitowymi znakami. Wówczas wszystkie cztery klucze są odwzorowywane na tę samą pozycję z prawdopodobieństwem 1/4. 76. Weź h(K) = (ho(l) + hi(x\) 4 -***+ hi{x{)) mod M, gdzie każde hj jest wybrane jak w ćwiczeniu 73. Wygeneruj losowe współczynniki dla hj (i, jeśli trzeba, stablicuj jej wartości), kiedy klucz długości ^ j pojawia się po raz pierwszy. Ponieważ l jest nieograniczone, macierz H jest nieskończona; jednak tylko jej skończony fragment jest istotny w każdym konkretnym wykonaniu programu, 77. Niech p ^ 2~16 będzie prawdopodobieństwem tego, że dla macierzy H obrazy dwóch 32-bitowych kluczy są takie same. Najgorszy przypadek zachodzi, kiedy dwa dane klucze zgadzają się na siedmiu spośród swoich ośmiu 32-bitowych podkluczy; wówczas prawdopodobieństwo kolizji jest równe 1 —(1 —p)4 < 4p. [Zobacz Wegman i Carter, J. Comp. Syst. Sci. 22 (1981), 265-279].
6.5 1 . Ścieżkę opisaną we wskazówce można przekształcić, zamieniając każdy fragment skierowany w dół, który biegnie od (i — 1 , J) do „nowej rekordowo niskiej” wartości (i,j — 1), na fragment skierowany w górę. Jeśli wykonano c takich zamian, to ścieżka kończy się w punkcie (m, n —2t + 2c), gdzie c ^ 0 i c ^ 2t —n; zatem n —2i + 2c ^ n —2k. W permutacji odpowiadającej przekształconej ścieżce najmniejszych c elementów listy B odpowiada fragmentom skierowanym w dół, które zostały zmienione, lista A zaś zawiera t — c elementów odpowiadających fragmentom skierowanym w dół, które nie zostały zmienione. W przypadku t = k nietrudno zobaczyć, że ta konstrukcja jest odwracalna; kon struowanych jest więc dokładnie (™) permutacji. Tak się składa, że zgodnie z tym dowodem kolejność elementów na listach A i C może być dowolna. Uwagi: Policzyliśmy te ścieżki w inny sposób w ćwiczeniu 2.2.1-4. Dla k = [n/2\ ta konstrukcja stanowi dowód Lematu Spemera, mówiącego, że nie może być więcej niż (^ny2j) P°6zbiorów zbioru {1,2,... ,n}, takich że żaden podzbiór nie zawiera się w innym. [Emanuel Sperner, Math. Zeitschrift 27 (1928), 544-548]. Jeśli bowiem mamy taką rodzinę podzbiorów, to dla każdej spośród (”) permutacji co najwyżej jeden z tych podzbiorów może występować na jej pozycjach początkowych, a każdy podzbiór występuje w pewnej permutacji. Przedstawiona tu konstrukcja to zama skowana postać ogólniejszej konstrukcji, za pomocą której N. G. de Bruijn, C. van Ebbenhorst Tengbergen i D. Kruyswijk [Nieuw Archief voor Wiskunde (2) 23 (1951), 191-193] udowodnili uogólnienie Lematu Spernera na multizbiory. „Niech M będzie multizbiorem zawierającym n elementów (licząc wraz z krotnościami). Rodzina wszyst kich [n/2]-elementowych podmultizbiorów M jest największą możliwą rodziną taką, że żaden podmultizbiór nie zawiera się w innym”. Na przykład największa taka rodzina dla M = {a, a, 6, 6, c, c} składa się z siedmiu podmultizbiorów {a, a, 6}, {a, a, c}, {a, 6, 6}, {a, 5, c}, {a, c, c}, (5, 6, c}, {6, c, c}. Odpowiadałoby to siedmiu permutacjom sześciu atrybutów A±, B\, A 2, S 2, A3, B 3j dla których każde zapytanie dotyczące Ai dotyczy również Bi. Dalsze uwagi podają C. Greene i D. J. Kleitman w pracy J. Combinatorial Theory A 20 (1976), 80-88. 2 . Niech aijk będzie listą wszystkich odnośników do rekordów o wartościach trzech atrybutów, odpowiednio, (i, J, fc), i załóżmy, że aon jest najkrótszą z trzech list a o n , aioi > 0, 1 1 0 . Wówczas listą o najmniejszej długości jest a00i 0 0 1 1 ^1 1 1^ 10 1 «100 ^11 0 ^ 111 »0 11 ^010 • Jeśli jednak lista aon jest pusta, podobnie jak któraś z list aooi, ^oio, nioo, to całą listę można skrócić, usuwając jedno z dwóch wystąpień a m [CACM 15 (1972), 802-808].
ODPOWIEDZI DO ĆW ICZEŃ
6.5
803
3. (a) Ziarna anyżku i/lub miód, ewentualnie w połączeniu z gałką muszkatołową i/lub aromatem waniliowym, (b) Żadne. 4. Niech pt będzie prawdopodobieństwem tego, że zapytanie dotyczy dokładnie t pozycji bitów, i niech Pt będzie prawdopodobieństwem tego, że w losowym rekor dzie na wszystkich t danych pozycjach są wartości 1. Wówczas odpowiedź to ^ t ptPt minus prawdopodobieństwo tego, że konkretny rekord jest „rzeczywistym alarmem”; to ostatnie prawdopodobieństwo jest równe (^Ig) / {^) > gdzie N = (”). Z zasady włączania-wyłączania Pt = ^ ( _ 1 )J f <) / ( n - j ’fc>T') / / ( rl!fc>'r)> i >0
J
gdzie f( n , k , r ) jest liczbą możliwych sposobów wyboru r różnych fc-bitowych kodów atrybutów na n-bitowym polu, czyli f{n, k ,r )= ^ C )
Dla ą — r zgodnie z ćwiczeniem 1.3.3-26 mamy
Uwagi: Powyższe obliczenia w ogólniejszej postaci jako pierwsi przeprowadzili G. Orosz i L. Takâcs, J. of Documentation 12 (1956), 231-234. Łatwo można pokazać, że wartość średnia ^Jtpt jest równa n( 1 — f ( n — 1 , fc, q)/f(n. A;, q)). Sytuację, kiedy losowe kody atrybutów w rekordach i w zapytaniach niekoniecznie muszą być różne, tak jak w przypadku technik Harrisona i Blooma, można przeanalizować taką samą metodą, kładąc f ( n ,k ,r ) = (?)r . Dla parametrów w odpowiednich zakresach mamy Pt « (1 - e~k^ nY oraz £ p t Pt « Pn(1_exp(- kq/n)). 6 - L(t) = ^ (7 ) ( n ) £ i Ü ) M f - i ) / ( mir ‘2)- [Zatem jeśli Li (i) « N«*-* i L 2(t) « N i a - 1, to L(t) « N i N 2 a - 1]. 7. (a) L(l) = 3, L(2) = l f . (b) L(l) = 3f, L(2) = 2±, L(3) = 1&. [ U w a g a : Trywialne rzutowanie takie jak 00** —►0, 01** —►1, 10** —> 2, 11 * * —►3, zachowuje się gorzej w przypadku pesymistycznym, ale lepiej w przypadku średnim, z uwagi na następne ćwiczenie: L(l) = 3, L(2) = 2 ~, L(3) = l |] . 8 . (a) Jeśli S = 5o0 U Sil, to mamy f t(S) = f t {S0 U Si) + ft-i(So) + /t-i(Si). Tak więc ft(s,m) to minimum z ft(so^m — 1) + ft~i(so,m — 1) + — 1) po wszystkich sq i si takich, że 2m_1 ^ sq ^ S \ ^ 0 i so + si — s. Żeby udowodnić, że minimum jest przyjmowane dla so = \ s / 2] i si = |_S/ 2J> możemy zastosować indukcję względem m; wynik jest jasny dla m = 1 . Dla rn ^ 2 niech gt(s) = /¿(s, m —1) i ht (s) — /i(s, m —2). Wówczas przez indukcję dowodzi się, że gt{so) + gt~i(so) + #£-i(si) = ńt([so/2])-|-/it-i( [so/2]) + [so/2j) + ńt_i ( [so/2]) + /i£_2( |"so/2]) + h.£_2( L*5o/2j) + ^ - i ( r « i / 2l) + /it-2(rfli/2l) + fct-2(L«i/2j), a to wyrażenie jest ^ gt(\s0/2] + [ s i/2]) + gt-\{\so/2\ + \s\/2\) + ([s0/ 2j + |_si / 2J)za®so > «i + 1 ? to mamy |"s0/ 2] 4[si/2] < so, z wyjątkiem przypadku so = 2k + 1 i si = 2k —1. Jednak w tym ostatnim przypadku pt(s0) + gt- i ( s 0) + 0É_i(si) ^ ht (2k + 1 ) + 2ht- i (2k) ^ ht (2k)+ 2ht- 1(2k). (b) Zauważmy, że zbiór S zawierający liczby 0, 1, ... , s — 1 w notacji binarnej ma tę własność, że So U Si = So i So ma f^o/2~| elementów. Stąd przy okazji wynika, że /t( 2m~ri,ra) = [z1] (1 + z)n( 1 + 2z)m~n.
804
ODPOWIEDZI DO ĆWICZEŃ
6.5
10.
(a) Musi być —1) trójek, a x v musi występować w \ v spośród nich. (b) Po nieważ v jest nieparzyste, istnieje dokładnie jedna trójka {xi, yj, z} dla każdego i, więc łatwo pokazać, że S f jest systemem trójek Steinera. Pary, których nie ma w iU, to { z , x 2}, {x2;y2}, {2/2, 3*}, {m3, 2/3}, {xv- u y v-\} , {yv~ u x v], {xViz}. (d) Zaczy nając od przypadku v = 1 i stosując przejścia v —>2v —2, v —> 2v + 1, dostajemy wszystkie liczby nieujemne, które nie są postaci 3&+2, bowiem przypadki 6fc+(0,1,3,4) otrzymujemy odpowiednio z wcześniejszych przypadków 3k + (1,0,1,3). Nawiasem mówiąc, „systemy trójek Steinera” nie powinny być nazwane jego nazwi skiem, chociaż ta nazwa jest już głęboko zakorzeniona w literaturze. Publikacja Steinera [Crelle 45 (1853), 181 “ 182] pojawiła się wiele lat po Kirkmanie, a Felix Klein wspo mniał [Vorlesungen über die Entwicklung der Math. im 19. Jahrhundert 1 (Springer, 1926), 128], że Steiner w późniejszym okresie swojego życia cytował angielskich autorów bez podawania źródeł. Co więcej, to pojęcie pojawiło się już wcześniej w dwóch dobrze znanych książkach J. Pliickera [System der analytischen Geometrie (1835), 283-284; Theorie der algebraischen Curven (1839), 245-247]. 11. Weźmy system trójek Steinera dla 2v + 1 obiektów. Nazwijmy jeden z obiektów z i nazwijmy tak pozostałe obiekty, żeby trójki zawierające z były postaci {z,Xi,Xi}\ wyrzucamy te trójki. 1 2 . {&, (&+1) mod 14, (fc-j-4) mod 14, (/c+6) mod 14} dla 0 ^ k < 14, gdzie (k + 7) mod 14 jest dopełnieniem k. [Systemy dopełnieniowe stanowią szczególny przypadek konfiguracji kombinatorycznych podzielnych na grupy; zobacz Bose, Shrikhande i Bhattacharya, Ann. Math. Statistics 24 (1953), 167-195].
14.
Usuwanie jest najłatwiejsze w k-d drzewach (zastępcę dla korzenia można znaleźć w około 0 ( N 1~l ^k) krokach). W drzewach ćwiartek usuwanie wydaje się wymagać przebudowania całego poddrzewa, którego korzeniem jest usuwany węzeł (ale to poddrzewo zawiera średnio tylko około logiV węzłów). W drzewach pocztowych usuwanie jest rzeczą niemal beznadziejną.
16.
Niech każda trójka odpowiada słowu kodowemu zawierającemu dokładnie trzy bi ty 1, które identyfikują elementy tej trójki. Jeśli u, v, w są różnymi słowami kodowymi, to u ma co najwyżej dwa bity 1 wspólne z nałożeniem v i w, ponieważ miało co najwyżej po jednej jedynce wspólnej z samym v lub samym w. [Podobnie, z systemów czwórek rzędu v możemy skonstruować v(v —1)/12 słów kodowych, z których żadne nie zawiera się w nałożeniu na siebie żadnych trzech innych itd.].
17. (a) Niech co = 60 oraz, dla 1 ^ k ^ n, niech Ck — (jeśli bk- 1 = 0 , to *, w przeciw nym razie 6^), C-k = (jeśli ó^-i = 1, to *, w przeciwnym razie bk)- Wówczas zapytanie podstawowe c_n ... c0 ... cn opisuje zawartość kubełka bo ... bn. [Tak więc ten schemat stanowi szczególny przypadek haszowania kombinatorycznego, a odpowiadający mu średni czas obsługi zapytania jest zgodny z dolnym ograniczeniem z ćwiczenia 8(b)]. (b) Niech dk — [bit k jest wyspecyfikowany] dla —n ^ k ^ n . Możemy założyć, że d-k ^ dk dla 1 k ^ n. Wówczas liczba zbadanych kubełków jest największa, kiedy wszystkie wyspecyfikowane bity są równe 0, i można ją obliczyć następująco: Przyjmijmy x <— y <— l. Następnie dla k = n, n - 1, . . . , 0, przyjmijmy (x,y) < — (x, y)Md„k+dk, gdzie «
«
-
(
i
; ) ’
"
“
0
«)■
0) '
Na końcu wynikiem jest x (które akurat jest też równe y po obliczeniu dla k = 0).
ODPOWIEDZI DO ĆW ICZEŃ
6.5
805
Powiemy,że (x,y) y (a/,?/), jeśli x ^ x f oraz x + y x ! + yf. Wówczas, jeśli (x >y) h. (x\ y f)>to mamy (x,y)Md h (x \ y f)Md dla d — 0, 1 , 2. Teraz (x,y)M2M J1M0 = (Fj+3 X,Fj+3x ), (x,
Mi = (Fj+3:r + F j+2y, F j+2a; + Fj+iy),
(x, y)M0M ( M 2 = (Fi+2iE + Fj+ 2t/, Fj+2;r + Fj+ 2y); mamy zatem (rr,y)MxM[Mi y (a;,y)M2M [ M0, ponieważ 2y ^ rr; oraz podobnie (x, y (x, y)M0M ( M 2, ponieważ x ^ y. Stąd wynika, że najgorszy przy padek ma miejsce, kiedy d-k + dk ^ 1 dla 1 ^ k ^ n albo kiedy d-k + dk ^ 1 dla 1 ^ k ^ n. Mamy też (.X, y)M0M{ = (Fj+2x + Fj+2y, Fj+1x + Fj+1y), {x, y)M{M0 - (Fj+2x + Fj+1y, Fj+2x + Fj+1y)-, (■x,y)M 2M{ = (Fj+2x, Fj+\x), (.x ,y )M {M 2 = (Fj+1x + Fjy,Fj+i x + Fjy). Tak więc w najgorszym przypadku konieczna jest następująca liczba kubełków: 2n- ‘Ft+3,
jeśli 0 ^ i ^ n
[z MiM0n+1-*];
2t~nF3n- 2t+3, jeśli n ^ t <: \3n/2]
[z M13n- 2t (M1M2)t- nM0];
22n+1-t,
[z M22t“3T‘(M1M2)2n“ tM0].
jeśli [3n/2] ^ t ^ 2n
[Te wyniki pochodzą zasadniczo od W. A. Burkharda, BIT 16 (1976), 13-31, uogól nienie w J. Comp. Syst. Sci. 15 (1977), 280-299; jednak jego bardziej skomplikowane odwzorowanie ao ... a2n na &o • • • bn zostało tutaj uproszczone zgodnie z sugestią P. Dubosta i J.-M. Trousse’a, Raport STAN-CS-75-511 (Stanford Univ., 1975)]. 18. (a) Razem jest 2n(m —n) symboli *, czyli 2nn cyfr, po 2nn / m cyfr w każdej kolumnie. Połowa cyfr w każdej kolumnie musi być równa 0. Zatem liczba 2rL~1n / m jest całkowita, a każda kolumna zawiera (2n - 1n /m )2 niezgodności. Ponieważ dla każdej pa ry wierszy jest przynajmniej jedna niezgodność, musi być 2n(2n —1)/2 ^ (2n~1n / m ) 2m. (b) Rozważmy 2n liczb m-bitowych zawierających 0 w m — n wyspecyfikowanych kolumnach. Połowa z nich zawiera nieparzystą liczbę jedynek. Wiersz z * w dowolnej spośród nie wyspecyfikowanych kolumn pokrywa tyle liczb z parzystą liczbą jedynek co z nieparzystą. (c) *000, *111, 0*10, 1*10, 00*1, 10*1, 010*, 110*. Ten system nie jest tak jednorodny jak (13), ponieważ zapytanie takie jak *0 1* trafia w cztery wiersze, podczas gdy *10* trafia tylko w dwa. Zauważmy, że (13) charakteryzuje się cykliczną symetrią. (d) Generujemy 43 wierszy z każdego wiersza (13), zastępując każdy symbol * przez * * * *, każde 0 przez którykolwiek z pierwszych czterech wierszy, a każdą 1 przez którykolwiek z ostatnich czterech wierszy. (Podobnie konstruuje się ABD(mm/, n n /) z dowolnych ABD(m,n) i ABD(m',n')). (e) Mając dany system ABD(16,9), możemy zaznaczyć jeden symbol * w każ dym wierszu w taki sposób, żeby w każdej kolumnie była równa liczba zaznaczonych symboli. Następnie możemy rozbić każdy wiersz na dwa wiersze, zastępując zaznaczony element odpowiednio przez 0 i 1 . Żeby pokazać, że taki sposób zaznaczenia jest możliwy, zauważmy, że gwiazdki w każdej kolumnie można dowolnie podzielić na 32 grupy
806
ODPOWIEDZI DO ĆW ICZEŃ
6.5
po 7 w każdej; wówczas każdy z 512 wierszy zawiera gwiazdki z 7 różnych grup, a każda z 32 x 8 = 512 grup występuje w 7 różnych wierszach. Twierdzenie 7.5.1E („twierdzenie o małżeństwach”) gwarantuje teraz istnienie doskonałego skojarzenia, zawierającego po jednym zaznaczonym elemencie z każdego wiersza i z każdej grupy. Odnośniki: R. L. Rivest, SICOMP 5 (1976), 19-50; A. E. Brouwer, Combinatorics, red. Hajnal i Sós, Colloq. Math. Soc. Janos Bolyai 18 (1978), 173-184. Brouwer poszedł dalej, dowodząc, że system ABD(2n, n) istnieje dla każdego n ^ 32. Metoda z części (d) daje również ABD(32,15), jeśli połączymy (13) z (15). 19. Zgodnie z ćwiczeniem 8, średnia liczba dla 8 —k wyspecyfikowanych bitów wynosi 2k- 3f s - k(8,8)/{ak), czyli odpowiednio (32,22, if i, f , f , f , f§, f , 1) » (32,22,14.9, 9.9.6.4.4.1.2.6.1.6.1) dla 8 ^ k ^ 0. To tylko odrobinę więcej niż wartości 32Ł ss (32, 20.7,13.5,8.7, 5.7,3.7,2.4,1.5,1). Wartości w najgorszym przypadku to (32,22,18, 15.11.8.4.2.1). 20. J. A. La Poutre [Disc. Math. 58 (1986), 205-208] pokazał, że system ABD(m,n) nie może istnieć dla m > Q i n > 3; zatem nie istnieje żaden system ABD(16,6). La Poutre i van Lint [Util. Math. 31 (1987), 219-225] udowodnili, że nie istnieje ABD(10,5). System ABD(8, 6) dostajemy z ABD(8,5) lub z ABD(4,3), stosując me tody z ćwiczenia 18; to daje cały szereg nieizomorficznych rozwiązań, a mogą również istnieć i inne przykłady systemu ABD(8, 6). Jedyne pozostałe możliwości (oprócz try wialnych ABD(5, 5) i ABD(6 , 6)) to system ABD(8, 5) różny od (15) oraz być może jeden lub więcej systemów ABD(12 , 6).
Cieszę się, że doszliśmy do tego w sposób, w ja k i by zrobili to prawdziwi detektywi, bo wszystkie inne sposoby niewarte są funta kłaków. — T O M E K S A W Y E R (1 8 8 4 )*
* Mark Twain, „Przygody Hucka” , Iskry 1973 r., przeł. Krystyna Tarnowska (przyp. tłum.).
DODATEK A
TABELE WIELKOŚCI NUMERYCZNYCH
Tabela 1 WIELKOŚCI CZĘSTO WYKORZYSTYWANE W PROCEDURACH STANDARDOWYCH I W ANALIZIE PROGRAMÓW KOMPUTEROWYCH (40 MIEJSC DZIESIĘTNYCH)
y/2 — 1.41421 35623 V3 — 1.73205 08075 = 2.23606 79774 vTo = 3.16227 76601 n — 1.25992 10498 n = 1.44224 95703 V2 1.18920 71150 ln 2 —0.69314 71805 ln 3 1.09861 22886 ln 10 2.30258 50929 1/ln 2 = 1.44269 50408 1/lnlO = 0.43429 44819 7T 3.14159 26535 = 7t/180 = 0.01745 32925 1/ 7T= 0.31830 98861 7T2 9.86960 44010 = r ( i / 2) — 1.77245 38509 r ( i / 3 ) = 2.67893 85347 r(2/3) 1.35411 79394 e 2.71828 18284 l /e 0.36787 94411 e2 = 7.38905 60989 7 = 0.57721 56649 ln7r = 1.14472 98858 = 1.61803 39887 e7 = 1.78107 24179 e" /4 2.19328 00507 sin 1 0.84147 09848 cos 1 = 0.54030 23058 -C '(2) —0.93754 82543 C(3) = 1.20205 69031 ln 0 __ 0.48121 18250 1/ln
—
—
_
_
—
73095 68877 99789 68379 94873 07408 02721 59945 68109 94045 88963 03251 89793 19943 83790 89358 05516 07747 26400 59045 71442 30650 01532 49400 49894 90197 38015 07896 68139 15843 59594 59603 35027 81664 807
04880 29352 69640 33199 16476 38232 06671 30941 69139 68401 40735 82765 23846 29576 67153 61883 02729 63365 41694 23536 32159 22723 86060 17414 84820 98523 45655 50665 71740 75370 28539 44749 53760 32701
16887 24209 74463 41505 91736 68731 88935 44432 72106 07278 16383 10780 74999 70560 72321 21458 52452 36922 79914 54684 99246 81001 11289 18916 26433 83279 92369 07684 77675 26745 44909 99876 81674 83341 56929 40974 52880 28154 02874 71352 55237 70161 04274 60575 65120 90082 34273 51353 45868 34365 65041 03107 97696 59278 25023 21630 09366 07442 25740 94567 97381 61511 77589 13424 13226 06117 24391 58232
69807 87236 27623 71853 22835 10958 47591 17656 52570 36420 89213 60508 50288 88612 02872 15113 14518 67764 51378 66249 46086 00781 40243 05871 63811 17954 73822 29899 97660 86497 44999 36842 79576 66946
8569769428+ 54406+ 3719605703839195293080755+ 4647576011+ 74266+ 229444197271344+ 40689+ 5313727975+ 4128755193+ 77572+ 74458+ 31803+ 104221647377203+ 91696+ 34616+ 9622637323+ 7897907650313527742294543-
808
DODATEK A
Tabela 2 WIELKOŚCI CZĘSTO WYKORZYSTYWANE W PROCEDURACH STANDARDOWYCH I W ANALIZIE PROGRAMÓW KOMPUTEROWYCH (45 MIEJSC ÓSEMKOWYCH)
Wielkości po lewej stronie znaku „=” są podane w notacji dziesiętnej. 0.1 0.01 0.001 0.0001 0.00001 0.000001 0.0000001 0.00000001 0.000000001 0.0000000001 V2 V5 V5
0. 06314 63146 31463 14631 46314 63146 31463 14631 463150. 00507 53412 17270 24365 60507 53412 17270 24365 605100. 00040 61115 64570 65176 76355 44264 16254 02030 44672+ 0. 00003 21556 13530 70414 54512 75170 33021 15002 352230. 00000 24761 32610 70664 36041 06077 17401 56063 344170 00000 02061 57364 05536 66151 55323 07746 44470 26033+ 0. 00000 00153 27745 15274 53644 12741 72312 20354 02151+ 0. 00000 00012 57143 56106 04303 4 7374 77341 01512 63327+ 0. 00000 00001 04560 27640 46655 12262 71426 40124 21742+ 0. 00000 00000 06676 33766 35367 55653 37265 34642 016271. 32404 74631 77167 46220 42627 66115 46725 12575 17435+ 1. 56663 65641 30231 25163 54453 50265 60361 34073 422232. 17067 36334 67722 47602 57471 63003 00563 55620 320213 12305 40726 64555 22444 0 2 2 4 2 57101 41466 33775 22532+ ^ 2 = L 20505 05746 15345 05342 10756 65334 25574 22415 03024+ v^3 = 1. 34233 50444 22175 73134 67363 76133 05334 31147 60121^ 2 = 1. 14067 74050 61556 12455 72152 64430 60271 02755 73136+ ln 2 = 0. 54271 02775 75071 73632 57117 07316 30007 71366 53640+ ln 3 = 1. 06237 24752 55006 05227 32440 63065 25012 35574 55337+ ln 10 = 2. 23273 06735 52524 25405 56512 66542 56026 46050 50705+ l / l n 2 = L 34252 16624 53405 77027 35750 37766 40644 35175 04353+ 1/lnlO = 0. 33626 75425 11562 41614 52325 33525 27655 14756 062207T 3 11037 55242 10264 30215 14230 63050 56006 70163 21122+ 1 = tt/180 = 0. 01073 72152 11224 72344 25603 54276 63351 22056 11544+ 1/-7T = 0. 24276 30155 62344 20251 23760 47257 50765 15156 700677T2 = 11. 67517 14467 62135 71322 25561 15466 30021 40654 34103V^F = r ( l / 2) = 1. 61337 61106 64736 6524 7 4 7035 40510 15273 34470 1 7762r ( i/3 ) = 2. 53347 35234 51013 61316 73106 47644 54653 00106 66046r(2 /3 ) = 1. 26523 57112 14154 74312 54572 37655 60126 23231 02452+ e = 2. 55760 52130 50535 51246 52773 42542 00471 72363 61661+ l/e = 0. 27426 53066 13167 46761 52726 75436 02440 52371 03355+ e2 = 7. 30714 45615 23355 33460 63507 35040 32664 25356 50217+ 7 = 0. 44742 14770 67666 06172 23215 74376 01002 51313 25521ln7r = 1. 11206 40443 4 7503 36413 65374 52661 52410 37511 46057+ = 1. 47433 57156 27751 23701 27634 71401 40271 66710 15010+ e7 = 1. 61772 13452 61152 65761 22477 36553 53327 17554 21260+ e” /4 = 2. 14275 31512 16162 52370 35530 11342 53525 44307 02171sin 1 — 0. 65665 24436 O4 4 1 4 73402 03067 23644 11612 07474 14505cos 1 = 0. 42450 50037 32406 42711 07022 14666 27320 70675 12321+ -C'(2) = 0. 74001 45144 53253 42362 42107 23350 50074 4 6 1 0 0 27706+ 1. 14735 00023 60014 20470 15613 42561 31715 10177 06614+ ln ó = 0. 36630 26256 61213 01145 13700 41004 52264 30700 40646+ 1/ln (f) = 2. 04776 60111 17144 41512 11436 16575 00355 43630 40651+ —ln ln 2 = 0. 27351 71233 67265 63650 17401 56637 26334 31455 57005-
= = = = = = = = = = = =
.
.
.
.
II S
TABELE W IELKOŚCI NUMERYCZNYCH
809
K i l k a i n t e r e s u j ą c y c h s t a ł y c h , b e z u s t a l o n y c h n a z w , p o j a w i ł o s ię w
zw iąz
k u z a n alizą a lg o r y tm ó w so rto w a n ia i w y s z u k iw a n ia . z d o k ł a d n o ś c i ą d o 40 m i e j s c d z i e s i ę t n y c h w
T e sta łe z o s ta ły p o d a n e
5 .2 .3 -(i9 )
i w
6 .5 -(6 ) oraz w
od
p o w ied ziach do ćw iczeń 5 .2 .3 -2 7 , 5 .2 .4 -1 3 , 5 .2 .4 -2 3 , 6 .2 .2 -4 9 , 6 .2 .3 -7 , 6 .2 .3 -8 , 6 .3 -2 6 i 6 .3 -2 7 .
Tabela 3 WARTOŚCI LICZB HARMONICZNYCH, LICZB BERNOULLIEGO I LICZB FIBONACCIEGO DLA MAŁYCH WARTOŚCI n
n
Hn
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
0 1 3/2 11/6 25/12 137/60 49/20 363/140 761/280 7129/2520 7381/2520 83711/27720 86021/27720 1145993/360360 1171733/360360 1195757/360360 2436559/720720 42142223/12252240 14274301/4084080 275295799/77597520 55835135/15519504 18858053/5173168 19093197/5173168 444316699/118982864 1347822955/356948592 34052522467/8923714800 34395742267/8923714800 312536252003/80313433200 315404588903/80313433200 9227046511387/2329089562800 9304682830147/2329089562800
Bn 1 - 1/2 1/6 0 -1 /3 0 0 1/42 0 -1 /3 0 0 5/66 0 -691/2730 0 7/6 0 -3617/510 0 43867/798 0 -174611/330 0 854513/138 0 -236364091/2730 0 8553103/6 0 -23749461029/870 0 8615841276005/14322
Fn 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
810
DODATEK A
D l a d o w o ln e g o x niech H x =
( — -------- -— ^ . W ó w c z a s n + x j
n^l # 1 / 2 = 2 — 2 ln 2, # 1/3 = 3 # 2/3 =
-
§
i ~
~
§ ln 3 , §
3;
# 1 / 4 = 4 — |yT — 3 1 n 2 ,
# 3/4 = | + # 1/5 = 5 # 2/5 =
§
# 4/5 =
^7r03/ 25 - 1 / 4 “
# 3/5 = |
- 31n2,
| ^
| ln 5 -
_ 3 / 2 5 “ 1/4 -
\\fh\n(f),
f ln 5 + ¿a/ó W ,
+ ^ tt0 ~ 3/ 25” 1/4 - | ln5 + \
f + | 7 r 0 3/25 _ 1/4 -
| ln 5 -
|> /5 1n ^ ,
# 1 /6 = 6 — ¿7 r\/3 — 21n2 — | ln 3 , # 5/6 = i ogó ln ie d la 0 < p < T T
'
ttp/q =
p/q
f
+ s*V 3 -
21n2 -
| ln 3
q (z o b a c z ć w iczen ie 1 .2 .9 -1 9 ) :
Q
^
p
2
,
P
------ ---- c o t -7 T q
1
n
ln 2 g + 2
V — '
>
^
l^ n < q/2
2pn
c o s ------- 7r • ln
ą
^
DODATEK
B
WYKAZ OZNACZEŃ W poniższych wzorach symbole, które nie są dalej objaśnione, m ają następujące znaczenie: j, k m, n x iV
z P / 5, T a ,/?
wyrażenie arytm etyczne o wartości całkowitej wyrażenie arytm etyczne o wartości całkowitej nieujemnej wyrażenie arytm etyczne o wartości rzeczywistej wyrażenie arytm etyczne o wartości zespolonej wyrażenie wskaźnikowe (A lub adres w pamięci) funkcja o wartościach rzeczywistych lub zespolonych zbiór lub multizbiór słowa lub inaczej napisy (ciągi symboli)
O zn aczen ie sy m b oliczn e
V U
Z naczenie
E
An lub A[n\ Amjl lub A[m,n] NODE(P)
F(P) CONTENTS(P) L0C(V) P <= AVAIL AVAIL
nadanie zmiennej V wartości wyrażenia E zam iana wartości zmiennych U i V n- ty element tablicy liniowej A element w wierszu m i w kolumnie n tablicy prostokątnej A węzeł (grupa zmiennych-pól, które różnią się nazwami) o adresie P, przy założeniu, że P /A pole w NODE(P) o nazwie F zawartość słowa maszynowego o adresie P adres zmiennej V w pamięci kom putera przypisanie zmiennej wskaźnikowej P adresu nowego węzła zwracanie NODE(P) do zasobów wolnej pa mięci; wszystkie pola stają się niedostępne węzeł z wierzchołka niepustego stosu S przypisanie wierzchołka S do X: wykonanie X top(S); potem usunięcie top(S) z nie pustego stosu S włożenie X na stos S: wstawienie wartości X jako nowego elementu na szczyt stosu S 811
G d zie definicja 1.1 1.1 1.1 1.1
2.1 2.1 2.1 2.1 2.2.3 2.2.3 2.2.1
2.2.1 2.2.1
812
DODATEK B
O zn aczen ie sy m b o liczn e
G dzie definicja
Z naczenie
(.B => E\ E ł) [B\ fikj [^n] 9(z)
£/(*) R(k) n/<*> R(k) min f(k ) R{k) m ax/(fe) R(k) j\ k S\T
gcd(j, k)
wyrażenie warunkowe: oznacza E , jeśli B jest prawdziwe, zaś E f, jeśli B jest fałszywe funkcja charakterystyczna warunku B : ( 5 =*> 1; 0) delta Kroneckera: \j = k] współczynnik przy z n w szeregu potęgowym 9 (z ) sum a wszystkich /(& ), takich że zmienna k jest całkowita i spełniona jest zależność R(k) iloczyn wszystkich /(£;), takich że zmienna k jest całkowita i spełniona jest zależność R(k) najm niejsza wartość spośród wszystkich /(& ), takich że zmienna k jest całkowita i spełniona jest zależność R(k) największa wartość spośród wszystkich /(&), takich że zmienna k jest całkowita i spełnio na jest zależność R(k) j dzieli k: k mod j = 0 i j > 0 różnica zbiorów: {a | a należy do S i a nie należy do T} największy wspólny dzielnik j i k: ( j = k = 0 => 0; max d ) \ d\j,d\k J
j ±k AT
j jest względnie pierwsze z k: gcd(j, k) = 1 transpozycja prostokątnej tablicy A:
i k > 0 => ^ 0 xk
X*
1.2.9 1.2.3 1.2.3
1.2.3
1.2.3 1.2.4
1.2.4 1.2.3
odwrócenie słowa a x do potęgi y (gdy x jest dodatnie) x do potęgi k: /
1.2.3
1.1
A T \j,k\ = A[k,j] aR xy xk
1.2.3
1 .2.2 \
x\
l/ x ~ k j /
1 .2.2
x górna silnia k: T(x + k)/F(x) — / \ J J (x + j); l/(ar + k)~k J V 04j 0=> J J ( x - j) ; \ 0^j
1.2.5
V
l/ (x — k)— J /
1.2.5
WYKAZ OZNACZEN
O znaczenie sym b oliczn e
Z n aczen ie n\
n 711 , 712 ■)•■■■)
,
71 LraJ
n i m)
{ a i , .. . , a n} {x}
[ a .. b] (a..b) \a..b) (a..b\ \S\ |x| |a| Lxj W x mod y x = x (modulo y) 0 { f(n )) 0 ( f( z ) ) n (f(n ))
©(/(«))
G d zie definicja
n silnia: F (n + 1 ) — 71—
1.2.5
współczynnik dwumianowy: (k < 0 => 0; x~/k\)
1 .2.6
współczynnik wielomianowy (zdefiniowany tylko wtedy, kiedy n = n i + n 2 + *** + n m)
1 .2.6
liczba Stirlinga pierwszego rodzaju: ^ ^ k\k^ *■* k n—m < n 0
1 .2.6
liczba Stirlinga drugiego rodzaju:
E
liCki^ko^-■ ■ ś;kn-
{a | R(a)}
813
k \ k 2 • ■* k n —7 m
1 .2.6
m
zbiór wszystkich a, takich że spełniona jest relacja R(a) zbiór lub multizbiór {a^ | 1 < A: < n} część ułamkowa (oznaczenie stosowane, kie dy z kontekstu wynika, że chodzi o wartość rzeczywistą, a nie o zbiór): x — [xj przedział domknięty: {x \ a < x < b} przedział otwarty: {x \ a < x < b} przedział lewostronnie domknięty: {x \ a < x < b} przedział prawostronnie domknięty: {x \ a < x < b} moc zbioru: liczba elementów zbioru 5 wartość bezwzględna x: (x > 0 => x; —x) długość a podłoga x, największa liczba całkowita nie większa niż x: maX k^x k sufit x, najm niejsza liczba całkowita nie mniejsza niż x: m i n / ^ k funkcja modulo: (y = 0 => x; x — y[x/y\) relacja kongruencji: x mod y — x' mod y wielkie O od /( n ) , przy zmiennej n —>00 wielkie O od f(z ), przy zmiennej z —►0 wielkie omega od /( n ) , przy zmiennej n —>oc wielkie th eta od /( n ) , przy zmiennej n —> 00
1 .2 . 11.2 1 . 2.2 1 .2.2 1 . 2.2
1 .2.2
1.2.4 1.2.4 1.2.4 1.2.4 1 .2 . 11.1 1 .2 . 11.1 1 .2 . 11.1 1 .2 . 11.1
814
DODATEK B
O zn aczen ie sy m b o liczn e
G dzie definicja
Z naczenie logarytm przy podstawie 6 z x (o iie x > 0, b > 0 i b ^ 1): y takie, że x = by
1.2.2
ln z
logarytm naturalny: loge x
1.2.2
lg x
logarytm dwójkowy: log2 x
1.2.2
funkcja wykładnicza zmiennej x przy pod stawie e: ex
1.2.9
ciąg nieskończony Xo, X\, X 2 >... (litera n stanowi część oznaczenia)
1.2.9
/ 'O )
pochodna / w punkcie x
1.2.9
n *)
druga pochodna / w punkcie x
1 .2.10
n -ta pochodna: (n — 0 => f{x); g, (x )), gdzie g(x) = / (n_ 1) (x)
1 .2 .11.2
logfe x
exp a; (Xn)
f in\ x ) H™
l/ k x
liczba harmoniczna rzędu a;:
1.2.7
l^k^n Hn Fn
liczba harmoniczna: H ^
1.2.7
liczba Fibonacciego: (Tl ^ 1 —V TlJ Fn—i ”h
2)
1 .2.8
Bn det(A)
liczba Bernoulliego: n\ [zn] z/(ez — 1)
1 .2 .11.2
wyznacznik macierzy kwadratowej A
1.2.3
sign(x)
znak x\ [x > 0] — [x < 0]
CO*) T(x)
funkcja dzeta: lim n^oo
(gdy x > 1 )
1.2.7
funkcja gamma: (x — 1 )! = 7 (x, 00)
1.2.5
niepełna funkcja gamma: J^ e- i £x_1cfó
1.2.11.3
7
stała Eulera: lim ri^ 00( iin —ln n)
1.2.7
e
podstaw a logarytmów naturalnych:
7r
E „ >0 V n! stosunek obwodu do średnicy okręgu: 4 £ nS50( - l ) 7 ( 2 n + l)
7 (x,y)
00
A
nieskończoność: większa od dowolnej liczby wskaźnik pusty (wskaźnik bez adresu)
e
puste słowo (słowo 0 długości zero)
0
zbiór pusty (zbiór bez elementów)
złota proporcja: | ( l + y/E)
cp(n) x « y
1 .2.2
[k _L n] Q^.k
funkcja Eulera:
2.1
1 .2.8
1.2.4 1.2.5
W Y K A Z OZNACZEŃ
O znaczen ie sy m b oliczn e P r(S (X )) EX
mean (g)
var (g)
815
Z n aczen ie
G d zie d efinicja
prawdopodobieństwo, że zdanie 5 (X ) jest prawdziwe dla losowych wartości X
1.2.10
wartość oczekiwana zmiennej X : Z x x P r (X = x)
1.2.10
wartość średnia rozkładu prawdopodobień stwa reprezentowanego przez funkcję tworzącą 9- g'{ 1) wariancja rozkładu prawdopodobieństwa reprezentowanego przez funkcję tworzącą g:
1.2.10
1.2.10 zmienna losowa 0 wartości najmniejszej x i, wartości średniej (oczekiwanej) # 2, wartości największej £ 3, odchyleniu standardowym Xą $tz część rzeczywista zmiennej 0 $sz część urojona zmiennej 0 ź sprzężenie zespolone: 5i 0 —i $sz ( . .. a ia o .a _ i.. . )& notacja pozycyjna przy podstawie b: Efc akbk // X\ , X2j • • ■j %nff ułamek łańcuchowy: 1 / (xi + l / ( x 2 + l / ( -----h l / { x n) . . . ) ) )
(min x i, ave x
aj(3 S(±iT
1 u rA rX r l l , . . . ,r I 6 rJ (L:R) OP ADDRESS,1(F) u * OF, IF, 2F, . . . , 9F OB, IB, 2B, . . . , 9B OH, 1H, 2H, . . . , 9H
iloczyn z wtrąceniami sum a multizbiorów; np. {a, b} l±) {a, c} = {0 , a, 6, c} różnica wartości funkcji: f(b) —f ( a) koniec algorytmu, programu lub dowodu pojedynczy odstęp rejestr A (akum ulator) w maszynie MIX rejestr X (rozszerzenie) w maszynie MIX rejestry (indeksowe) 11 , . . . , 16 w maszynie MIX rejestr (skoku) J w maszynie MIX wycinek słowa maszyny MIX, 0 < L < R < 5 oznaczenie instrukcji maszyny MIX jednostka czasu w maszynie MIX „ja sam” w języku MIXAL symbol lokalny „w przód” w języku MIXAL symbol lokalny „w ty ł” w języku MIXAL symbol lokalny „tu” w języku MIXAL
1.2.10 1.2.2 1.2.2 1.2.2 4.1 4.5.3 5.1.2 4.6.3 1.1 1.3.1
1.3.1 1.3.1 1.3.1 1.3.1 1.3.1 1.3.1, 1.3.2 1.3.1 1.3.2 1.3.2 1.3.2 1.3.2
SKOROWIDZ ZE SŁOWNIKIEM Jeśli nie znajdziesz czegoś w indeksie, przejrzyj uważnie cały katalog.
— SEA RS, R O EBU CK AND CO ., Consumers Guide (1897) Gdy pozycja skorowidza dotyczy ćwiczenia, warto zajrzeć również do rozwiązania. Hasła zawar te w rozwiązaniach występują w skorowidzu tylko wtedy, gdy nie pojawiają się w sformułowaniu ćwiczenia. (2,4)-drzewa 513 (a, 6)-drzewa 513 2-3 drzewa 511, 516, 519, 771 łączenie 512 podział 512 reprezentacja binarna 513 usuwanie z 512 wstawianie do 512 Abel, Niels Henrik twierdzenie graniczne 798 wzór dwumianowy 789 Abraham, Chacko Thakadiparambil 623 Adelson-Velsky, Georgii Maximovich (AAejmcoH-BejibCKHH, Teoprim MaKCHMOBHu; Adelson-Wielski Gieorgij Maksimowicz) 492, 494 adres haszowania 553 adresowanie otwarte 566-583, 590, 598, 599 liniowe 567, 590 optymalne 581-583 z haszowaniem podwójnym 569 AF-kopce 160 Agar wal, Ramesh Chandra (T^rśr ) 385, 418 agenda, zob. kolejka priorytetowa Aggarwal, Alok (3TRTRT 752 Aho, Alfred Vaino 511, 515, 702 Aigner, M artin 255 Aj tai, Miklós 240-241, 724, 799 aktywne bufory czytające 398 scalające 398 Aldous, David John 785 Alekseev, Vladimir Evgenievich (AjieKceeB, Bjian,HMHp EsreHbeBHu; Aleksiejew W ładimir Jewgieniewicz) 246, 251, 252 Alexanderson, Gerald Lee 645 ALGOL 487 algorytm Batchera 110, 116, 141, 142, 237, 239, 409 Euklidesa 556 Garsii-Wachsa 479-485, 491 Hoare’a 110, 409 Huffmana 386, 470, 485 Hu-Tuckera 487 MacLarena 189, 409 obchodzenia drzew 144
a lg o ry tm
Patricia 536, 542, 543, 546 przeszukiwania drzewa cyfrowego 556 przewidywanie z ruchomymi buforami 343-345 rozrzucania ze wstawianiem 189 Shella 109, 110 sortowania P ra tta 109, 249, 717 SyncSort 395, 398 usuwania przy próbkowaniu liniowym 575 „wstawiania fraktalnego” 710 wyboru 716 wyszukiwania-i-wstawiania 421 algorytmy analiza 4, 81, 84, 85, 8 9-99, 105-110, 113, 124-128, 147, 160-166, 170, 176-178, 184-186, 188, 196, 271, 275-283, 291-297, 303-306, 313-318, 352-357, 362-366, 406-412, 416, 426-438, 422, 455, 462, 487-492, 501-505, 515, 522, 527, 537-551, 564, 575-581, 585, 595-600, 609, 621, 666, zob. także złożoność obliczeniowa dla tablic symboli 458 geometryczne 610 al-Khwàrizmï, Abu ‘Abd Allah Muhammad ibn Müsâ
¿H An~t‘a ^ ^ ^0 8 Allen, Brian Richard 513 Allen, Charles Grant Blairfindie 601 alokacja dowiązaniowa 100, 173, 181 liniowa 100 pamięci dynamiczna 516 metoda drzewowa 765 sekwencyjna 181 Altenkamp, Doris 769 alternatywa wyłączna 559 Amble, Ole 600 Amdahl, Gene Myron 590 AMM: American Mathematical Monthly - czasopismo wydawane przez Mathematical Association of America od 1894 r. 816
SKOROWIDZ ZE SŁOWNIKIEM
anagramy 9, 634, zob. także permutacje multizbioru analiza algorytmów 4, 81, 84, 85, 89-99, 105-110, 113, 124-128, 147, 160-166, 170, 176-178, 184-186, 188, 196, 271, 275-283, 291-297, 303-306, 313-318, 352-357, 362-366, 406-412, 416, 426-438, 422, 455, 462, 487-492, 501-505, 515, 522, 527, 537-551, 564, 575-581, 585, 595-600, 609, 621, 666, zob. także złożoność obliczeniowa frędzelkowa 771 André, Antoine Désiré 71, 651 Anuyogadvàra-sutra ( ^ b b l S J ) 23 Apolloniusz Sofista ( AtcoXXcovioç ó Eocpiaxriç, xoü ’Apxtptou) 451 Appell, Paul Émile 732 Aragon, Cecilia Rodriguez 514 Archimedes ( ApxipriÔTK ó Eupaxouotoç) 13, 638 Arge, Lars Allan 526 argument wyszukiwania 421 Arisawa, Makoto 618 Armstrong, Philip Nye 239, 259, 727 Arora, Sant Ram (*FrT W STTtTT) 488 Arpaci-Dusseau, Andrea Carol 419 Arpaci-Dusseau, Remzi Hussein 419 Ashenhurst, Robert Lovett 367, 372 Askey, Richard Allen 647 atrybuty binarne 611-614, 621 rekordu 602 złożone 608, 610-611, 624 Avni, Haim (UIN 0” n) 762 -drzewa 524, 526, 775 B + -drzewa 523 Babbage, Charles 190 Baber, Robert Laurence 759 Bachrach, Ran (*pD2 j*l) 433 Baeza-Yates, Ricardo Alberto 526, 769, 771 Bafna, Vineet (fa *ild «iihï*ii ) 662 Bailey, Norman Thomas John 798 Balbinę, Guy de 569 Ball, Walter William Rouse 638 Barnett, John Keith Ross 177 Barton, David Elliott 46, 648, 649, 651 Barve, Rakesh Dilip (TT%^T farfln 398 Batcher, Kenneth Edward 116, 237, 239, 244-246, 249, 409, 418, 718 Baudet, Gerard 723 Bayer, Paul Joseph 487, 491, Bayer, Rudolf 512, 513, 519, 523, 526, 777 Bayes, Anthony John 370 baza danych 421
817
B-drzewa 519-527, 592, 606 binarne, symetryczne 513 buforowanie 525 czas działania 522 histeryczne 513 łączenie 527 przepełnienie w 523 rzędu m 519 ulepszenia 522-526 uogólnione 526 wstawianie do 527 usuwanie z 522, 527 wstawianie do 521-522 wyszukiwanie 521 Bell, Colin James 360 Bell, David A rthur 176, 417, 696 Bell, James Richard 572, 573 Bellman, Richard Ernest xiii Ben-Amram, Amir Mordechai (D1)3V-p *0*n)D TDN) 191 Bencher, Dennis Leo 333, 334, 336 Bender, Edward Anton 651, 655, 750 Bennett, Brian Thomas 404 Bennett, Mary Katherine 775 Bent, Samuel Watkins 226, 513, 717 Bentley, Jon Louis 128, 432, 551, 608, 609, 610, 682, 683 Berkeley, George 838 Berman, Joel David 720 Berners-Lee, Conway Maurice 102, 486 Bernoulli, Jacques (= Jakob = James), liczby 544, 648, 809 Bertrand, Joseph Louis François 651 Betz, B. Keith 285, 306 Beus, Hiram Lynn 260-261 Bhâskara Âchàrya (HT^nTTRf) 24 Bhattacharya, Kailash Nath (Î^TPT 804 biblioteka podprogramów 436 systemowa 433 Bienaymé, Irénée Jules 651 Bierce, Ambrose Gwinnett 601 BIN AC, komputer 415 Birkhoff, G arrett 775 bisekcja 440 BIT: Nordisk Tidskrift for Informations-Behandling - międzynarodowe czasopismo wydawane w Skandynawii od 1961 r. Bitner, James Richard 432, 513, 758 bitoniczne sortowanie Batchera 251, 409 bity informacji 193 Bjorner, Anders 656 Blake, Ian Fraser 798 Blanks, algebra 637 Bleier, Robert E. 623 bloki danych 395 Bloom, Burton H. 616, 617, 623, 803
818
SKOROWIDZ ZE SŁOWNIKIEM
Blum, Manuel 226 Boehme McGraw, Elaine M. 590 Boerner, Hermann 720 Bollobas, Béla 694 Booth, Andrew Donald 425, 429, 452, 486, 487 Boothroyd, John 664 Bor wein, Peter Benjamin 163 Bose, Raj Chandra 239, 623, 804 Bostic, Keith 187, 702 Bottenbruch, Hermann 453, 456 Bouricius, Willard Gail 206, 236 Bourne, Charles Percy 424, 623 Brandwood, Leonard 429 Brawn, Barbara Severa 753 Breaux, Nancy Ann Eleser 732 Brent, Richard Peirce 572, 589, 774 Briandais, René Edward de la 531 Brouwer, Andries Evert 620, 806 Brown, John 8 Brown, Mark Robbin 160, 515 Brown, Randy Lee 160 Brown, William Stanley 165 Bruhat, François, porządek 676, 721 Bruijn, Nicolaas Govert de 137, 144, 648, 719, 721, 722, 802 Bryce, James Wares 414 bryly archimedesowe 638 Buchholz, Werner 425, 590 Buchsbaum, Adam Louis 517 buforowanie 274, 417 bufory aktywne czytające 398 scalające 398 wejściowe, ruchome 395 Bürge, William Herbert 297, 316, 360 Burkhard, Walter Austin 805 Burton, Robert ix C 458 CACM: Communications o f the AC M czasopismo wydawane przez Association for Computing Machinery od 1958 r. Canfield, Earl Rodney 724 Carlitz, Leonard 40, 49, 660, 668 Caron, Jacques 297, 298, 305 Carroll, Lewis (= Dodgston, Charles Lutwidge) 219, 629 Carter, John Lawrence 559, 601, 802 Carter, William Caswell 296, 306, 316 Catalan, Eugne Charles, liczby 63, 314 Cawdrey (= Cawdry), Robert 452 Cayley, A rthur 676, 703 Celis Villegas, Pedro 799 Césari, Yves 204, 297 Chakravarti, Gurugovinda b&<$\) 24
Chandra, Ashok Kumar (ST^ffaT ^pTTT 453 Chang, Shi-Kuo (3i|j§*|13) 491 Chartres, Bruce Aylwin 165 Chase, Stephen M artin 207 Chazelle, Bernard Marie 628 Chebyshev, Pafnutii Lvovich (Heöbimeß, na
SKOROWIDZ ZE SŁOWNIKIEM
Cunto, Pucii Walter 231 Curtis, Pavel 266 cykle 25 rozłączne, złożenie 26 Cypher, Robert Edward 671 czas dostępu, zamortyzowany 513 przeszukiwania 382, 387, 391, 394 ścieżki krytycznej 347 transmisji 387 Czech, Zbigniew Janusz 554 Czen Ping Q£ *F) 197 częstość odwołań 428-431, 467-475 Dały, Lloyd William 452 dane geometryczne 607-610 losowe 228 losowy podział na pasma 397, 398, 400, 406, 407, 753 podział na pasma 396, 406, 418, 753 superbloki 396, 398, 406 wieloatrybutowe 623 Dannenberg, Roger Berry 628 David, Florence Nightingale 46, 648, 651 Davidson, Leon 424 Davies, Donald W atts 417 Davis, David Robert 623 Davison, Gerard A. 160 de Balbinę, Guy 569 de Bruijn, Nicolaas Govert 137, 144, 648, 719, 721, 722, 802 de la Briandais, René Edward 531 de Peyster, James Abercrombie, Jr. 587 de Staël, Madame, zob. Staël-Holstein Dedekind, Julius Wilhelm Richard 253 delta Kroneckera 812 Demuth, Howard B. 114, 194, 261, 372, 377, 416, 728 Den, Vladimir Eduardovich (fleHb, BjiaflHMup D,n;yapflOBHu; Dien’ Władimir Eduardowicz) 8 Dent, Warren Thomas 488 Deutsch, David Nachman 216 Devroye, Luc Piet-Jan Arthur 609, 769, 777, 785 diagram częściowo uporządkowany 194, 198 Dietzfelbinger, M artin Johannes 592 Dijkstra, Edsger Wijbe 684 Dinsmore Robert Johe 274 Dixon, John Douglas 658 długość ścieżki stopniowej 389, 391-393 w drzewie, zob. długość ścieżki wewnętrznej, długość ścieżki zewnętrznej ważonej 208 długość ścieżki wewnętrznej: suma poziomów (głębokości) wszystkich węzłów wewnętrznych 443, 609, 765, 783, 784
819
długość ścieżki zewnętrznej: suma poziomów (głębokości) wszystkich węzłów zewnętrznych 323, 326, 328, 330, 386, 389-393, 549, 706, 707, 740, 767, 770 DNA 35, 75 Dobkin, David Paul 623, 628 Dobosiewicz, Włodzimierz 187, 283, 675, 732 dodawanie elementu, zob. wstawianie Dodd, Marisue 559 Dodgston, Charles Lutwidge 219, zob. Carroll dolna granica teorio-informacyjna 193, 209, 214, 216, 705 Dor, Dorit (TU JPYn) 715 Doren, David Gerald 225, 230 doskonały rozkład Fibonacciego 285-286, 304, 320 Douglas, Alexander Shafto 102, 417, 425 Dowd, M artin John 724 drzewo trójkowe 551 Drake, Paul 1 Driscoll, James Robert 160, 628 Dromey, Robert Geoffrey 682 Drysdale, Robert Lewis (Scot) 242 drzepiec (treap) 514 drzewa 528-532, 545, 550-551 AVL 493, 517, zob. także drzewo zrównoważone binarne 102, 456 optymalne 214 prawostronnie sfastrygowane 283, 487, 489 rozszerzone 191, 206, 214, 216, 222 wysokość 206, 222 zliczanie 63 zupełne 151, 224, 273, 712, 729, 773 cyfrowe 544 czerwono-czarne 513 ćwiartek 608, 610, 627, 804 punktowe 610 decyzyjne 191, 476 doskonale zrównoważone 486, 516 etykietowanie węzłów 656 inwersje 656, 791 Fibonacciego 447, 455, 456, 490, 493, 494, 502, 509, 514, 515, 761, 762, 770, 773 HB 511 Huffmana 386, 470, 485, 491 ważona długość ścieżki 491 kartezjańskie 514 lewicowe 158, 166, 695 usuwanie węzła 166 wstawianie węzła 158 optymalne 389, 390, 391-392, 514, 766 ósemkowe 517, 609 pocztowe 607, 627 Patricia 526, 535, 544, 548, 549, 621 wyszukiwanie w 536, 549 pokonanych 268-270
820
SKOROWIDZ ZE SŁOWNIKIEM
drzewa porównań 191, 203, 204, 209, 230, 234, 707 bez odwoływania się do historii 233 i zamian 207, 707 optymalne 707 porządek prefiksowy 327 pocztowe 804 pół zrównoważone 513 przystosowawcze 513 rozdrobnienie (rozdzielczość) 207, 708 rząd 207, 708 scalania 387 silnie sortujące 206, 705 ternarne, rozszerzone 205 Thuego 457 trie 528, 538, 544, 546 binarne 537, 538, 783 las 531 losowe 782 wysokość 551 skompresowane 545 uogólnione 620-621 usuwanie 545 własności 537 wstawianie 545 wyszukiwanie 528 turniejowe 714 typu przegrywający odpada 714 typu splay 513 warstwowe 160 w pełni zrównoważone 461, 492 wolne 381, 596 wysokość 493 wyszukiwań binarnych 492, 769 optymalne 468-475, 486, 489, 530 „pesymalne” 767 podział na strony 518 cyfrowych 533, 534, 537, 539-542, 547, 621, 779, 783 usuwanie węzła 546 wstawianie 534 wysokość 785 pozycyjnych 695 priorytetowych 623 wyważanie 495, 498, 507 wyważanie doskonałe 516 wolne 635, 790 wyboru 267, 272-274, 373, 748 wyższych stopni 517-527 z trzema dowiązaniami 510 zdegenerowane 488, 767, 771, 784 zliczanie 306 zorientowane 74 zrównoważone 158, 492-517, 590, 769, 770 liczba 501 łączenie 508-511
drzewa zrównoważone po wysokościach 511, 516 usuwanie 508-511 wagowo 511, 516, 773 wstawianie do 516 wysokość 773 wstawianie 496-505, 507 wyszukiwanie 496-501 zliczanie 501 zupełne doskonale zrównoważone 502 stopnia P 386 „zygzakowate” 461 Dubost, Pierre 805 Dudeney, Henry Ernest 635, 721 Dugundji, James 259 Dumas, Philippe 140 Dumey, Arnold Isaac 271, 425, 452, 486, 590 Dumont, Dominique 651 dwukierunkowe listy cykliczne 437 dwupoziomowe sortowanie przez rozrzucanie 189 Dwyer, Barry 619 dysk cylinder 382 czas oczekiwania 382 przeszukiwania 382, 387, 391, 394 transmisji 382 głowice odczytująco/zapisujące 382 ramię 382 ścieżka 382 dyski MIXTEC 382, 606 dyskretna entropia 401-402 e 41 Ebbenhorst Tengbergen, Cornelia van 802 Eckert, John Presper 414, 415 Eckler, Albert Ross 635 Eddy, Gary Richard 418 Edelman, Paul Henry 722, 775 Edighoffer, Judy Lynn Harkness 694 Edmund, Norman Wilson 1 EDVAC, komputer 414 Efe, Kemal 732 Ehresmann, Charles 676 Eichelberger, Edward Baxter 759 Eisenbarth, Bernhard 526 Elcock, Edward Wray 594, 788 elektryczne maszyny sortujące 179 element neutralny 25 Eleser, zob. Breaux Elias, Peter 627 Elkies, Noam David 9 Ellery, Robert Lewis John 424 El-Yaniv n ) 433 Emde, Boas Peter van 160 Emden, Maarten Herman van 134, 681, 686 entropia 475-479, 491, 768
SKOROWIDZ ZE SŁOWNIKIEM
Eppinger, Jeffrey Lee 467 Eratostenes z Cyreny (’EpoccoaGLvry; ó Kupr)vaioę) 691 Erdelyi, Arthur 138 Erdos, Pal (= Paul) 69, 163, 708 Erdwinn, Joel Dyne 3 Erkió, Hannu Heikki Antero 670 Ershov, Andrei Petrovich (Epm oB, AH/npen IleTpoBHH; Jerszow Andriej Pietrowicz) 590 Espelid, Terje Oskar 275 Estivill-Castro, Vladimir 418 Euler, Leonhard (Oijiep, JleoHapn;) 9, 20, 36, 639 Eusterbrock, Ju tta 225 Eve, James 533 Fagin, Ronald 592 Fawkes, Guido (Guy) 362 Feigenbaum, Joan 513 Feijen, Wilhelmus (= Wim) Hendricus Johannes 684 Feindler, Robert 413 Feit, Walter 656 Feldman, Jerome Arthur 623 Feldman, Paul Neil 457 Feller, Willibald (= Willy — William) 554 Felsner, Stefan 708 Fenner, Trevor Ian 694 Ferguson, David Elton 3, 308, 310, 316, 318, 393, 453, 565, 738 Fermat, Pierre de 629 Ferragina, Paolo 526 Feurzeig, Wallace 82 Fiat, Amos (oW2 t?im>) 763 Fibonacci, Leonardo 455 Field, Daniel Eugene 628 FIFO 156, zob. kolejka Finkel, Raphael Ari 608, 610 Fischer, Michael John 160 Fishburn, John Scot 778 Flajolet, Philippe Patrick Michel 140, 608, 609, 610, 621, 678, 693, 699, 758, 783, 785, 800 Flawiusz Józef, problem 18 Flores, Ivan 417 Floyd, Robert W. 22, 152, 165, 229, 230, 231, 239, 240, 243, 251, 253, 254, 316, 401, 402, 405, 488, 502, 558, 661, 712, 749 Foata, Dominique Cyprien 17, 22, 24, 28, 34, 40, 45, 645, 666, 790 FOCS: Proceedings of the IEEE Symposia on Foundations of Computer Science (1975-), przedtem zwane Symposia on Switching Circuit Theory and Logic Design (1960-1965), Symposia on Switching and Autom ata Theory (1966-1974)
821
Fomin,Sergey Vladimirovich (O omhh, Cepren BjiaAHMnpoBnu; Fomin Siergiej Wladimirowicz) 722 Ford, Donald Floyd 424 Ford, Lester Randolph, Jr. 194, 197 FORTRAN 3, 7, 458, 592, 785 Foster, Caxton Croxford 504, 508, 511, 770 Frame, James Sutherland 63 Franęon, Jean 160 Frank, Robert Morris 97 Franklin, Fabian 19, 21, 645 Fraser, Christopher Warwick 628 Frazer, William Donald 128, 275, 731, 759, 764 Fredkin, Edward 528 Fredman, Michael Lawrence 160, 191, 475, 516, 592, 624, 661 Friedman, Haya 775 Friedman, Jerome Harold 610 Friend, Edward Harry 82, 114, 148, 180, 271, 346, 360, 371, 417, 700 Frieze, Alan Michael 694 Frobenius, Ferdinand Georg 61 funkcja analityczna 733 całkowa, wykładnicza 109 całkowalna w sensie Riemanna 187 drzewowa 769, 798 „dyskretnej entropii” 401-402 dzeta 139, 685, 757, 814 Eulera 814 gamma, niepełna 598 gamma T(z) 138, 144, 658, 678, 757, 814 Grahama 218 Móbiusa p(7r) 33 parzysta 683 Ramanujana Q(n) 756 rozrzucająca 556 Schura 658 symetryczna 655 elementarna 253, 655 tworząca 363, 456, 540, 580 dwóch zmiennych 22 inwersji 33 liczby scaleń 293 permutacji multizbioru 34 prawdopodobieństwa inwersji w losowej permutacji 109 rozkładu jednostajnego 16 sekwensów 3 9 -4 4 , 277 wklęsła 475 „wstawiania binarnego” 238 wypukła 392 funkcje eliptyczne 21 haszujące 554-560, 569, 590, 600, 601, 627, 785 multiplikatywne 556 rodzina uniwersalna 801
822
SKOROWIDZ ZE SŁOWNIKIEM
funkcje hipergeometryczne 579, 609 Fussenegger, Frank 230 Gabow, Harold Neil 160, 230 Gaines, Helen Fouche 468 Gale, David 720 Galen, Claudius (rocXr}vóę, KXau5io<;) 452 Galii, Zvi >32) 191 Gandz, Solomon 23 Gardner, Erie Stanley 1 Gardner, M artin 397, 630, 635, 701, 752 Gardy, Daniele 758 Garsia, Adriano Mario 482, 642, 767 Gasarch, William łan 225 Gassner, B etty Jane 42, 278 Gaudette, Charles H. 371 Gauß (= Gauss), Johann Friedrich Carl 424 gcd: największy wspólny dzielnik generator podgrupy 550 programów sortujących 339, 361-362, 416, 417 Genoa, Giovanni di 452 geny 75 geometria obliczeniowa 610 George, John Alan 762 Gessel, Ira M artin 642 Ghosh, Sakti Pada (1tll^pitt l*rra) 424, 523, 623, 624 Gibson, Kim Dean 634 Gilbert, Edgar Nelson 487, Gilbreath, Norman Laurence 397 Gillis, Joseph ^OV) 647 Gilstad, Russell Leif 285, 320, 358 Gini, Corrado 431 Gleason, Andrew M attei 204, 697 głowice odczytująco/zapisujące 382 Goetz, M artin Alvin 336, 337, 360, 394, 417, 732 Goldberg, Andrev Vladislav (rojibAÖepr, AH^pen Bjia^HCJiaBOBHu; Goldbierg Andriej Wladislawowicz) 160 Goldenberg, Daniel 416 Goldstein, Larry Joel 725 Golin, Mordecai J. (i® HTifp) 000 Gönnet Haas, Gaston Henry 526, 574, 609, 762, 792 Good, Irving John 554 Goodman, Jacob Eli 610 Goodwin, David Thomas 321 Gore, John K. 413 Gotlieb, Calvin Carl 417, 418, 474 Goto, Eiichi (i& IÜ J i—) 575 Gourdon, Xavier Richard 140 GPX, system 796 Grabner, Peter Johannes 693
graf dualny 202 izomorficzny 10 jakość 198 skierowany (zorientowany) 10, 64, 202, 639 acykliczny 208 składowe 199 spójny 791 grafy, suma 200-202 Graham, Ronald Lewis ( 3 |j£ fE ) 209, 214, 217, 593, 786 granica teorio-informacyjna dolna 193, 209, 214, 216 granice dolne dla scalania 212, 214 Grasselli, Antonio 721 Grassl, Richard Michael 72 Gray, Harry Joshua, Jr. 623 Gray, James Nicholas 419 Green, Milton Webster 240, 254, 718, 725 Greene, Curtis 73, 722, 775, 802 Greene, Daniel Hill 794 Greniewski, Marek 554 Gries, David Joseph 665 Grinberg, Victor Simkhovich (rpnHÓepr, Bhktop C hmxobhh; Grinbierg Wiktor Simchowicz) 722 Griswold, William Gale 591 Gross, Oliver Alfred 205, 703 Grossi, Roberto 526 Grove, Edward Franklin 398 grupa wolna 549 grupowanie 2 trzeciego rzędu 598 wtórne 570, 597, 788 Guibas, Leonidas John (rxipTtotc, AeoovtSotc ’Iwavvou) 513, 565, 765, 795 Guilbaud, Georges Theodule 638, 639 Gunji, Takao ( S P ^ P ^ I ? ) 575 Gustafson, Richard Alexander 617 Gustavson, Frances Goertzel 753 Gwehenberger, Gernot 534 Hadian, Abdollah 196, 224, 230 Hajela, Dhananjay (^R^PT I) 432 Hajnal, Andras 806 hak 62, 73 uogólniony 70 Hall, Marshall, Jr. 12, 550, 623 Halperin, John Harris 673 Halpern, Mark Irwin 453 Hamilton, Douglas Alan 767 Han, Guo-Niu ($£ 9 4^) 641, 645, 647 Hanan, Maurice 786 Haralambous, Yannis (XapaXtxp7iouę, ’Ioodvvric) 838 Hardy, Godfrey Harold 759 Hardy, Norman 636 Harper, Lawrence Hueston 759 Harrison, Malcolm Charles 616, 625, 803
SKOROWIDZ ZE SŁOWNIKIEM
haszowanie 422, 552-601, 765 adres 553 doskonałe 592 drzewowe 596, 793 jednostajne 588 kombinatoryczne 618-620, 804 liniowe 591 łańcuchowe 595 z osobnymi listami 596 metoda Brenta 572, 588 podwójne 569-574, 577, 600, 785, 800 pojedyncze 599 cykliczne 599, 600 porządkowe 799 „Robin Hooda” 799 rozszerzalne 591 uniwersalne 600, 601 usuwanie 574, 599 wielomianowe 560, 592, 786 wstawianie 599 Havas, George 554 Hayward, Ryan Bruce 684, 691 Heaps, Harold Stanley 623 Heide, zob. Meyer auf der Heide Heilbronn, Hans Arnold Heising, William Paul 429, 797 Heller, Robert Andrew 550 Hellerman, Herbert 591 Hellerstein, Joseph Meir 419 Hellman, M artin Edward 637 Hendricks, Walter James 758 Hennequin, Pascal Daniel Michel Henri 680 Hennie, Frederick Clair 376, 381 Hermite, Charles, wielomian 65 Herrick, Robert 438 Hibbard, Thomas Nathaniel 20, 207, 239, 417, 418, 443, 464, 486, 707 Hilbert, David 424 Hildebrandt, Paul 134 Hillman, Abraham P. 72 Hindenburg, Karl Friedrich 14 Hinrichs, Klaus Helmer 608 Hinterberger, Hans 608 Hinton, Charles Howard 638 hipoteza Eulera 9 Hoare, Charles Antony Richard 120, 127, 128, 143, 418 Hobby, John Douglas 838 Hoey, Daniel J. 229 Holberton, Frances Elizabeth Snyder 346, 415, 416 Hollerith, Herman 412-413 Holt, Hopfenberg Anatol Wolf 796 Homer ("Op-ripo;) 451 Hooker, William Weston 44 Hopcroft, John Edward 260, 511, 512, 636, 702 Hoshi, Mamoru (JL^F) 784 Hosken, James Cuthbert 417, 420
823
h-sortowanie 89, 671 Hsu, Meichun (fF l& U )) 524 Hu, Te Chiang (f f llS w ) 487, 767, 769 Huang Bing-Chao (S tS l:® ) 56 Hubbard, George Underwood 389, 418 Huddleston, Charles Scott 523, 774 Huffman, David Albert, drzewa 386, 470, 485 Hunt, Douglas Hamilton 92 h-uporzadkowanie 89, 669 Hurwitz, Henry 681 Hu-Tuckera algorytm 487 Hwang, Frank Kwangming 198, 206, 214-218 Hwang, Hsien-Kuei (St US i ł ) 699 Hyafil, Laurent Daniel 231, 404 IBM 701, komputer 590 IBM 705, komputer 8 6 -8 7 IBM RS/6000, komputer 418 IBM, firma 179, 413 iloczyn kolejnych współczynników dwumianowych 659 z wtrąceniami 24, 25, 33, 36 Inakibit-Anu z Uruk 451 Incerpi, Janet Marie 95, 97 indeks permutacji 16, 33 uogólniony 22 indeksowanie KWIC 472, 479, 530 inwersje 11, 16, 85, 89, 101, 105, 107, 113, 140, 177, 188, 372, 666, 668, 670, 675, 676, 689, 701, 730 średnia liczba 16 „inwersje-z-równością” 753 inwolucja 18, 50, 57, 68, 457 Isaac, Earl J. 103 Isbitz, Harold 134 Ismail, Mourad El Houssieny (J^L ^ I jl^O 647 Itai, Alon On>N )t>H) 762, 767 Iverson, Kenneth Eugene 115, 151, 417, 425, 453, 454; 487, 759 Izydor z Sewilli (Święty Izydor z Sewilli) 452 JACM: Journal of the AC M - czasopismo wydawane przez Association for Computing Machinery od 1954 r. Jacobi, Carl Gustav Jacob 21 Jacquet, Philippe Pierre 783 jakość grafu 198 Janson, Carl Svante 675, 791 jednokierunkowa lista liniowa 100 jednostka taśmowa MIXT 339-342 przewijanie 341 punkt zapełnienia 342 Jensen, Johan Ludvig William Valdemar 767 język MIXAL: asembler komputera MIX John, John Welliaveetil 226, 713, 717 Johnsen, Robert Lawrence 551
824
SKOROWIDZ ZE SŁOWNIKIEM
Johnsen, Thorstein Lunde 317 Johnson, Lyle Robert 539, 623 Johnson, Selmer M artin 194, 197 Johnson, Stephen Curtis 599 Johnson, Theodore Joseph 524 Jonassen, Arne Tormod 769 Józef Flawiusz 18 Juillé, Hugues René 240 Kaas, Robert 160 Kaehler, Edwin Bruno 708 Kalai, Gil 0yt>p p>3) 728 Kaman, Charles Henry 572,573 Kant, Immanuel 424 Kaplan, Aryeh (l^3p 23 Kaplan, Haim (l^Ûp D^n) 661 Karlin, Anna Rochelle 592 Karp, Richard Manning 109, 209, 306, 321, 326, 329-332, 336, 370, 376, 377, 381, 684, 720, 762 karty dziurkowane 179, 412 z nacinanym brzegiem 613-614 Katajainen, Jyrki Juhani 699 Kaufman, Marc Thomas 519 Kautz, William Hall 616, 627,721 k-d drzewa 609, 627, 804 Kececioglu, John Dmitri 661 Kelly, Wayne Anthony 225 Kemp, Rainer 306, 695 Kempner, Aubrey John 657 Kerov, Sergei Vasilievich (Kepoß, Cepren BacujmeBnu; Kierów Siergiej Wasiljewicz) 658 Khizder, Leonid Abramovich (Xus^ep, JleoHHn, AópaMOBHu; Chizdier Leonid Abramowicz) 515 Kingston, Jeffrey H. 487 Kipling, Joseph Rudyard 77 Kircher, Athanasius 24 Kirchhoff, Gustav Robert, pierwsze prawo 124, 133 Kirkman, Thomas Penyngton 622, 626 Kirkpatrick, David Galer 225, 231, 713 Kirschenhofer, Peter 621, 682, 693, 783 Kislitsyn, Sergei Sergeevich (K h c jih u m h , Cepren CepreeBnu; Kislicyn Siergiej Siergiejewicz) 208, 220, 222, 224, 230, 712 Klar ner, David Anthony 630 Klein, Christian Felix 804 Klein, Rolf 770 Kleitman, Daniel J. (Isaiah Solomon) 485, 487, 720, 802 Klerer, Melvin 317, 417 klika 10, 636
klucz 4, 421 główny 616 pomocniczy 424 sortowanie 77 wyprzedzający 747 klucze niewidoczne 632 o zmiennej długości 461, 523, 559, 599, 601, 776 reprezentacja binarna 128 rozkład 129, 706 skrócone 594 wtórne 602, 624 K nott, Gary Don 21, 467, 559, 570, 765 Knuth, Donald Ervin ( i§ i i§ ^ ) vi, 60, 160, 282, 316, 414, 418, 424, 428, 451, 453, 487, 514, 578, 630, 639, 646, 649, 675, 682, 708, 722, 750, 756, 769, 778, 791, 794, 799, 800 Koch, Gary Grove 623 kod haszowania drugiego rzędu 799 Morse’a 670 kodowanie nakładkowe 614-618, 625 przez inwolucje 457 kody trudności ćwiczeń xv Koester, Charles Edward 419 Kohler, Peter 720 kojarzenie 2 kolejka 156, 164 dwumianowa 160 „fishspear” 160 priorytetowa 156, 158, 164, 165, 268, 690, 694, 759 dwustronna 166 prosta 690 kolejki gorące 160 kalendarzowe 160 wiązanie 182-183 kolizja 553 Kollar, Lubor 707, 710 Komlós, Janos 240-241, 592, 724, 799 komórki 608 komparator 255 redundantny 256 sąsiedzki 721 kompresja przednio-tylna 550 komputer MIX: hipotetyczna maszyna zdefiniowana w podrozdziale 1.3 78, 339 komputer binarny 128, 141 dziesiętny 180 potokowy 701 komputery równoległe 241 konfiguracje kombinatoryczne 621-623 łączne 627 kongruencje 634
SKOROWIDZ ZE SŁOWNIKIEM
Konheim, Alan Gustave 282, 403, 590, 790, 798 koniunkcja bitowa 117 konwolucja indywidualnych rozkładów 697 Koornwinder, Tom Hendrik 647 kopiec: tablica, w której elementy są uporządkowane w taki sposób, że element na pozycji î-tej jest większy lub równy (albo mniejszy lub równy, w zależności od zastosowań) od elementu na pozycji |_i/2j 152, 158, 161, 165, 268, 691, 692, 694, 759, 765 bliźniaczy 694 Fibonacciego 160 nieskończony 695 pochyły 160 przedziałowy 694 rozluźniony 160 sparowany 160 specjalne poddrzewa 161 węzły 160 f-arny 693 ternarny 165 Korn, Granino Arthur 317, 417 Körner, Janos 554 kostka n-wymiarowa 437 koszt drzewa 470, 477 kowariancja 36 krata permutacji 19, 676 Kreweras, Germain 791 kroki w dół 168 Kronecker, Leopold 812 Kronmal, Richard Aaron 103 Kronrod, Mikhail Aleksandrovich (KpoHpoa, Mnxami AaeKcaHapoBHu; Kronrod Michaił Aleksandrowicz) 177 Krutar, Rudolph Allen 594 Kruyswijk, Dirk 802 książka telefoniczna 618 kubełki 583-587, 590, 608 Kummer, Ernst Eduard 797 Kwan, Lun 707 kwestionariusze 193 La Poutre, Johannes Antonius (= Han) 806 Labelle, Gilbert 609 Ladner, Richard Emil 418 Laforest, Louise 609 Lagrange (= de la Grange), Joseph Louis Comte, wzór inwersyjny 599 Laguerre, Edmond Nicolas 647 LaMarca, Anthony George 418 Lambert, Johann Heinrich 693 Lampson, Butler Wright 565 Landauer, Walter Isfried 518, 623 Lander, Leon Joseph 9 Landis, Evgenii Mikhailovich (JI bhahc, EBreHHÖ MnxaHjTOBHu; Łandis Jewgienij Michaj łowicz) 492, 494
825
Langston, Michael Allen 756 Lapko, Olga Georgievna (JlanKo, O jib r a TeopmeBHa; Łapko Olga Gieorgijewna) 838 Laplace (= de la Place), Pierre Simon de 67 LARC Scientific Compiler 3 Larson, Per-Äke 591, 799 las: zero lub więcej drzew, 49, 530-531, 545 rosnący 49 Lascoux, Alain 722 Lawler, Eugene Leighton 219 Lazarus, Roger Ben 97 Lee, Der-Tsai ( $ t S l ł ) 610 Lee, Tsai-hwa ( ¿ £ |f ip ) 417 Leeuwen, Jan van 694 Leeuwen, Marcus Aurelius Augustinus van 658 Lefkowitz, David 623 Lehmer, Derrick Henry 453 Leibholz, Stephen Wolfgang 725 Leiserson, Charles Eric 513 lemat Spernera 802 Levcopoulos, Christos (AluxotcouXoc, Xprjaxoi;) 418 Levenshtein, Vladimir Iosifovich (J le B e H in x e H H , B jia A H M u p H o c h ^ jo b h u ;
Lewiensztein W ładimir Iosifowicz) 630 LeVeque, William Judson 629 Levitt, Karl Norman 721 Levy, Silvio Vieira Ferreira xi lewostronne minima 85, 89, 466, 672, 678, 732 Li, Shan-Lan ($H fH tf) 38 Liang Franklin Mark 778, 786 liczba całkowita, generowalna 108 odczytów 651 pięciokątna 15 podziałów 668 porównań maksymalna 192 minimalna 192, 207, 221 średnia 192, 203, 204, 207, 228-229 scaleń 291, 329, 739 tangensowa 648, 657 liczby Bernoulliego 544, 648, 686, 809 Catalana 63, 314 Eulera 37, 657 eulerowskie 3 6 -4 2 , 703 Fibonacciego 97, 284, 455, 557, 670, 736, 737, 740, 786, 805, 809, 814 rzędu p 287 uogólnione 285, 304, 306 harmoniczne 430, 681, 809-810, 814 kaskadowe 308, 313-318 Lucasa 763 pierwsze 165, 570, 601, 674, 690 bliźniacze 569
826
SKOROWIDZ ZE SŁOWNIKIEM
liczby Stirlinga 37, 40, 488, 648, 703, 732, 797, 813 stowarzyszone 283 drugiego rodzaju 185, 813 licznik odwołań 575 Liddy, George Gordon 424 LIFO 156, zob. także stos Lin, Andrew Damon 590, 623 Lin, Shen ( # © ) 198, 206, 214-218 Ling, H u ei(# |® ) 623 Liniał, Nathen (^PPb jTO) 711 Linn, John Charles 457 Lint, Jacobus Hendricus van 786, 806 Lissajous, Jules Antoine 424 lista cykliczna 666, 787 dwukierunkowa 437, 585, 695, 769 liniowa 100, 374, 492, 516, zob. także sortowanie listowe jednokierunkowa 100 k-ty element 492 reprezentacja 506-508 reprezentacja drzewowa 493 usuwanie 492 wstawianie 492 wyszukiwanie 492, 506 z dowiązaniami 590 listy odwrotne 604, 610, 622 sklejające się 788 z przeskokami 514 Littlewood, Dudley Ernest 657, 659 Littlewood, John Edensor 759 Litwin, Samuel 623 Litwin, W itold André 591 Livius, Titus ix Lloyd, Stuart Phinney 424 Logan, Benjamin Franklin (= Tex), Jr. 658 logarytm dyskretny 10, 637 Logg, George Edward 770 Louchard, Guy 762, 769 Lozinskii, Eliezer Leonid Solomonovich ( J I o 3HHCKHH, Jle O H H A COJIOMOHOBHU,
Łoziński Leonid Solomonowicz) 696 Lucas, Francois Edouard Anatole 658 Lueker, George Schick 800 Luhn, Hans Peter 472, 590 Lum, Vincent Y u -su n (# ^ ) 559, 610, 623 Lynch, William Charles 734, 764 łańcuch główny 195 Łuczak, Tomasz Jan 791 Lukasiewicz, Jan 424, 723 macierz: tablica dwuwymiarowa porównań 199 przekątniowa 777
macierz transpozycja 664 Vandermonde’a 786 wyznacznik 11 MacLaren, Malcolm Donald 186, 188, 189, 409, 665 MacLeod, Iain Donald Graham 664 MacMahon, Percy Alexander 16, 17, 20, 28, 33, 34, 45, 47, 61, 64, 73, 645, 660, 703 twierdzenie mistrza 34 Magnus, Wilhelm 138 Mahmoud, Hosam Mahmoud (jjjka-û ^l.Mj.-v) 769, 777 Mahon, Maurice Harlang (= Magenta) xv Maier, David 513 Majewski, Bohdan Stanislaw 554 makrorozwinięcia 760 maksimum funkcji 447 Mailach, Efrem Gershon 574 Mallows, Colin Linngwood 46, 649, 791 Maly, Kurt 778 Manacher, Glenn Keith 203, 216 Maniac II, komputer 198 Mankin, Efrem S. 753 Mann, Henry Berthold 670 Mannila, Heikki Olavi 418 Margoliash, Daniel Joseph 618 Markov, Andrei Andreevich (M a p K O B , AHApen AHApeeBHu; Markow Andriej Andriejewicz) 363-364 Marsaglia, George 762 Martin, Thomas Hughes 523 Martnez Parra, Conrado 514, 682 Marton, Katalin 554 Martzloff, Jean-Claude 38 Mason, Perry 1 maszyna Holleritha 412 Turinga 728 Math. Comp.: Mathematics o f Computation (I9 6 0 -) - publikacja American Mathematical Society wydawana od 1965 r.; założona przez National Research Council of the National Academy of Sciences pod pierwotnym tytułem Mathematical Tables and Other Aids to Computation (1943-1959) Mathsort 82 Matsunaga, Yoshisuke (fô zk Ü ® ) 38 Matula, David William 229 Mauchly, John William 370, 372, 414-415, 452 McAllester, Robert Linné 299, 300 McAndrew, M. H. 539 McCabe, John 432 McCarthy, John 134, 177 McCracken, Daniel Delbert 417, 453
SKOROWIDZ ZE SŁOWNIKIEM
McCreight, Edward Meyers 516, 519, 523, 525-526, 623, 776 McDiarmid, Colin John Hunter 684, 691 McGeoch, Catherine Cole 432 Mcllroy, Malcolm Douglas 128, 187, 683, 702, 796 Mcllroy, Peter Martin 187, 702 McKellar, Archie Charles 128, 405, 764 McKenna, James 282 McNamee, Carole M attern 671 McNutt, Bruce 607 m-d drzewo 621 m-d trie 621 mediana 226, 230, 231, 503, 713, 749, 756 z trzech 128, 134, 145, 409, 682, 687 Mehlhorn, Kurt 475, 487, 513, 526, 592, 769, 771, 774 Meister, Bernd 798 Mellin, Robert Hjalmar, transformaty 140, 544, 693, 699 Mendelson, Haim 0 785 M E T R F O N T vi, x, 838 M E T R P O S T xi, 838 metoda Brenta 572 dublowania pętli 757 dwugłowej żmii 417 „dzielenia taśm ” 299-303, 305 Fergusona 310 Huffmana 386, 470, 485 łańcuchowa 618 bez nakładania się list 594 z osobnymi listami 561, 583-584, 587, 588, 601 z osobnymi listami uporządkowanymi 588 z wklejaniem list 561-565, 585, 588 Morrisa 796 NOW-Sort 419 pierwszego dopasowania 778 podmiany i wyboru Hadiana-Sobela 230 P ra tta 95, 249, 717 „przeglądania/przeszukiwania tabeli” 528 przepowiadania 417 Shara 447, 454, 761 Shella 87 „środka kwadratu” 555, 556 transpozycji 432 „WĘDROWCA” 774 wymiennych ogonów 67 z przesuwaniem na początek 432, 435 „zaglądania do tabeli” 528 z dzieleniem 555 metody asymptotyczne 135-145 oszczędne 756 Meyer auf der Heide, Friedhelm 592 Meyer, Curt 21 miara nieporządku 75
(yiDb*ni3 »n)
827
Miles Ernest Percy, Jr. 299 Miltersen, Peter Bro 244 Minker, Jack 623 Mises, Richard Edler von 554 Mitchell, Oscar Howard 72, 658 MIX, zob. komputer MIX MIXAL, zob. język MIXAL MIXT: jednostka taśmowa komputera MIX 339-342 Miyakawa, Masahiro ( '§ ' J l | I E 5 A ) 784 Möbius, August Ferdinand, funkcja 33 moduł porównująco-zamieniający 248 porównujący 234 sortujący 724 Moffat, Alistair 418 Molodowitch, Mariko 800 Mooers, Calvin N. 614 Moore, Edward Forrest 271, 279, 487 Morgenthaler, John David 769 Morris, Robert 590, 796, 799 Morrison, Donald Ross 534 Morse, Samuel Finley Breese, kod 670 Mortenson, John Albert 737 Moser, Leo 67 Motzkin, Theodor Samuel (pp^IKS TITlW Jl) 759 Muir, Thomas 11 Mullin, James Kevin 618, 628 multilista 604, 605, 623 multizbiór: „zbiór” , w którym elementy mogą się powtarzać 23, 223, 317, 643, 721 relacja dominacji 223 liniowego porządku 26 Munro, James łan 231, 467, 513, 574, 628, 705, 763, 792, 799, 800 Muntz, Richard 518, 527 Muroga, S ab u ro f^ 5? jr. UP) 786 Musser, David Rea 128 Myers, Eugene Wimberly, Jr. 628 Nagler, Harry 86, 371, 696, 697 najdłuższe dopasowanie 528 największy wspólny dzielnik 196 Nakayama, Tadasi(43 LÜ 72, 658 Naor, Simeon (= Moni; TliO 'ODD, flVQ^) 763 Narasimhan, Balasubramanian (u!Ttä&LjfJ-LDLD6$r) 762 Neimat, Marie-Anne Kamal (o ft*i (JLo£ ¿jł L) 591 Nelson, Raymond John 239, 259 Netto, O tto Erwin Johannes Eugen 304, 638 Neumann, John von (= M argittai Neumann Janos) 168, 414 Newcomb, Simon 44, 47 Newell, Allen 787 Newman, Donald Joseph Nielsen, Jakob 550
ZE)
828
SKOROWIDZ ZE SŁOWNIKIEM
nieporządek 75, 732 w genomie 75 niepowodzenie w wyszukiwaniu 421, 426 nierówność ogonowa 406 Nievergelt, Jrg 511, 516, 592, 608 niezmienniki izomorfizmu grafów 635 kanoniczne 635 Nijenhuis, Albert 73 Nikitin, Andrei Ivanovich (H h k h t h h , AHApeił PlBaHOBim; Nikitin Andriej Iwanowicz) 375 Nodine, Mark Howard 752 Nórlund, Niels Erik 686 Noshita, Kohei(jy ł ) 226 notacja uzupełnieniowa do dwójki 188 do jedynek 188 znak-moduł 188 Novelli, Jean-Christophe 661 n-sieć 248 N so rt™ , program sortujący 419 Nyberg, Christopher 419 O ’Connor, Daniel J. 239 O ’Neil, Patrick Eugene 526 O ’Rourke, Joseph 610 obciążenie bezużyteczne 716 użyteczne 716 Oberhettinger, Fritz 138 obliczenia równoległe 118 obszar nadmiarowy 584 odbicie permutacji 637 odczytywanie taśmy wstecz 318 —332 Odell, Margaret K. 423 Oderfeld, Jan 557 Odlyzko, Andrew Michael 678, 771 odwracanie permutacji 13 Oettinger, Anthony Gervin 527 ograniczenia lewostronne 210 prawostronne 210 Oldham, Jeffrey David xi Olivie, Hendrik Johan 513 Olson, Charles A. 587 optymalizacja kombinatoryczna 434 optymalne drzewa binarne 214 optymalne scalanie wielofazowe 295-297, 321-332, 735 schematy 321-332 Orosz, Gabor 803 ośmiościan ścięty 13, 18, 638 reprezentacja cz terowy miarowa 638 otoczka wypukła 514 Overmars, Markus (= Mark) Hendrik 628
pagody 160
Paige, Robert Allan 701 Painter, James Allan Pak, Igor Markovich (nax, H ropt MapKOBHu; Pak Igor Markowicz) 73, 661 Palermo, Frank Pantaleone 786 Pallo, Jean Marcel 775 pamięci asocjacyjne 421 pamięć bębnowa 381-407 dyskowa 381-407 kołowa 261 masowa 381 podręczna 418 rozproszona 553 wirtualna 405, 418 zewnętrzna 263 Panny, Wolfgang Christian 677, 678, 698 Papernov, Abram Aleksandrovich (üanepHOB, A6paM AjieKcaHApoBnu; Papiernow Abram Aleksandrowicz) 95 Pappus z Aleksandrii (naTinoc ó 'AXe^avSptvoc) 638 paradoks dnia urodzin 553, 554 Parberry, łan 717 Pareto, Vilfredo 430, 435 Parker, Ernest Tilden 9 Parkin, Thomas Randall 9 Pasanen, Tomi Armas 699 Patashnik, Oren Paterson, Michael Stewart 160, 227, 244, 639, 705, 742, 794 Patricia 526, 534, 536, 542, 544, 546, 783 P att, Yale Nance 545 Patterson, David Andrew 419 Patterson, George William 415, 452 Perl, Yehoshua (infl inunm) 724, 762 permanent macierzy 710 permutacje 11-75 2-uporządkowane 90, 107, 108, 118, 141 liczba inwersji 90 losowe 91 cykle 25, 65, 665, 688, 707 długie sekwensy 49 Fibonacciego 670 h-recydywne 670 h-uporządkowane 92, 107 indeks 16, 33 inwersja 33, 81, 85, 90, 101, 105, 107, 113, 188,’ 254 inwersje dla multizbiorów 645 inwolucja 18, 50, 57, 68 jednoznaczna reprezentacja 36 kanoniczne 68, 653 k rata 19, 676 losowa inwersja 637 losowe 71
SKOROWIDZ ZE SŁOWNIKIEM
permutacje maksima lokalne 12 prawostronne 12 multizbioru 23, 36, 45, 47, 69 inwersje 645 nieparzyste 19, 707 odbicie 637 odczyty 49 odwrotne 13, 33, 50, 56, 638 parzyste 19, 707 pierwsze 29 iloczyn 29 punkty stałe 65, 68 puste 25, 37 reprezentacja cyklowa 676 dwuwierszowa 24 samo odwracał ne 645 „spadek” 36, 651 stosowe 640 struktura cyklowa 663 sumaryczne przemieszczenie 22 „topologiczne” 764 zgodne z porządkiem częściowym 229 „wzrost” 37, 651 permutościan 638 Peterson, William Wesley 425, 453, 566, 576, 579, 590, 591 Petersson, Ola 418 Pevzner, Pavel Arkadjevich (IleB3Hep, I l a B e j i A p K a A b e B H u ; Piewznier Pawie! Arkadjewicz) 662 Peyster, James Abercrombie de, Jr. 587 Picard, Claude François 193, 207, 228 pierwsze prawo Kirchhoffa 124, 133 Pinzka, Charles Frederick 785 Pippenger, Nicholas John 227, 248, 592 Pittel, Boris Gershon (Ü H T T e jib , Bopnc repinoHOBHu; Pittel Boris Gierszonowicz) 769, 777, 785, 791 P L /I 361, 573 Plankalkül język 414 Plaxton, Charles Gregory 671, 718 plik: tu ciąg rekordów 4, 421, 517 h-uporządkowany 669 indeksowo-sekwencyjny 518 siatkowy 608 pliki odwrotne 604-606, 622 samoorganizujące się 431-433, 435, 695 zewnętrzne 605 Plücker, Julius 804 plug śnieżny 276 Poblete Olivares, PatricioVincente 695, 798, 800 Podderjugin, Viktor Denisowitsch ( r io A z je p io r H
H
,
B
h
k
t o
p
/ J e im
c o B iiH
;
Poddierjugin W iktor Dienisowicz) 590
podłoga 813 podział danych na pasma 396, 753 liczby 19, 639 na trzy bloki 144 na trzy części 684 płaski 72, 600 odwrotny 72 przez zamienianie 110 z „medianą z trzech” 687 podziały zespolone 21 Pohl, Ira Sheldon 231 714 Pohlig, Stephen Carl 637 Pollard, John Michael 637, 721, 723 Pool, Jan Albertus van der797 Poonen, Bjorn 108 porównania redundantne 192, 206, 216 Porter, Thomas K. 691 porządek alfabetyczny 451 B ruhata 676, 721 slaby 676, 721 chronologiczny 398, 406, 407 częściowy 32, 69, 72, 194, 229, 231, 676, 710, 775 diagram 194, 198 leksykograficzny 5, 6, 178, 181, 189 liniowy 4, 191 piłowy 485 postfiksowy 790 prefiksowy 327, 740, 790 słownikowy 6 symetryczny 442, 459, 769 topologiczny 32, 64, 69, 229 postać kanoniczna 720 postęp arytmetyczny 556 Powers, James 413 powielanie informacji 759 Pólya, Gyórgy (= George) 645, 759 P ratt, Richard Don 330 P ratt, Vaughan Ronald 95, 109, 119, 249, 260, 491, 670, 727, 756 prawo 8 0-20, 489 idempotentności 253, 720 Kirchhoffa 124, 133 łączności 253, 720 pochłaniania 253, 720 przechodniości 4 przemienności 253, 720 replikacji 692 rozdzielności 253, 720 trychotomii 4 Zipfa 467, 489 prawostronne maksima 101, 105, 109, 672 prefiks 528 Prestet, Jean 24 Pring, Edward John 607 Prins, Jan Fokko 665
829
830
SKOROWIDZ ZE SŁOWNIKIEM
problem co-NP-zupełny 257 cykicznej zajętości 406 głosowania 63 Józefa Flawiusza 18 parkowania 595, 596, 800 windy 377-380, 401-402, 404 zewnętrznej permutacji 401 proces Markowa 363 - 364 Prodinger, Helmut 621, 682, 693, 698, 783 program sortujący 414 proste scalanie dwuwejściowe 171, 176, 204, 416 proste wstawianie 172, 187, 235, 408, 414 próbka losowa 632 próbkowanie jednostajne 571, 576, 581, 590, 598, 599, 600 kwadratowe 595 liniowe 566-569, 575, 577, 578-581, 587, 588, 595, 596, 599 losowe z grupowaniem wtórnym 588, 591, 595, 597, 795 Prusker, Francis 404 Prywes, Noah Shmarya 623 przebieg: część wykonania algorytmu, polegająca na jednokrotnym przejściu przez wszystkie dane 289 przeciwnik 217, 221, 231, 710, 714, 716, 717, 722 dla scalania 210 dolna granica dla scalania 212, 214 strategia 209, 214 z ograniczeniami 210, 212 przeciwnik probabilistyczny: przeciwnik, który w procesie podejmowania decyzji posługuje się losowaniem (np. rzutem monetą) 232 przemieszczanie rekordów zewnętrzne 401 przepełnienie arytmetyczne (nadmiar) 559, 630 przerwy losowe 491 przesiewanie 162 przeszukiwanie binarne 85 rekordów różnej długości 433 tekstu 616, 624 wyczerpujące 198 przetwarzanie potokowe 185 przewidywanie 342, 343-346, 395, 747 z ruchomymi buforami 344, 395 przybliżenie Poissona 598 Puech, Claude Henri Clair Marie Jules 608, 609, 610, 621 Pugh, William Worthington, Jr. 225, 514 Rabin, Micheal Oser (pl*l m y 7n D>0) 256 Radke, Charles Edwin 316 Raiha, Kari-Jouko 773
Rains, Eric Michael Rais, Bonita Marie 783 Raman, Rajeev 682 Raman, Venkatesh (Q sura^C L.^ rriTLD&sr) 705 Ramanan, Prakash Viriyur (tSirrarrGfy sBifimrr ¡jLD6m
/ T T T L O r r g f l/ g O C T Ł
U J fE J &
fT fT ) ,
funkcja Q(n) 756 Ramshaw, Lyle Harold 786 Randrianarimanana, Bruno 769 Raney, George Neal 316, 317 Raver, Norman 786 Ravikumar, Balasubramanian (urrsv&rLJiXLDismfliLnm rj
623 Reed, Bruce Alan 691, 769 Regnier, Mireille 608, 680 Reiner, Victor Schorr 775 Reingold, Edward M artin 218, 511, 516, 771 rekordy 4 grupowanie 684 o zmiennej długości 283 Remington Rand, korporacja 413 reprezentacja binarna liczby 773 dowiązaniowa 428 Fibonacciego 748 pozycyjna, mieszana 637 Ribenboim, Paulo 629 Rice, Stephan Oswald 145 Richards, Ronald Clifford 515 Richmond, Lawrence Bruce 783 Riemann, Georg Friedrich Bernhard 187 Riesel, Hans Ivar 436 Riordan, John 40, 48, 651, 732, 789, 790, 791, 796 Rising, Hawley 134 Rivest, Ronald Linn 226, 227, 229, 418, 432, 513, 618-620, 625, 806 Roberts, David Caron 618 Robinson, Gilbert de Beauregard 60, 63 Robson, John Michael 609, 769 Rochester, Nathaniel 590 Rodgers, William Calhoun 759 Rodriguez, Benjamin Olinde 15, 638 Roebuck, Alvah Curtis Rogers, Lawrence Douglas 762 Rohnert, Hans 592 Rollett, Arthur Percy 639 Rose, Alan 723 Roselle, David Paul 49, 642 Rosenstiehl, Pierre 638, 639 Rosier, Uwe 680 Rosser, John Barkley 723 Rost, Hermann 661
SKOROWIDZ ZE SŁOWNIKIEM
rosyjska ruletka 21 rotacja 495, 498, 508, 517, 774 podwójna 495, 498, 508, 774 Rotem, Doron (o n n jlTn) 64 Rothe, Heinrich August 14, 50, 65 Rouché, Eugène, twierdzenie 733 Roura Ferret, Salvador 514 Rovner, Paul David 623 rozdrobnienie drzewa 207 rozkład B' 697 beta 631 doskonały 734 dwumianowy 105 Fibonacciego doskonały 285-286, 304, 320 jednostajny 430, 652, 691, 692 kaskadowy 313, 315, 317 na czynniki pierwsze 637 normalny 699 Pareto 430, 766 prawdopodobieństwa, binarny 435, 436 Yulego 431, 435 Zipfa 430, 467, 489 rozkłady „niewielofazowe” 736 rozmieszczenia organowe 759 rozmieszczenie podprogramów na taśmie, optymalne 436 rekordów, optymalne 433 rozrzucanie kaskadowe 310 doskonałe 306 rozszerzone drzewo binarne: albo pojedynczy węzeł zewnętrzny, albo węzeł wewnętrzny, który jest korzeniem całego drzewa, plus jego lewe i prawe rozszerzone poddrzewa binarne 191, 206, 214, 216 rozwiązywanie kolizji 583, 590, 618 metodą łańcuchową 560-565 przez „adresowanie otwarte” 566, 587 równolegle sortowanie Batchera 110, 116, 409 różnica symetryczna 20, 634 Rubin, Herman 785 Rudolph, Lawrence Set 724 Russell, Robert C. 423 Rustin, Randall 336, 377 rząd drzewa 207 rzeczywista moc scalania 728 Sable, Jerome David 623 Sackman, Bertram Stanley 297, 736 Sagan, Bruce Eli 50 Sager, Thomas Joshua 554 Sagiv, Yehoshua Chaim D” n ywirp) 777 Saks, Michael Ezra 485, 711, 724 Salveter, Sharon Caroline 513
831
Salvy, Bruno 609 Samadi, Behrokh 777 Samet, Hanan 610 samoorganizujące się pliki 431-433 Samuel, Arthur Lee 590 Sandelius, David M artin 706 Sankoff, David Lawrence 661 Sarnak, Neil Ivor 628 Sasson, Azra (yiWW NJty) 395 Sawyer, Thomas 806 SB-drzewa 526 S B -drzewa 526 scalacz 414 scalanie 166, 208, 414, 696 binarne 214, 216, 218 bitoniczne 255, 724, 725, 726 dwuwejściowe 167, 263, 753 zrównoważone 263-267, 414, 416, 632 proste 171, 176, 204, 416, 753 granica dolna 209, 243 górna 209, 214 jednowejściowe 728 kaskadowe 306-318, 319, 322, 324, 328. 418, 737, 743 analiza 313-318 doskonale rozkłady 307 efektywność 309 modyfikacje 316-317 wstępny podział sekwensów 308-312 z czytaniem w przód 348, 355 z czytaniem wstecz 330, 350, 352, 356 z jednpczesnym przewijaniem 349, 356 z rozrzucaniem wstępnym 310-312 kompromisowe 316 krzyżowe 333 X-wejściowe 175 listowe 174-175, 409, 420, 756 m etoda Batchera 409, 418 naturalne 168, 176, 697 nieparzysto-parzyste 237, 242, 243-244, 249, 257, 258, 717, 723, 724 ocena czasu działania 352 —361 parzysto-nieparzyste 258, 726 porównanie schematów 346-352 prefiksowe 327-328, 330, 336 przez zamienianie 110, 409, 418 P -wejściowe 267-270, 346, 400 stabilne 756 taśmowe 338-366 trzywejściowe 240 w miejscu, stabilne 699 wielofazowe 284-306, 322, 324, 328, 332, 358, 418, 447, 735, 762 efektywność 290, 296 liczba scaleń 291, 329 optymalne 295-297, 735 optymalne, schematy 321 —332 reprezentacja drzewiasta 331
832
SKOROWIDZ ZE SŁOWNIKIEM
scalanie wielofazowe z czytaniem w przód 347, 355 z czytaniem wstecz 320-321, 350, 356 z dzieleniem taśm 299-303, 305, 348 356, 737 z rozrzucaniem poziomym 287-289 wielowejściowe 267-284 z czytaniem w przód 328, 368 z podmianą 732 z testowaniem w przód i wstawianiem wstecz 216 z zamianami 116, 239, 245 ze wstawianiem 194, 202, 204, 214, 410, 418 zrównoważone 284, 318, 322, 324, 332, 371, 377, 728, 729 z czytaniem w przód 347, 355 z czytaniem wstecz 318, 349, 356 Schachinger, Werner 621 Schaffer, Alejandro Alberto 763 Schaffer, Russel Warren 164, 166, 694 Schay, Geza, Jr. 579, 580, 599, 786 schemat scalania dla dysków 388 schematy scalania reprezentacja drzewiasta 321-326, 329, 331 reprezentacja wektorowa 321, 329 zrównoważonego wypełniania 621-623 Schensted, Craige Eugene 5 9 -6 0 , 69 Scherk, Heinrich Ferdinand 693 Schkolnick, Mario 777 Schlegel, Stanislaus Ferdinand Victor 287 Schlumberger, Maurice Lorrain 392, 393 Schmidt, Jeanette Pruzan 763, 800 Schneider, Donovan Alfred 591 Schónhage, Arnold 227, 231 Schott, René Pierre 769 Schreier, Jozef 220 Schulte Mónting, Jürgen 202, 710 Schur, Issai, funkcja 658 Schützenberger, Marcel Paul 17, 22, 40, 5 8-60 , 68, 71, 72, 73, 722 Schwartz, Eugene Sidney 430 Schwartz, Jules 134 Scoville, Richard A rthur 49 Sears, Richard Warren Sedgewick, Robert 95, 97, 99, 119, 121, 128, 142, 160, 164, 166, 513, 551, 670, 677, 678, 682, 687, 694, 725, 783 Sefer Yetzirah (m ^> n£Dp) 23 Seidel, Raimund 514 sekwensy 36, 263, 731 długość 276, 731 plug śnieżny 276 domyślne 264, 287-289, 308-312, 321, 329, 333, 338, 386, 733 naprzemienne 48
sekwensy średnia długość 40, 43 średnia liczba 36 Selfridge, John Levis 9 Senko, Michael Edward 523 Sevcik, Kenneth Ciem 608 Seward, Harold Herbert 82, 179, 271, 416, 721, 751 Seymour, Paul Douglas 432 Shackleton, Patrick 142 Shamir, Ron p i) 661 Shanks, Daniel Charles 636 Shannon, Claude Elwood, Jr. 475, 491, 768 Shapiro, Gerald Norris 240, 242, 258 Shapiro, Henry David 719 Shar, Leonard Eric 446, 761 Shasha, Dennis Elliott 524 Shearer, James Bergheim 711 Sheil, Beaumont Alfred 491 Shell, Donald Lewis 87, 97, 297 Shepp, Lawrence Alan 658 Sherman, Philip M artin 528 Shields, Paul Calvin 785 Shockley, William Bradford 719 Sholmov, Leonid Ivanovich JleoHHA HBanoBHu; Szolmow Leonid Iwanowicz) 375 Shrairman, Ruth 160 Shrikhande, Sharadchandra Shankar (*l W T %!W^) 804 SICOMP: SIAM Journal on Computing - czasopismo wydawane przez Society for Industrial and Applied Mathematics od 1972 r. sieci wyboru 246-248 sieć 234, 235 dopełnieniowa 722 modułów porównujących 234, 724 odwracająca 721 okresowa 724 permutacyjna 258, 725 scalająca 237, 243-244, 255 bitoniczna 255 nieparzysto-parzysta 237, 242 sortowania bąbelkowego 236 sortująca 232-262 czas opóźnienia 241 efektywna 241 o minimalnej liczbie porównań 239-241 o minimalnym czasie działania 241-243 okresowa 257 prosta 254, 721, 722 równoległa 245 sprzężenie 251, 718 standardowa 248, 252 , 254, 258, 719, 721, 725 symetryczna 718 Siegel, Alan Richard 763, 800 Siegel, Shelby 671 ( I H
o
j im
o
b
,
SKOROWIDZ ZE SŁOWNIKIEM
Silicon Graphics 0rigin2000, komputer 419 Silver, Roland Lazarus 637 Silverstein, Craig Daryl 160 Simon, Istvan Gusztav 691 Singer, Theodore 297 Singleton, Richard Collom 103, 121, 128, 142, 616, 627 składowe grafów 199 spójne 229 skojarzenie doskonale 806 Slagle, James Robert 758 Sleator, Daniel Dominie Kaplan 160, 432, 513, 628, 775 Sloane, Neil James Alexander 515 słowa dopełniające się 9 kodowe o zmiennej długości 485 Słupecki, Jerzy 220 Smith, Alan Jay 177, 749 Smith, Alfred Emanuel 421 Smith, Cyril Stanley 638 Smith,Wayne Earl 434, 436 Sobel, Milton 224, 228, 229, 230 Sobel, Sheldon 332, 337 SODA: Proceedings of the ACM -SIAM Symposia on Discrete Algorithms materiały wydawane od 1990 r. sorter doskonały 260 kart 413 sortowanie 1, 57 adresowe 77, 78 bąbelkowe 110-116, 136, 141, 236, 255, 259, 261, 262, 372, 375, 377, 408, 416, 728, 729 analiza 113-114 bez odwoływania się do historii 232 bitoniczne 244-246, 251, 409, 725 metoda Batchera 251, 409 cyfrowe 178 drzewowe 102, 488 dystrybucyjne 366 historia 412-419 jednoprzebiegowe 730 kart bibliotecznych 7 karuzelowe 336 kluczy 77, 400-403 wielosłowowych 142 koktajlowe (mieszane) 115, 141, 381, 748, 750 kubełkowe 178 listowe 77-78, 173-178, 181-188, 419, 752 metoda Batchera, równolegle 110, 116, 409 MacLarena 409 metody adresowe 409 hybrydowe 410, 419
833
sortowanie minimalna liczba porów nań-zamian 207 na dwóch taśmach 372-381 na jednej taśmie 377 —380 nieparzysto-parzyste przestawiające 254, 721 o malejących skokach 87 optymalne 190, 262 oscylacyjne 332-338, 370, 418 Benchera 332-338 efektywność 338 Goetza 336 pozycyjne 370 Sobela 337-338 z czytaniem w przód 336, 351, 357 wstecz 350, 356 z rozrzucaniem „krzyżowym” 334 —336 porównanie metod 411 schematów 346-361 pozycyjne 130-134, 136, 145, 178, 188, 366-372, 375, 385, 409, 413, 682, 683, 699, 700, 701, 753 kaskadowe 371 listowe 181, 183-185, 756 o podstawie 2 416 od najbardziej znaczącej cyfry 185, 187, 188 przez zamienianie 110, 129, 375, 418, 537, 700, 750, 753 wielofazowe 372 zewnętrzne 366-372 zrównoważone dwustopniowe 414 próbko we 128 przestawiające nieparzysto-parzyste 254 przez dzielenie i zamienianie 120 przez kopcowanie 152-156, 165, 409, 418, 705, 752 metoda Williamsa 418 analiza 160-164 przez naturalne scalanie dwuwejściowe 169-171 przez odwracanie 75 przez porównywanie 706 przez proste scalanie dwuwejściowe 171-173, 204, 416 wstawianie 8 3 -8 5 , 133, 235, 408, 414 wybieranie 146, 409, 416 wybieranie, doskonalenie 147 przez próbkowanie 777 przez rozrzucanie 178-189, 699 przez scalanie 103, 166-178, 193, 245, 261, 369, 371 listowe 173-175, 409 w trybie bezpośrednim 177 z czytaniem w przód 368 z zamianami 116, 237, 239 ze wstawianiem 194, 202, 204, 214, 410, 418
834
SKOROWIDZ ZE SŁOWNIKIEM
sortowanie przez wstawianie 76, 83, 176, 409, 699 binarne 193, 705 do drzewa 418, 462, 486 do wielu list 104, 409, 560 przez wybieranie 76, 145-166 drzewowe 149, 176, 193, 220, 230, 696 przez wyliczanie adresów 103 przez zamienianie 76, 110-145, 418 przez zliczanie 76, 7 9-83, 180, 408 przez zrównoważone scalanie dwuwejściowe 263-267, 414, 416, 632 równoległe 723 schemat 2-poziomowy 187 Shella 87, 88, 89, 102, 106-107, 110, 155, 408, 418, 720, 752 analiza 8 9 -9 9 słów 682 stabilne 4, 83, 106, 140, 164, 419, 420, 629, 662 w minimalnej pamięci 419 statyczne 260, 727 ograniczone 260, 727 szybkie 119-128, 155, 260, 261, 373-375, 409, 682, 683, 727, 750, 753, 756 analiza 124-130 m etoda Hoare’a 110, 409, 418 z wieloma kluczami 418, 682 średnia liczba porównań 192, 203, 204, 207, 228 taśmowe 412 terabajtowe 419 topologiczne 32, 64, 69, 198, 422, 639 ukierunkowane 76 w czasie liniowym 106 w miejscu 83 wewnętrzne 5, 76-189, 339, 408 przez scalanie 414 wielofazowe 734 Carona 298, 305 optymalne 735 z minimalną liczbą porównań 190 z podziałem danych na pasma 396, 418, 753 z wyliczeniem adresów 418, 752 ze scalaniem 204 zewnętrzne 5 -1 0 , 263-407, 410 złożoność 190 zrównoważone 333 Sós, Vera Turan Pálné 557, 806 spełnialność 257 Sperner, Emanuel 802 spójne składowe 229 sprawdzanie pisowni 618 sprawdzanie wielu warunków 436 Sprugnoli, Renzo 554 Spruth, Wilhelm Gustav Bernhard 579, 580, 599
Spuler, David Andrew 767 stabilność 408, 697 Stacy, Edney Webb 759 Stael-Holstein, Anne Louise Germaine Necker 635 stała Eulera 807, 814 stale wielokrotnej precyzji 807 Stanfel, Larry Eugene 491 Stanley, Richard Peter 73, 646, 652, 722 Stasevich, Grigory Vladomirovich (OraceBHH, TpiiropHH BjiaAHMHpoBHu; Stasiewicz Grigorij Wladimirowicz) 95, 97 Stasko, John Thomas 160 statystyki porządkowe 46 Stearns, Richard Edwin 376, 381 Steiner, Jacob 804 Steinhaus, Hugo Dyonizy 197, 220, 453, 557, 638 sterta 732 Stevenson, David 723 STOC: Proceedings o f the ACM Symposia on Theory o f Computing datowane od 1969 r. Stockmeyer, Paul Kelly 214 Stone, Harold Stuart 251, 457 stos 21, 120, 121, 129, 156, 164, 374, 690, 774 stowarzyszone liczby Stirlinga 283 Stoyanovskii, Aleksander Vasil’evich ( C
t o
b
h
o
b c
k
h
h
,
A jie K c a H
A P
BacHjibeBHu; Stojanowski Aleksandr Wasiljewicz) 73, 661 strategia „scalaj, aż wyczerpiesz” 305 strategia przeciwnika 209, 214 Straus, Ernst Gabor 759 Strong, Hovey Raymond, Jr. 592 stronicowanie 777 struktury danych trwałe 628 ukryte 457 zrandomizowane 514 Sue, Jeffrey Yen (j f 747 Suel, Torsten 671, 718 sufit 813 Sugito, Yoshio ( ^ I S J j i S ) 784 sukces w wyszukiwaniu 421, 426 suma grafów 200 - 202 sumaryczne przemieszczenie permutacji 22 sumowanie przez części 196 sumy Dedekinda 21 superbloki 396, 398, 406 supersilnia 659 Sussenguth, Edward Henry, Jr. 531 Swift, Jonathan xi Sylvester, James Joseph 670 symetryczne B-drzewa binarne 513 sympleks 491 symulacja 376
SKOROWIDZ ZE SŁOWNIKIEM
Symvonis, Antonios (EuppoovrK, Avxtć>vtoę) 756 system „dwupiątkowy” 748 liczbowy Fibonacciego 369, 372, 786 uogólniony 304 operacyjny 406 trójek, dopełnieniowy 626 Kirkmana 626 Steinera 621, 626, 627 konfiguracje kombinatoryczne 804 szachownica n x n 48 Szekeres, George 69 Szemeredi, Endre 240-241, 592, 724, 799 szereg Lamberta 693 teleskopowy 471 szeregowanie prac 436 Szpankowski, Wojciech 783, 784, 785 szybka transformata Fouriera 251 szybkie sortowanie Hoare’a 110, 409 ścieżka krytyczna, czas 347 schodkowa 90, 107 stopniowa, długość 389, 391-393 ważona, długość 208, 485 wewnętrzna, długość 443, 609, 765, 783, 784 zewnętrzna, długość 323, 326, 328, 330, 386, 389-393, 549, 706, 707, 740, 767, 770 minimalna 203, 206, 207, 401, 699 zmodyfikowana 549, 784 zewnętrzna ważona 360 ścieżki na kratownicy 90, 107, 118, 141, 678 Swierczkowski, Stanisław Sławomir 557 tabele 421 inwersji 113 tableau 653, 720, 721 dualne 59 liczba 62, 65 przesunięte 70 transponowane 60, 656 uogólnione 658 Younga 4 9 -7 5 , 254, 722 tablice przeniesień 778 rzadkie, kompresowanie 778 z haszowaniem łańcuchowym 562 przepełnienie 562, 565, 569 usuwanie z 574 wstawianie 561-565, 569 wyszukiwanie 561-565 tabulator Holleritha 412 Tainiter, Melvin 798 Takacs, Lajos 803 Tamaki, Jeanne Keiko ( 5 M S '? 1) 487
835
Tamari, Dov 775 Tamminen, Markku 187 Tan, Kok Chye 490, 767 Tanner, Robert Michael 710 Tanny, Stephen Michael 652 Tarjan, Robert Endre 160, 226, 227, 432, 513, 592, 628, 636, 699, 702, 769, 775, 778 Tarter, Michael Ernest 103 Tarui, J u n iiIF f1'}?) 244 tasowanie 7, 250 doskonałe 250, 251, 718 taśm a magnetyczna 263, 339, 417 bloki 340 przerwa między blokowa 340 przewijanie 297-306 T-drzewo silnie typu fifo 386, 742 T-drzewo silnie typu Ufo 331, 368 T-drzewo typu fifo 330 T-drzewo typu Ufo 325-328, 330, 369, 386, 740 Tengbergen Cornelia van Ebbenhorst 802 teoria grafów 260 grup 549, 657 informacji 193, 475 odwzorowań losowych 637 Terquem Olry 637 test chi-kwadrat 797 na równość zbiorów 218 pokerowy 185 Teuhola, Jukka Ilmari 699 TeX przenoszenie wyrazów 572 T£X vi, x Thiel, Larry Henry 623 Thimbleby, Harold William 675 Thimonier, Lo„s 758 Thorup, Mikkel 191 Thrall, Robert McDowell 63, 70 Thue, Axel 453, 531 Thurston, William Paul 775 Tichy, Robert Franz 693 Ting, Tze Ching ( T T $ S ) 277 Tomlinson, Robert L., Jr. 671 topologia algebraiczna 676 Touchard, Jacques 703 Townsend, Gregg Marshall 591 tożsamości podziałowe 542 tożsamość hipergeometryczna Kummera 797 Jacobiego 640 Trabb Pardo, Luis Isidoro 695, 756 transform ata dwumianowa 143, 546 Poissona 792 transformaty Mellina 140, 544, 693, 699 transpozycja macierzy 7, 664 Treadway, Jennifer Ann 641 Tribolet, Charles Siegfried 671
836
SKOROWIDZ ZE SŁOWNIKIEM
TYicomi, Francesco Giacomo Filippo 138 Trotter, William Thomas 708 Trousse, Jean-Michel 805 trójpodział 682 Truesdell, Leon Edgar 413 trw ałe struktury danych 628 Trybuła, Stanisław 197 Tucker, Alan Curtiss 487 Turba, Thomas Norbert 532 Turing, Alan Mathison 628 turniej 219, 224, 229, 268, 280, 729 Turski, Władysław 554 Twain, Mark (= Clemens Samuel Langhorne) 806 twierdzenie Abela o dwumianie 595 Bouriciusa 236 graniczne Abela 798 mistrza 34 o liczbach pierwszych 674 o małżeństwach 806 o residuach 649 o trzech odległościach 557, 593 o wartości średniej 767 ę-mianowe 639 Rouchego 733 Shreiera-Kislitsyna 221 Uk (n) i Uk(n) 246, 252 Ullman, Jeffrey David 581, 702 UltraSPARC I, komputer 419 ułamki proste 205 UNIVAC I, komputer 415 UNIVAC III, komputer 741 uniwersalna rodzina funkcji haszujących 600 UNIX 128a uogólnione liczby Fibonacciego 285, 304, 306 uporządkowanie 2-malejące 491 usuwanie przemienność 489 z binarnego drzewa wyszukiwań 463 - 467 uwagi do ćwiczeń xiii Uzgalis, Robert 518, 527 Vallee, Brigitte 785 van der Pool, Jan Albertus 797 van Ebbenhorst Tengbergen, Cornelia 802 van Emde Boas, Peter 160, 681, 686 van Emden, M aarten Herman 134 van Leeuwen, Jan 694 van Leeuwen, Marcus Aurelius Augustinus 658 van Lint, Jacobus Hendricus 786, 806 Van Valkenburg, Mac Elwyn 9 Van Voorhis, David Curtis 240-242, 255 van W ijngaarden, Adriaan 9 Velthuis, Frans Jozef 838 Venn, John Leonard 321 Vershik, Anatoly Moiseevich (BepniHK, AHaTOJiim MoHceeBnu; Wierszyk Anatolij Moisiejewicz) 658
Viennot, Gérard Xavier 160 Viola Deambrosis, Alfredo 798, 800 Vitter, Jeffrey Scott ( H f Ü lf ) 160, 398, 526, 591, 752, 788, 789, 793, 794 Vk (n) i Vk (n) 246, 252 von Mises, Richard, Edler 554 von Neumann, John (= M argittai Neumann Janos) 168 VSAM 526 Vuillemin, Jean Etienne 160, 392, 404, 513 Vyssotsky, Victor Alexander 796 Wachs, Michelle Lynn 424, 487, 656, 767 Waks, David Jeffrey 362 Waksman, Abraham 240, 721 Walker, Ewing Stockton 393 Walker, Wayne Allan 474 Wallis, John 24 Walters, John Rodney, Jr. 272 Wang, Yihsiao ( T l £ l ? ) 134 Wang, Ya W e i( T f t # ) 277 Ward, Morgan 720 wariancja 666 łączna 793, 800 wartownik: wyróżniona wartość umieszczana w tablicy, służąca do usprawnienia organizacji programów 5 W atanabe, Masatoshi (}]f ® $£) 838 Waters, Samuel Joseph 393 Waugh, Evelyn A rthur St. John 424 Wedekind, Hartmut 333 Wegener, Ingo Werner 692, 694 Wegman, Mark N. 559, 601, 802 Wegner, Lutz Michael 683 Weisert C. 299 Weiss, Benjamin 590, 790 Weiss, Harrold 417 Weiss, Mark Allen 99, 670 Weissblum, Walter 49 wektor inwersji 11, 140, 638, 645, 651, 666, 676, 730 dualny 676 wektory scalania 322 Wells, Mark Brimhall 201 Wessner, Russell Lee 767 wędrujący wskaźnik 585 węzeł wewnętrzny 191 zewnętrzny 191 Wheeler, David John 102, 486 Whirlwind, komputer 416 Whitlow, Duane L. 395 wiązanie kolejek 182-183 Wiedemann, Douglas Henry 720 wielomian antysymetryczny 69 Czebyszewa 315, 738 Hermite’a 65 homogeniczny 69
SKOROWIDZ ZE SŁOWNIKIEM
wielomiany arytmetyka 560 dodawanie 174 Laguerre’a 647 mnożenie 165 wielowymiarowe drzewa wyszukiwań binarnych, zob. k-d drzewa Wiener, Norbert 8 Wigram, George Vicesimus 189 Wijngaarden, Adriaan van 9 Wiles, Andrew John 629 Wilf, Herbert Saul 73 Willard, Dan Edward 160 Williams, Francis A., Jr. 561 Williams, John William Joseph 152, 157, 160, 164, 166, 418 Williamson, Stanley Gil 724 Wilson, David Bruce 722 Windley, Peter Francis 486, 765, 793 Winkler, Phyllis Astrid Benson vii Wk(n) i Wk(n) 246, 252 Wong, Chak-Kuen 275, 492, 511, 516, 610, 731 Wood, Derick 418, 526, 696, 770 Woodall, Arthur David 175 Woodrum, Luther Jay 175, 362 Wormald, Nicholas Charles 554 Wrench, John William, Jr. 42, 163, 693, 782 Wright, Edward Maitland 640 współczynnik korelacji statystycznej 22 wielomianowy 23, 30, 491, 792, 813 wypełnienia 584, 588 wzrostu 291 zrównoważenia 493, 517, 771 współczynniki dwumianowe 200, 813 współrzędne 607-610 wstawianie 214, 235 binarne 85, 86, 102, 197, 204, 222, 705 do drzewa 459, 460, 507, 519 do wielu list 207, 706 dwustronne 85, 86, 102 koktajlowe 728 na listę 99-103, 756 proste 172, 187, 235 Wu Jigang H!l) 692 wybieranie czwartego i wyższych stopni 148 drzewowe 148, 149-152, 222, 230, 417, 486, 696 kubiczne 148 kwadratowe 148 n-tego stopnia 148 średnia liczba porównań 228, 229 wybór 235 fc-tego największego elementu 219, 226-229, 231, 253 naturalny 275-277, 279-281, 283 n-tego co do wielkości 143
837
wybór przez zamienianie 110 z minimalną liczbą porównań 219-232 z podmianą 224, 266, 267-284, 354, 371, 385, 391, 404, 416, 730, 732 analiza 277-279 generowanie początkowych sekwensów 270 stopnie swobody 274 Wyman, Max 67 wyrażenia wrunkowe 812 wysokość drzewa 493 wyszukiwanie 2, 421-628 binarne 214, 215, 415, 439-446, 454, 455, 456, 588, 692, 763 jednorodne 444-446 cyfrowe 528-551 rzędu M 534, 546 w drzewach 533 drzewowe 462, 506, 549, 589 dynamiczne 422 dyskowe 437 Fibonacciego 447-450, 453, 455, 456 historia 451-453 i sortowanie 423 interpolacyjne 450-451, 456 liniowe 425-438, 454, 461, 487 w tabeli uporządkowanej 428 szybkie 427 logarytmiczne 440 łańcuchowe 437 metodą próbkowania liniowego 585, 590 niepowodzenie 421, 426 przez porównywanie kluczy 439-527 równolegle 457 statyczne 422 sukces 421, 426 w drzewach binarnych 457-492 w drzewie 459, 460, 519, 589 cyfrowym 549, 556, 589 Patricia 536, 549 w macierzy 219 w tabeli uporządkowanej 439 wewnętrzne 422, 517, 551 względem kluczy wtórnych 602-627, 623 zewnętrzne 422, 519, 534-537, 583-587, 590, 600, 617 wyważanie drzewa 495', 498, 507 doskonałe 516 wyznaczanie elementu drugiego co do wartości 222, 228 wyznacznik macierzy 11 MacMahona 649 Vandermonde’a 61, 657 wzór dwumianowy Abela 789 Eulera 20, 21, 39, 782 inwersyjny Lagrange’a 599 Stirlinga 66, 91, 135, 193, 208, 715
838
SKOROWIDZ ZE SŁOWNIKIEM
wzór sumacyjny Eulera 66, 135, 136, 674, 757 van Emdena 686 Yao, Andrew Chi-Chih ( t y k M W 229, 244, 248, 456, 525, 582, 600, 675, 689, 716, 720, 773, 778 Yao, Frances Foong Chu (Hf f i ) 214, 244, 456, 716, 767 Yoash, Nadal Ben (u>NP p bro), pseudonim Gideona Yuvala (t>2P jiyj)) 373 Youden, William Wallace 473 Young, Alfred 50 Young, Alfred, tableaux 4 9 -7 5 Young, Frank Hood 240 Yuba, Toshitsugu ( ^ ^ I f e P I ) 784 Yuen, Pasteur Shih Teh (j§£ ©P ^ ) 559 Yule, George Udny 431 Zalk, M artin Maurice 272 zamienianie pozycyjne 128-134 zapytania 602-627 boolowskie 602, 605, 607, 614 o zawieranie 613-617, 618, 624, 625, 626 podstawowe 613, 619, 620, 621,625, 625 proste 602 zakresowe 602, 609, 623 ortogonalne 608 zgrupowanie 603 zasada dziel i zwyciężaj 186 Gilbreatha 397, 406 włączania i wyłączania 631, 803 zero-jedynkowa 236, 259, 718, 719 zastój 777 Zave, Derek Alan 297, 735 zbiór par, przechodni 19 wyznaczanie minimum i maksimum 231 „Zadanie o fladze holenderskiej” 684 Zeckendorf, Edouard 734
Zeilberger, Doron TTil) 642, 646, 647 zgrupowanie zapytań 603 Zhang, Bin (51 j®) 524 Zhang, Linbo ( * # $ 0 838 Zhu, Hong ( ^ $t) 692, 725 Zijlstra, Erik 160 Zipf, George Kingsley 429 Ziviani, Nivio 526 zliczanie drzew binarnych 63 przez porównywanie 79, 416 przez rozrzucanie 81, 408, 416 złota proporcja 557, 807, 814 złożoność obliczeniowa algorytmów 177, 189, 180-262, 321-332, 377-381, 401-404, 416, 442, 527, 581-583, 592, 623 problemu windy 377 sortowania 190 zmiana kolejności liter w słowie, zob. permutacje multizbiorów zmienna zespolona 138, 547 znajdowanie elementu drugiego co do wartości 222, 228 fc-tego największego elementu 219, 226-229, 231, 253 maksimum 221 Zoberbier, Werner 360 Zobist, Alfred L. 801 Zolnowsky, John Edward 640 zrównoważone niepełne konfiguracje kombinatoryczne 621-623 zrównoważone scalanie dwuwejściowe 263-267, 414, 416, 632 zupełne drzewa binarne 151, 224, 273, 712, 729, 773 Zuse, Konrad 414 Zweben, Stuart Harvey 773 Zwick, Uri (pPW niN) 715 z-wspólczynnik wielomianowy 33 Chociaż posiadasz rozległą wiedzę, to jednak nadal nie możesz uważać się w pełni za człowieka nauki.
— G E O R G E B E R K E L E Y , Th e Anaiyst (1 7 34 )
Oryginał tej książki został złożony na Sun SPARCstation z użyciem krojów pisma rodzi ny Computer Modern. Wykorzystano do tych celów systemy i META FONT, opisane w tomach A -E dzieła Donalda E. K nutha pt. Computers Sz Typesetting (Reading, Mass.: Addison-Wesley 1986). Do wykonania ilustracji użyto systemu METRPOST Johna Hobby’ego. Niektóre nazwiska w skorowidzu zostały złożone w oryginalnej pisowni, czcionkami opracowa nymi przez Yannisa Haralambousa (greckie, hebrajskie, arabskie), Olgę G. Łapko (cyrylicą), Fransa J. Velthuisa (w dewanagari), Masatoshiego W atanabe (japońskie) i Limbo Zhanga (chińskie).
Kod znaku* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 * u
00
A B C D E F G H I A J K L M N O P Q R E n S T U
1
Nie rób nic
01
02
2
rA
rA + V
08
09
2
r AX <- r A x V
SUB (0 :5 ) FSUB(6 )
MUL(0 :5 ) FMUL(6 )
2
10
rll < -V
rI2 *— V
LDA(0:5)
LD1(0 :5 )
LD2(0:5)
17
2
18
2
11
2
rA <- V
16
10
rA <- r A - V
ADD(0:5) FADD(6 )
N0P(0)
03
2
2
rI3
V
LD3(0:5)
19
2
2
rA <----- V
r l l <- - V
rI2 <- - V
rI3 ^ - V
LDAN(0:5)
LD1N(0:5)
LD2N(0:5)
LD3N(0:5)
24
25
2
2
26
M (F) <- rA
M (F) <- r ll
M(F) <- rI 2
STA(0:5)
ST1(0 :5 )
ST2(0:5)
32
33
2
M (F)
rJ
M(F) <- 0
STJ(0 :2 )
40
34
41
rA : 0, skok
1
r l l : 0, skok
JA [+]
49
1
rA <- [rA]? ± M INCA(O) DECA(l) ENTA(2) ENNA(3)
56
2
CI <- rA(F) : V CMPA(0:5) FCMP(6 )
Opis 0 P (F )
t
rI3
ST3(0:5)
35
1
1+ T
JBUS(0)
I0C(0)
42
43
1
1
rI 2 : 0, skok
rI3 : 0, skok
J2M
J3 [+]
50
51
1
1
[rll]? ± M
rI2 <- [rI2] ? ± M
rI3 ^ [rI3] ? ± M
INCl(O) D ECl(l) ENT1(2) ENN1(3)
INC2(0) DEC2(1) ENT2(2) ENN2(3)
INC3(0) DEC3(1) ENT3C2) ENN3(3)
57 CI
2
rll(F ) : V CMP1(0 :5 )
Legenda: 1
rll
1
M(F)
Sterowanie urządzeniem F
JIM
48
2
Urządzenie F zajęte?
STZ(0:5) 1
C
2
27
2
58 CI
59
2
rI2(F) : V
CI
CMP2(0:5)
C = kod operacji, wycinek (5 : 5) F = modyfikator operacji, wycinek (4 : 4) M = adres po indeksowaniu V = M (F) = zawartość wycinka F lokacji M OP = nazwa symboliczna operacji (F) — standardow a wartość F t = czas wykonania; T = czas wstrzym ania
2
rI3(F) : V CMP3(0:5)
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
V W X Y Z 0 1 2 3 4 5 6 7 8 9 04 | 12 rA <— rAX/V rX <— reszta DIV(0:5) FDIV(6) 12 2 rI4 4 V -
LD4(0:5) 20 rI4 4- - V
05 10 Specjalne NUM(O) CHAR(l) HLT(2) 13 2 rI5 <— V
.
,
( ) + - * /
06 ' 2 Przesuń o M bajtów SLA(O) SRA(l) SLAX(2) SRAX(3) SLC(4) SRC(5) 14 2 rI6 <—V
LD5(0:5)
2
= $ < > « ;
M0VE(1) 15 rX <—V
2
rI5 4- - V
rI6 4- - V
LD4N(0:5)
LD5N(0:5)
LD6N(0:5)
LDXN(0:5)
28 2 M(F) 4- rI4
29 M(F)
ST4(0:5)
2 4-
30 M(F)
rI5
ST5(0:5)
36 1+ T Wejście, urządzenie F IN(0)
37 1+ T Wyjście, urządzenie F
52 1 rI4 [rI4] ? ± M
53 1 rI5 «- [rI5]? ± M
INC4(0) DEC4(1) ENT4(2) ENN4(3)
INC5C0) DEC5(1) ENT5(2) ENN5(3)
C I 4-
rI4(F) : V
46 1 rI6 : 0, skok
rI6
[rI6]? ± M
INC6(0) DEC6(1) ENT6(2) ENN6(3)
CMP5C0:5)
62
2
C I 4-
rI6(F) : V
CMP6(0:5)
W : JL (4) JE (5) JG(6) JGE(7) JNE(8) JLE(9)
< = > > i <
W : N(0) Z (l) P(2) NN(3) NZ(4) NP(5)
rX
1
Skoki JMP(O) J S J ( l) J0V(2) JN0V(3) też [*] poniżej 47 1 rX : 0, skok JX[+]
1
54
2
39
J6 [+]
61 2 C I <- rI5(F) : V
rA = rejestr A rX = rejestr X rAX = połączone rA i rX rl i = rejestr indeksowy i. 1 < i < 6 rJ = rejestr J CI = wskaźnik porównania
31 M(F)
2
STX(0:5)
38 1 Urządzenie F gotowe?
45 1 rI5 : 0, skok J5[+]
2
rI6
JRED(O)
J4 [+]
60
2
ST6(0:5)
OUT(O)
44 1 rI4 : 0, skok
CMP4(0:5)
22
2
LDX(0:5) 23 rX 4- - V
21
'
07 1 + 2F Kopiuj F słów z M do rll
LD6(0:5)
2
:
55 1 rX 4 [rX]? ± M -
INCX(0) DECX(1) ENTX(2) ENNX(3)
2
63 CI
rX(F) : V CMPX(0:5)
Scalanie zrównoważone z czytaniem w przód
Scalanie wielofazowe z czytaniem w przód
Scalanie kaskadowe z czytaniem w przód
Scalanie wielofazowe z dzieleniem taśm
Scalanie kaskadowe z jednoczesnym przewijaniem
Scalanie zrównoważone z czytaniem wstecz
Scalanie wielofazowe z czytaniem wstecz W k ła d k a A . S c a la n ie t a ś m o w e
Legenda
Scalanie kaskadowe z czytaniem wstecz Y ////x
Czytanie w przód Czytanie wstecz Zapisywanie w przód Przewijanie wstecz
Sortowanie oscylacyjne z czytaniem wstecz
Zmiana taśm przez operatora
Sortowanie oscylacyjne z czytaniem w przód
g Czas (minuty)