TOTAL писал(а):
В ящиках с номерами от
![$1$ $1$](https://dxdy-01.korotkov.co.uk/f/0/3/4/034d0a6be0424bffe9a6e7ac9236c0f582.png)
до
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
лежат числа. Берём число из первого непустого ящика и записываем его, за ним следующее и т.д. (до окончания цикла). Снова берём число из первого непустого ящика и т.д. С самого начала храним (и обновляем) номер первого непустого ящика, последнего непустого ящика, следующего непустого ящика (это для каждого непустого ящика).
Ага!
![Smile :-)](./images/smilies/icon_smile.gif)
Если я правильно Вас понял, то у меня так и работает. Но это как раз в худшем случае
![$O(n^2)$ $O(n^2)$](https://dxdy-04.korotkov.co.uk/f/3/9/8/3987120c67ed5a9162aa9841b531c3a982.png)
. Т.е. если эти
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
точек организованы в, скажем,
![$\frac{n}{5}$ $\frac{n}{5}$](https://dxdy-03.korotkov.co.uk/f/e/7/3/e732f7450f75a222cdf5ccc65e7ddf3d82.png)
циклов длиной 5, причем точки каждого цикла равномерно распределены по данному массиву, то нам будет необходимо пройти по
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
точек, чтобы вытащить каждый цикл, т.е. всего
![$O(n \cdot \frac{n}{5})=O(n^2)$ $O(n \cdot \frac{n}{5})=O(n^2)$](https://dxdy-01.korotkov.co.uk/f/4/a/e/4aea186546789b8cc8f6993faf1adf6f82.png)
(ну там даже если пустые элементы игнорировать все равно получится
![$O(n^2)$ $O(n^2)$](https://dxdy-04.korotkov.co.uk/f/3/9/8/3987120c67ed5a9162aa9841b531c3a982.png)
).
Правильно я понял?
-- Чт ноя 18, 2010 16:37:18 --venco, TOTAL М.б. я какой-то момент упустил? (Скажите, проект и так горит...)
-- Чт ноя 18, 2010 16:51:39 --Может быть так сделать: рассматриваем входящие точки как куски циклов длины 1, для которых известны точки, которые можно подсоединить к их концам. Создаем новый пустой массив кусков циклов. Проходим по старому массиву, для каждого куска цикла старого массива пробегаемся по новому массиву и проверяем - подходит этот кусок хотя бы к одному куску из нового массива, если подходит - то соединяем куски, иначе - пишем его в новый столбец нового массива. После прохода по старому массиву новый массив будет представлять из себя тоже массив кусков циклов, только кусков будет меньше и они будут длиннее. Записываем теперь новый массив в старый, а новый очищаем и повторяем итерации до тех пор пока не образуются полные циклы. И получается еще, что если на каком-то шаге образовался полный цикл, то его можно вывести и не рассматривать...
М.б. так будет быстрее работать
![:roll: :roll:](./images/smilies/icon_rolleyes.gif)
? Правда писанины будет много и геморроя тоже...