оживить раздел пара старых задачек:
1. есть linked list (N->N->N->...). нужно не используя вложенных циклов определить не является ли этот list циклическим.
2. (решается одинаковым с 1 принципом) есть не циклический linked list. используя только один цикл (не используя вложенных) найти середину списка.
как вариант 2 - найти 1/3 или 2/3 от начала списка
задачка для программистов (linked list)
-
- Уже с Приветом
- Posts: 753
- Joined: 18 Sep 2000 09:01
- Location: Fremont, CA
-
- Уже с Приветом
- Posts: 1906
- Joined: 14 Mar 2001 10:01
задачка для программистов (linked list)
<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>
Может я чего-то не понял - но при чём тут волженные циклы?
Определить, циклический список или нет можно, просто пройдясь его от головы до хвоста и сравнивая адреса элементов с головой.
Во второй задаче сначала подсчитать элементы, пройдясь по списку, а на втором проходе отсчитать нужное кол-во.
Не, наверное я всё-таки не так чего-то понял...
<strong>оживить раздел пара старых задачек:
1. есть linked list (N->N->N->...). нужно не используя вложенных циклов определить не является ли этот list циклическим.
2. (решается одинаковым с 1 принципом) есть не циклический linked list. используя только один цикл (не используя вложенных) найти середину списка.
как вариант 2 - найти 1/3 или 2/3 от начала списка</strong><hr></blockquote>
Может я чего-то не понял - но при чём тут волженные циклы?
Определить, циклический список или нет можно, просто пройдясь его от головы до хвоста и сравнивая адреса элементов с головой.
Во второй задаче сначала подсчитать элементы, пройдясь по списку, а на втором проходе отсчитать нужное кол-во.
Не, наверное я всё-таки не так чего-то понял...
-
- Уже с Приветом
- Posts: 753
- Joined: 18 Sep 2000 09:01
- Location: Fremont, CA
задачка для программистов (linked list)
<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].
<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].
-
- Уже с Приветом
- Posts: 2278
- Joined: 02 Jan 2001 10:01
- Location: MSK; NJ; MA; UAE, Chicago
задачка для программистов (linked list)
Первая:
Пройтись двумя указателями. Одним идти попорядку, другим прыгать через элемент. Если станут равны - циклический.
Вторая - то же самое. Только когда второй остановится первый будет указывать на середину. (соответственно с 1/3 и 2/3).
Пройтись двумя указателями. Одним идти попорядку, другим прыгать через элемент. Если станут равны - циклический.
Вторая - то же самое. Только когда второй остановится первый будет указывать на середину. (соответственно с 1/3 и 2/3).
-
- Уже с Приветом
- Posts: 242
- Joined: 03 Jan 2000 10:01
- Location: TX > MA/NH > NJ/NYC
задачка для программистов (linked list)
<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>
<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>
-
- Уже с Приветом
- Posts: 577
- Joined: 19 Oct 2000 09:01
- Location: Kiev, Ukraine -> Boston, MA -> Minneapolis, MN -> Exton, PA
задачка для программистов (linked list)
[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] может, я просто задачу не понял?
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] может, я просто задачу не понял?
-
- Уже с Приветом
- Posts: 242
- Joined: 03 Jan 2000 10:01
- Location: TX > MA/NH > NJ/NYC
задачка для программистов (linked list)
<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 - натуральные бло... хм то есть числа натуральные.
<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 - натуральные бло... хм то есть числа натуральные.