Definições: Seja um DAG sem auto-loops e e sejam gráficos.
Entrada: . Saída: A composição relacional composição relacional em .
- Caso 1:. Dois para loops acima de e : Tempo de execução .
- Caso 2:
- Desenhe o gráfico : . Chamamos arestas de preto e de vermelho.
- Classifique-o topologicamente (Kahn: ). Deixe o primeiro nível ser , e as arestas vão de um nível para um nível mais alto.
- Desenhe este gráfico duas vezes.
- Na primeira cópia, remova todas as bordas vermelhas que começam no nível par e todas as bordas pretas que começam no nível ímpar: .
- Na segunda cópia, remova cada "par preto" e "ímpar vermelho": .
- Para a primeira cópia:
- para todos os nós no nível
- para todos os nós no nível
- borda do relatório (Tempo de execução ).
- Para a segunda cópia: O mesmo para " ".
- União os nós relatados, elimine duplicatas (espero que a representação gráfica permita isso).
Alguns de vocês poderiam examinar meu algoritmo e verificar se
- isso está correto
- está em
Se estiver correto, meu algoritmo já "existe"? Caso contrário, você poderia fornecer uma alternativa? Aceito a primeira resposta, mas voto a favor se mais algumas pessoas tiverem a gentileza de verificar.
EDIT: Etapa 6 Parece estar em às vezes. Eu gostaria que isso não fosse verdade. Alguém tem um algoritmo de trabalho?
O Teorema 2.29 na página 60 da Teoria da Análise de Sippu e Soisalon-Soininen fornece um algoritmo para calcular (entre outras operações sobre relações) a composição de duas relações. O algoritmo é executado no tempo , em que é o tempo necessário para executar operações de união ou atribuição em conjuntos de vértices. O resultado dessa operação é um conjunto de vértices por vértice representando seus vizinhos. Esse algoritmo funciona em gráficos arbitrários, não apenas acíclicos.O(t(|V|+|E|)) t
fonte