Como encontrar um mínimo local de uma árvore binária completa?
Considere um árvore binária completa do nó , Onde para alguns . Cada nó é rotulado com um número real . Você pode supor que os números reais que rotulam os nós são todos distintos. Um nó é um mínimo local se o rótulo é menor que o rótulo para todos os nós que se juntaram a por uma borda.
Você recebe uma árvore binária completa , mas a rotulagem é especificada apenas da seguinte maneira implicitamente : para cada nó, você pode determinar o valor por sondagem do nó. Mostre como encontrar um mínimo local de usando apenas sondas para os nós de.
Atribuição: esse parece ser o Problema 6 no capítulo 5 "Dividir e conquistar" do livro "Algorithm Design", de Jon Kleinberg e Eva Tardos.
fonte
O(log n)
. É isso que você está procurando? Aqui está uma dica: chame um nó de "mínimo local candidato" se for menor que seu pai. Agora, para qualquer candidato local mínimo: ou é um mínimo local ou tem um filho que é um candidato local mínimo.Respostas:
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:
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 profundidaded<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:
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érticev terminamos em é de fato um mínimo local. Suponha por contradição que não é, então ele tem algum vizinhou que 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 v como o próximo vértice; 2)u aparece 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é:
fonte