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

9.6. Упражнения 419

C-9.7 Опишите, как выполнить удаление из хеш-таблицы, которая использует линейный

исследование, чтобы решить столкновения, где мы не используем специальный маркер, чтобы представлять удаленные элементы. Таким образом, мы должны перестроить содержание так, чтобы казалось, что удаленный вход никогда не вставлялся во-первых.

C-9.8 Учитывая коллекцию C n пар работы стоимости (c, p), описывают algo-

rithm для нахождения пар максимумов C в O (n регистрируют n), время.

C-9.9 У квадратной стратегии исследования есть группирующаяся проблема, которая касается

путем это ищет открытые места, когда столкновение происходит. А именно, когда столкновение происходит в ведре h (k), мы проверяем [(h (k) + f (j)) модник Н], для

f (j) = j2, используя j = 1, 2..., N- 1.

a. Покажите, что f (j) модник Н примет самое большее (N + 1)/2 отличный val -

ues, для начала N, как j колеблется от 1 до N- 1. Как часть этого

оправдание, отметьте что f (R) = f (N- R) для всего R.

b. Лучшая стратегия состоит в том, чтобы выбрать главный N, такой, что N подходящий

к 3 модулям 4 и затем проверять ведра [(h (k) ± j2) модник Н]

поскольку j колеблется от 1 до (N- 1)/2, чередующийся между дополнением и

вычитание. Покажите, что этот дополнительный тип квадратного исследования

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

C-9.10 Покажите, что функции выше (p) и прежде (p) не фактически необходимы

эффективно осуществить словарь, используя список пропуска. Таким образом, мы можем осуществить вставку входа и удаление в списке пропуска, используя строго главное - вниз, передовой просмотром подход, никогда не используя вышеупомянутое или перед функциями. (Намек: В алгоритме вставки, сначала неоднократно flip монета, чтобы определить уровень, где Вы должны начать вставлять новый вход.)

C-9.11 предположим, что каждый ряд n n выстраивает A, состоит из 1's и 0, таким образом что,

в любом ряду A, весь 1's прибывают перед любым 0 в тот ряд. Принятие A

уже находится в памяти, опишите метод, бегущий в O (n, регистрируют n) время (не O (n2) время!) для подсчета числа 1's в A.

C-9.12 Опишите эффективную заказанную структуру словаря для хранения n элементы

у этого есть связанный набор k <n ключи, которые прибывают из полного заказа. Таким образом, набор ключей меньше, чем ряд элементов. Ваша структура должна выступить, все заказанные операции по словарю в O (зарегистрируйте k + s), ожидаемое время, где s - возвращенный ряд элементов.

C-9.13 Опишите эффективную структуру словаря для хранения n записи чей r <n

у ключей есть отличные кодексы мешанины. Ваша структура должна выполнить операцию findAll в O (1 + s) ожидаемое время, где s - число записей пере - превращенный, и остающиеся операции словаря ADT в O (1) экс-pected время.

420

Глава 9. Хеш-таблицы, карты и списки пропуска

C-9.14 Опишите эффективную структуру данных для осуществления сумки ADT, который

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

C-9.15 Опишите, как изменить структуру данных списка пропуска, чтобы поддержать функцию

медиана (), который возвращает положение элемента в «нижнем» списке S0 виндексе n/2 ⌋. Покажите, что Ваше внедрение этой функции бежит в

O (регистрируют n), ожидаемое время.

Проекты

P-9.1 Напишите класс спеллчекера, который хранит ряд слов, W, в хеш-таблице

и осуществляет функцию, spellCheck (s), который выступает, период проверяют последовательность s относительно набора слов, W. Если s находится в W, то требование к spellCheck (s) возвращает повторяемую коллекцию, которая содержит только s, так как это, как предполагается, записано правильно в этом случае. Иначе, если s не находится в W, то требование к spellCheck (s) возвращает список каждого слова в W, который мог быть правильным правописанием s. Ваша программа должна быть в состоянии обращаться со всеми распространенными способами, которыми s мог бы быть орфографической ошибкой слова в W, включая обмен смежных знаков, одним словом, вставку единственного промежутка характера два смежных знака, одним словом, удаление единственного характера от слова и замены характера, одним словом, с другим характером. Для дополнительной проблемы рассмотрите фонетические замены также.

P-9.2 Напишите внедрение словаря ADT использование связанного списка. P-9.3 Напишите внедрение карты ADT использование вектора. P-9.4 Осуществите класс, который осуществляет версию заказанного словаря ADT

использование списка пропуска. Обязательно тщательно определите и осуществите версии словаря соответствующих функций заказанной карты ADT.

P-9.5 Осуществите карту ADT с хеш-таблицей с отдельным формированием цепочки colli-

обработка Сьона (не приспосабливают ни одного из классов STL). P-9.6 Осуществите заказанную карту ADT использование списка пропуска. P-9.7 Расширьте предыдущий проект, обеспечив графическую мультипликацию

пропустите операции по списку. Визуализируйте, как записи перемещают список пропуска вверх во время вставок и связаны из списка пропуска во время удалений. Кроме того, в операции по поиску визуализируйте действия снижения вниз и форвард просмотра.

P-9.8 Осуществите словарь, который поддерживает осведомленные о местоположении записи посредством

заказанный список.

P-9.9 Выполните сравнительный анализ, который изучает уровень аварийности для различного

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

Примечания к главе 421

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

P-9.10 Выполните сравнительный анализ как в предыдущем осуществлении, но для с 10 цифрами

номера телефона вместо строк символов.

P-9.11 Проектируйте C ++ класс, который осуществляет структуру данных списка пропуска. Используйте это

класс, чтобы создать внедрения и карты и словаря ADTs, включая осведомленные о местоположении функции для словаря.

Примечания к главе

Хеширование - хорошо изученная техника. Читатель, заинтересованный дальнейшим исследованием, поощрен исследовать книгу Knuth [60], а также книгу Виттера и Чена [100]. Интересно, двоичный поиск был сначала издан в 1946, но не был издан в полностью правильной форме до 1962. Для дальнейших обсуждений извлеченных уроков, пожалуйста, см. статьи Бентли [11] и Levisse [64]. Списки пропуска были введены Pugh [86]. Наш анализ списков пропуска - упрощение представления, данного Motwani и Raghavan [80]. Для более подробно анализа списков пропуска, пожалуйста, посмотрите различные научно-исследовательские работы в списках пропуска, которые появились в литературе структур данных [54, 82, 83]. Упражнение C-9.9 было внесено Джеймсом Ли.

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

Глава

10

Деревья поиска

Содержание

10.1 Деревья двоичного поиска................

.

.

.

424

10.1.1 Поиск...................

.

.

..

426

10.1.2 Операции по обновлению..............

.

.

..

428

10.1.3 C ++ внедрение дерева двоичного поиска

.

.

..

432

10.2 Деревья AVL.....................

.

.

.

438

10.2.1 Операции по обновлению..............

.

.

..

440

10.2.2 C ++ внедрение дерева AVL.....

.

.

..

446

10.3 Косые деревья.....................

.

.

.

450

10.3.1 Вывих....................

.

.

..

450

10.3.2 Когда вывихнуть.................

.

.

..

454

10.3.3 Амортизируемый анализ вывиха ......

.

.

..

456

10.4 (2,4) Деревья.....................

.

.

.

461

10.4.1 Многоканальные деревья поиска............

.

.

..

461

10.4.2 Операции по обновлению для (2, 4) деревья......

.

.

..

467

10.5 Красно-черные деревья..................

.

.

.

473

10.5.1 Операции по обновлению..............

.

.

..

475

10.5.2 C ++ внедрение Красно-черного дерева..

.

.

..

488

10.6 Упражнения......................

.

.

.

492