Ao pesquisar gráficos, existem dois algoritmos fáceis: largura primeiro e profundidade primeiro (geralmente feito adicionando todos os nós gráficos auxiliares a uma fila (largura primeiro) ou pilha (profundidade primeiro)).
Agora, existem vantagens de um sobre o outro?
Os que eu conseguia pensar:
- Se você espera que seus dados estejam bem abaixo do gráfico, a profundidade pode ser encontrada mais cedo, pois você está indo para as partes mais profundas do gráfico muito rapidamente.
- Por outro lado, se você espera que seus dados estejam bem no gráfico, a amplitude pode fornecer o resultado mais cedo.
Há algo que eu perdi ou isso se resume principalmente à preferência pessoal?
Um ponto importante em nosso mundo multicore: o BFS é muito mais fácil de paralelizar. Isso é intuitivamente razoável (enviar threads para cada filho) e pode ser provado que é assim também. Portanto, se você tiver um cenário em que possa usar o paralelismo, o BFS é o caminho a seguir.
fonte
(Criei um wiki da comunidade. Sinta-se à vontade para editar.)
E se
Então
Razões para escolher
IDDFS = pesquisa aprofundada aprofundada iterativa - primeira
fonte
h
a "altura da árvore". Isso se traduz diretamente na "altura do gráfico"?Um cenário (além de encontrar o caminho mais curto, que já foi mencionado) em que você pode escolher um sobre o outro para obter um programa correto seria infinitos gráficos:
Se considerarmos, por exemplo, uma árvore em que cada nó tem um número finito de filhos, mas a altura da árvore é infinita, o DFS pode nunca encontrar o nó que você está procurando - ele continuará visitando o primeiro filho de cada nó que veja, portanto, se o que você procura não é o primeiro filho de seu pai, ele nunca chegará lá. BFS, no entanto, é garantido para encontrá-lo em tempo finito.
Da mesma forma, se considerarmos uma árvore em que cada nó tem um número infinito de filhos, mas a árvore tem uma altura finita, o BFS pode não terminar. Ele visitará apenas os filhos do nó raiz e, se o nó que você procura for filho de outro nó, ele não será alcançado. Nesse caso, é garantido que o DFS o encontre em tempo finito.
fonte
Largura primeiro e profundidade primeiro certamente têm o mesmo comportamento de pior caso (o nó desejado é o último encontrado). Eu suspeito que isso também seja verdade para o caso médio, se você não tiver informações sobre seus gráficos.
Um bom bônus da primeira pesquisa de largura é encontrar caminhos mais curtos (no sentido de menos arestas) que podem ou não ser interessantes.
Se a classificação média de nós (número de vizinhos) for alta em relação ao número de nós (ou seja, o gráfico é denso), a largura em primeiro lugar terá grandes filas, enquanto a profundidade em profundidade terá pequenas pilhas. Em gráficos esparsos, a situação é invertida. Portanto, se a memória é um fator limitante, o formato do gráfico em questão pode ter que informar sua escolha da estratégia de pesquisa.
fonte
Todas as opções acima estão corretas, mas é digno de nota que o BFS e o DFS criam suas próprias árvores, com base na ordem que eles usam para atravessar a árvore. Cada uma dessas árvores tem sua própria propriedade, que pode ser útil em algum tipo de problema.
Por exemplo, todas as arestas no gráfico original que não estão na árvore BFS são arestas transversais; arestas entre dois ramos da árvore BFS. Todas as arestas no gráfico original que não estão na árvore DFS são arestas traseiras; arestas que conectam dois vértices em uma ramificação da árvore DFS. Tais propriedades podem ser úteis para problemas como corantes especiais, etc.
fonte
A árvore DFS e BFS possui propriedades exclusivas que podem fornecer informações mais úteis sobre o gráfico. Por exemplo, com um único DFS, você pode fazer o seguinte:
Com o BFS, você pode encontrar os caminhos mais curtos entre o nó de origem e quaisquer outros nós no gráfico.
O capítulo Algoritmos de gráfico no CLRS resume essas propriedades do DFS e BFS muito bem.
fonte
Eu acho que seria interessante escrever os dois de uma maneira que somente alternando algumas linhas de código lhe desse um algoritmo ou outro, para que você veja que seu dillema não é tão forte quanto parece ser a princípio .
Pessoalmente, gosto da interpretação do BFS como inundação de uma paisagem: as áreas de baixa altitude serão inundadas primeiro e somente então as áreas de alta altitude se seguirão. Se você imaginar as altitudes da paisagem tão isoladas quanto os livros de geografia, é fácil ver que o BFS preenche toda a área sob o mesmo isoline ao mesmo tempo, assim como seria com a física. Assim, interpretar altitudes como distância ou custo escalonado fornece uma idéia bastante intuitiva do algoritmo.
Com isso em mente, você pode adaptar facilmente a ideia por trás da primeira pesquisa de largura para encontrar facilmente a árvore de abrangência mínima, o caminho mais curto e também muitos outros algoritmos de minimização.
Ainda não vi nenhuma interpretação intuitiva do DFS (apenas a padrão sobre o labirinto, mas não é tão poderosa quanto a do BFS e a inundação); portanto, para mim, parece que o BFS parece se correlacionar melhor com os fenômenos físicos, conforme descrito acima, enquanto O DFS se correlaciona melhor com o dillema de escolhas em sistemas racionais (ou seja, pessoas ou computadores decidindo qual mover-se em um jogo de xadrez ou sair de um labirinto).
Então, para mim, a diferença entre mentiras sobre qual fenômeno natural melhor combina com seu modelo de propagação (transversal) na vida real.
fonte