2014-10-05 2 views
1

У меня есть массив s = {'ACA', 'BBC', 'CKA', ...};лучший алгоритм для перетасовки массива

Я хочу перетасовать. Поэтому я создаю список A = {1,2,3,4 ..} и список B = {1,2,3,4, ...}

Затем я перетасовываю два списка. random.shuffle (А) random.shuffle (Б)

, наконец, я поменять местами с [A [0]] с [ы B [0]], своп с [A [1]] с S [B [1]] .....

Является ли этот алгоритм произвольной перестановкой s? Является ли это случайным? Предполагая, что random.shuffle производит случайные достаточно перестановки A и B.

+1

На каком языке это? Почему вы не можете просто перетасовать исходный массив вместо создания двух других массивов, перетасовывая их, а затем используя это, чтобы перетасовать первый? –

+0

Что такое отношение s, A и B. Ваш вопрос кажется недостаточным для некоторых проблем. –

+0

s - очень большая последовательность строк. каждая строка составляет около 8000 байт. A и B являются перестановками последовательности {1,2,3, .... length (s)} –

ответ

2

Для использования Фишера - Йетс (Кнут) перемешайте с массивом индекса, инициализировать один массив индексов A как

for (int i = 0; i < n; i++) A[i] = /* random integer in 0..i */; 

, а затем делать свопы как

for (int i = 0; i < n; i++) swap(&s[A[i]], &s[i]); 

Ваш алгоритм не порождают равномерные случайные подстановки. При n = 2 возможности для A и B равны

A = {0, 1}; B = {0, 1}; 
A = {0, 1}; B = {1, 0}; 
A = {1, 0}; B = {0, 1}; 
A = {1, 0}; B = {1, 0}; 

Ничего из этого не влияет на начальную перестановку; либо оба элемента меняются местами, либо один и тот же нетривиальный своп повторяется дважды, отменяя его эффект.

+0

Я думаю, что ваш код работает очень хорошо. Но мне очень любопытно, генерирует ли мой алгоритм равномерную случайную перестановку. Я надеюсь, что кто-то сможет дать математическое обоснование. –

+0

@readRead Не работает; когда n = 2, в окончательном учете ничего не происходит. –

2

Knut's shuffle - простой и эффективный способ перетасовки массива. Вам не нужны дополнительные массивы индексов. Есть ли какая-то особая причина для их использования?

+0

Перемешивает ли Кнут более произвольную перестановку, чем мой алгоритм? Я использую массивы индексов, потому что я хочу переставить другой массив x точно так же. s и x имеет одно к одному соответствие. –

+0

Он просто производит равномерное распределение (все перестановки имеют равные вероятности) – MBo

Смежные вопросы