Suponha que temos um conjunto finito de discos em , e queremos calcular o menor disco para o qual . Uma forma normal de fazer isto é a utilização do algoritmo de MATOUSEK, Sharir e Welzl [1] para encontrar uma base do , e deixar , o menor disco contendo . O disco pode ser computado algebricamente usando o fato de que, como é uma base, cada disco em é tangente a .
( é uma base de se é mínimo, de modo que . Uma base tem no máximo três elementos; em geral para bolas em uma base tem no máximo elementos.)B ⟨ B ⟩ = ⟨ L ⟩ R d d + 1
É um algoritmo recursivo aleatório da seguinte maneira. (Mas veja abaixo uma versão iterativa, que pode ser mais fácil de entender.)
Procedimento : Entrada : Conjuntos finitos de discos , , onde é uma base (de ).L B B B
- Se , retorno .
- Caso contrário, escolha aleatoriamente.
- Deixe .
- Se , retorne .
- Caso contrário, retorne , onde é uma base de .
Usado como para calcular a base de .
Recentemente, tive motivos para implementar esse algoritmo. Depois de verificar se os resultados estavam corretos em milhões de casos de teste gerados aleatoriamente, notei que havia cometido um erro na implementação. Na última etapa, eu estava retornando vez de .
Apesar desse erro, o algoritmo estava dando as respostas certas.
Minha pergunta: Por que essa versão incorreta do algoritmo aparentemente fornece respostas corretas aqui? Sempre funciona (provavelmente)? Se sim, isso também é verdade em dimensões superiores?
Adicionado: alguns equívocos
Várias pessoas propuseram argumentos incorretos no sentido de que o algoritmo modificado é trivialmente correto, portanto pode ser útil evitar alguns conceitos errôneos aqui. Uma crença falsa popular parece ser que . Aqui está um contra-exemplo dessa alegação. Dados os discos como abaixo (o limite de também é mostrado em vermelho):um , b , c , d , e ⟨ um , b , de e ⟩
podemos ter ; e observe que :e ∉ ⟨ c , d ⟩
Aqui está como isso pode acontecer. A primeira observação é que :
- Desejamos calcular o
- Escolha
- Seja
- Observe que
- Portanto, deixe ser uma base deB " ∪ { X } = { um , b , c , de e }
- Observe que
- Retornar , que é{ b , c }
Agora considere o .
- Desejamos calcular o
- Escolha
- Seja
- Observe que
- Portanto, deixe ser uma base deB " ∪ { X } = { b , c , d }
- Observe que
- Retornar , que é{ c , d }
(Por uma questão de definição, digamos que os discos todos tenham raio 2 e estejam centralizados em , , , e respectivamente.)( 30 , 5 ) ( 30 , 35 ) ( 10 , 5 ) ( 60 , 26 ) ( 5 , 26 )
Adicionado: uma apresentação iterativa
Pode ser mais fácil pensar em uma apresentação iterativa do algoritmo. Certamente acho mais fácil visualizar seu comportamento.
Entrada : Uma lista de discos Saída : Uma base deL
- Deixe .
- Embaralhe aleatoriamente.
- Para cada em :L
- Se :
- Seja uma base de .
- Volte ao passo 2.
- Retorno .
A razão os termina algoritmo, aliás, é que o passo 5 sempre aumenta o raio de - e há apenas um número finito de valores possíveis de B .
A versão modificada não tem uma apresentação iterativa tão simples, tanto quanto eu posso ver. (Tentei dar um na edição anterior deste post, mas estava errado - e deu resultados incorretos.)
Referência
[1] Jiří Matoušek, Micha Sharir e Emo Welzl. Um limite subexponencial para programação linear. Algorithmica, 16 (4-5): 498-516, 1996.