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

start [/forum/topic.php?fid=16&mobile=1&tid=1343362]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
186ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 486ms |

| 0 / 0 |
