O problema mínimo de zap abaixo é o Exercício 11 na palestra de Jeff Erickson sobre "Algoritmo Greedy" .
O problema mínimo de zap pode ser declarado mais formalmente da seguinte maneira. Dado um conjunto do círculos no plano, cada um especificado por seu raio e pela coordenadas do centro, calcule o número mínimo de raios da origem que cruzam todos os círculos . Seu objetivo é encontrar um algoritmo eficiente para esse problema. (Veja um exemplo de "9 balões com 4 raios" na figura abaixo)
Pergunta: Suponha que seja possível disparar um raio que não cruze nenhum balão. Descreva e analise um algoritmo ganancioso que resolva o problema mínimo de zap nesse caso especial.
Estou tendo problemas para abordar esse problema. Eu pensei que uma abordagem gananciosa seria usar o raio que cruza mais círculos e recuar, mas me disseram que isso estava errado. Por que é isso?
E qual é o sentido do fato de haver um raio que não cruza balões? Devo provar que alguma solução ótima usa esse fato?
Qualquer ajuda seria apreciada! Recentemente, comecei a aprender algoritmos :)
Algoritmo baseado na resposta de hengxin: https://cs.stackexchange.com/a/52293/42816
Prova por indução matemática
Nota: Não utilizou a implementação O (n log n)
Agora vamos provar a correção desse algoritmo usando indução matemática. Mostraremos que nosso algoritmo ganancioso não pode fazer pior do que a solução ideal.
Deixei seja o conjunto de raios disparados pelo nosso algoritmo ganancioso. Deixei ser o conjunto de raios disparados por outra solução ideal.
Nosso caso base é quando . Existe apenas um objeto para destruir, e nosso algoritmo ganancioso usa 1 raio, o que também é ideal. Então, isso dá uma olhada.
Agora, para nossa hipótese de indução, assumiremos que nosso algoritmo guloso é ideal para até objetos.
Afirmamos agora que o primeiro raio de do não pode fazer pior do que o de .
Agora vamos considerar um situação do objeto. Então, nós classificamos e de acordo com , sentido horário. Agora vamos examinar o primeiro raio que ocorre a partir desentido horário. No, esse primeiro raio, chame-o , não pode ser pior do que o de , chame-o , porque nosso algoritmo ganancioso diz que esse raio cruza a maioria dos objetos, incluindo o primeiro . Portanto, intercepta tanto ou menos objetos do que . Assim, podemos substituir com na solução ideal .
Agora, temos que descobrir se o resto é ideal, cortando , que chamaremos . No entanto, como agora existem no máximo objetos, nossa hipótese de indução diz que nosso algoritmo ganancioso encontra uma solução ótima para . Como tal, oO problema tem uma solução ideal do nosso algoritmo ganancioso. QED
fonte
Respostas:
Princípio: Você precisa disparar os raios em alguma ordem e escolher cuidadosamente a direção / ângulo adequados para o primeiro raio.
Veja a figura no problema. Suponha que haja apenas 4 balões: os dois verdes e os azuis. Se você disparar seu primeiro raio ao longo do eixo x (isso é permitido por sua estratégia gananciosa. Observe que suponho que os três balões maiores não possam ser atingidos por um único raio; caso contrário, mova-os levemente), você deixará os dois outros balões distantes. Como resultado, custa 3 raios, mas o ideal é 2.
Portanto, o ponto principal é disparar o primeiro raio na direção certa. Aí vem o fato de que "existe um raio que não cruza nenhum balão".
A ideia básica é a seguinte:
Não é fácil provar que uma estratégia gananciosa está correta. Você pode tentar provar a idéia acima aplicando argumentos matemáticos de indução e troca ( ou talvez mostre que está errado! ). Uma dica é considerar o conjunto de raios disparados por um algoritmo arbitrário, classificá-los por ângulos em relação aα (horário) e compare-a com a solução ideal, uma a uma.
Implementação: nos comentários, o OP solicita uman logn algoritmo. Bem,n lgn geralmente significa que você pode resolver algumas coisas primeiro. Talvez classifique todos os balões pelos ângulos das linhas de emaranhado direitas (no sentido horário novamente). Então é fácil aplicar a estratégia gananciosa acima. Essa é uma ideia aproximada. Como implementá-lo eficientemente, escolhendo / projetando boas estruturas de dados, é deixado como um exercício.
fonte