Largura Primeiro Vs Profundidade Primeiro DoCow
algoritmo largura primeiro pesquisa profundidade primeira busca tree travessia
Como escolher múltiplos commits Por que o SetWindowsHookEx deve ser usado com uma fila de mensagens do Windows? node.js – pedidos http fáceis com compactação gzip / deflate Como canalizar stderr e não stdout? É possível enviar um stit git para um repository remoto? Os parâmetros de modelo de um construtor podem ser explicitamente especificados? Criando Tarefas Agendadas Desenhe a imagem de sobreposição semi-transparente em toda a forma de janelas com alguns controles OdbcConnection retornando caracteres chineses como "?" Substituir parte de uma string por outra string Como a opção de debugging -g altera o executável binário? Injetar um EJB no JAX-RS (serviço RESTful) Registros do Oracle SELECT TOP 10 Uma condição de loop baseada em intervalo do C ++ 11 é avaliada a cada ciclo? Como atualizar uma declaração no ASP.NET Identity?
Esses dois termos diferenciam entre duas maneiras diferentes de andar em uma tree.
É provavelmente mais fácil apenas exibir a diferença. Considere a tree:
Um primeiro percurso de profundidade visitaria os nós nesta ordem
Observe que você percorre todo o caminho até uma perna antes de seguir em frente.
Uma passagem em largura primeiro visitaria o nó nessa ordem
Aqui nós trabalhamos em todos os níveis antes de descer.
(Note que há alguma ambigüidade nas ordens de travessia, e eu trapaceei para manter a ordem de "leitura" em cada nível da tree. Em qualquer caso eu poderia chegar a B antes ou depois de C, e da mesma forma eu poderia chegar a E antes ou depois de F. Isso pode ou não importar, depende da sua aplicação …)
Ambos os tipos de travessia podem ser alcançados com o pseudocódigo:
A diferença entre as duas ordens de percurso está na escolha do Container .
Para profundidade primeiro use uma pilha. (A implementação recursiva usa a pilha de chamadas …)
Para o primeiro uso, use uma fila.
A implementação recursiva parece
A recursion termina quando você alcança um nó que não tem filhos, portanto, é garantido que ele termine para charts finitos e acíclicos.
Neste ponto, eu ainda trapaceei um pouco. Com um pouco de inteligência, você também pode trabalhar nos nós nesta ordem:
que é uma variação de profundidade primeiro, onde eu não faço o trabalho em cada nó até que eu esteja andando de volta até a tree. No entanto, visitei os nós superiores no caminho para encontrar seus filhos.
Essa travessia é bastante natural na implementação recursiva (use a linha "Tempo alternativo" acima, em vez da primeira linha "Trabalho"), e não muito difícil se você usar uma pilha explícita, mas deixarei como um exercício.
Esta imagem deve dar-lhe a ideia sobre o contexto em que as palavras largura e profundidade são usadas.
Pesquisa de Profundidade-Primeiro:
O algoritmo de busca em profundidade age como se quisesse ficar o mais longe possível do ponto de partida o mais rápido possível.
Geralmente, ele usa um Stack para lembrar onde deve ir quando atinge um beco sem saída.
Regras a seguir: Empurre o primeiro vértice A para a Stack
Se possível, visite um vértice não visitado adjacente, marque-o como visitado e empurre-o na pilha.
Se você não puder seguir a Regra 1, se possível, retire um vértice da pilha.
Se você não puder seguir a Regra 1 ou Regra 2, estará pronto.
Aplicações : Pesquisas em profundidade são frequentemente usadas em simulações de jogos (e situações de jogo no mundo real). Em um jogo típico, você pode escolher uma das várias ações possíveis. Cada escolha leva a novas escolhas, cada uma das quais leva a novas escolhas, e assim por diante, em um gráfico de possibilidades em forma de tree em constante expansão.
Pesquisa de largura de canal:
O algoritmo de pesquisa abrangente gosta de ficar o mais próximo possível do ponto de partida.
Esse tipo de pesquisa geralmente é implementado usando uma Queue .
Regras a seguir: Tornar o início do Vertex A o vértice atual
Visite o próximo vértice não visitado (se houver um) adjacente ao vértice atual, marque-o e insira-o na fila.
Se você não puder executar a Regra 1 porque não há mais vértices não visitados, remova um vértice da fila (se possível) e torne-o o vértice atual.
Se você não puder executar a regra 2 porque a fila está vazia, está feito.
Aplicações : A pesquisa em largura primeiro encontra todos os vértices que estão a uma distância do ponto inicial, depois todos os vértices que estão a duas arestas distantes e assim por diante. Isso é útil se você estiver tentando encontrar o caminho mais curto do vértice inicial para um dado vértice.
Espero que isso seja suficiente para entender as buscas de Breadth-First e Depth-First. Para ler mais, recomendo o capítulo Gráficos de um excelente livro de estruturas de dados de Robert Lafore.
Eu acho que seria interessante escrever os dois de uma forma que apenas trocando algumas linhas de código você daria um algoritmo ou outro, de modo que você veria que seu dillema não é tão forte quanto parece ser a princípio .
Eu pessoalmente gosto da interpretação do BFS como inundar uma paisagem: as áreas de baixa altitude serão inundadas primeiro, e somente então as áreas de alta altitude seguiriam. Se você imaginar as altitudes da paisagem como isolinhas, como vemos nos livros de geografia, é fácil ver que o BFS preenche toda a área sob a mesma isolinha ao mesmo tempo, assim como isso seria com a física. Assim, interpretar altitudes como distância ou custo escalado dá uma ideia bastante intuitiva do algoritmo.
Com isso em mente, você pode adaptar facilmente a ideia por trás da primeira pesquisa para encontrar a tree geradora mínima, o caminho mais curto e também muitos outros algoritmos de minimização.
Eu ainda não vi nenhuma interpretação intuitiva do DFS (apenas o padrão sobre o labirinto, mas não é tão poderoso quanto o BFS e inundações), então para mim parece que o BFS parece se correlacionar melhor com fenômenos físicos como descrito acima, enquanto O DFS se correlaciona melhor com o dilema de escolhas em sistemas racionais (isto é, pessoas ou computadores decidindo qual movimento fazer em um jogo de xadrez ou saindo de um labirinto).
Então, para mim, a diferença entre mentiras sobre qual fenômeno natural melhor corresponde ao seu modelo de propagação (transversing) na vida real.
Dada esta tree binária:
Largura da Primeira Travessia:
Atravesse cada nível da esquerda para a direita.
"Eu sou G, meus filhos são D e eu, meus netos são B, E, H e K, seus netos são A, C, F"
Profundidade Primeiro Traversal:
A travessia não é feita através de níveis inteiros de cada vez. Em vez disso, a travessia mergulha no DEPTH (da raiz até a folha) da tree primeiro. No entanto, é um pouco mais complexo do que simplesmente para cima e para baixo.
Uso (aka, por que nos importamos):
Gostei muito desta simples explicação do Quora sobre os methods Depth First Traversal e como eles são comumente usados: