Я бы сказал, что ответ лисенка неверен. Чтобы доказать это, я введу полезное определение идеально перетасованного списка (назовите его массивом, последовательностью или как хотите).
Определение. Предположим, у нас есть список L
, содержащий элементы a1, a2 ... an
и индексы 1, 2, 3..... n
. Если мы подвергаем L
операции перемешивания (к внутренним компонентам у нас нет доступа), L
будет идеально перемешано тогда и только тогда, когда, зная индексы некоторых k (k< n
) элементов, мы не сможем вывести индексы оставшихся n-k
элементов. То есть оставшиеся n-k
элементов с равной вероятностью обнаружатся по любому из оставшихся n-k
индексов.
Пример: если у нас есть список из четырех элементов [a, b, c, d]
и после его перетасовки мы знаем, что его первый элемент a
([a, .., .., ..]
), то вероятность того, что любой из элементов b, c, d
появится, скажем, в третьей ячейке, равна 1/3
.
Теперь наименьший список, для которого алгоритм не соответствует определению, состоит из трех элементов. Но алгоритм все равно преобразует его в 4-элементный список, поэтому мы попытаемся показать его некорректность для 4-элементного списка.
Рассмотрим ввод L = [a, b, c, d]
После первого запуска алгоритма L будет разделен на l1 = [a, c]
и l2 = [b, d]
. После перетасовки этих двух подсписков (но перед объединением в четырехэлементный результат) мы можем получить четыре равновероятных двухэлементных списка:
l1shuffled = [a , c] l2shuffled = [b , d]
l1shuffled = [a , c] l2shuffled = [d , b]
l1shuffled = [c , a] l2shuffled = [b , d]
l1shuffled = [c , a] l2shuffled = [d , b]
Теперь попытайтесь ответить на два вопроса.
1. Какова вероятность того, что после объединения в окончательный результат a
будет первым элементом списка.
Достаточно просто, мы можем видеть, что только две из четырех пар выше (опять же, равновероятных) могут дать такой результат (p1 = 1/2
). Для каждой из этих пар heads
должно быть нарисовано во время первого перелистывания в процедуре слияния (p2 = 1/2
). Таким образом, вероятность наличия a
в качестве первого элемента Lshuffled
равна p = p1*p2 = 1/4
, что верно.
2. Зная, что a
находится на первой позиции Lshuffled
, какова вероятность того, что c
(мы могли бы также выбрать b
или d
без ограничения общности) на второй позиции Lshuffled
Теперь, согласно к приведенному выше определению идеально перетасованного списка ответ должен быть 1/3
, так как есть три числа, которые нужно поместить в три оставшиеся ячейки в списке
Давайте посмотрим, гарантирует ли это алгоритм.
После выбора 1
в качестве первого элемента Lshuffled
у нас будет либо:
l1shuffled = [c] l2shuffled = [b, d]
или:
l1shuffled = [c] l2shuffled = [d, b]
Вероятность выбора 3
в обоих случаях равна вероятности переворачивания heads
(p3 = 1/2
), таким образом, вероятность наличия 3
в качестве второго элемента Lshuffled
, если известно, что первым элементом элемента Lshuffled
является 1
, равна 1/2
. 1/2 != 1/3
, что завершает доказательство неверности алгоритма.
Интересно то, что алгоритм выполняет необходимое (но недостаточное) условие идеального перемешивания, а именно:
Для списка из n
элементов для каждого индекса k
(<n
) для каждого элемента ak
: после перетасовки списка m
раз, если мы подсчитали количество раз, когда ak
встречалось в индексе k
, это количество будет стремиться к m/n
по вероятности, при этом m
стремится к бесконечности.
person
GA1
schedule
27.02.2015
Collections.sort
в JDK выгружает список в массив, выполняет перетасовку Фишера-Йейтса, а затем преобразует массив обратно в список. Это занимает линейное время и пространство. - person Abhijit Sarkar   schedule 22.05.2018