powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Экзаменационная задача
19 сообщений из 19, страница 1 из 1
Экзаменационная задача
    #36919293
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗадачаЕсть связный список неизвестной размерности. В этом списке возможно есть цикл. Требуется сочинить алгоритм проверяющий есть цикл или нет.
Изменять реализацию списка и его нод нельзя.
Можно создать дополнительную внешнюю структуру с количеством элементов не больше чем размер списка.

Вопрос: существует ли реалистичный алгоритм с быстродействием O(N)?
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919311
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Эммм
Не понятно
White Owl
Есть связный список неизвестной размерности

В смысле не извесно сколько элементов в списке ?

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

Пусть доп внешняя структура - это список - имеет следующие поля:
1) Адрес следующего элемента в оригинальном списке - next_orig
2) Адрес след элемента. - next ( как и в обычном списке для связности )
3) Индекс текущего элемента - i

Алгоритм:
Для каждого элемента из оригинального списка
- Если поле адреса след элемента == NULL
то нет в этом списке циклов. Выход из цыкла.
- Иначе Если поле адреса след элемента < Колличество элементов в доп структурке
то цикл есть. Выход из цикла
- Иначе в доп структуру добавляем новый элемент, такой что
next_orig = Адрес след элемента из оригинально списка
i = Колличество элементов в доп структурке
В оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке
Колличество элементов в доп структурке инкрементируем на 1.
Конец цикла

Выполняем востановление адресов в оригинальном списке.
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919407
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, прошу прощения, там конечно должно быть "неизвестного размера".
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919421
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для односвязного списка можно без дополнительных структур, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool HasLoop(Node top) {
  Node a,b;
  a=top;
  if (a==NULL) return false;
  b = a.next;
  while (b!=a && b!=NULL) {
    a=a.next;
    b=b.next;
    if(b==NULL) break;
    b=b.next;
  }
  return b==a;
}
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919609
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗадачаИзменять реализацию списка и его нод нельзя.
clihltВ оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке...
Выполняем востановление адресов в оригинальном списке.Тут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма.
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919807
Берлuнгер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю, что список -- Н-мерный, количество элементов которого неизвестны?
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919814
Берлuнгер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечЗадачаИзменять реализацию списка и его нод нельзя.
clihltВ оригинальный список в поле адреса след элемента проставляем Колличество элементов в доп структурке...
Выполняем востановление адресов в оригинальном списке.Тут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма.
подозреваю, что нет...

либо искать цикл всякими графами, либо рекурсиями пытатся зациклится... в любом случае задача не есть легкая... в случае рекурсий. в любом случае нужна дополнительная память...
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919839
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Берлuнгеря так понимаю, что список -- Н-мерный, количество элементов которого неизвестны?Скорее всего, обычный линейный список (односвязный), у которого next последнего узла может быть null или указывать на любой узел (будет цикл).
К тому же неизвестно, задача для С++ или нет (к примеру в С# нет доступа к числовому представлению адреса - доп. ограничение).
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919852
Берлuнгер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечБерлuнгеря так понимаю, что список -- Н-мерный, количество элементов которого неизвестны?Скорее всего, обычный линейный список (односвязный), у которого next последнего узла может быть null или указывать на любой узел (будет цикл).
К тому же неизвестно, задача для С++ или нет (к примеру в С# нет доступа к числовому представлению адреса - доп. ограничение).
если линейный, то решается обычным проходом (быстрее все равно не получится)
но судя по "список неизвестной размерности" -- возможно речь идет именно о неизвестном количестве ветвей в узле...
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36919892
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЗадачаЕсть связный список неизвестной размерности. В этом списке возможно есть цикл. Требуется сочинить алгоритм проверяющий есть цикл или нет.
Изменять реализацию списка и его нод нельзя.
Можно создать дополнительную внешнюю структуру с количеством элементов не больше чем размер списка.

Вопрос: существует ли реалистичный алгоритм с быстродействием O(N)?
Задача древняя, как мир, где-то уже постилась на этом форуме.
Одно из решений:
1. Создаются два итератора (назовем их быстрый и медленный).
2. Медленный выставляется на начало списка, быстрый - на элемент, следующий зан им.
3. Порверяем, равны ли друг другу элементы, на которые указывают итераторы.
Если да, то цикл существует.
Если нет, продвигаем быстрый итератор на 2 элемента вперед, медленный - на 1 элемент вперед.
4. Вернуться к п. 3.
Пример реализации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
(defun getCycleIt (src)
    (declare (list src))
    (loop for slowP = src then (cdr slowP)
        for fastP = (cdr src) then (cddr fastP)
        until (endp fastP)
        do (if (eq (car slowP) (car fastP))
            (return t)
            )
        )
    )
)
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921103
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneДля односвязного списка можно без дополнительных структур, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool HasLoop(Node top) {
  Node a,b;
  a=top;
  if (a==NULL) return false;
  b = a.next;
  while (b!=a && b!=NULL) {
    a=a.next;
    b=b.next;
    if(b==NULL) break;
    b=b.next;
  }
  return b==a;
}
Мило, но быстродействие будет намного хуже чем у самого примитивного алгоритма с O(N^2).
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921108
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечТут надо уточнить у ТС, можно ли менять исходный список на время выполнения алгоритма.В исходном тексте есть запрет на изменение структуры, изменение данных в оригинальном списке явно запрещено не было. Так что clihit пока лидирует :)
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921137
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так:Мило, но быстродействие будет намного хуже чем у самого примитивного алгоритма с O(N^2).Нет, беру свои слова обратно. С итераторами получается в пределах O(N).
Итераторы могут в принципе сделать пару кругов по кольцу, но в максимуме это будет a+2b, где a+b=N. То есть O(N) выполняется.
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921149
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool HasLoop(Node top) {
  Node a,b;
  a=top;
  if (a==NULL) return false;
  b = a.next;
  while (b!=a && b!=NULL) {
    a=a.next;
    b=b.next;
    if(b==NULL) break;
    b=b.next;
  }
  return b==a;
}
Мило, но быстродействие будет намного хуже чем у самого примитивного алгоритма с O(N^2).
А по-моему, сложность линейна. Переменная b пробежится по петле не более двух раз.
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921159
Берлuнгер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlBarloneДля односвязного списка можно без дополнительных структур, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool HasLoop(Node top) {
  Node a,b;
  a=top;
  if (a==NULL) return false;
  b = a.next;
  while (b!=a && b!=NULL) {
    a=a.next;
    b=b.next;
    if(b==NULL) break;
    b=b.next;
  }
  return b==a;
}
Мило, но быстродействие будет намного хуже чем у самого примитивного алгоритма с O(N^2).
ЩИТО ?

тут быстродействие (точнее не быстродействие, а сложность) - O(N*2)
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921161
Берлuнгер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле линейный цикл неинтересно искать (есть чоткий алгоритм).

вопрос -- как искать на дереве с произвольным числом узлов в сети без изменения элементов
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921285
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Берлuнгер O(N*2)
это и есть O(N)
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921715
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык, тупо создаём хеш-таблицу для хранения посещенных узлов, и далее при проходе (все равно как - хоть линейный список, хоть граф со многими ветвями) проверяем наличие в хеше за O(1): прекращаем если есть (цикл!), или добавляем в хеш и идем дальше.
O(N), не?
...
Рейтинг: 0 / 0
Экзаменационная задача
    #36921929
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMдык, тупо создаём хеш-таблицу для хранения посещенных узлов, и далее при проходе (все равно как - хоть линейный список, хоть граф со многими ветвями) проверяем наличие в хеше за O(1): прекращаем если есть (цикл!), или добавляем в хеш и идем дальше.
O(N), не?
Ну это смотря как проходить.
A->B
A->C
B->C
Вроде не цикл. Но если сначала занесли в хеш A, потом B и C, а дальше смотрим, что из B ссылка на C, который уже в хеше, и что?

Надо делать поиск в глубину, и при входе добавлять в хеш, а при выходе из хеша удалять.

Только O(N) никак не получится - может быть N^2 ветвей.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Экзаменационная задача
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]