Параллельное программирование - это немного красная селедка. Выполнение предположений о времени выполнения только на большой нотации O может ввести в заблуждение. Чтобы сравнить время выполнения алгоритмов, вам нужно полное уравнение не только большой записи O.
Проблема в том, что большая нотация O указывает на доминирующий термин, поскольку n
переходит в бесконечность. Но время работы находится на конечных диапазонах n
. Это легко понять из непрерывной математики (мой фон).
Рассмотрите y=Ax
и y=Bx^2
Значок Big O сообщит вам, что y=Bx^2
работает медленнее. Однако между (0, A/B) оно меньше y=Ax
. В этом случае было бы быстрее использовать алгоритм O (x^2), чем алгоритм O (x) для x<A/B
.
Фактически я слышал о алгоритмах сортировки, которые начинаются с алгоритма O (nlogn), а затем переключаются на логарифм O (n^2), когда n достаточно мало.
Лучший пример - умножение матрицы. Наивный алгоритм O (n^3), но есть алгоритмы, которые доходят до O (n^2,3727). Однако каждый алгоритм, который я видел, имеет такую большую константу, что наивный O (n^3) по-прежнему является самым быстрым алгоритмом для всех значений частиц n
, и это вряд ли изменится в ближайшее время.
Так что действительно вам нужно полное уравнение для сравнения. Что-то вроде An^3
(давайте проигнорировать условия более низкого порядка) и Bn^2.3727
. В этом случае B настолько невероятно велика, что метод O (n^3) всегда выигрывает.
Параллельное программирование обычно просто снижает константу. Например, когда я делаю умножение матрицы с использованием четырех ядер, мое время идет от An^3
до A/4 n^3
. То же самое произойдет с вашей параллельной сортировкой пузырьков. Вы уменьшите константу. Поэтому вполне возможно, что для некоторого диапазона значений n
ваш параллельный тип пузырьков будет бить непараллельный (или, возможно, даже параллельный) тип слияния. Хотя, в отличие от матричного умножения, я думаю, что диапазон будет довольно небольшим.
Один из моих старых профессоров ответил мне по электронной почте о поиске «круглой сложности» для таких случаев. Я пытаюсь проверить, могу ли я найти ссылку и проверить ее использование. –
'Round' в смысле параллельных шагов, происходящих одновременно. Имеет смысл. –
Это похоже на то, что в книге «Введение в алгоритмы» называется span. Он определяется как время работы алгоритма на бесконечном числе процессоров. –