0.3 – Busca e Solucao de Problemas
0.3.1.1 – Busca em Largura BFS
0.3.1.2 – Busca em Profundidade DFS
0.3.1.3 – Busca de Custo Uniforme
a estratégia oposta da bfs
A busca em profundidade (DFS) adota uma abordagem radicalmente diferente da busca em largura. Enquanto a BFS explora todos os vizinhos antes de avançar, a DFS mergulha em um caminho até o fim. Ela expande um único ramo da árvore de busca até atingir um estado terminal. Se o objetivo não está nesse ramo, o algoritmo retrocede e tenta outro caminho alternativo. Por exemplo, em um labirinto, a DFS anda por um corredor até encontrar uma parede. Depois, ela volta até o último ponto de decisão e escolhe outra direção. Essa estratégia prioriza a profundidade em detrimento da abrangência durante a exploração.
pilha: a estrutura que define o comportamento
A DFS utiliza uma pilha (LIFO) para gerenciar os estados durante a exploração do espaço. Estados recém-descobertos são empilhados no topo e explorados imediatamente antes dos mais antigos. Esse comportamento LIFO (último a entrar, primeiro a sair) produz o mergulho característico em profundidade. O algoritmo remove do topo o estado mais recentemente adicionado, aprofundando-se sem hesitação. Por exemplo, ao explorar um diretório de computador, a DFS lista arquivos dentro de subpastas antes de voltar. A implementação recursiva da DFS utiliza a pilha de chamadas da linguagem de programação. Essa simplicidade estrutural torna a DFS fácil de implementar em muitos contextos diferentes.
exemplo prático: explorando um labirinto
Imagine um labirinto onde você quer encontrar a saída usando a estratégia DFS. Você começa na entrada e escolhe sempre o primeiro corredor disponível à esquerda. Continua avançando por esse corredor até encontrar uma bifurcação ou um beco sem saída. Se encontra um beco sem saída, você retorna ao último ponto com alternativas não exploradas. Em seguida, escolhe o próximo corredor disponível e repete o processo sistematicamente. Esse método explora todo o labirinto sem precisar decorar todas as bifurcações simultaneamente. A DFS funciona bem quando o labirinto tem corredores longos e poucas ramificações. Ela consome pouca memória porque mantém apenas um caminho por vez.
vantagens e desvantagens da dfs
A DFS oferece vantagens significativas em termos de consumo de memória e simplicidade. Ela armazena apenas o caminho atual e os estados pendentes, não todos os estados de um nível. Em espaços com muitos estados, essa economia de memória se torna extremamente valiosa. Contudo, a DFS não garante encontrar o caminho mais curto para o objetivo desejado. Além disso, ela pode ficar presa em caminhos infinitos sem encontrar solução alguma. Por essa razão, versões com limite de profundidade foram desenvolvidas para evitar loops infinitos. A escolha entre BFS e DFS depende fundamentalmente das características específicas do problema.
quando usar cada estratégia
A escolha entre BFS e DFS depende do contexto e das restrições do problema em questão. BFS é ideal quando precisamos garantir a solução mais curta e a memória não é limitada. DFS é preferível quando a memória é escassa e o espaço de busca é muito profundo. Em jogos como xadrez, a DFS com limites de profundidade avalia sequências de movimentos futuros. Para encontrar conexões em redes sociais, a BFS encontra relacionamentos de forma mais intuitiva. Muitos sistemas modernos combinam ambas as estratégias para aproveitar suas respectivas vantagens. Para iniciantes, entender essas diferenças é essencial para aplicar a técnica correta. Cada problema demanda uma análise cuidadosa para determinar a estratégia de busca mais adequada.