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

430 Глава 10. Деревья поиска

Рисунок 10.5: Удаление из дерева двоичного поиска рисунка 10.4b, где вход, чтобы удалить (с ключевыми 32) сохранен в узле (w) с внешним ребенком: (a) перед удалением; (b) после удаления.

Рисунок 10.6: Удаление из дерева двоичного поиска рисунка 10.4b, где вход, чтобы удалить (с ключевыми 65) сохранен в узле (w), чьи дети оба внутренние: (a) перед удалением; (b) после удаления.

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

Исполнение дерева двоичного поиска

Анализ поиска, вставки и алгоритмов удаления подобен. Мы тратим

O (1) время в каждом узле, который посещают, и, в худшем случае, число узлов, которые посещают, пропорционально высоте h T. Таким образом, в карте M, осуществленной с деревом двоичного поиска T, находкой, вставкой, и, стирают пробег функций в O (h) время, где h - высота T. Таким образом дерево двоичного поиска T является эффективным внедрением карты с n записями, только если высота T маленькая. В лучшем случае у T есть высота h =

⌈log (n+1) ⌉, который приводит к логарифмически-разовой работе для всех операций по карте.

В худшем случае, однако, у T есть высота n, когда это посмотрело бы и чувствовало бы себя подобно

заказанное внедрение списка карты. Такая конфигурация худшего случая возникает, например, если мы вставляем ряд записей с ключами в увеличении или уменьшении заказа. (См. рисунок 10.7.)

10

20

30

40

Рисунок 10.7: Пример дерева двоичного поиска с линейной высотой, полученной вставкой - записи луга с ключами в увеличивающемся заказе.

Исполнение карты, осуществленной с деревом двоичного поиска, является сводом - rized в следующем суждении и в Таблице 10.1.

Суждение 10.1: дерево двоичного поиска T с высотой h для n записей значения ключа

использование O (n) делает интервалы, и выполняет карту операции ADT со следующей продолжительностью. Операционный размер и пустой каждый берет O (1) время. Операции находят, вводят и стирают каждого, берут O (h) время.

Операция Время

размер, пустой O (1) находят, вставляют, стирают O (h)

Таблица 10.1: Продолжительность главных функций карты, понятой деревом двоичного поиска. Мы обозначаем текущую высоту дерева с h. Космическое использование - O (n), где n - число записей, сохраненных в карте.

Обратите внимание на то, что продолжительность поиска и обновляет операции в дереве двоичного поиска, варьируется существенно в зависимости от высоты дерева. Мы можем, тем не менее, взять

432

Глава 10. Комфорт Деревьев поиска, что в среднем дерево двоичного поиска с n ключами, произведенными от управления - dom серия вставок и удаления ключей, ожидало высоту O (регистрируют n). Такое заявление требует, чтобы осторожный математический язык точно определил то, что мы подразумеваем случайной серией вставок и удалений и сложной теории вероятности доказать; следовательно, его оправдание выходит за рамки этой книги. Тем не менее, имейте в виду плохую работу худшего случая и заботьтесь в использовании стандарта bi-деревья поиска не в заявлениях, где обновления не случайны. Есть, в конце концов, заявления, где важно иметь карту с быстрыми временами поиска и обновления худшего случая. Структуры данных, представленные в следующих секциях, обращаются к этой потребности.

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

В этой секции мы представляем C ++ внедрение словаря ADT, основанный на дереве двоичного поиска, которое мы называем SearchTree. Вспомните, что словарь отличается от карты, в которую он позволяет многократным копиям того же самого ключа быть вставленными. Для простоты мы не осуществили функцию findAll.

Чтобы сохранять число параметров шаблона маленьким, а не templating наш класс на ключе и типах стоимости, мы выбрали вместо этого к шаблону, наше дерево двоичного поиска на просто типе входа обозначило E. Чтобы получить доступ к ключу и типам стоимости, мы предполагаем, что класс входа определяет два общественных типа, определяющие их. Учитывая объект входа типа E, мы можем получить доступ к этим типам E:: Ключ и E:: Стоимость. Oth-erwise, наш класс входа - по существу то же самое как класс входа, данный в Кодовом Фрагменте 9.1. Это представлено в Кодовом Фрагменте 10.3.

шаблон <typename K, typename V>

Вход класса

общественность:

typedef K Ключ; typedef V Стоимостей;

общественность:

Вход (константа K& k = K (), константа V& v = V ())

: ключ (k), оцените (v)

константа K& ключ () константаклавиша ENTER;константа V& стоимость () константавозвращаемое значение;пустота setKey (константа K& k)ключ = k;пустота setValue (константа V& v)оценивают = v;

частный:

K ключ; V стоимостей;

;

// // // // // //

// // // // // // //

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

станьте ключевыми (читайте только), доберитесь, стоимость (читайте только), стоимость набора ключа набора частное значение ключа данных

Кодовый Фрагмент 10.3: C ++ класс для входа значения ключа.