Топологическая сортировка в Python с элементами Моголов
Моголы правили Южной Азией около двух столетий и оказали огромное влияние на Индийский субконтинент. Один из таких примеров - Тадж-Махал. В этом блоге мы будем использовать генеалогическое древо империи Великих Моголов, чтобы понять топологическую сортировку в теории графов.
В теории графов топологическая сортировка - одна из самых интересных тем. В этом блоге будут рассмотрены теория топологической сортировки, реализация топологической сортировки в питоне, проблемы, которые решаются с помощью топологической сортировки, и забавные факты об империи Великих Моголов.
Топологическая сортировка, которая также известна как топологическое упорядочение в ориентированном ациклическом графе (DAG), - это линейное упорядочение вершин, такое что для каждого ребра UV от вершины U до вершины V U идет перед V в упорядочении.
Выполнение сортировки топологии на генеалогическом дереве с именами членов семьи в качестве вершин дерева приведет к тому, что сначала будет обрабатываться поколение 1 семейства, а затем поколение 2.
Направленный график, показанный выше, представляет собой обрезанное генеалогическое древо Моголов. Подробную информацию о семействе можно найти здесь. На приведенном выше графике вершина представляет имя члена семьи, а ребро представляет родительско-дочерние отношения между членами семьи. Вершины серого цвета представляют членов семьи, которые были императорами империи Великих Моголов.
Рассмотрим алгоритм реализации топологической сортировки,
- Инициализация структуры данных для определения графа:
Для топологической сортировки нам нужно инициализировать связь между вершинами (родитель-потомок) и степенью каждой вершины. Используя отношения родитель-потомок между вершинами, можно создать список смежности графа.
Независимость требуется для вывода зависимости между вершинами. Если вершина имеет нулевую степень степени, это означает, что в эту вершину нет входящего ребра и она не зависит от какой-либо другой вершины.
В коде для хранения графа и степени используется словарь. Его также можно представить как класс.
indegree = {i: 0 for i in vertices} graph = {i: [] for i in vertices}
- Заполнение степени и графа:
Из заданного набора ребер обновите словарь графа, указав список смежности и степень для каждой вершины.
for edge in edges: parent, child = edge[0], edge[1] graph[parent].append(child) indegree[child] += 1
- Добавление вершин с нулевой степенью в очередь:
Вершина с нулевой степенью не зависит от других вершин. Добавьте его в очередь для дальнейшей обработки.
sources = deque() for source, degree in indegree.items(): # store vertex with indegree zero if degree == 0: sources.append(source)
- Обработка вершин, добавленных в очередь:
Извлечь вершину из очереди и обработать все дочерние вершины извлеченной вершины. Дочерняя вершина добавляется в очередь, если степень становится равной нулю.
while sources: source = sources.popleft() sortedOrder.append(source) for child in graph[source]: # decrement indegree of child vertex indegree[child] -= 1 # if indegree is zero then add it to the queue if indegree[child] == 0: sources.append(child)
- Проверка наличия петель между вершинами:
Будет цикл, если вершина A зависит от вершины B, а вершина B зависит от вершины A, так что и вершина A, и вершина B всегда будут имеют степень 1 и никогда не будут обрабатываться топологической сортировкой. Циклы можно обнаружить, сравнив длину sorted_list и длину словаря графа. Если после выполнения топологической сортировки не все вершины добавлены в sorted_list, это означает, что несколько вершин имели степень, отличную от нуля, даже после удаления всех зависимостей.
if len(sortedOrder) != len(vertices): return list()
Ниже приведен код Python для топологической сортировки.
Вывод вышеуказанной программы:
Topological sort: ['Babur', 'Humayun', 'Askari', 'Akbar', 'Mirza', 'Jahangir', 'Daniyal', 'Shah Jahan', 'Khusrau', 'Aurangzeb', 'Murad']
Где использовать топологическую сортировку:
- Порядок вершин:
Это можно использовать для устранения зависимости между несколькими элементами. Например, установка пакетов, в которых один пакет является необходимым условием для установки другого пакета. - Нахождение петли на графике:
Это продолжение вышеупомянутой точки. Например, вершина A зависит от вершины B, вершина B зависит от вершины C, а вершина C зависит от вершины A. Это создает петлю между вершинами A, B и C. Для обнаружения таких петель можно использовать топологическую сортировку. В приведенном выше примере кода это достигается в строке №44.
Интересные факты об империи Великих Моголов
- Тадж-Махал был построен Шахом Джаханом и является одним из шедевров мирового наследия.
- Император Хумаюн был отстранен от власти, но он боролся вопреки всему, чтобы вернуть себе империю, что является большим уроком для всех. Преодолеть препятствия всегда можно упорным трудом.
- Император Акбар считался дислексиком.
P.S. Пример, обсуждаемый в этом блоге, также может быть решен с использованием BFS, потому что мы обрабатываем дерево (частный случай графа). Я выбрал топологическую сортировку, чтобы объяснить алгоритм.
Спасибо, что читаете блог. Надеюсь, он был вам полезен.