Вы не указали модель машины, поэтому я предполагаю, что мы работаем с EREW PRAM . Мера сложности, о которой вы заботитесь, называется «размахом», количеством раундов, которые требуется вычислить. Есть также «работа» (количество операций, суммированное по всем процессорам) и «стоимость» (диапазон, умноженный на количество процессоров).
С точки зрения теории очевидным ответом является изменение O (log n) -глубинная сортировочная сеть (AKS или Goodrich's Zigzag Sort) для подсчета свопов, затем возврат (количество свопов) по модулю 2. Код очень сложен, а постоянные коэффициенты довольно велики.
A Более практичный алгоритм состоит в том, чтобы вместо этого использовать сеть сортировки bitoni c Batcher, которая увеличивает диапазон до O (log 2 n), но имеет разумные постоянные коэффициенты (так что люди фактически используют его на практике для сортировки на графических процессорах ).
Я не могу придумать практического детерминированного c алгоритма с диапазоном O (log n), но вот рандомизированный алгоритм с диапазоном O (log n) с высокой вероятностью. Предположим, что n процессоров и пусть вход (изменяемый) будет Perm. Пусть Coin будет массивом из n логических значений.
В каждом из O (log n) проходов процессоры параллельно выполняют следующие операции, где i ∈ {0… n-1} идентифицирует процессор и меняет местами ← 0 изначально. Переменные в нижнем регистре обозначают локальные переменные процессора.
Coin[i] ← true with probability 1/2, false with probability 1/2
(barrier synchronization required in asynchronous models)
if Coin[i]
j ← Perm[i]
if not Coin[j]
Perm[i] ← Perm[j]
Perm[j] ← j
swaps ← swaps + 1
end if
end if
(barrier synchronization required in asynchronous models)
После этого мы суммируем локальные значения свопов и модов на 2.
Каждый проход уменьшает количество i, так что Perm [ i] ≠ i на 1/4 от текущего результата в ожидании. Благодаря линейности математического ожидания, ожидаемая сумма не превышает n (3/4) r , поэтому после r = 2 log 4/3 n = O (log n) проходит , ожидаемая сумма не превышает 1 / n, что, в свою очередь, ограничивает вероятность того, что алгоритм не сходится к тождественной перестановке, как требуется. В случае неудачи мы можем просто переключиться на последовательный алгоритм O (n) -span, не увеличивая ожидаемый диапазон, или просто повторить попытку.