Вы находитесь на странице: 1из 410

Н.

Вирт
АЛГОРИТМЫ + СТРУКТУРЫ ДАННЫХ = ПРОГРАММЫ
Монография известного швейцарского специалиста по системному
программированию, знакомого советским читателям по переводу его книги
«Систематическое программирование. Введение.» (М.: Мир. 1977). Она содержит
описание и анализ основных алгоритмов, методов построения программ. Книгу
можно использовать и как руководство по применению языка Паскаль в задачах
математического обеспечения ЭВМ.
Для научных работников, преподавателей, аспирантов и студентов,
специализирующихся по математическому обеспечению ЭВМ.
Содержание
Предисловие редактора перевода 5
Предисловие 7
1. Фундаментальные структуры данных 14
1.1. Введение 14
1.2. Концепция типа для данных 17
1.3. Простые типы данных 20
1.4. Стандартные простые типы 22
1.5. Ограниченные тисы 25
1.6. Массивы 25
1.7. Записи 30
1.8. Записи с вариантами 35
1.9. Множество 38
1.10. Представление массивов, записей и множеств 44
1.11. Последовательный файл 50
Упражнения 71
Литература 73
2. Сортировка 74
2.1. Введение 74
2.2. Сортировка массивов 77
2.3. Сортировка последовательных файлов 108
Упражнения 147
Литература 149
3. Рекурсивные алгоритмы 150
3.1. Введение 150
3.2. Когда не нужно использовать рекурсию 153
3.3. Два примера рекурсивных программ 156
3.4. Алгоритмы с возвратом 163
3.5. Задача о восьми ферзях 169
3.6 Задача об устойчивых браках 174
3.7. Задача оптимального выбора 182
Упражнения 186
Литература 188
4. Динамические информационные структуры 189
4.1. Рекурсивные типы данных 189
4.2. Ссылки или указатели 193
4.3. Линейные списки 198
4.4. Древовидные структуры 219
4.5. Сильно ветвящиеся деревья 278
4.6. Преобразования ключа (расстановка) 303
Упражнения 314
Литература 318
5. Структура языков и трансляторы 319
5.1. Определение и структура языка 319
5.2. Анализ предложений 322
5.3. Построение синтаксического графа 322
5.4. Построение программы грамматического разбора для заданного 332
синтаксиса
5.5. Построение таблично-управляемой программы грамматического 336
разбора
5.6. Преобразование БНФ в структуру данных, управляющую 340
грамматическим разбором
5.7. Язык программирования ПЛ/0 346
5.8. Программа грамматического разбора для ПЛ/0 352
5.9. Восстановление при синтаксических ошибках 361
5.10. Процессор ПЛ/0 373
5.11. Формирование команд 376
Упражнения 390
Литература 392
Приложение А 393
Множество символов ASCII 393
Приложение В 394
Синтаксические диаграммы Паскаля 394
Указатель программ 400
Указатель 401
Указатель программ
1.1. Вычисление степеней двойки 30 2.6. Сортировка Шелла 89
1.2. Сканер 42 2.7. Просеивание 93
1.3. Чтение вещественного числа 63 2.8. Пирамидальная сортировка 95
1.4. Печать вещественного числа 65 2.9. Разделение 97
2.1. Сортировка простыми 2.10. Быстрая сортировка 99
включениями 79 2.11. Нерекурсивная версия быстрой
2.2. Сортировка бинарными сортировки 100
включениями 80 2.12. Поиск k-го элемента 105
2.3. Сортировка простым выбором 82 2.13. Сортировка простым слиянием
2.4. Сортировка методом пузырька 114
84 2.! 4. Сортировка естественным
2.5. Шейкер-сортировка 86 слиянием 121
2.15. Сортировка сбалансированным 4.6. Построение оптимального дерева
слиянием 126 поиска 274
2.16. Многофазная сортировка 138 4.7. Поиск, включение и удаление в
2.17. Распределение начальных серий Б-дереве 290
с помощью пирамиды 145 4.8. Построение таблицы
3.1. Кривые Гильберта 157 перекрестных ссылок с
3.2. Кривые Серпинского 161 использованием функций
3.3. Ход коня 167 расстановки 308
3.4. Восемь ферзей (одно решение) 5.1. Грамматический разбор для
172 синтаксиса из примера 5 334
3.5. Восемь ферзей (все решения) 174 5.2. Грамматический разбор для
3.6. Устойчивые браки 180 языка (5.12) 343
3.7. Оптимальная выборка 184 5.3. Транслятор для языка (5.13) 345
4.1. Включение в список 204 5.4. Грамматический разбор для ПЛ/0
4.2. Топологическая сортировка 218 356
4.3. Построение идеально 5.5. Грамматический разбор для ПЛ/0
сбалансированного дерева 227 с восстановлением при ошибках
4.4. Поиск с включениями 236 368
4.5. Построение таблицы 5.6. Транслятор для ПЛ/0 380
перекрестных ссылок 240
Указатель
Адельсон-Вельский 248 — — выбором простым 81
Адрес 44, 48 — — обменом простым 83
— абсолютный 374 — — пирамидальной 90
— базовый 374 — — с разделением 96
— возврата 374 — — слиянием естественным 115
— относительный 374 — — слиянием многофазным 137
Алгол-60 17, 320 — — — простым 109
Алгоритм включения в Б-дерево 285 — — — сбалансированным N-
— — в ББ-дерево 296 путевым 122
— — в сбалансированное дерево 254 — удаления из Б-дерева 288
— — в список 200 — — из сбалансированного дерева
— вычисления n-го факториального 256
числа 153 — шейкер-сортировки 85
— грамматического разбора 324 Алгоритмы рекурсивные 9
— линейного просмотра 203 — с возвратом 9, 168
— поиска медианы 103 Анализ алгоритмов сортировки 79,
— — по дереву с включением 233 80, 82, 85, 88, 94, 100, 113
— построения кустарников 300 Балансировка 288
— сортировки включениями Банки данных 58
бинарными 79 Барабаны магнитные 57
— — — простыми 78 Барьер 79, 203, 233
— — — с убывающим приращением ББ-дерево см. Б-дерево бинарное
(сортировка Шелла) 87 Б-дерево 282
Б-дерево бинарное 295 — Фибоначчи 249
— — симметричное 298 2-3 дерево 295
Буквы латинские 24 Диаграмма зависимости 361
Буфер 54 Дизъюнкция логическая 23
Бэйер 282, 289, 295, 298 Диски магнитные 57
Варианты в записях 35 Дискриминант типа 36
Вес дерева 264 Длина пути 220
Ветвь 223 — — взвешенная 261
Возврат 9, 168, 325 — — внешнего 220
Вольтер 13 — — внутреннего 220
Восстановление при ошибках 373 Доступ последовательный 53
Время патентное 58 — прямой 58
Выборочное изменение 28 — случайный 25
Выравнивание 46 Заглядывание вперед 55, 68
Выражение 17 Заголовок списка 314
— индексное 27 Задача об устойчивых браках 174
Высота дерева 220 — о восьми ферзях 169
Гаусс 169 — о ходе коня 164
Гильберт 156 — оптимального выбора 182
Глубина дерева 220 — поиска медианы 103
Горизонтальное распределение 134 — построения школьного расписания
Готлиб 267 41
Грамматический разбор 10, 328 Запись (record) 8, 31, 48
— — нисходящий 323 — с вариантами 36
— — целеориентированный 328 Запись бесскобочная 377
Граф распознавания 328 — инфиксная 230
— синтаксический 328 — польская 377
— — детерминированный 332 — постфиксная 230
Графы 19 — префиксная 230
Данные 11 Инвариант цикла 28
Дейкстра 7, 12 Индекс 26, 44
Декартово произведение 31 Интерпретатор 373
Декартовы координаты 15, 36 Искусственный интеллект 163
Дерево 10, 19, 219 Итерация 9, 99, 154
— — АВЛ-сбалансированное 248 Карта (индексов) 123, 128
— бинарное 223 Квантиль 105
— вырожденное 220 Ключ 76, 303
— идеально сбалансированное 226 Ключей преобразование 303
— лексикографическое 238 Ключи переменной длины 318
— оптимальное 263 Кнут 77, 86, 134, 144, 264
— поиска 231 Кольца 19
— сильно ветвящееся 223 Конкатенация 51, 52, 54
— сортировки 91 Константа 17
— упорядоченное 220 Конструктор 20
— записи 32 — присоединения 34, 286
— массива 26 — процедуры 190
Контекстная зависимость 322 — условный 190
Конфликт 304 — цикла 29
Конфликтов разрешение 304 — — с параметром 190
Конъюнкция логическая 23 — — с предисловием 190
Координаты 15, 31, 36 Операции булевские 23
— декартовы 15, 36 — над файлами 54
Корень дерева 220 — отношений 40
Коэффициент заполнения 312 — преобразования 20
— использования памяти 46 I/O-операции 62
Кривая Гильберта 156 Операция 17, 18, 19
— Серпинского 158 Описание 17
Кустарники 299 Опробирование квадратичное 307
Ландис 248, 249 — линейное 306
Лента 54 Открытая адресация 306
— магнитная 108 Очередь 198
Лист дерева 220 Ошибки наведенные 373
Лорин 77 Память для программы 373
Лукасевич 377 — оперативная 295
Мак-Вити 179 Паскаль 8, 11, 16, 19, 62
Мак-Крейт 289 Переменная буферная 55
Мантисса 15 Переменные 17, 23
Массив 19, 25, 44 Переупорядочение списка 209
Матрица 29 Пирамида 91
Машина ПЛ/0 373 ПЛ/0 331, 349
Медиана 101, 103 ПЛ/1 20
Метасимволы 320 Поддерево 223
Метод деления пополам 28 Поиск бинарный 28
— пузырька 84 —— в списке 202
— рассеянных таблиц 307 — медианы 103
Множеств объединение 40 — по дереву с включением 233
— пересечение 40 — по списку самоорганизующийся
— разность 40 209
— сложение 40 Поле 48
— умножение 40 Поле признака 36
Множество 15, 19, 38 Порядок Б-дерева 282
Множество-степень 38 — частичный 211
Множеству принадлежность 40 — числа 15
Моррис 306 Последовательность 16, 19, 52
Нотация 52 Потомок 220
Область переполнения 306 Поэтапное уточнение 11, 67, 344
Обход дерева 229 Правила подстановки 320
Оператор варианта 37 — порождающие 320
— построения графа 329 — фиктивные 132
Правило «не поднимай панику» 363 Серпинский 158
Предложения 319 Символ 23, 40, 319
Преобразование (типов) 24 — начальным 320
— ключей 303 — пустой 24
Приоритеты операций 40 Символы внешние 363
Присваивание 19, 21, 189 — возобновления 363
Проблема пустой строки 326 — нетерминальные 320
Программа рабочая 373 — терминальные 320
— таблично-управляемая 328 — управляющие 393
Просеивание 92 Сканер 40, 341
Просмотр на один символ вперед без Слияние 109
возврата 323 — двухфазное 115
Проход 109 — естественное 115
— по списку 201 — каскадное 149
Процедура 190 — многопутевое 122
Путь внешний 222 — однофазное 110
— внутренний 220 — простое 109
Разряд 15, 44 — сбалансированное 110, 122
Расписание школьное 41 — трехленточное 109
Распознавание предложений 322 Слова размер 44
Распределение горизонтальное 134 Словарь частотный 203
— памяти динамическое 51, 193 Слово памяти 44
Расстановка 303 Случайный доступ 25
— повторная 318 Смещение 48, 374
Реализация 47, 50 Сопрограммы 144
Регистр адреса команды 374 Сортировка 9, 74, 77
— команды 374 — быстрая 96
— вершины стека 374 — включениями 77
Редактирование 67 — — бинарными 80
Рекурсия 9, 99, 150 — — простыми 78
— косвенная 151 — внешняя 75
— прямая 151 — внутренняя 75
СББ-дерево 298 — выбором 77
Связка динамическая 374 — — простым 81
Сегмент 57 — массивов 75
— логический 58 — методом пузырька 84
— физический 58 — обменом 83
Сектор 58 — — простым 83
Селектор 20, 37 — пирамидальная 91
— записи 32 — слиянием 109
— массива 26 Серии 115 — — многофазная 128
— максимальные 115 — — простым 109
— фиктивные 132 — с помощью дерева 89
— топологическая 211 Упаковка 47, 49
— устойчивая 79 Уровень 220
— файлов 75 Файл 14, 19, 53
— Шелла 88 — индексированный 58
i-сортировка 88 — многоуровневый 57
Список 10, 198 — персональный 14
— двунаправленный 315 — с прямым доступом 58
— циклический 314 Фиктивный элемент 79
Сравнение 19 Флойд 92
— методов сортировки массивов 105 Фибоначчи деревья 249
Ссылки 10, 19, 193 — числа 131
Стек 99, 374 Фиксация 378
Строка разрядов 49 Форма бэкус-наурова 320
— текущая 69 — инфиксная 377
Структуры данных динамические 10 — постфиксная 377
— — усложненные 8, 51 Формула Эйлера 247
— — фундаментальные 8 Функция 17
— древовидные 219 — Аккермана 188
Структурирования методы 19 — преобразования 24
Схемы программ 56 — расстановки 304
Таблица рассеянная 307 — упорядочения 75
— расстановки 305 — факториал 150
Таблично-управляемые программы — характеристическая 49
328 Ханойские башни 186
Таккер 266 Хоор 7, 8, 12, 96, 103
Тексты 59 Ху 266
Тип базовый 18 Центроид 267
— данных 17 Цепочка 115
— — регулярный 26 Цикл 16
— — скалярный 19 Цифры арабские 15, 24
— — составной 30 — двоичные !5
— — стандартный 19 — римские 15
— индексов 26 Числа вещественные 15
— рекурсивный 314 — комплексные 31
Транслятор 10, 17, 40, 319 — натуральные 150
Трансляция 40 — с плавающей запятой 15
Удаление из дерева 241 — факториальные 153
— из списка 200 — цели с 15
Узел дерева внутренний 220 Число гармоническое 83
— — специальный 222 — кардинальное 18, 20, 39, 49, 50
Уилсон 179 Читаемый вход 59
Уильямс 91 — выход 59
Указатели 10 Шенкер-сортировка 85
Уолкер 263 Эвристика 267 Эйлер
13 — контекстно-свободный 322
Эйлерова константа 83 — машинно-зависимый 16
Эффективность 49, 105 — машинно-ориентированный 16
Язык Ассемблера 18 — формальный 10
— высокого уровня 16 Языки программирования 16
— контекстно-зависимый 322 Ячейка памяти 44