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

11.1. Вид слияния 511

два. Чтобы удержаться от переписывания векторных элементов, мы копируем элементы

от входного вектора в к вектору продукции. Например, мы сливаемся в [0] и в [1] в подвектор [0.. 1], тогда мы сливаемся в [2] и в [3] в подвектор [2.. 3], и так далее.

Мы тогда обмениваем рулоны в и, и мы сливаем эти пробеги длины два в пробеги длины четыре. Например, мы сливаемся в [0.. 1] с в [2.. 3] в подвектор [0.. 3], тогда мы сливаемся в [4.. 5] с в [6.. 7] в подвектор [4.. 7]. Мы тогда сливаем последовательные пробеги длины четыре в новые пробеги длины восемь, и так далее, пока множество не сортировано.

Переменная b хранит начало пробегов, и m хранит их длину. vari-ables i, j, и k хранят текущие индексы в различных подвекторах. Обменивая векторы, мы не копируем их все содержание. Вместо этого мы поддерживаем указатели на два множества и обмениваем эти указатели в конце каждого раунда подвекторных слияний.

11.1.5 Вид слияния и уравнения повторения

Есть другой способ оправдать это, продолжительность алгоритма вида слияния

O (n регистрируют n) (Суждение 11.2). А именно, мы можем иметь дело более непосредственно с рекурсивной природой алгоритма вида слияния. В этой секции мы представляем такой анализ продолжительности вида слияния, и при этом вводим математическое понятие уравнения повторения (также известный как отношение повторения).

Позвольте функции t (n), обозначают продолжительность худшего случая вида слияния на входной последовательности размера n. Так как вид слияния рекурсивный, мы можем характеризовать func-tion t (n) посредством уравнения, где функция t (n) рекурсивно выражена с точки зрения себя. Чтобы упростить нашу характеристику t (n), давайте сосредоточим наше внимание на случае, где n - власть 2. Мы оставляем проблему показа, что наша асимптотическая характеристика все еще держится в общем случае как осуществление (Упражнение R-11.7). В этом случае мы можем определить определение t (n) как

t (n) = если n1£

2 т (n/2) + cn иначе.

b

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

Мы можем получить решение закрытой формы, применив определение уравнения повторения, принятие n относительно большое. Например, после еще одного применения уравнения выше, мы можем написать новое повторение для t (n) как

t (n) = 2 (2 т (n/22) + (cn/2)) + cn

= 22 т (n/22) + 2 (cn/2) + cn = 22 т (n/22) + 2cn.

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

шаблон <typename E, typename C> //вид слияния S

пустота mergeSort (vector<E>& S, константа C& меньше)

вектор typedef <E> vect;

интервал n = S.size (); vect v1 (S); vect* в = &v1; vect v2 (n); vect* = &v2;

для (интервал m = 1; m <n; m * = 2)

для (интервал b = 0; b <n; b + = 2*m)

слияние (*in, *, меньше, b, m);

станд.:: обмен (в,);

S = * я n;

//начальный входной вектор//начальный вектор продукции//перечисляет удвоение размеров / / b, например, я, nni ng o f l i s t//сливают подсписки

//обмен введен с продукцией

//скопируйте сортированное множество к S

//слияние в [b. .b+m-1] и в [b+m. .b+2*m-1]

шаблон <typename E, typename C>

недействительное слияние (vector<E>& в, vector<E>&, константа C& меньше, интервал b, интервал m)

интервал i = b; интервал j = b + m; интервал n = in.size (); интервал e1 = станд.:: минута (b + m, n); интервал e2 = станд.:: минута (b + 2*m, n); интервал k = b;

в то время как ((я <e1) && (j <e2))

если (! меньше (в [j], во [мне]))

[k ++] = в [я ++];

еще

[k ++] = в [j ++];

в то время как (я <e1)

[k ++] = в [я ++]; в то время как (j <e2)

[k ++] = в [j ++];

//индекс в управляемый #1//индекс в управляемый #2

//конец управляемых #1//конец управляемых #2

//приложите меньший к S

//отдых копии 1, которым управляют, к S

//отдых копии 2, которыми управляют, к S

Кодовый Фрагмент 11.4: Функции mergeSort и слияние, осуществляющее основанное на векторе

алгоритм вида слияния. Мы используем обмен функций STL, который обменивает два val - ues, и минута, которая возвращает минимум из двух ценностей. Отметьте что требование обменять обмены только указатели на множества и, следовательно, пробеги в O (1) время.