Algoritmo de classificação topológica

Algoritmo de classificação topológica
O algoritmo de classificação topológico funciona com o DAG (Gráfico aciclico direto). O significado do tipo topológico é que, se algum nó apontar para outro nó, então o nó que aponta para outro nó virá depois disso. Portanto, neste caso, se tivermos um gráfico cíclico, não podemos prever qual nó vem depois de qual nó. Então é por isso que o algoritmo de classificação topológico funciona apenas com o gráfico acíclico e não com o gráfico cíclico.

Cada gráfico tem mais de uma sequência de classificação topológica, porque depende do grau dentro das bordas dos nós. O primeiro nó inicial que escolhemos com um número de nós em grau é 0.

Vamos entender o algoritmo de classificação topológico com um exemplo.

Etapa 1: Inserimos os nós cuja contagem de borda de entrada é igual a 0. Então, esses nós são o nó 1 e o nó 4.

Passo 2:

a. Começamos com o nó 1. Podemos escolher qualquer nó entre o nó 1 e o nó 4.

b. Diminuímos cada borda do nó em 1, que está conectado ao nó 1. Estamos diminuindo a borda dos nós (0, 2 e 3).

c. Movemos o nó 1 da lista para a lista topologicamente classificada, como mostrado abaixo.

Etapa 3:

a. Agora prosseguimos da lista, que é o nó 4.

b. Dimigimos todas as bordas de saída dos nós conectados ao nó 4, que são nós (0 e 3).

c. Agora, o nó 3 não tem bordas de entrada, então o empurramos para a lista e o nó 4 turnos para a lista topologicamente classificada.

Passo 4:

a. Agora prosseguimos da lista, que é o nó 3.

b. Dimigimos todas as bordas de saída dos nós conectados ao nó 3, que são nós (0 e 2).

c. Agora, os nós 0 e o nó 2 não têm bordas de entrada, por isso o empurramos para a lista, e o nó 3 muda para a lista topologicamente classificada.

Etapa 5:

a. Agora prosseguimos da lista, que é o nó 0.

b. Como sem bordas de saída do nó 0, então simplesmente as adicionamos à lista de classificação topológica.

Etapa 6:

a. Agora prosseguimos da lista, que é o nó 2.

b. Como sem bordas de saída do nó 2, então simplesmente as adicionamos à lista de classificação topológica.

Etapa 7:

Finalmente, classificamos a lista aqui.

Algoritmo de classificação topológico

Abaixo são as etapas para o algoritmo de classificação topológico que temos que seguir.

Etapa 0: Calcule o grau dentro de cada nó do gráfico.

Etapa 1: Primeiro temos que encontrar um nó que tenha bordas de zero.

Etapa 2: removemos esse nó do gráfico e o adicionamos à lista de ordens de classificação topológicas.

Etapa 3: Remova os nós que têm bordas de saída.

Etapa 4: reduza o grau no número de bordas relacionadas que foram removidas.

Etapa 5: Repita as etapas 1-4 até que não haja nós com 0 em grau.

Etapa 6: verifique se todos os itens estão na sequência correta.

Etapa 7: agora, resolvemos o pedido da etapa 6.

Etapa 8: Coloque um fim no algoritmo.

Código Python: O abaixo é uma implementação do Python do exemplo acima.

FromCollectionImportDefaultDict
ClassBuildGraph:
def__init __ (self, nós: int):
auto.nós = nós
# Agora estamos armazenando o gráfico em formato de lista adjacente
auto.adjListDetails = defaultDict (lista)
# Ele armazena as informações sobre um nó específico recebido
# bordas em um gráfico
auto.count_numbers_of_incoming_edge_of_a_node = []
# Nós armazenamos os nós classificados em ordem topológica
auto.topological_sorted_order = []
# Nós armazenamos as informações de todos esses nós que não
# tem alguma bordas de entrada em um gráfico
auto.modes_have_zero_incoming_edges = []
# Agora estamos criando uma lista adjacente de todos os gráficos para classificar
DEFADDGRAPHEDGE (self, fonte: int, destino: int):
auto.adjListDetails [fonte].Anexar (destino)
auto.count_numbers_of_incoming_edge_of_a_node [destino] += 1
DeftopologicalSortalgorithm (self):
para o nó inlange (self.nós):
se você mesmo.count_numbers_of_incoming_edge_of_a_node [nó] == 0:
auto.Sodes_have_Zero_incoming_edges.Anexar (nó)
Whilesel.modes_have_zero_incoming_edges:
auto.Sodes_have_Zero_incoming_edges.organizar()
fonte = self.Sodes_have_Zero_incoming_edges.pop (0)
# iteração da lista adjacente
Se a fonte da fonte.adjListDetails:
para o nó insef.adjListDetails [fonte]:
auto.count_numbers_of_incoming_edge_of_a_node [nó] -= 1
se você mesmo.count_numbers_of_incoming_edge_of_a_node [nó] == 0:
auto.Sodes_have_Zero_incoming_edges.Anexar (nó)
auto.topological_sorted_order.Anexar (fonte)
impressão ("Ordem de classificação topológica:"+str (self.topological_sorted_order))
Defmain ():
número_of_nodes = 7
Graph = BuildGraph (number_of_nodes)
gráfico.count_numbers_of_incoming_edge_of_a_node = [0] *number_of_nodes
gráfico.AddGraphedge (0,2)
gráfico.AddGraphedge (0,5)
gráfico.AddGraphedge (1,3)
gráfico.AddGraphedge (1,6)
gráfico.AddGraphedge (2,4)
gráfico.AddGraphedge (3,5)
gráfico.AddGraphedge (5,2)
gráfico.AddGraphedge (5,4)
gráfico.AddGraphedge (6,2)
gráfico.TopologicalSortalgorithm ()
Se __name__ == "__ main__":
principal()

Saída:

Ordem de classificação topológica: [0, 1, 3, 5, 6, 2, 4]

Complexidade do tempo do algoritmo de classificação topológica:

O tempo total para processar o algoritmo é O (e + n), onde e representa o número de arestas e n representa o número de nós no gráfico. Então, na etapa seguinte, devemos calcular o nível interno de cada nó, que geralmente leva o (e) tempos, e depois colocar todos esses nós em uma lista classificada em que o seu grau é zero, o que leva o (n) vezes. Portanto, a complexidade total do tempo do algoritmo de classificação topológica é O (E+N).

Mas a complexidade do espaço do algoritmo de classificação topológica é O (n), que é o número total de nós no gráfico.

Aplicativo :

1. O tipo topológico é muito útil para encontrar o ciclo do gráfico.

2. O algoritmo de classificação topológico é usado para determinar as condições de impasse em um sistema operacional.

3. O algoritmo de classificação topológico é usado para encontrar o caminho mais curto em um gráfico acíclico ponderado.

Conclusão:

Este artigo aprendeu sobre mais um algoritmo importante, classificação topológica. Vimos que esse algoritmo só funciona com gráficos aciclicos. O algoritmo de classificação topológico também ajuda a determinar a ordem de compilação de tarefas. O algoritmo de classificação topológico tem muitas vantagens em tempo real, como encontrar o caminho mais curto. Como o tipo topológico é extremamente útil, todo programador e aluno devem entender completamente esse algoritmo.