Sztuka Programowania. Tom 3 Sortowanie i wyszukiwanie

Sztuka programowania (The Art of Computer Programming) – fundamentalna monografia autorstwa Donalda Knutha dotycząca ana

620 48 32MB

Polish Pages [851]

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Sztuka Programowania. Tom 3 Sortowanie i wyszukiwanie

Citation preview

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



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)
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 (ai2 . . . 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 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 + " , f (n- 1,/2/

n^O

J ] (1 - q k).

/ l 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 ,