Я должен случайным образом переставить N первых элементов односвязного списка длины n. Каждый элемент определяется как:
typedef struct E_s
{
struct E_s *next;
}E_t;
У меня есть корневой элемент, и я могу просмотреть весь связанный список размером n. Какой метод наиболее эффективен для случайной перестановки только N первых элементов (начиная с корня)?
Итак, учитывая a-> b-> c-> d-> e-> f-> ... x-> y-> z, мне нужно сделать что-то. как f-> a-> e-> c-> b -> ... x-> y-> z
Мой конкретный случай:
- n-N составляет около 20% относительно n
- У меня ограниченные ресурсы оперативной памяти, лучший алгоритм должен сделать это на месте
- Я должен сделать это в цикле, во многих итерациях, поэтому скорость имеет значение
- Идеальная случайность (равномерное распределение) не требуется, это нормально, если она "почти" случайна
- Прежде чем делать перестановки, я уже пересекаю N элементов (для других нужд), поэтому, возможно, я мог бы использовать это и для перестановок
ОБНОВЛЕНИЕ: я нашел этот документ . Это заявляет, что представляет алгоритм O (log n) стекового пространства и ожидаемого O (n log n) времени.