Вопрос

Меня задали этот вопрос в интервью, и я дал различные решения, но интервьюер не был убежден. Мне интересно найти решение. Пожалуйста, бросьте свои взгляды:

Q: Напишите эффективную структуру данных для реализации перемены в iPod. Он должен играть все песни, каждый раз в разном случайном порядке, та же песня не должна повторяться. (в основном O (n))

Одно решение, я сдан после интервью: я могу сделать рандомизированный быстрый сортировку без рекурсии. Где мы случайно, выбрали 1 пивок O (1), а затем сделать QuickSort O (N). Теперь песни будут отсортированы в некоторых заказах, и я играю их до конца. Как только он достигает конца, я снова выбрал случайную поворот, и повторите этот процесс снова и снова.

С уважением, СЕТХУ

Это было полезно?

Решение

Разместите все песни в массиве ... Для каждого элемента в массиве поменяйте его случайным положением.

Другие советы

Вы хотите Fisher-Yates Shuffle. Отказ Будьте в курсе об ошибках реализации, упомянутых на этой странице, поскольку ваш в настоящее время ответчик падает на фол.

Ну, первый раствор линейного времени, который снимает на ум:

Вы можете сделать связанный список всех песен, которые примут примерно O (n) (учитывая, что вставки являются постоянными временными операциями). Затем генерируйте случайное число, модуль размер списка, чтобы получить случайный индекс, и удалить этот индекс и добавить его в новый список (оба из которых являются постоянными операциями времени).

Вставка для каждого O (n) + удаление для каждого O (n) + вторая вставка o (n). Это было бы в целом привести к линейному времени.

Редактировать: Я полностью забыл пройти список. Таким образом, вместо этого вы можете сделать результат фиксированной длины массива. Поп-глава связанного списка, назначьте его случайным индексом и заполните массив.

Нейт (отредактированные) и алгоритмы Брайана являются рыбаком-Йитами, перемешающими o (n), в то время как перетаскивание, сортировка - это o (nlogn), но может быть фактически быстрее на практике (http://r.wikipedia.org/wiki/fisher E2% 80% 93YATES_Shuffle # Somvalison_With_Other_shuffling_algorithms). Неправильное использование песни неверно может иметь незначительные последствия, но если вы пишете алгоритм спреинга для онлайн-покерной игры, убедитесь, что вы знаете, что вы делаете (http://www.cigital.com/news/index.php?pg= Art & Artid = 20).

Я новичок, позвольте мне сказать решение, которое поражает, если что-то не так, пожалуйста, заставь меня знать.

Давайте предположим, что песни хранятся в одиночном или вдвойне связанном списке. Каждый раз, когда музыкальный проигрыватель открыта, выберите случайное число, меньше (любое желаемое число) предположить k, и обратить вспять каждый K узлов в списке, аналогично сделать это дважды или в Max Thrice (как вы хотите), что примет O ( 2n) или o (3n) время перемешать. Наконец, укажите указатель на последний узел списка. И каждый раз, когда прослушана песня (посещается узел) Удалите узел и вставьте его рядом с последним узлом, который можно сделать в O (1) время. Это продолжается до тех пор, пока музыкальный проигрыватель не будет закрыт.

Спасибо, стремясь узнать правильность ответа.

Что вы хотите, это Fisher-Yates Shuffle. Отказ Вот реализация в Java:

public void shuffle(Song[] songs) {
    Random r = new Random();
    for(int i = 0; i < songs.length - 1; i++) {
        int swap = i + r.nextInt(songs.length-1-i);
        T temp = songs[i];
        songs[i] = songs[swap];
        songs[swap] = temp;
    }
}
/* r.nextInt(max) returns integer 0 to max-1 inclusive */

Как это работает, это относится к всему массиву в качестве шляпы и начинает тянуть случайные элементы и выдвигать их на передней части массива. Все элементы после i «в ведре», все элементы перед i перетасовываются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top