Изменения

Перейти к: навигация, поиск

Список

424 байта убрано, 19:21, 12 июня 2014
Поиск длины хвоста в списке с циклом
==Поиск длины хвоста в списке с циклом==
Так как для поиска хвоста мы должны знать, что цикл существует, воспользуемся предыдущей функцией и при выходе из неё запомним "момент встречи" зайца и черепахи. Назовем её <tex>pointMeeting</tex>.
===Наивные реализации=======Реализация за <tex>O(n^2)</tex>====
Будем последовательно идти от начала цикла и проверять, лежит ли этот элемент на цикле. На каждой итерации запустим от текущего элемента вперёд указатель. Если он окажется в текущем элементе, прежде чем два раза посетит <tex>pointMeeting</tex>, то точку окончания (начала) хвоста нашли.
'''int''' getTail(Node head, Node pointMeeting): lengthTail = 0 currentElement = head '''while''' true iterator = currentElement.next count = 0 '''while''' iterator != currentElement '''and''' count != 2 '''if''' iterator == pointMeeting count++ iterator = iterator.next '''if''' count < 2 '''break''' currentElement = currentElement.next lengthTail++ '''return''' lengthTail ===Реализация за <tex>O(n \log n)</tex>====
Реализацию, приведенную выше можно улучшить. Для этого воспользуемся бинарным поиском. Сначала проверим голову списка, потом сделаем 2 шага вперёд, потом 4, потом 8 и так далее, пока не окажемся на цикле. Теперь у нас есть две позиции {{---}} на левой границе, где мы в хвосте, и на правой {{---}} в цикле. Сделаем бинарный поиск уже по этому отрезку и таким образом найдём цикл за <tex>O(n \log n)</tex>.
===Эффективная реализация===
Анонимный участник

Навигация