Мне задали этот вопрос в интервью, и я дал различные решения, но интервьюер не был убежден. Мне интересно найти решение. Пожалуйста, введите ваше мнение:Эффективный способ рандомизации массива - Случайный код
Q: Напишите эффективную структуру данных для реализации тасования в ipod. Он должен воспроизводить все песни, каждый раз в разных случайных порядках, одну и ту же песню не следует повторять. (в основном O (n))
Одно решение, я подумал после интервью: я могу сделать рандомизированный быстрый сортировку без рекурсии. Где мы случайным образом, выбрали 1 pivot O (1), а затем выполните quicksort O (n). Теперь песни будут отсортированы в определенном порядке, и я буду играть их до конца. Как только он достигнет конца, я снова выберу случайный стержень и повторю этот процесс снова и снова.
С уважением, Sethu
Но в этом случае шансы повторения песен высоки? – sethu
@sethu: Нет, если вы меняете его. Как изменить ABCD на CBAD. Каждый своп просто изменяет его на другую перестановку исходных элементов. –
Это неверно. Это не приводит к случайной перестановке. Эта ошибка довольно распространена и описана в википедии: http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Implementation_errors – Dijkstra