Eu queria saber quando alguém deve usar o algoritmo de Prim e quando Kruskal para encontrar a árvore de abrangência mínima? Ambos têm lógicas fáceis, os mesmos piores casos, e a única diferença é a implementação, que pode envolver estruturas de dados um pouco diferentes. Então, qual é o fator decisivo?
192
Encontrei um tópico muito bom na rede que explica a diferença de uma maneira muito direta: http://www.thestudentroom.co.uk/showthread.php?t=232168 .
O algoritmo de Kruskal desenvolverá uma solução a partir da borda mais barata, adicionando a próxima borda mais barata, desde que não crie um ciclo.
O algoritmo de Prim desenvolverá uma solução a partir de um vértice aleatório adicionando o próximo vértice mais barato, o vértice que não está atualmente na solução, mas conectado a ela pela aresta mais barata.
Aqui está anexada uma folha interessante sobre esse tópico.
Se você implementar o Kruskal e o Prim, em sua forma ideal: com um achado de união e um monte de finbonacci, respectivamente, observará como o Kruskal é fácil de implementar em comparação com o Prim.
Prim é mais difícil com um heap de fibonacci, principalmente porque você precisa manter uma tabela de contabilidade para registrar o link bidirecional entre nós do gráfico e nós do heap. Com um Union Find, é o contrário, a estrutura é simples e pode até produzir diretamente o mst quase sem custo adicional.
fonte
V-1
arestas.Eu sei que você não pediu isso, mas se você tiver mais unidades de processamento, sempre considere o algoritmo de Borůvka , porque ele pode ser facilmente paralelizado - portanto, ele tem uma vantagem de desempenho sobre o algoritmo Kruskal e Jarník-Prim.
fonte
O Kruskal pode ter melhor desempenho se as arestas puderem ser classificadas em tempo linear ou se já estiverem classificadas.
Prim é melhor se o número de arestas em vértices for alto.
fonte
Kruskal complexidade de tempo pior caso é O (E log E) , isto porque precisamos classificar as bordas. O pior caso de complexidade no horário inicial é O (E log V) com fila de prioridade ou, melhor ainda, O (E + V log V) com Fibonacci Heap . Devemos usar Kruskal quando o gráfico for esparso, com um pequeno número de arestas, como E = O (V), quando as arestas já estiverem classificadas ou se pudermos classificá-las em tempo linear. Devemos usar Prim quando o gráfico for denso, ou seja, o número de arestas é alto, como E = O (V²).
fonte
Se pararmos o algoritmo no meio, o algoritmo do prim sempre gera uma árvore conectada, mas o kruskal, por outro lado, pode gerar árvores ou florestas desconectadas
fonte
Uma aplicação importante do algoritmo de Kruskal está no cluster de link único .
Considere n vértices e você terá um gráfico completo.Para obter clusters ak desses n pontos, execute o algoritmo de Kruskal sobre as primeiras n- (k-1) arestas do conjunto de arestas classificadas. espaçamento.
fonte
O melhor horário para Kruskal é O (E logV). Para Prim usando pilhas de fibras, podemos obter O (E + V lgV). Portanto, em um gráfico denso, o Prim é muito melhor.
fonte
O Prim é melhor para gráficos mais densos, e nisso também não precisamos prestar muita atenção aos ciclos adicionando uma aresta, pois estamos lidando principalmente com nós. O Prim é mais rápido que o Kruskal no caso de gráficos complexos.
fonte
No algoritmo kruskal, temos número de arestas e número de vértices em um determinado gráfico, mas em cada aresta temos algum valor ou peso em nome do qual podemos preparar um novo gráfico que não deve ser cíclico ou não fechar de nenhum lado.
gráfico assim _____________ | | | | | | | __________ | | Dê nome a qualquer vértice a, b, c, d, e, f.
fonte