задачка для программистов (linked list)

и задачки для интервью.
User avatar
sttranik
Уже с Приветом
Posts: 753
Joined: 18 Sep 2000 09:01
Location: Fremont, CA

задачка для программистов (linked list)

Post by sttranik »

оживить раздел пара старых задачек:

1. есть linked list (N->N->N->...). нужно не используя вложенных циклов определить не является ли этот list циклическим.

2. (решается одинаковым с 1 принципом) есть не циклический linked list. используя только один цикл (не используя вложенных) найти середину списка.

как вариант 2 - найти 1/3 или 2/3 от начала списка
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

задачка для программистов (linked list)

Post by Vovka »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by sttranik:
<strong>оживить раздел пара старых задачек:

1. есть linked list (N->N->N->...). нужно не используя вложенных циклов определить не является ли этот list циклическим.

2. (решается одинаковым с 1 принципом) есть не циклический linked list. используя только один цикл (не используя вложенных) найти середину списка.

как вариант 2 - найти 1/3 или 2/3 от начала списка</strong><hr></blockquote>

Может я чего-то не понял - но при чём тут волженные циклы?

Определить, циклический список или нет можно, просто пройдясь его от головы до хвоста и сравнивая адреса элементов с головой.

Во второй задаче сначала подсчитать элементы, пройдясь по списку, а на втором проходе отсчитать нужное кол-во.

Не, наверное я всё-таки не так чего-то понял...
User avatar
sttranik
Уже с Приветом
Posts: 753
Joined: 18 Sep 2000 09:01
Location: Fremont, CA

задачка для программистов (linked list)

Post by sttranik »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Vovka:
<strong>Определить, циклический список или нет можно, просто пройдясь его от головы до хвоста и сравнивая адреса элементов с головой.</strong><hr></blockquote>
список может зацикливаться не на голову.
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr><strong>
Во второй задаче сначала подсчитать элементы, пройдясь по списку, а на втором проходе отсчитать нужное кол-во.
</strong><hr></blockquote>
да, немного недосказал условие. нужно сделать за [b:36fcf198d2]один[/b:36fcf198d2] проход, [b:36fcf198d2]без вложенных циклов[/b:36fcf198d2].
User avatar
GShapiev
Уже с Приветом
Posts: 2278
Joined: 02 Jan 2001 10:01
Location: MSK; NJ; MA; UAE, Chicago

задачка для программистов (linked list)

Post by GShapiev »

Первая:
Пройтись двумя указателями. Одним идти попорядку, другим прыгать через элемент. Если станут равны - циклический.

Вторая - то же самое. Только когда второй остановится первый будет указывать на середину. (соответственно с 1/3 и 2/3).
Drom
Уже с Приветом
Posts: 242
Joined: 03 Jan 2000 10:01
Location: TX > MA/NH > NJ/NYC

задачка для программистов (linked list)

Post by Drom »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by GShapiev:
<strong>Первая:
Пройтись двумя указателями. Одним идти попорядку, другим прыгать через элемент. Если станут равны - циклический.

</strong><hr></blockquote>

мое первое поползновение было добавлять к 1 указателю 2^N, а вторым пробегать до позиции +2^N, сравнивая:
p1=1, p2=2,
p1=2, p2=3..4
p1=4, p2=5..8 ...

кстати, кто может оценить какое отношениые скоростей оптимально: например список из 2^10 элементов и последний показывает на случайно выбранный (равномерно) элемент из середины.

<занудка1>
только не "перепрыгивать", а просто двигаться с разными скоростями (2:1, 3:1) - иначе нужно добавлять специальный код чтобы не проскочить медленный указатель.
</занудка1>

<занудка2>
для 1/3 и 2/3 списка лучше идти сразу тремя указателями со скоростью 3:2:1
</занудка2>
Andy77
Уже с Приветом
Posts: 577
Joined: 19 Oct 2000 09:01
Location: Kiev, Ukraine -> Boston, MA -> Minneapolis, MN -> Exton, PA

задачка для программистов (linked list)

Post by Andy77 »

[b:10a51ace39]мое первое поползновение было добавлять к 1 указателю 2^N, а вторым пробегать до позиции +2^N, сравнивая:
p1=1, p2=2,
p1=2, p2=3..4
p1=4, p2=5..8 ...
[/b:10a51ace39]

Ваше первое поползновение [img:10a51ace39]images/smiles/icon_smile.gif[/img:10a51ace39] имеет сложность n*n, в то время как сложность решения GShapiev - линейна.

[b:10a51ace39]кстати, кто может оценить какое отношениые скоростей оптимально: например список из 2^10 элементов и последний показывает на случайно выбранный (равномерно) элемент из середины.[/b:10a51ace39]

см. выше. 2^10 - достаточно большое число...

[b:10a51ace39]
только не "перепрыгивать", а просто двигаться с разными скоростями (2:1, 3:1) - иначе нужно добавлять специальный код чтобы не проскочить медленный указатель.
[/b:10a51ace39]

GShapiev написал всё правильно, а вот Ваше решение, похоже, страдает - Вам не кажется, что при скоростях 2, 3 мы просто не будем попадать на определённые элементы?

[img:10a51ace39]images/smiles/icon_confused.gif[/img:10a51ace39] может, я просто задачу не понял?
Drom
Уже с Приветом
Posts: 242
Joined: 03 Jan 2000 10:01
Location: TX > MA/NH > NJ/NYC

задачка для программистов (linked list)

Post by Drom »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>
<strong>
Ваше первое поползновение [img:772f838ff9]images/smiles/icon_smile.gif[/img:772f838ff9] имеет сложность n*n, в то время как сложность решения GShapiev - линейна.
</strong><hr></blockquote>
не, оно тоже линейно. как только p1 залезет в петлю и одновременно будет больше длины этой петли - тут и наступит конец.

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Andy77:
<strong>
GShapiev написал всё правильно, а вот Ваше решение, похоже, страдает - Вам не кажется, что при скоростях 2, 3 мы просто не будем попадать на определённые элементы?
</strong><hr></blockquote>
кажется.
у нас просто термины разные. для меня:
"прыгать" - сравнивать на шаге N элементы N c 2N,
"разные скорости" - сравнивать (N c 2N) и (N c 2N+1)

причем я теперь уже совсем не уверен, что в случае 2:1 прыгать не стоит [img:772f838ff9]images/smiles/icon_sad.gif[/img:772f838ff9] sorry


people, кто-нибудь теорчел помнит? можно определить для каких N при любых p, L существует q: (p+q) mod L = (Nq) mod L (?) N, p, q, L - натуральные бло... хм то есть числа натуральные.

Return to “Головоломки”