Como encontrar um mínimo local de uma árvore binária completa?

7

Como encontrar um mínimo local de uma árvore binária completa?

Considere um nárvore binária completa do nó T, Onde n=2d1 para alguns d. Cada nóvV(T) é rotulado com um número real xv. Você pode supor que os números reais que rotulam os nós são todos distintos. Um nóvV(T) é um mínimo local se o rótulo xv é menor que o rótulo xw para todos os nós w que se juntaram a v por uma borda.

Você recebe uma árvore binária completa T, mas a rotulagem é especificada apenas da seguinte maneira implicitamente : para cada nóv, você pode determinar o valor xvpor sondagem do nóv. Mostre como encontrar um mínimo local deT usando apenas O(logn) sondas para os nós deT.

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.

user34790
fonte
3
Você está falando sobre "o" mínimo local, mas pode haver vários.
Yuval Filmus
2
Existe um algoritmo que encontrará um dos mínimos locais em uma árvore binária completa no tempo 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.
rici
Vejo uma nota dizendo que o texto foi copiado de um exercício. A cópia de um problema de um livro sem atribuição não é permitida neste site. (Copiá-lo mesmo com atribuição é uma forma bastante ruim, na minha opinião, mas copiá-lo sem atribuição equivale a plágio, o que não é bem-vindo aqui.) Vamos manter a atribuição intacta, por favor.
DW

Respostas:

5

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:

  1. Teste o rótulo do vértice atual e os rótulos de seus dois filhos.
  2. Se o rótulo atual for o menor, pare e relate que o vértice atual é um mínimo local.
  3. 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=2d1 vértices), realizamos no máximo 3dO(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:

  1. Escolha qualquer vértice para ser o vértice atual inicial.
  2. Teste o rótulo do vértice atual e todos os seus vizinhos.
  3. Se o vértice atual tiver o rótulo mais baixo, pare e relate-o como um mínimo local.
  4. 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áximo8dO(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é:

  1. 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.
Luke Mathieson
fonte
Uma prova de correção do seu algoritmo é desejável: por que podemos jogar fora com segurança a outra subárvore e selecionar apenas o filho com o menor rótulo? Na IMO, é necessário provar que seu algoritmo encontrará um mínimo local enquanto existirem. Além disso, uma propriedade mais forte pode ser verdadeira: toda árvore binária completa possui pelo menos um mínimo local.
Hengxin
@hengxin (espero) esclarecido.
Luke Mathieson
Eu acho que há uma falha nesse raciocínio, já que as sondas O (log n) exigem alguma ordem na inserção dos valores da árvore, para que a divisão e a conquista possam discriminar entre ir para a esquerda e para a direita. Nesse caso, na etapa 4 "selecionar o vizinho com o rótulo mais baixo" realmente não está escolhendo o caminho correto sempre, pois não há pedidos nos valores da árvore (os mínimos locais podem estar na subárvore à direita). Se houver ordem na inserção da árvore, o nó pai será sempre maior que o nó atual, fazendo com que os mínimos locais existam apenas na folha esquerda da árvore.
Juan Zamora
Cormen et at (2011) definem que, para que uma árvore seja considerada uma árvore de pesquisa binária, ela deve ter a "propriedade de árvore de pesquisa binária", que requer uma certa ordem na inserção da árvore.
Juan Zamora
@JuanZamora A questão não é sobre árvores de pesquisa binária, é apenas sobre árvores binárias completas rotuladas como vértices. Em segundo lugar, mesmo que se tratasse de BSTs, trata-se de encontrar um mínimo local , não o mínimo global.
Luke Mathieson