Д. Кнут - Искусство программирования том 1 (1119450), страница 2
Текст из файла (страница 2)
— Профессор Ю. В. Козаченко ПРЕДИСЛОВИЕ уважаемые читатели) Вы держите в руках книгу, иЗдать КОтОруЮ Вы просили нас в тыСячах пиСЕм. мам пришлось потратить годы на то, чтобы самым тщательным образом пРовеРить н перепроверить бесконечное множество рецептов н отобрать для вас самые лучшие, самые интересные, самые совершенные.
теперь без тени сомнения мы можем сказать, что если вы будете следовать инструкциям, то каждое блюдо будет получаться у вас таким же, как н у нас, даже если раньше вы никогда не занимались пРиготовлением лиши. — поваренная книга мак-колла (1963) Пгоцнсс подготовки программ для цифрового компьютера — это очень увлекательное занятие.
И дело не только в том, что оно оправдывает себя с экономической и научной точек зрения; оно может вызвать также эстетические переживания, подобные тем, которые испытывают творческие личности при написании музыки или стихов. ллы держите в руках первый том многотомного издания, цель которого — дать читателю разнообразные знания и умения, из которых и состоит ремесло программиста. Последующие главы не являются введением в компьютерное программирование; предполшается, что вы уже имеете некоторый опыт в этой области. На самом деле предъявляемые к читателю требования очень просты; тем не менее начинающему программисту потребуются время и практика, чтобы понять, что собой представляет цифровой компьютер. Итак, читатель должен иметь а) некоторое представление о том, как работает цифровой коллпьютер с хранимой программой; при этом необязательно разбираться в электронике, главное— понимать, каким образом колланды можно сохранять в памяти компьютера, и затем последовательно нх выполнить; Ь) способность ставить задачу с люмощью четких и определенных терминов, понятных компьютеру (у компьютеров нет разума, присущего человеку', поэтому они делают в точности то, что им приказывают, не больше и не меньше; именно этот факт обычно труднее всего уяснить начинающим пользователям); с) знание самых простых компьютерных методов, таких как организация циклов (повторное выполнение некоторого набора команд), а также использование подпрограмм и переменных с индексами; й) знание распространенных компьютерных терминов, например "память", "регистры", "биты", "плавающая точка", 'переполнение", "программное обеспечение"; большинство терминов, которые не определены в тексте, поясняются в алфавитном указателе в конце каждого тома.
Эти четыре условия, вероятно, можно объединить в одном требовании: читатель должен иметь опыт написания н отладки по меньшей мере четырех программ хотя бы для одного компьютера. Я старался писать эти книги так, чтобы они могли служить нескольким различным целям. Во-первых, они представляют собой справочное пособие, в котором сосредоточены знания нз нескольких важных областей науки. Во-вторых, они могут использоваться в качестве пособий для самообразования и учебников по программированию или информатике для университетов. В связи с этим я включил в текст большое количество упражнений и предоставил ответы на большинство из них.
Кроме того, я попытался сосредоточить внимание на фйктах., вместо того чтобы "лить воду" и заниматься общими рассуждениями. Этот трехтомник предназначен для всех, кто серьезно интересуется компьютерами, а не только для профессионалов. В сущности, одна из моих главных целей состояла в том, чтобы сделать методы программирования более доступными для специалистов из других областей. Как правило, эти специалисты получают большие преимущества, используя компьютеры, но не могут позволить себе тратить время на поиски необходимой информации, крупицы которой разбросаны по множеству технических журналов.
Тему этих книг можно сформулировать следующим образом: "Нечисленяый анализ", Компьютеры обычно ассоциируются с решением численных задач, таких как нахождение корней уравнения, численное интерполирование, интегрирование и т. д. Но в этом трехтомнике подобные темы не рассматриваются (за исключением случаев, когда это необходимо сделать по ходу изложения). Численное компьютерное программирование — необычайно интересная н бурно развивающаяся область; на эту тему написано очень много хороших книг. Но с 60-х годов компьютеры все чаще и чаще применяются для решения проблем, в которых числа играют второстепенную роль.
Теперь на первый план выходит способность компьютера принимать решения, а не просто выполнять арифметические операции. При решении нечисленных задач иногда требуется выполнять операции сложения и вычитания, но потребность в умножении и делении возникает довольно редко. Но, конечно, даже тот. кто в основном занимается численным компьютерным программированием, только выиграет от изучения исчисленных методов, так как они лежат и в основе числовых программ.
Результаты исследований в области нечислениого анализа разбросаны по многим техническим журналам. Моя цель состояла в том, чтобы извлечь из этого огромного объема информации только фундаментальные методы, которые можно применять в разнотипиых ситуациях программирования. Я попытался обобщить выбранную информацию, чтобы получить то, что в большей нли меньшей степени можно назвать "теорией", а также показать, как применять эту теорию прн решении различных практических задач. Конечно, "исчисленный анализ" — крайне неудачное название для данной области науки. Оно неудачно прежде всего потому, что содержит только отрицание другого понятия; гораздо лучше было бы выбрать более содержательный термин, не имеющий приставки "не". Назваиие "обработка информации" охватывает более широкую область, чем рассматриваемый здесь материал, а "методы программирования" — более узкую.
Я считаю, что для темы, освещаемой в данных книгах, самым подходящим является название анализ алгорипьмое, которое можно расшифровать как "теория свойств некоторых компьютерных алгоритмов ', Полный иаГюр книг, озаглавленный как Искусство программирования., имеет следующую основную структуру, Том 1.
Основные алгоритмы Глава 1, Основные понятия Глава 2. Информационные структуры Том 2. Получнсленные алгоритмы Глава 3. Случайные числа Глава 4. Арифметика Том 3. Сортировка в поиск Глава 5. Сортировка Глава 6. Поиск Том 4. Комбияаторные алгоритмы Глава 7. Комбинаторный поиск Глава 8. Рекурсия Том 5. Слитакслческле алгоритмы Глава 9. Лексикографический поиск Глава 10. Синтаксический анализ В томе 4 рассматривается очень большая тема, поэтому на самом деле он состоит из трех отдельных книг (томов 4А, 4В и 4С). Планируется также выпуск двух дополнительных томов по более специализированным темам: том 6, Теория языков (глава 11), и том 7, Компиляторы (глава 12).
Я приступил к этой раГюте в 1962 году с намерением написать единственную книгу, содержащую все перечисленные главы, но вскоре понял, что необходимо глубоко рассматривать выбравные темы, а не просто "скользить по поверхности". В результате получился текст такого объема, что материала каждой главы оказалось более чем достаточно для изучения в течение одного университетского семестра. И стало ясно, что необходимо разбить материал иа несколько отдельных томов. Я знаю, что книга, содержащая только одну-две главы, выглядит довольно странно, но реп~ил сохранить первоначальную нумерацию глав, чтобы упростить перекрестные ссылки. Планируется выпуск сокращенного варианта томов 1-5, который будет служить более общим справочником и/или учебником для студентов; в ием будет содержаться основная часть материала данных томов, а более специальная информация будет опущена.
В сокращенном издании будет сохранена такая же нумерация глав, как и в полном. Том 1 можно рассматривать как "пересечение" полного набора глав, в том смысле, что он содержит основныс сведения, которые используются во всех остальных книгах. С другой стороны, тома 2 — 5 можно читать независимо один от другого. Том 1 — это не только справочник, который необходимо использовать как пособие прн чтении других томов; он может служить также университетским учебником либо пособием для самообразования по теме структпуры данных (основное внимание следует уделить главе 2) или днскрегпнал матемагаика (основное внимание следует уделить разделам 1.1, 1.2, 1.3.3 и 2.3.4), или программирование на языке машинных команд (основное внимание следует уделить разделам 1.3 н 1А). Эти главы написаны с другой точки зрения, чем та, которая используется в самых современных книгах по программированию, т.
е. я не пытался научить читателя пользоваться чужим программным обеспечением. Вместо этого я стремился научить читателя писать собственные программы более высокого качества. Моя первоначальная цель заключалась в том, чтобы познакомить читателей с передовыми научными исследованиями в каждой из рассматриваемых областей знания. Но очень сложно постоянно быть в курсе дел отрасли, которая является экономически выгодной; бурный рост компьютерной науки сделал невозможным осуществление моей мечты. Образно говоря, я очутился на берегу безбрежного океана, содержащего десятки тысяч маленьких результатов, которые были получены десятками тысяч талантливых яюдей по всему миру. Поэтому мне пришлось поставить перед собой новую цель — сосредоточиться на "классических" методах, которые останутся актуальными в течение многих десятилетий, и описать их как можно лучше по мере моих возможностей.