Исправить положительные целые числа n
и k
.
Пусть A
будет массивом длины n
с A[i]
массивом длины k
, где каждая запись n-i
. Например, с n=5
и k=1
это просто
[ [5] , [4] , [3] , [2] , [1] ]
а для n=5
и k=2
это
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
Цель состоит в том, чтобы пузырьки сортировать этот массив массивов путем замены чисел в смежных массивах (например, swap A[i][j1]
с помощью A[i+1][j2]
), пока каждая запись A[i]
не будет i+1
для каждого i
.
Вопрос: сколько требуется свопов и , что оптимальный алгоритм?
ПРИМЕЧАНИЕ. Существует много и много лучших алгоритмов сортировки. Однако, по этому вопросу, меня интересует только применение типа пузырьков, как описано выше. Я могу только переписывать записи из соседних массивов, и меня интересует только минимальное количество таких обменов. Я действительно ценю все предложения по другим алгоритмам сортировки, но это проблема, которую я пытаюсь понять.
ПРИМЕРЫ:
Для k=1
это хорошо известно. Количество свопов - это номер инверсии A
, рассматриваемый как перестановка, поэтому минимальное число свопов - это биномиальный коэффициент (n choose 2) = n(n-1)/2
, и это может быть достигнуто путем замены любой пары не по порядку: A[i] > A[j]
. Для первого примера здесь оптимальная сортировка пузырьков:
[ [5] , [4] , [3] , [2] , [1] ]
[ [4] , [5] , [3] , [2] , [1] ]
[ [4] , [5] , [2] , [3] , [1] ]
[ [4] , [2] , [5] , [3] , [1] ]
[ [4] , [2] , [5] , [1] , [3] ]
[ [4] , [2] , [1] , [5] , [3] ]
[ [4] , [1] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [3] , [5] ]
[ [1] , [2] , [4] , [3] , [5] ]
[ [1] , [2] , [3] , [4] , [5] ]
Для k=2
, используя ту же стратегию, получим оценку 2 (n choose 2)
необходимых свопов. В приведенном выше примере это означает 20
свопы. Но есть решение, которое использует только 15
свопы:
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [5,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [5,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [5,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [1,2] , [5,1] ]
[ [5,4] , [3,4] , [2,1] , [3,2] , [5,1] ]
[ [5,4] , [3,1] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,5] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [5,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,5] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,1] , [5,5] ]
[ [1,4] , [3,2] , [2,1] , [3,4] , [5,5] ]
[ [1,4] , [1,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [4,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [4,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [3,3] , [4,4] , [5,5] ]
Это решение оптимально для n=5
и k=2
(доказательство грубой силой, чтобы найти все решения). Для n=6
наилучшее решение принимает 22
свопы, но решение выглядит не так хорошо, как одно для n=5
(следуйте по 5 правым, затем по 1 слева, затем по 5 справа и т.д.), Поэтому Я до сих пор не знаю оптимальной стратегии, а тем более формулы или лучшей привязки к числу свопов.
Я думал об этом уже пару дней и не придумал ничего полезного. Если у кого-нибудь есть мысли по этой проблеме, пожалуйста, поделитесь ими. Я был бы в восторге от того, что узнал больше о случае k=2
. Еще лучше для любых мыслей об общем случае.
EDIT: Прошу прощения, если я не могу мотивировать эту проблему по своему вкусу, но здесь попытка: количество сортов пузырьков, необходимых для сортировки перестановки, является очень важной статистикой в комбинаторике и теории чисел, называемой номером инверсии перестановки, Вы можете сортировать нестандартную перестановку, используя гораздо лучшие алгоритмы, но это тот, который дает вам алгебраическое значение. Если это не поможет, возможно, эта связанная почта SO может: Что такое сортировка пузыря для?
ОБНОВЛЕНИЕ. самый старый ответ ниже дает более низкую (и верхнюю) оценку количества свопов. второй самый старый ответ дает алгоритм, который очень близок к этой нижней границе (часто достигающей ее). Было бы замечательно, если бы кто-то мог улучшить оценку или, что еще лучше, доказать, что приведенный ниже алгоритм является оптимальным.