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

11.4. Наборы и Структуры Союза/Находить 537

Чтобы преобразовать Слияние в полезный класс, мы предоставляем определения для трех auxil-

функции iary, fromA, fromBoth, и fromB. См. Код 11.11.

• В классе UnionMerge слияние копирует каждый элемент с A и B в C, но

не дублирует элемента.

• В классе IntersectMerge слияние копирует каждый элемент, который находится и в A и в B

в C, но «выбрасывает» элементы в одном наборе, но не в другом.

• В классе SubtractMerge слияние копирует каждый элемент, который находится в A а не в B

в C.

шаблон <typename E> //s и uni o n

класс UnionMerge: общественное Слияние <E> 

защищенный:

typedef typename Слияние <E>:: Список Списка; виртуальная пустота fromA (константа E& a, List& C)

C.push назад (a);

/ / добавляют a

виртуальная пустота fromBoth (константа E& a, константа E& b, List& C)

C.push назад (a); //добавляют o nl y

виртуальная пустота fromB (константа E& b, List& C)

C.push назад (b); //добавляют b

; шаблон <typename E>

класс IntersectMerge: общественное Слияние <E> 

защищенный:

typedef typename Слияние <E>:: Список Списка; виртуальная пустота fromA (константа E& a, List& C)



//пересечение набора

//проигнорировать

виртуальная пустота fromBoth (константа E& a, константа E& b, List& C)

C.push назад (a); //добавляют o nl y

виртуальная пустота fromB (константа E& b, List& C)

 //игнорируют

; шаблон <typename E>

класс SubtractMerge: общественное Слияние <E> 

защищенный:

typedef typename Слияние <E>:: Список Списка; виртуальная пустота fromA (константа E& a, List& C)

C.push назад (a);

//вычитание набора

/ / добавляют a

виртуальная пустота fromBoth (константа E& a, константа E& b, List& C)

 //игнорируют

виртуальная пустота fromB (константа E& b, List& C)

 //игнорируют

;

Кодовый Фрагмент 11.11: Классы, простирающиеся класс Слияния, специализируя auxil-

iary функционирует, чтобы выполнить союз набора, пересечение и вычитание, соответственно.

538 Глава 11. Сортировка, наборы и выбор

11.4.3 Разделение с операциями находки союз

Разделение - коллекция несвязных наборов. Мы определяем функции разделения ADT использование объектов положения (Раздел 6.2.1), каждый из которых хранит элемент x. Разделение ADT поддерживает следующие функции.

makeSet (x): Создайте набор единичного предмета, содержащий элемент x и возвращение

положение, хранящее x в этом наборе.

союз (A, B): Возвратите наборÈ B, разрушив старый A и B.

найдите (p): Возвратите набор, содержащий элемент в положении p.

Простое внедрение разделения с в общей сложности n элементы использует коллекцию последовательностей, один для каждого набора, где последовательность для набора набор магазинов позиции его элементов. Каждая объектно-ориентированная память положения переменная, элемент, который ссылается на его связанный элемент x и позволяет выполнение элемента () func-tion в O (1) время. Кроме того, мы также храним переменную, устанавливаем в каждом положении, которое ссылается на последовательность, хранящую p, так как эта последовательность представляет довод «против» набора - taining элемент p. (См. рисунок 11.16.) Таким образом мы можем выступить, операция находят (p) в O (1) время, следующим ссылка набора для p. Аналогично, makeSet также берет O (1) время. Операционный союз (A, B) требует, чтобы мы присоединились к двум последовательностям в одну и обновили ссылки набора положений в одном из двух. Мы выбираем к imple-ment эту операцию, удаляя все положения из последовательности с меньшим размером и вставляя их в последовательность с большим размером. Каждый раз, когда мы открываем позицию p от меньшего набора s и вставляем его в больший набор t, мы обновляем ссылку набора для p, чтобы теперь указать на t. Следовательно, операционный союз (A, B) занимает время

O (минута (|A,|B )), который является O (n), потому что, в худшем случае,|A  =|B  = n/2. Невада -

ertheless, как показано ниже, амортизируемый анализ показывает это внедрение, чтобы быть

намного лучше, чем появляется от этого анализа худшего случая.

A B

4 1 7 9 3 6 2

C

5 11 12 10 8

Рисунок 11.16: основанное на последовательности внедрение разделения, состоящего из трех наборов:

A =1, 4, 7, B =2, 3, 6, 9, и C =5, 8, 10, 11, 12.