ПЕРЕДМОВА
Алгоритми були ще до комп'ютерів. Але тепер, коли є комп'ютери, алгоритмів є ще більше і алгоритми лежать в основі обчислень.
Ця книжка забезпечує всебічний вступ до сучасних комп'ютерних алгоритмів. У ній подано багато алгоритмів і охоплено їх дуже детально, при цьому їхня побудова і аналіз доступні для всіх рівнів читачів. Ми постаралися зберегти пояснення елементарними без шкоди для глибини охоплення чи математичної строгості.
Кожен розділ подає якийсь алгоритм, методику побудови, галузь застосування чи пов’язану тему. Алгоритми описані звичайною мовою і в псевдокоді, щоб міг читати будь-хто, хто хоч трохи програмує. Книга містить 244 рисунки – багато з декількох частин – що ілюструють, як працюють алгоритми. А що ми наголошуємо на ефективності як критерієві проєктування, то подаємо тривалості обчислення всіх наших алгоритмів.
Текст насамперед призначений для використання в студентських чи аспірантських курсах з алгоритмів або структур даних. Через те що в ньому обговорюються технічні питання розроблення алгоритмів, а також математичні аспекти, він рівною мірою добре підходить для самостійного навчання технічних фахівців.
У цьому, третьому виданні, ми ще раз оновили всю книжку. Зміни охоплюють широкий спектр, зокрема нові розділи, переглянутий псевдокод і активніший стиль письма.
До викладачів
Ми задумували цю книжку як універсальну і повну. Ви побачите, що вона корисна для різних курсів, від бакалаврських про структури даних до магістерських/аспірантських про алгоритми. А враховуючи, що ми передбачили куди більше матеріялів, ніж може вміститися в типовому одностроковому курсі, ви можете розглядати цю книжку як "шведський стіл", з якого можете вибрати ліпші матеріяли для курсу, який хочете викладати.
Ви побачите, що з нього легко організувати свій курс, виходячи тільки з потрібних вам розділів. Ми зробили розділи відносно самодостатніми, так що ви можете не хвилюватися через неочікувану і зайву залежність одного розділу від іншого. У кожному з них подано спершу легший матеріял, складніший – пізніше, з позначенням чітких меж параграфів. У бакалаврських курсах, ви можете використовувати тільки легші параграфи з розділу; в магістерських – охопити весь розділ.
Ми подали 957 вправ і 158 задач. Кожен параграф закінчується вправами, а кожен розділ – задачами. Вправи – зазвичай короткі питання, якими перевіряється базове засвоєння матеріялу. Деякі з них проста самоперевірка думки вправи, тоді як інші важливіші та придатніші для домашнього завдання. Задачі – детельніше розроблені дослідження проблеми, що часто вводять новий матеріал; часто складаються з кількох питань, які проводять студента через етапи, необхідні, щоб дійти до розв’язку.
Виходячи з нашої практики в попередніх виданнях цієї книжки, ми зробили відкрито доступними розв’язки деяких, але далеко не всіх, задач і вправ. Наш вебсайт,
http://mitpress.mit.edu/algorithms/, зв’язаний з цими рішеннями. Радимо переглянути цей сайт, щоб переконатися, що він не містить розв'язків вправ або задач, які ви плануєте задати. Ми розраховуємо, що кількість розв’язків, які публікуємо, повільно зростати протягом тривалого часу, тому вам потрібно буде перевіряти його щоразу, як викладатимете курс.
Ми помітили знаками (?) параграфи і вправи, які більше підходять для аспірантів, ніж для студентів. Помічений параграф не обов'язково важчий, ніж не позначений, але це може вимагати розуміння більшого обсягу вищої математики. Аналогічно, позначені вправи можуть вимагати досконалішої підготови чи більшої за середню творчої здатності.
До студентів
Ми сподіваємося, що цей підручник стане для вас приємним вступом у галузь алгоритмів. Ми намагалися зробити кожен алгоритм доступним і цікавим. Щоб допомогти вам, коли ви стикатиметеся з незнайомими або складними алгоритмами, ми опишемо кожен з них крок за кроком. Ми також надаємо ретельні пояснення математики, необхідної для розуміння аналізу алгоритмів. Якщо ви вже дещо ознайомлені з якоюсь темою, то побачите, що розділи організовані так, що ви можете проглянути вступні параграфи і швидко перейти до глибшого матеріялу/вищого рівня.
Вам треба мати певний досвід програмування. Зокрема, ви повинні розуміти рекурсивні процедури і прості структури даних, такі як масиви і зв'язані списки.
Ви повинні володіти певною здібністю до математичних доведень, і особливо доведень методом математичної індукції. Кілька частин книжки спираються на деякі знання елементарного числення. Крім того, частини I і VIII цієї книжки навчать вас усіх математичних методів, що вам знадобляться.
Ми почули голосний і чіткий заклик надати розв’язки задач і вправ. Наш вебсайт,
http://mitpress.mit.edu/algorithms/, поєднує з розв’язками деяких задач і вправ. Не соромтеся порівнювати свої розв’язки з нашими. Ми просимо, однак, не надсилати свої розв’язки нам.
До професіоналів
Широке коло питань в цій книжці, робить її відмінним довідником з алгоритмів. А що кожнн розділ відносно самодостатній, то ви можете зосередитися на темах, які цікавлять вас найбільше.
Більшість алгоритмів, які ми обговорюємо мають велику практичну цінність. Тому ми звертаємося до проблем впровадження та інших технічних питань. Ми часто надаємо практичні альтернативи до деяких алгоритмів, що здебільшого становлять лише теоретичний інтерес.
Якщо ви хочете реалізувати будь-який з алгоритмів, то повинні знайти трансляцію нашого псевдокоду у вашу улюблену мову програмування, це буде досить простим завданням. Ми розробили псевдокод, щоб кожен алгоритм подати чітко та лаконічно. Отже, ми не звертатимемося до обробки помилок та інших програмно-технічних питань, які вимагають конкретних припущень про ваше середовище програмування. Ми намагаємося подати кожен алгоритм просто і безпосередньо, не враховуючи специфічних особливостей конкретної мови програмування, що б затіняла його сутність.
Ми розуміємо, що якщо ви використовуєте цю книжку, вийшовши за межі курсу, то, можливо, будете не в змозі перевірити розв’язки задач і вправ, як це було з розв’язками, наданими викладачем. Наш вебсайт,
http://mitpress.mit.edu/algorithms/, поєднує з розв’язками деяких задач і вправ, так що ви можете перевірити свою роботу. Будь ласка, не надсилайте свої рішення нам.
До наших колег
Ми подали велику бібліографію і вказівники на сучасну літературу. Кожен розділ закінчується низкою приміток, які надають історичні подробиці та покликання. Ці розділові примітки, однак, не забезпечують повного покликання на всю галузь алгоритмів. Хоч у це, можливо, важко повірити, зважаючи на такий обсяг книжки, та просторові обмеження все ж завадили нам внести багато цікавих алгоритмів.
Попри незліченні прохання від студентів щодо розв’язків задач і вправ, ми вибрали за політику не подавати покликань на них, щоб студенти не спокушалися розшукувати розв’язок, замість того щоб знаходити його самим.