|
|
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
ЗадачаЕсть связный список неизвестной размерности. В этом списке возможно есть цикл. Требуется сочинить алгоритм проверяющий есть цикл или нет. Изменять реализацию списка и его нод нельзя. Можно создать дополнительную внешнюю структуру с количеством элементов не больше чем размер списка. Вопрос: существует ли реалистичный алгоритм с быстродействием O(N)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 01:34 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
White Owl, Эммм Не понятно White Owl Есть связный список неизвестной размерности В смысле не извесно сколько элементов в списке ? Если так то, т.к. в условии не сказано сколькосвязный список предположим что он односвязный. Пусть доп внешняя структура - это список - имеет следующие поля: 1) Адрес следующего элемента в оригинальном списке - next_orig 2) Адрес след элемента. - next ( как и в обычном списке для связности ) 3) Индекс текущего элемента - i Алгоритм: Для каждого элемента из оригинального списка - Если поле адреса след элемента == NULL то нет в этом списке циклов. Выход из цыкла. - Иначе Если поле адреса след элемента < Колличество элементов в доп структурке то цикл есть. Выход из цикла - Иначе в доп структуру добавляем новый элемент, такой что next_orig = Адрес след элемента из оригинально списка i = Колличество элементов в доп структурке В оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке Колличество элементов в доп структурке инкрементируем на 1. Конец цикла Выполняем востановление адресов в оригинальном списке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 02:07 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Ой, прошу прощения, там конечно должно быть "неизвестного размера". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 06:44 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Для односвязного списка можно без дополнительных структур, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 07:22 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
ЗадачаИзменять реализацию списка и его нод нельзя. clihltВ оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке... Выполняем востановление адресов в оригинальном списке.Тут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:51 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
я так понимаю, что список -- Н-мерный, количество элементов которого неизвестны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:56 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Яростный МечЗадачаИзменять реализацию списка и его нод нельзя. clihltВ оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке... Выполняем востановление адресов в оригинальном списке.Тут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма. подозреваю, что нет... либо искать цикл всякими графами, либо рекурсиями пытатся зациклится... в любом случае задача не есть легкая... в случае рекурсий. в любом случае нужна дополнительная память... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 10:59 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Берлuнгеря так понимаю, что список -- Н-мерный, количество элементов которого неизвестны?Скорее всего, обычный линейный список (односвязный), у которого next последнего узла может быть null или указывать на любой узел (будет цикл). К тому же неизвестно, задача для С++ или нет (к примеру в С# нет доступа к числовому представлению адреса - доп. ограничение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:06 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Яростный МечБерлuнгеря так понимаю, что список -- Н-мерный, количество элементов которого неизвестны?Скорее всего, обычный линейный список (односвязный), у которого next последнего узла может быть null или указывать на любой узел (будет цикл). К тому же неизвестно, задача для С++ или нет (к примеру в С# нет доступа к числовому представлению адреса - доп. ограничение). если линейный, то решается обычным проходом (быстрее все равно не получится) но судя по "список неизвестной размерности" -- возможно речь идет именно о неизвестном количестве ветвей в узле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:10 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
White OwlЗадачаЕсть связный список неизвестной размерности. В этом списке возможно есть цикл. Требуется сочинить алгоритм проверяющий есть цикл или нет. Изменять реализацию списка и его нод нельзя. Можно создать дополнительную внешнюю структуру с количеством элементов не больше чем размер списка. Вопрос: существует ли реалистичный алгоритм с быстродействием O(N)? Задача древняя, как мир, где-то уже постилась на этом форуме. Одно из решений: 1. Создаются два итератора (назовем их быстрый и медленный). 2. Медленный выставляется на начало списка, быстрый - на элемент, следующий зан им. 3. Порверяем, равны ли друг другу элементы, на которые указывают итераторы. Если да, то цикл существует. Если нет, продвигаем быстрый итератор на 2 элемента вперед, медленный - на 1 элемент вперед. 4. Вернуться к п. 3. Пример реализации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 11:24 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
BarloneДля односвязного списка можно без дополнительных структур, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:07 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Яростный МечТут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма.В исходном тексте есть запрет на изменение структуры, изменение данных в оригинальном списке явно запрещено не было. Так что clihit пока лидирует :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:10 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так:Мило, но быстродействие будет намного хуже чем у самого примитивного алгоритма с O(N^2).Нет, беру свои слова обратно. С итераторами получается в пределах O(N). Итераторы могут в принципе сделать пару кругов по кольцу, но в максимуме это будет a+2b, где a+b=N. То есть O(N) выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:21 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А по-моему, сложность линейна. Переменная b пробежится по петле не более двух раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:24 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ЩИТО ? тут быстродействие (точнее не быстродействие, а сложность) - O(N*2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:28 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
на самом деле линейный цикл неинтересно искать (есть чоткий алгоритм). вопрос -- как искать на дереве с произвольным числом узлов в сети без изменения элементов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:30 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
Берлuнгер O(N*2) это и есть O(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 19:10 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
дык, тупо создаём хеш-таблицу для хранения посещенных узлов, и далее при проходе (все равно как - хоть линейный список, хоть граф со многими ветвями) проверяем наличие в хеше за O(1): прекращаем если есть (цикл!), или добавляем в хеш и идем дальше. O(N), не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:11 |
|
||
|
Экзаменационная задача
|
|||
|---|---|---|---|
|
#18+
XMдык, тупо создаём хеш-таблицу для хранения посещенных узлов, и далее при проходе (все равно как - хоть линейный список, хоть граф со многими ветвями) проверяем наличие в хеше за O(1): прекращаем если есть (цикл!), или добавляем в хеш и идем дальше. O(N), не? Ну это смотря как проходить. A->B A->C B->C Вроде не цикл. Но если сначала занесли в хеш A, потом B и C, а дальше смотрим, что из B ссылка на C, который уже в хеше, и что? Надо делать поиск в глубину, и при входе добавлять в хеш, а при выходе из хеша удалять. Только O(N) никак не получится - может быть N^2 ветвей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 09:17 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36919807&tid=1343362]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
451ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 799ms |

| 0 / 0 |
