Алгоритм P: Перемешивание массива

Приветствую друзья.

Сегодня речь пойдет о перемешивании одномерно массива. Будем пользоваться Алгоритмом P, описанным Дональдом Кнутом (Искусство программирования. Том 2, с.163).

Для начала процитируем описание алгоритма.

Алгоритм P (Перемешивание). Пусть X1, X2, …, Xt – множество t чисел для перемешивания.

P1. “Инициализация”. Присвоить j <- t.

P2. “Генерация U”. Генерировать случайное число U, равномерно распределенное между 0 и 1.

P3. “Замена”. Присвоить j <- round(j*U) + 1, где round() – операция округления до целого числа. Заменим Xk <-> Xj.

P4. “Уменьшение j”. Уменьшить j на 1. Если j>1, возвратиться к шагу P2.


А теперь перейдем к реализации данного алгоритма на PHP.

# Приведем Алгоритм Р от Кнута в действие
function ShuffleP(&$X) {
$N = count($X); // Кол-во элементов массива

# P1: Инициализация
$j = $N-1; // Индекс последнего элемента массива

do {
# P2: Генерация U, равномерно распределенного между 0 и j
$U = rand(0, $j);

# P3: Округлить U до целого и присвоить k. Переставить местами Xk <->Xj
$k = round($U);

$tmp = $X[$k];
$X[$k] = $X[$j];
$X[$j] = $tmp;
unset($tmp);

# P4: Уменьшить j на 1. Если j>0: вернуться к P2
$j--;
} while($j>0);
}

Исходный код со скриптом для демонстрации работы функции можно скачать по ссылке alg.shuffle.zip .

Спасибо за внимание!

4 Responses to “Алгоритм P: Перемешивание массива”

  1. Kichrum says:

    И че, он быстрее стандартного shuffle()?

  2. Rudolf says:

    не читайте Кнута!

    Он выедает мозг!

Leave a Reply




*