Como a árvore é finita e os rótulos são números reais, temos a certeza de que há um mínimo de elemento no conjunto de rótulos ( essa pergunta de math.SE tem uma prova dessa propriedade simples). Nesse caso, como todos os rótulos são distintos, não há problema em exigir que os mínimos locais sejam estritamente menores que seus vizinhos. Se fossem, teríamos que relaxar essa condição para "menor ou igual a", caso contrário, pode não haver uma solução. No entanto, sabemos que há pelo menos um mínimo local a ser encontrado.
Se a árvore estiver enraizada (ou seja, temos uma noção de uma relação pai-filho), podemos resolver o problema um pouco mais barato. Se a árvore não estiver enraizada, também podemos fazê-lo assintoticamente, mas provavelmente executaremos mais testes reais.
Primeiro, vamos lidar com o caso raiz.
Como a árvore é uma árvore binária (completa), cada vértice tem no máximo três vizinhos, seu pai e dois irmãos (com a raiz, é claro, sem pai), portanto, um vértice é um mínimo local se seu rótulo for menor que o rótulo de seus dois filhos e pais. Portanto, podemos determinar se um vértice é um mínimo local ou não com no máximo quatro testes (na verdade, como atravessaremos a árvore de maneira ordenada, precisaremos no máximo de três no caso raiz).
Para encontrar um mínimo local, podemos percorrer a árvore, começando com a raiz como o vértice atual, da seguinte maneira:
- Teste o rótulo do vértice atual e os rótulos de seus dois filhos.
- Se o rótulo atual for o menor, pare e relate que o vértice atual é um mínimo local.
- Caso contrário, defina o vértice atual para o filho com o menor rótulo e retorne à etapa 1.
Quando começamos a partir da raiz, nunca precisamos nos preocupar com o rótulo do pai - a raiz não tem pai e, se o nosso vértice atual tiver um pai, então devemos tê-lo descontado na iteração anterior. Observe que na etapa 2 não é estritamente necessário escolhermos o menor rótulo, qualquer que seja menor que a corrente é suficiente 1 , escolher o menor apenas oferece uma escolha definitiva (novamente porque temos rótulos distintos).
À medida que selecionamos um vértice entre os dois filhos, nossa travessia escolhe um caminho da raiz para (no mais distante) uma folha, assim como temos uma árvore binária de profundidade d<logn+1 (como é uma árvore binária completa com n=2d−1 vértices), realizamos no máximo 3d∈O(logn) sondas.
No caso não enraizado, não temos um ponto de partida tão conveniente, mas ainda temos a estrutura em árvore (mesmo que o algoritmo não o conheça). Podemos usar o seguinte algoritmo:
- Escolha qualquer vértice para ser o vértice atual inicial.
- Teste o rótulo do vértice atual e todos os seus vizinhos.
- Se o vértice atual tiver o rótulo mais baixo, pare e relate-o como um mínimo local.
- Senão, selecione o vizinho com o rótulo mais baixo como o novo vértice atual e retorne à etapa 2.
Em cada iteração, realizamos apenas no máximo 4 análises, então a questão é quantas iterações podem existir? A chave é observar que nunca podemos voltar atrás (sabemos que de onde viemos tinha um rótulo maior), portanto, devemos seguir um caminho simples no gráfico, mas como o gráfico é realmente uma árvore binária completa, o caminho simples mais longo tem comprimento2d. Assim, mesmo no caso não enraizado, realizamos no máximo8d∈O(logn) sondas.
Para correção, observamos o segundo algoritmo (o caso raiz é claramente apenas um caso especial do não enraizado).
O fato de o algoritmo nunca poder voltar atrás também garante a finalização, pois o gráfico é finito. Agora precisamos apenas demonstrar que o vérticevterminamos em é de fato um mínimo local. Suponha por contradição que não é, então ele tem algum vizinhouque tem uma etiqueta com um valor mais baixo. Temos três casos: (1)u é o vértice anterior no caminho que o algoritmo seguiu; nesse caso, quando o algoritmo estava em u, não teria selecionado vcomo o próximo vértice; 2)uaparece no caminho, mas mais de uma iteração anterior; nesse caso, o gráfico não é uma árvore; e (3)u não está no caminho que o algoritmo seguiu, mas o algoritmo selecionaria u como o próximo vértice na etapa 4, e o algoritmo não teria terminado em v. portantov deve ser um mínimo local.
Outra maneira de ver isso é simplesmente observar que a sequência de rótulos dos vértices selecionados pelo algoritmo está diminuindo monotonicamente. A partir disso, tanto a rescisão quanto a correção seguem imediatamente.
Nota de rodapé:
- A propriedade que permite isso é que toda subárvore possui um mínimo local - novamente, todo conjunto finito que possui uma ordem total tem um elemento mínimo. Assim, por indução, quando estendemos a subárvore com uma nova raiz e uma subárvore irmão, temos três casos: (1) a nova raiz é menor que os dois filhos, portanto o algoritmo terminaria a nova raiz; (2) a nova raiz é menor que um filho, mas não o outro, então o algoritmo não escolhe a raiz maior e deve assumir a menor por definição; ou (3) os dois filhos são menores, mas, neste caso, como observado, cada subárvore possui pelo menos um mínimo local, portanto, podemos selecionar um deles.