Проверить список на зацикленность

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
nemiga
Маньяк
Сообщения: 2425
Зарегистрирован: 02 сен 2006, 19:05
Откуда: Minsk -> Seoul -> Ottawa

Проверить список на зацикленность

Сообщение nemiga »

Дан кортеж, где каждый элемент ссылается на следующий. Проверить самым быстрым способом, что список не зациклен. ANSI C.

.
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

Вы это серьезно? Прямо в субботу утром?
У меня к вам встречная задача: случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Аватара пользователя
nemiga
Маньяк
Сообщения: 2425
Зарегистрирован: 02 сен 2006, 19:05
Откуда: Minsk -> Seoul -> Ottawa

Сообщение nemiga »

Tony писал(а):Easy, it involves a "Turtle and Rabbit" algorithm
Спасибо. Я так и ответил. Единственно, я думал, что этот алгоритм называется Ахиллес и черепаха -- может, поэтому интервьювер и сказал "almost correct"?

.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

nemiga писал(а):может, поэтому интервьювер и сказал "almost correct"?
вряд ли. это настолько элементарный алгоритм, что никакого
обшепринятого названия у него нету.

это из серии, что удаление элемента из бинарного tree - это
алгоритм вирта. ну да, в какой-то книжке так написано, но
по жизни он называетcя "удаление элемента из бинарного дерева" :)
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

Tony писал(а):Easy, it involves a "Turtle and Rabbit" algorithm.

You have two pointers traversing the linked list - one fast (2 steps at a time), another slow (1 step). If the fast one reaches the end of the list, there is obviously no loop involved. If the fast one passes the slow, there must be a loop.
Вот интересно. Алгоритм этот все знают и на интервью регулярно спрашивают.
Но лично я ни разу не видел его в реальной программе. По моему, он реально, по жизни, нафиг не нужен.
Аватара пользователя
nemiga
Маньяк
Сообщения: 2425
Зарегистрирован: 02 сен 2006, 19:05
Откуда: Minsk -> Seoul -> Ottawa

Сообщение nemiga »

sz писал(а):Вот интересно. Алгоритм этот все знают и на интервью регулярно спрашивают.
Но лично я ни разу не видел его в реальной программе. По моему, он реально, по жизни, нафиг не нужен.
На интервю, вообще, по-моему, часто задают искусственные вопросы. Кое-где это объяснимо тем, что, допустим, не хотят рассказывать, чем именно занимаются. Но кое-где, похоже, просто от того, что реальные задачи слишком просты и тривиальны.

.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

sz писал(а):
Tony писал(а):Easy, it involves a "Turtle and Rabbit" algorithm.

You have two pointers traversing the linked list - one fast (2 steps at a time), another slow (1 step). If the fast one reaches the end of the list, there is obviously no loop involved. If the fast one passes the slow, there must be a loop.
Вот интересно. Алгоритм этот все знают и на интервью регулярно спрашивают.
Но лично я ни разу не видел его в реальной программе. По моему, он реально, по жизни, нафиг не нужен.
я его первый раз уcлышал в немного другой форме на военной
кафедре в универе - дана функция генератора псевдо-случайных
чисел x(n) = f( x(n-1) ), найти ее период для данного seed value.

кстати хороший вариант задавать местным на интервью. про список
с двумя поинтерами все ответ знают, а на генераторе - сыпятся :)
Аватара пользователя
Anry
Маньяк
Сообщения: 1616
Зарегистрирован: 03 ноя 2004, 13:46
Откуда: Волгоград-Coquitlam

Сообщение Anry »

Stanislav писал(а):Вы это серьезно? Прямо в субботу утром?
У меня к вам встречная задача: случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Ntdsutil.exe
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

sz писал(а):
Tony писал(а):Easy, it involves a "Turtle and Rabbit" algorithm.
You have two pointers traversing the linked list - one fast (2 steps at a time), another slow (1 step). If the fast one reaches the end of the list, there is obviously no loop involved. If the fast one passes the slow, there must be a loop.
Вот интересно. Алгоритм этот все знают и на интервью регулярно спрашивают.
Но лично я ни разу не видел его в реальной программе. По моему, он реально, по жизни, нафиг не нужен.
Это алгоритм ловит все зацикления, а в реальной жизни тупое сравнивание ссылки на следующий элемент с запомненной ссылкой на 1 элемент эффективнее, поскольку использовать зацикленные списки с петлей на конце ни разу не приходилось.
А поскольку вопрос был о самом эффективном алгоритме, я голосую за соответствующую имплементацию метода add, которая всегда знает, будет ли список закольцован :-)
Последний раз редактировалось Stanislav 31 мар 2007, 21:48, всего редактировалось 1 раз.
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

Anry писал(а):
Stanislav писал(а):Вы это серьезно? Прямо в субботу утром?
У меня к вам встречная задача: случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Ntdsutil.exe
Ответ неправльный, но вопрос был не про это :-) Оптимальность каких либо действий сильно зависит от текущих условий и поставленной задачи. Универсальность алгоритма ведет к его неоптимальности. В частности, если в OU только один пользователь, то может проще заново его создать, а если пользователей десятки, то без восстановления из бэкапа не обойтись?
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Сообщение Аман Ванкуверский »

Stanislav писал(а):случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Stanislav писал(а):В частности, если в OU только один пользователь, то может проще заново его создать ... ?
SID-то будет другой, так что формально это не восстановление
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

Аман Ванкуверский писал(а):
Stanislav писал(а):случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Stanislav писал(а):В частности, если в OU только один пользователь, то может проще заново его создать ... ?
SID-то будет другой, так что формально это не восстановление
Восстановление - это чтобы все работало так же, как и прежде! Не надо усложнять! :lol: При использовании дисков аварийного восстановления SID тоже меняется - однако их не перестают называть дисками аварийного восстановления :-)
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Сообщение Аман Ванкуверский »

Stanislav писал(а):
Аман Ванкуверский писал(а):
Stanislav писал(а):случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Stanislav писал(а):В частности, если в OU только один пользователь, то может проще заново его создать ... ?
SID-то будет другой, так что формально это не восстановление
Восстановление - это чтобы все работало так же, как и прежде! Не надо усложнять! :lol:
"Как прежде" оно работать не будет, в чем Вы убедитесь при первой попытке этого юзера открыть какой-нибудь файл с соответственно настроенными permissons
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

Аман Ванкуверский писал(а):
Stanislav писал(а):
Аман Ванкуверский писал(а):
Stanislav писал(а):случайно был удален OU из AD - предложите самый быстрый способ восстановления OU.
Stanislav писал(а):В частности, если в OU только один пользователь, то может проще заново его создать ... ?
SID-то будет другой, так что формально это не восстановление
Восстановление - это чтобы все работало так же, как и прежде! Не надо усложнять! :lol:
"Как прежде" оно работать не будет, в чем Вы убедитесь при первой попытке этого юзера открыть какой-нибудь файл с соответственно настроенными permissons
Со специально настроенными - вы хотели сказать - Creator/Owner и конкретный аккаунт. А обычно филеи на компе имеют установленные права для Users, куда по умолчанию входят все пользователи домена.
Аватара пользователя
Аман Ванкуверский
Маньяк
Сообщения: 2759
Зарегистрирован: 18 окт 2005, 01:10

Сообщение Аман Ванкуверский »

Stanislav писал(а):
Аман Ванкуверский писал(а): "Как прежде" оно работать не будет, в чем Вы убедитесь при первой попытке этого юзера открыть какой-нибудь файл с соответственно настроенными permissons
Со специально настроенными - вы хотели сказать - Creator/Owner и конкретный аккаунт. А обычно филеи на компе имеют установленные права для Users, куда по умолчанию входят все пользователи домена.
BMHATK. Не вижу смысла продолжать разговор
Ответить