Только прочитайте первые два параграфа, вы просто хотите намек. Для этого есть эффективное решение (если, конечно, я не ошибся). Сначала отсортируйте список. Теперь мы можем написать исходный список как список продуктов непересекающихся циклов.
Например, 5,3,4,2,1 имеет два цикла (5,1) и (3,4,2). Цикл можно представить, начиная с 3, 4 находится на 3-м месте, 2 находится на 4-м месте, а 4 - в 3-х. место. Конечная цель - 1,2,3,4,5 или (1) (2) (3) (4) (5), пять непересекающихся циклов.
Если мы переключим два элемента из разных циклов, скажем 1 и 3, получим: 5,1,4,2,3 и в обозначении цикла (1,5,3,4,2). Два цикла объединяются в один цикл, это противоположность тому, что мы хотим сделать.
Если мы переключим два элемента из того же цикла, скажем 3 и 4, получим: 5,4,3,2,1 в обозначении цикла (5,1) (2,4) (3). Один цикл делится на два меньших цикла. Это приближает нас к цели всех циклов длины 1. Обратите внимание, что любой переключатель из двух элементов в одном цикле разбивает цикл на два цикла.
Если мы сможем найти оптимальный алгоритм для переключения одного цикла, мы можем применить его для всех циклов и получить оптимальный алгоритм для всего сортировки. Один алгоритм состоит в том, чтобы взять минимальный элемент в цикле и переключить его с той, в чью позицию он находится. Таким образом, для (3,4,2) мы переключали бы 2 на 4. Это оставляет нас с циклом длины 1 (элемент просто переключился в правильное положение) и цикл размером один меньше, чем раньше. Затем мы можем применить правило снова. Этот алгоритм переключает наименьшую длину цикла элемента -1 и каждый другой элемент один раз.
Чтобы преобразовать цикл длины n в циклы длины 1, выполняется n - 1 операций. Каждый элемент должен работать как минимум один раз (подумайте о каждом отсортированном элементе, его нужно переместить в правильное положение). Предлагаемый мной алгоритм работает на каждом элементе один раз, который должны выполняться всеми алгоритмами, затем каждая другая операция выполнялась на минимальном элементе. Ни один алгоритм не может сделать лучше.
Этот алгоритм принимает O (n log n) для сортировки, затем O (n), чтобы беспорядок с циклами. Для решения одного цикла требуется O (длина цикла), общая длина всех циклов равна n, поэтому стоимость операций цикла равна O (n). Конечным временем выполнения является O (n log n).
Существует уже принятое решение, которое является более или менее правильным ответом - вы можете * доказать *, что (с очевидной модификацией) он является оптимальным.«Сокращение» чего-то NP-жесткой проблемы слишком просто; что ничего не говорит о твердости исходной проблемы: P – ShreevatsaR 2008-11-20 02:56:02
Почему вы сказали «уже», когда я отправил мой за час до принятого ответа? Игнорируя на мгновение, что принятый ответ неверен. – Sparr 2008-12-18 22:10:15