Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Эта страница преднамеренно оставила незаполненный

Структуры данных и алгоритмы в C ++

Второй выпуск

Эта страница преднамеренно оставила незаполненный

Структуры данных и алгоритмы в C ++

Второй выпуск

Майкл Т. Гудрич

Факультет информатики

Калифорнийский университет, Ирвин

Роберто Тамассиа

Факультет информатики

Университет Брауна

Дэвид М. Мунт

Факультет информатики

Университет Мэриленда

John Wiley & Sons, Inc.

РЕДАКТОР ПРИОБРЕТЕНИЙ ПОМОЩНИК ПЕРЕДОВОЙ СТАТЬИ МЕНЕДЖЕРА ПО МАРКЕТИНГУ РЕДАКТОР СМИ СЕНЬОР ДИЗАЙНЕРСКИЙ МЕНЕДЖЕР ПО СОДЕРЖАНИЮ ПРОИЗВОДСТВЕННЫЙ РЕДАКТОР ФОТОРЕДАКТОР

Бет Лэнг Голуб Крис Руель Элизабет Миллз Томас Кулеса Джим О'Ши Мишлин Фредерик Эми Вейнтроб Шина Голдстайн

Эта книга была установлена в LTEX авторами и напечатана и связана Литографами Malloy. A

Покрытие было напечатано Литографами Malloy. Нанесенное на обложку изображение от Wuta Wuta Tjan-

праздничный, «Страус эму, мечтающий» c состояние художника, 2009 лицензируется исконным Агентством Художников. Дженнифер Ресурс Steele/Art, Нью-Йорк.

Эта книга напечатана на бескислотной бумаге.¥

Фирменное Признание: Ява - торговая марка Sun Microsystems, Inc. UNIX R является зарегистрированной торговой маркой в Соединенных Штатах и других странах, лицензируемых через X/Open Company, Ltd. PowerPoint R - торговая марка Microsoft Corporation. Все другие названия продукта, упомянутые здесь, являются торговыми марками своих соответствующих владельцев.

Copyright c 2011, John Wiley & Sons, Inc. Все права защищены. Никакая часть этой публикации не может быть воспроизведена, сохранена в поисковой системе или передана

в любой форме или каким-либо образом, электронный, механический, фотокопирование, запись, просматривая или иначе, за исключением разрешенного согласно Разделам 107 или 108 1976 Закон об авторском праве Соединенных Штатов, или без предварительного письменного разрешения Издателя или без разрешения через оплату соответствующего сбора за копию Copyright Clearance Center, Inc. 222 Розевуд-Драйв, Дэнверз, Массачусетс 01923, (978) 750-8400, факс (978) 646-8600.

Запросы к Издателю для разрешения должны быть адресованы Разрешениям, Отбывают -

ment, John Wiley & Sons, Inc., 111 речных улиц, Хобокен, Нью-Джерси 07030, (201) 748-6011, факс (201) 748-6008, электронная почта: PERMREQ@WILEY.COM.

К регистрационным журналам или для обслуживания клиентов, пожалуйста, назовите 1 800 ТРЕБОВАНИЕ ВАЙЛИ (225-5945). Основанный в 1807, John Wiley & Sons, Inc. была ценным источником знания и

понимание больше 200 лет, помощь людям во всем мире удовлетворить их потребности и выполняют их стремления. Наша компания построена на основе принципов, которые включают ответственность перед сообществами, которым мы служим и где мы живем и работаем. В 2008 мы проявили Инициативу Корпоративного гражданства, глобальные усилия, чтобы обратиться к экологическим, социальным, экономическим, и этическим трудностям, с которыми мы сталкиваемся в нашем бизнесе. Среди проблем мы обращаемся, углеродное воздействие, бумажные технические требования и приобретение, этическое поведение в пределах нашего бизнеса и среди наших продавцов, и сообщества и благотворительной поддержки. Для получения дополнительной информации, пожалуйста, посетите наш веб-сайт: www.wiley.com/go/citizenship. <www.wiley.com/go/citizenship>

Каталогизация библиотеки Конгресса в данных ISBN 13 978-0-470-38327-8 о публикации

Напечатанный в Соединенных Штатах Америки

10 9 8 7 6 5 4 3 2 1

Карен, Полу, Анне и Джеку

- Майкл Т. Гудрич

Изабель

- Роберто Тамассиа

Жанин

- Дэвид М. Гора

Эта страница преднамеренно оставила незаполненный

Предисловие

Этот второй выпуск Структур данных и Алгоритмов в C ++ разработан к про - смотри введение в структуры данных и алгоритмы, включая их дизайн, analy-сестра и внедрение. С точки зрения учебных планов, основанных на учебном плане IEEE/ACM 2001 Com-puting, эта книга подходит для использования в курсах CS102 (I/O/B версии), CS103 (I/O/B версии), CS111 (Версия), и CS112 (Язычки A/I/O/F/H ver-). Мы обсуждаем его использование для таких курсов более подробно позже в этом предисловии.

Существенные изменения во втором выпуске - следующее:

• Мы добавили больше примеров анализа алгоритма и структуры данных.

• Мы увеличили последовательность с C ++ Standard Template Library (STL).• Мы включили структуры данных STL во многие наши структуры данных.• Мы добавили главу по множествам, связанные списки и iterators (Глава 3).• Мы добавили главу по управлению памятью и B-деревьям (Глава 14).

• Мы увеличили обсуждение алгоритмических методов проектирования, как динамический

программирование и жадный метод.

• Мы упростили и реорганизовали представление кодовых фрагментов.

• Мы ввели STL-стиль iterators в наши контейнерные классы и имеем

представленный C ++ внедрения для этих iterators, даже для комплекса struc-

tures, такой как хеш-таблицы и деревья двоичного поиска.

• Мы изменили наш интерфейс приоритетной очереди, чтобы использовать компаратор STL-стиля

объекты.

• Мы расширили и пересмотрели упражнения, продолжив наш подход деления

их в укрепление, креативность и упражнения проекта.

Эта книга связана со следующими книгами:

• M.T. Гудрич и Р. Тамассия, структуры данных и алгоритмы в Яве,

John Wiley & Sons, Inc. У этой книги есть подобная полная структура к

представьте книгу, но использование Ява как основной язык (с некоторыми скромные, но необходимые педагогические различия, требуемые этим подходом).

• M.T. Гудрич и Р. Тамассия, дизайн алгоритма: фонды, анализ,

и интернет-Примеры, John Wiley & Sons, Inc Это - учебник для больше

продвинутый курс алгоритмов и структур данных, такой как CS210 (T/W/C/S версии) в учебном плане 2001 года IEEE/ACM.

В то время как эта книга сохраняет тот же самый педагогический подход и общую структуру как Структуры данных и Алгоритмы в Яве, кодовые фрагменты были com-pletely перепроектированный. Мы старались полностью использовать C ++ возможности и проектируем кодекс способом, который совместим с современным C ++ использование. В частности если это уместно, мы делаем широкое применение C ++ элементы, которые не являются частью Явы, включая C ++ Standard Template Library (STL), C ++ распределение памяти

vii

viii

Предисловие и освобождение (и связанные проблемы печей для сжигания отходов производства), виртуальные функции, вход и выход потока, оператор, перегружающий и C ++ безопасный кастинг во время выполнения.

Используйте в качестве учебника

Дизайн и анализ эффективных структур данных долго признавались жизненным предметом в вычислении, потому что исследование структур данных - часть ядра каждой университетской информатики и вычислительной техники главная программа, с которой мы знакомы. Как правило, вводные курсы представлены как два - или последовательность с тремя курсами. Элементарные структуры данных часто briefly введены в первом программном курсе или во введении в курс информатики, и это сопровождается более всесторонним введением в структуры данных в курсах, которые следуют после этого. Кроме того, эта последовательность курса, как правило, сопровождается позже в учебном плане более всесторонним исследованием структур данных и алгоритмов. Мы чувствуем, что центральная роль дизайна структуры данных и анализа в учебном плане полностью оправдана, дана важность эффективных структур данных в большинстве систем программного обеспечения, включая Сеть, операционные системы, базы данных, компиляторы и научные системы моделирования.

С появлением ориентированной на объект парадигмы как предпочтительная структура для строительства прочного и повторно используемого программного обеспечения мы попытались взять последовательную объектно-ориентированную точку зрения всюду по этому тексту. Одна из главных идей позади объектно-ориентированного подхода - то, что данные должны быть представлены как заключаемый в капсулу с методами, что доступ и изменяет их. Таким образом, вместо того, чтобы просто рассматривать данные как коллекцию байтов и адресов, мы думаем об объектах данных как о случаях абстрактного типа данных (ADT), который включает репертуар методов для выполнения операций на объектах данных этого типа. Аналогично, ориентированные на объект решения часто организуются, используя общие шаблоны, которые облегчают повторное использование программного обеспечения и надежность. Таким образом мы представляем каждую структуру данных, используя ADTs и их соответствующие внедрения, и мы вводим важные шаблоны как способ организовать те внедрения в классы, методы и объекты.

Для большинства ADTs, представленных в этой книге, мы предоставляем описание общественного интерфейса в C ++. Кроме того, конкретные структуры данных, понимающие ADTs, обсуждены, и мы часто даем бетон C ++ классы, осуществляющие эти интерфейсы. Мы также даем C ++ внедрения фундаментальных алгоритмов, такие как поиск графа и сортировка. Кроме того, в дополнение к обеспечению методов для использования данных struc-tures, чтобы осуществить ADTs, мы также даем примеры приложения структур данных, такие как соответствие HTML-тэга и простая система, чтобы вести плей-лист для системы цифровой звукозаписи. Из-за пространственных ограничений, однако, мы только показываем кодовые фрагменты некоторых внедрений в этой книге и делаем дополнительную пользу исходного кода - способной на сопутствующем веб-сайте.

Предисловие ix

Ресурсы онлайн

Эта книга сопровождается обширным набором ресурсов онлайн, которые могут быть

найденный на следующем веб-сайте:

<www.wiley.com/college/goodrich>

Включенный в этот веб-сайт коллекция образовательных пособий, которые увеличиваются

темы этой книги, и для студентов и для преподавателей. Студенты поощрены использовать этот сайт наряду с книгой, чтобы помочь с упражнениями и увеличением понимают - луг предмета. Преподаватели аналогично могут использовать сайт, чтобы помочь запланировать, организовать и представить их материалы курса. Из-за их добавленной стоимости некоторые из этих ресурсов онлайн защищены паролем.

Для студента

Для всех читателей, и специально для студентов, мы включаем следующие ресурсы:

Весь C ++ исходный код представлен в этой книге.

Раздаточные материалы PDF слайдов Powerpoint (четыре за страницу) обеспечили преподавателям. База данных намеков ко всем упражнениям, внесенным в указатель проблемным числом. Учебник онлайн, который включает решения отобранных упражнений.

Намеки должны иметь значительное применение любому нуждающемуся в небольшой помощи, начинающей на определенных упражнениях, и решения должны помочь любому желающему видеть законченные упражнения. Студенты, которые купили новую копию этой книги, получат доступ пароля к намекам и другим защищенным паролем ресурсам онлайн без всякой дополнительной оплаты. Другие читатели могут купить доступ пароля за номинальный сбор.

Для преподавателя

Для преподавателей, использующих эту книгу, мы включаем следующие дополнительные учебные пособия:

••••

Решения более чем 200 из упражнений книги. База данных дополнительных упражнений, подходящих для викторин и экзаменов. Дополнительный C ++ исходный код. Слайды в Powerpoint и PDF (один за страницу) формат. Отдельный, дополнения специальной темы, включая обсуждения выпуклых корпусов, деревьев диапазона и ортогонального пересечения сегмента.

Слайды полностью редактируемые, чтобы позволить преподавателю, использующему эту книгу, полную свободный - dom в настройке его или ее представлений. Все ресурсы онлайн предоставлены без всякой дополнительной оплаты любому преподавателю, принимающему эту книгу для его или ее курса.

X Предисловие

Ресурс для обучения структур данных и алгоритмов

Эта книга содержит много C ++-code и псевдокодовые фрагменты и сотни

упражнения, которые разделены примерно на 40%-е упражнения укрепления, 40% cre-ativity упражнения и 20%, программируя проекты.

Эта книга может использоваться для курса CS2, как описано в ACM 1978 года Научный Учебный план Com-короткой клюшки для гольфа, или в курсах CS102 (I/O/B версии), CS103 (I/O/B ver-язычки), CS111 (Версия), и/или CS112 (Версии A/I/O/F/H), как описано в Учебном плане Вычисления 2001 года IEEE/ACM, с учебными единицами, как обрисовано в общих чертах в Таблице 0.1.

Учебная единица PL1. Обзор языков программирования PL2. Виртуальные машины PL3. Введение в языковой перевод PL4. Декларации и типы PL5. Механизмы абстракции

PL6. Объектно-ориентированное программирование

PF1. Фундаментальное программирование строит PF2. Алгоритмы и решение проблем PF3. Фундаментальные структуры данных

PF4. Рекурсия SE1. Проектирование программного обеспечения

SE2. Используя ПЧЕЛУ

AL1. Основной алгоритмический анализ AL2. Алгоритмические стратегии

AL3. Фундаментальные вычислительные алгоритмы

DS1. Функции, отношения и наборы DS3. Методы доказательства

DS4. Основы подсчета DS5. Графы и деревья DS6. Дискретная вероятность

Соответствующие Материальные Разделы 1.1.2, 1.1.3 Раздела 1.7 Разделов 14.1.1 и 14.1.2 Глав 1 и 2 и 2.2.5 Раздела 2.2.5, 5.1-5.3, 6.1.1, 6.2.1, 6.3, 7. 1, 7. 3. 1, 8. 1, 9. 1, 9. 5, 1 1. 4, d 1 3. 1. 1 Глава 1 и 2 и Разделы 6.2.1, 7. 3. 7, 8. 1. 2, d 1 3. 3. 1 Раздел 3.1, 3.2, 5.1-5.3, 6.1-6.3, 7.1, 7. 3, 8. 1, 8. 3, 9. 1 - 9. 4, 1 Разделов 1.7 и 4.2 Глав 1 и 2 0. 1, d 1 3. 1. 1 Глава 2 Раздела 3.5 и Разделы 6.2.1, 7.3.7, 8. 1. 2, d 1 3. 3. 1 Раздел 2.2.5, 5.1-5.3, 6.1.1, 6.2.1, 6.3, 7. 1, 7. 3. 1, 8. 1, 9. 1, 9. 5, 1 1. 4, d 1 3. 1. 1 Раздел 11.1.1, 11.5.1, 12.2, 12.3.1 Главы 4, и 1 2.4.2 Разделов 8.1.5, 8.2.2, 8.3.5, 9.2, и 9.3.1, и Главы 11, 12, и 13 Разделов 4.1, 8.1 и 11.4 Разделов 4.3, 6.1.3, 7.3.3, 8.3, 10.2-10.5, 1 1.2.1, 1 1.3.1, 1 1.4.3, 1 3.1.1, 1 3.3.1, 1 3. 4, d 1 3. 5 Глав 7, 8, 10 Разделов 2.2.3 и 11.1.5, и 13 Приложений A и Разделы 9.2, 9.4.2, 1 1. 2. 1, d 1 1. 5

Таблица 0.1: Материал для единиц в Учебном плане Вычисления 2001 года IEEE/ACM.

Предисловие xi

Содержание и организация

Главы для этого курса организованы, чтобы обеспечить педагогический путь, который начинается с основ C ++ программирование и ориентированный на объект дизайн. Мы обеспечиваем раннее обсуждение конкретных структур, как множества и связанные списки, чтобы к про - смотри конкретная опора, чтобы положиться, строя другие структуры данных. Мы тогда добавляем основополагающие методы как рекурсия и анализ алгоритма, и, в главной части книги, мы представляем фундаментальные структуры данных и алгоритмы, завершающие обсуждением управления памятью (то есть, архитектурные подкрепления структур данных). Определенно, главы для этой книги - orga-nized следующим образом:

1. C ++ учебник для начинающих 2. Ориентированный на объект дизайн 3. Множества, связанные списки и рекурсия 4. Аналитические инструменты 5. Стеки, очереди и Deques 6. Список и Iterator ADTs 7. Деревья 8. Кучи и приоритетные очереди 9. Хеш-таблицы, карты и списки пропуска

10. Деревья поиска 11. Сортировка, наборы и выбор 12. Последовательности и динамическое программирование 13. Алгоритмы графа 14. Управление памятью и B-деревья

A. Полезные математические факты

Более подробный список содержания этой книги может быть найден в оглавлении.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]