Случайным образом переставить N первых элементов односвязного списка

Мне нужно случайным образом переставить 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

Мой конкретный случай:

  • nN составляет около 20% относительно n
  • Я ограничил Ресурсы оперативной памяти, лучший алгоритм должен сделать это на месте
  • Я должен делать это в цикле, во многих итерациях, поэтому скорость имеет значение
  • Идеальная случайность (равномерное распределение) не требуется, это нормально, если это "почти" случайный
  • Перед выполнением перестановок Я уже прохожу через N элементов (для других нужд), так что, возможно, я мог бы использовать это и для перестановок

ОБНОВЛЕНИЕ: Я нашел эту статью . В нем говорится, что он представляет алгоритм из пространства стека O (log n) и ожидаемого времени O (n log n).

19
задан psihodelia 16 December 2010 в 16:21
поделиться