23:35 

Загадка для программистов

Дикий Грифон
Дан однонаправленный список (упорядоченная структура данных, каждый элемент которой содержит указатель на следующий элемент) из n элементов. Известен указатель на первый элемент.
Необходимо определить, есть ли в этом списке циклы, то есть существует ли такой k-й элемент, у которого указатель содержит ссылку на один из предыдущих элементов - на r-й элемент, где r<k.
Алгоритм решения этой задачи должен выполняться за время t=O(n) (порядка n) и использовать постоянное, не зависящее от n, количество ячеек памяти - M=O(1).

Комментарии
2007-11-22 в 23:42 

ДихлофосЪ
И однажды с тупого похмелья твоя злость превратится в картечь
Дикий Грифон
Чего-то я не понял, как это может указывать на предыдущий элемент, если он по любому указывает на следующий? Задача ошибочная. Список-то однонаправленный.

2007-11-22 в 23:51 

ДихлофосЪ
И однажды с тупого похмелья твоя злость превратится в картечь
Дикий Грифон
А вообще если какой-то указатель указывает назад, то проверить это проще простого - сравнить адрес проверяемой ячейки и адрес, на который указывает указатель. Если первое больше, то мы нашли решение.

2007-11-22 в 23:53 

Дикий Грифон
Нужно узнать, имеет ли место следующая ситуация:
a1->a2->a3->...->ar->...->ak->ar->...->ak ->ar->...
то есть зацикленный список.
Здесь n - максимальное количество элементов в нем.

2007-11-22 в 23:56 

ДихлофосЪ
И однажды с тупого похмелья твоя злость превратится в картечь
Дикий Грифон
Ты программированием занимаешься?

2007-11-22 в 23:59 

Дикий Грифон
Раненый Ветер
Ответ с адресной логикой не принимается. Предполагается, что адреса элементов списка могут идти вразнобой.
Это же список, а не массив :)

2008-01-22 в 18:00 

Ulmo
Пройтись по списку от первого элемента до n+1, если окажется возможным - список зациклен.

2008-01-23 в 17:09 

Дикий Грифон
Ulmo Хороший вариант, но не совсем то, что я имел в виду.

Предположим, что мы не можем проверить корректность данных (в данном случае корректность n+1 элемента); например, мы имеем абстрактный список, содержащий только указатели, и значение указателя последнего элемента не определено, а в оперативной памяти хранится мегахаотичный мусор :)
Короче, эту задачу нужно решить, строго сравнивая между собой указатели.

2008-01-23 в 19:33 

Ulmo
Дикий Грифон Ну и запросы у вас, сказала база данных и повисла :)

Тогда отсортировать указатели и просмотреть полученный список на предмет одинаковых адресов. Только помоему время будет не порядка n, а больше, и для сортированного массива нужно будет еще n ячеек

2008-01-23 в 19:47 

ДихлофосЪ
И однажды с тупого похмелья твоя злость превратится в картечь
Дикий Грифон
По идее можно сравнивать n и n+k указатель, где k изменяется от 1 до длинны списка. Если при каком-то k указатели равны, то можно еще раз проверить для произвольного n и если пару раз будет работать, значит список зациклен.

2008-01-25 в 12:31 

Дикий Грифон
Ulmo Верно, это решение не подходит по времени и по используемым ячейкам памяти.
DUST. По памяти алгоритм подходит, а вот время работы будет порядка n^2. Кстати, по-моему, в данном алгоритме достаточно первого равенства указателей n и n+k.

Загадка-подсказка: Сколько раз за один оборот часовой стрелки ее догоняет минутная?

2008-01-25 в 12:48 

Ulmo
А ветаки, число n - известно, или по условиям задачи неизвестно сколько элементов в списке?

2008-01-25 в 13:07 

Дикий Грифон
Считай, что известно. n можно использовать в алгоритме, считая что оно передается на его вход.
Смысл n (как я уже писал выше) - максимальное количество элементов в незацикленном списке. Естественно, если список зациклен, то он бесконечен.

2008-01-25 в 13:19 

ДихлофосЪ
И однажды с тупого похмелья твоя злость превратится в картечь
Дикий Грифон
Ну хз. Первого совпадения конечно достаточно, однако мы не знаем, в каком месте список начинает зацикливаться.

 [?] :
    


Прежде, чем нажать кнопку "Отправить", впишите код, изображенный на картинке

РЕШАЕМ ГОЛОВОЛОМКИ

главная