Изменения

Перейти к: навигация, поиск

Обсуждение участника:AKhimulya

1176 байт добавлено, 18:14, 18 мая 2014
Нет описания правки
'''sync'''
Оценим время выполнения данного алгоритма сверху при возможности запускать неограниченное количество потоков независимо друг от друга. Оба массива содержат <math>n_{1} + n_{2} = n</math> элементов. К моменту рекурсивных вызовов <math>n_{2} <= n_{1}</math>, значит, <math>n_{2} = 2 * n_{2} / 2 <= (n_{1} + n_{2}) / 2 = n / 2</math>. В худшем случае один из двух рекурсивных вызовов сольет <math>n_{1} / 2</math> элементов <math>T[left_{1} \dots right_{1}]</math> с <math>n_{2}</math> элементами <math>T[left_{2} \dots right_{2}]</math> и тогда количество элементов первых двух массивов в рекурсивном вызове будет равно <math>n_{1} / 2 + n_{2} <= n_{1} / 2 + n_{2} / 2 + n_{2} / 2 = (n_{1} + n_{2}) / 2 + n_{2} / 2 <= n / 2 + n / 4 = 3 * n / 4</math>. Так как рекурсивные вызовы функции выполняются параллельно, время их выполнения будет равно времени выполнения самого долгого вызова. В худшем случае это <math>T(3 * n / 4)</math>. Тогда сумарное время работы алгоритма слияния будет равно <math>TTmerge(n) = TTmerge(3 * n / 4) + \Theta(\log(n)) = O\Theta(\log^2(n))</math>, т.к. асимпототика каждого вызова функции - <math>\Theta(\log(n))</math>, т.е. время, затрачиваемое на бинарный поиск.
===Сортировка с многопоточным слиянием===
Приведем псевдокод алгоритма, использующего слияние из предыдущего раздела, сортирующего элементы A[leftA \dots rightA] и помещающего отсортированный массив в B[leftB \dots leftB + rightA - leftA]
 
mergeSortMT2(A, leftA, rightA, B, leftB):
n = r - p + 1
if n == 1:
B[leftB] = A[leftA]
else
создадим новый массив T[1 \dots n]
mid = (leftA + rightA) / 2
newMid = mid - leftA + 1
'''spawn''' mergeSortMT2(A, leftA, mid, T, 1)
mergeSortMT2(A, mid + 1, rightA, T, newMid + 1)
'''sync'''
mergeMT(T, 1, newMid, newMid + 1, n, B, leftB)
 
Оценим данный алгоритм сверху при условии, что возможен запуск неограниченного количества независимых потоков. Из предыдущих пунктов <math>TmergeSort(n) = TmergeSort(n / 2) + Tmerge(n) = TmergeSort(n / 2) + \Theta(\log^2(n)) = \Theta(\log^3(n))</math>.
97
правок

Навигация