Обнаружение цикла с заданными строками

#algorithm #hashtable #doubly-linked-list #np-hard

#алгоритм #хеш-таблица #двусвязный список #np-жесткий

Вопрос:

Я хотел бы обнаружить «полный цикл». Предположим, что списки подключаемы, если первое значение списка равно конечному значению другого списка. Например, у нас может быть 5 списков, как показано ниже.

 a1 = [1, 14, 0]
a2 = [2, 14, 3]
a3 = [0, 14, 2]
a4 = [3, 14, 1]
a5 = [0, 14, 3]
 

где a1, a3, a2 и a4 могут быть соединены друг с другом, образуя «полный цикл», поскольку a4 и a1 также могут быть соединены. Таким образом, результат должен быть [a1, a3, a2, a4].

(Это выглядело так, как если бы это была NP-сложная задача, но я думаю, что я ошибался!) Я пробовал такие решения, как двусвязный список или хеш-таблица, но это каким-то образом оказалось рекурсивным программированием, в котором я ужасен и не очень успешен.

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

Комментарии:

1. Это совсем не сложно. Найдите «обнаружение цикла в ориентированном графе». Ваши ребра — это просто списки, например a1 = [1, 14, 0] . указывает ребро от узла 1 до узла 0.

2. @orlp Спасибо за ваш ответ. Я должен был спросить здесь раньше. Это выглядело как NP-hard, я думаю, я был неправ.

Ответ №1:

Это не NP-сложно. Концептуально эта проблема известна как «обнаружение цикла» и является частью теории графов.

Если вы хотите увидеть кодовые подходы к обнаружению цикла, вот достойный учебник для начинающих:

https://www.tutorialspoint.com/Detect-Cycle-in-a-an-Undirected-Graph

https://www.techiedelight.com/check-undirected-graph-contains-cycle-not

Если бы эта проблема была NP-сложной, мы не смогли бы выполнять множество относительно важных вещей, таких как вычисления зависимостей и обнаружение циклических ссылок.

Комментарии:

1. Спасибо за ваш ответ и ссылку. Я должен был спросить здесь раньше! Мне пришлось потратить на это уже два дня. Это выглядело так, как будто это было NP-сложно, я думаю, что я ошибаюсь.