Добрый день, друзья!
Благодаря
iancaple удалось получить формулы для расчета числа перестановок для ряда алгоритмов сортировки. Я полностью удовлетворен полученным результатом.
Теперь у меня возникла новая задача по поводу перестановок. Нужно разработать оптимальный алгоритм сортировки. Не секрет, что в основе алгоритмов сортировки лежит операция сравнения двух элементов массива, при этом минимальное число таких сравнений для массива из
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
чисел равно
![$\log_2 n$ $\log_2 n$](https://dxdy-03.korotkov.co.uk/f/6/8/f/68f1bbb87512454065f67d6f1803da9e82.png)
.
В каждой итерации алгоритм должен сравнить два таких элемента массива и получить такое дерево сортировки, чтобы число перестановок
![$PC$ $PC$](https://dxdy-04.korotkov.co.uk/f/b/8/7/b87dba954b563303c3246ea1012bc8f382.png)
на данной итерации было минимальным. То есть алгоритм должен быть жадным по этому критерию.
Учитывая, что в зависимости от значений сравниваемых чисел может получиться либо
![$graph_1$ $graph_1$](https://dxdy-03.korotkov.co.uk/f/6/8/0/6803da2258d114400401c4ec23a633d182.png)
(
![$x_1>x_2$ $x_1>x_2$](https://dxdy-01.korotkov.co.uk/f/4/1/a/41a177f9b8c78354652d61b50b444cc982.png)
), либо
![$graph_2$ $graph_2$](https://dxdy-04.korotkov.co.uk/f/3/2/f/32f57f2f47f76e5c8e7ae25a035e5ede82.png)
(
![$x_2>x_1$ $x_2>x_1$](https://dxdy-01.korotkov.co.uk/f/8/b/2/8b2064a3aa17b307117deead1a0677ed82.png)
), то число перестановок
![$PC$ $PC$](https://dxdy-04.korotkov.co.uk/f/b/8/7/b87dba954b563303c3246ea1012bc8f382.png)
будет случайной величиной. Следовательно минимизировать придется математическое ожидание величины
![$PC$ $PC$](https://dxdy-04.korotkov.co.uk/f/b/8/7/b87dba954b563303c3246ea1012bc8f382.png)
. Считать, что в каждой итерации
![$graph_1$ $graph_1$](https://dxdy-03.korotkov.co.uk/f/6/8/0/6803da2258d114400401c4ec23a633d182.png)
и
![$graph_2$ $graph_2$](https://dxdy-04.korotkov.co.uk/f/3/2/f/32f57f2f47f76e5c8e7ae25a035e5ede82.png)
равновероятны.
Изначально граф представляет собой лес из
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
вершин, не связанных с дугами (
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
компонент связности). Число перестановок равно
![$n!$ $n!$](https://dxdy-02.korotkov.co.uk/f/5/0/c/50c0357224674ab662b8ea5e5ca3eb8a82.png)
.
Итерация 1. Из соображений симметрии можно взять любые два числа и сравнить. В результате получим однозначно
![$\frac{n!}{2}$ $\frac{n!}{2}$](https://dxdy-02.korotkov.co.uk/f/9/8/5/985fc76f31aba4bbc4e715a3389d31fb82.png)
перестановок.
Дальнейшие итерации усложняются.
Итерация 2. У меня получилось, что все варианты сравнения дают абсолютно одинаковый результат по величине
![$M(PC)=\frac{n!}{4}$ $M(PC)=\frac{n!}{4}$](https://dxdy-03.korotkov.co.uk/f/6/f/e/6fe448659cceb4cbae55f4544837948282.png)
, но получаются графы сравнения различной структуры. Наверное алгоритм должен сделать прогноз на одну итерацию вперед...
Итерация 3. Я рассмотрел несколько вариантов выбора в итерации 2 и пришел к выводу, что многие варианты дают одинаковый результат
![$M(PC)=\frac{n!}{8}$ $M(PC)=\frac{n!}{8}$](https://dxdy-02.korotkov.co.uk/f/1/5/0/1503b71882f7a2511780019d6e43471982.png)
, но не все. Есть исключения: например, сравниваем
![$x_1$ $x_1$](https://dxdy-03.korotkov.co.uk/f/2/7/7/277fbbae7d4bc65b6aa601ea481bebcc82.png)
и
![$x_2$ $x_2$](https://dxdy-02.korotkov.co.uk/f/9/5/d/95d239357c7dfa2e8d1fd21ff6ed5c7b82.png)
в первой итерации, затем
![$x_3$ $x_3$](https://dxdy-03.korotkov.co.uk/f/2/c/5/2c52641cc5fa73cbbdf887c89d82f0de82.png)
и
![$x_4$ $x_4$](https://dxdy-02.korotkov.co.uk/f/9/8/2/98281ac06ae64c568765342739c6722082.png)
- во второй итерации и, наконец, в третьей итерации сравниваются наибольшее число в паре
![$(x_1, x_2)$ $(x_1, x_2)$](https://dxdy-04.korotkov.co.uk/f/f/5/3/f53b29a6b632f468788cf07d2cef97e882.png)
с наименьшим числом в паре
![$(x_3, x_4)$ $(x_3, x_4)$](https://dxdy-04.korotkov.co.uk/f/7/7/8/77887be9a8bfc44b0c19f0cc90f4e7cf82.png)
. При таком алгоритме получается
![$\frac{29n!}{240}$ $\frac{29n!}{240}$](https://dxdy-03.korotkov.co.uk/f/6/c/1/6c13c8349223373ee3c02817c023a21d82.png)
, что меньше чем
![$\frac{n!}{8}$ $\frac{n!}{8}$](https://dxdy-04.korotkov.co.uk/f/7/4/a/74ab9805c7b9d8adfcf88227bdc16cd782.png)
.
Итерация 4. Так как рассмотрел не все варианты в итерации 3, поэтому испытываю сложность в дальнейшем продвижении.
Нужно научиться вычислять число перестановок при произвольном графе сортировки (не только вида "дерево").
Допустим дана матрица смежности ориентированного графа. Как вычислять число перестановок?