|
|
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
Есть класс Item, у него поле/свойство Next - ссылка на объект того же типа Item. То есть имеем связанный список, если у очередного элемента Next=null, то это конец списка. На входе объект A класса Item, на выходе ответ, есть ли у списка, начинающегося с элемента A, конец или нет, то есть проверка на зацикленность. Интересует наиболее оптимальное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 09:11:37 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
отмечать все элементы, которые уже прошли. петля я понимаю может быть любой - хоть "Ъ" 4 8 15 16 23 42 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 09:39:41 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
Я так полагаю, что потребуется память, способная запомнить ссылки на все объекты, потому что зацикливание может произойти где угодно и куда угодно. Если их можно упорядочить как-то (по адресу, например), то проверка на присутствие в списке такой ссылки будет быстрой, а если нет - тогда с каждой новой ссылкой придется просматривать весь список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 09:45:03 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
Aklinотмечать все элементы, которые уже прошли. петля я понимаю может быть любой - хоть "Ъ" да, петля произвольная, отмечать внутри объекта не получится, у него нет свойства/поля такого у меня получился двойной цикл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 09:48:51 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
Может это и не к месту, но приведу такой пример: Есть дерево и все его элементы в одной таблице. Создавая новую ветку, создаем массив из Parent-ов этой ветки подымаясь вверх до 0 (корень). Далее тестируем связь новой ветки (т.е. в вашем случае Next) на вхождение в этот массив. Если входит, то цикл. Если нет, то ветку можно создавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 11:46:01 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
Naf, Оптимальное по чему? По скорости или по памяти? Если по скорости, то дополнительная хэш таблица, в котрой будут храниться все посещенные объекты. Если по памяти, то есть классический алгоритм, когда по списку пускаем 2 указателя, один за шаг переходит на 1 элемент вперед, 2-й - на 2 элемента вперед. При проходе 2-м проверяем, если он указывает на тот-же объект, что и первый - значит цикл есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 15:23:07 |
|
||
|
Проверка на зацикленность
|
|||
|---|---|---|---|
|
#18+
donkyNaf, Оптимальное по чему? По скорости или по памяти? Если по скорости, то дополнительная хэш таблица, в котрой будут храниться все посещенные объекты. Если по памяти, то есть классический алгоритм, когда по списку пускаем 2 указателя, один за шаг переходит на 1 элемент вперед, 2-й - на 2 элемента вперед. При проходе 2-м проверяем, если он указывает на тот-же объект, что и первый - значит цикл есть. точно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2009, 15:41:30 |
|
||
|
|

start [/forum/topic.php?fid=16&tid=1344159]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
226ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 567ms |

| 0 / 0 |
