Supponiamo di avere un insieme finito di dischi in , e vogliamo calcolare il più piccolo disco per i quali . Un modo standard per farlo è quello di utilizzare l'algoritmo di Matoušek, Sharir e Welzl [1] per trovare una base di , e lasciare che , il disco più piccolo che contiene . Il disco può essere calcolato algebricamente usando il fatto che, poiché è una base, ogni disco in è tangente a .
( è una base di se è minima tale che . Una base ha al massimo tre elementi; in generale per le palle in una base ha al massimo elementi.)B ⟨ B ⟩ = ⟨ L ⟩ R d d + 1
È un algoritmo ricorsivo randomizzato come segue. (Ma vedi sotto per una versione iterativa, che può essere più facile da capire.)
Procedura : Input : insiemi finiti di dischi , , dove è una base (di ).
B B B
- Se , ritorno .
- Altrimenti scegli a caso.
- Sia .
- Se restituisce .B '
- Altrimenti restituire , dove B '' è una base di B '\ cup \ {X \} .B ″ B ′ ∪ { X }
Usato come per calcolare una base di .
Di recente ho avuto motivo di implementare questo algoritmo. Dopo aver verificato che i risultati erano corretti in milioni di casi di test generati casualmente, ho notato che avevo fatto un errore nell'implementazione. Nell'ultimo passaggio stavo restituendo anziché .
Nonostante questo errore, l'algoritmo stava dando le risposte giuste.
La mia domanda: perché questa versione errata dell'algoritmo sembra fornire risposte corrette qui? Funziona sempre (in modo dimostrabile)? Se è così, è vero anche in dimensioni superiori?
Aggiunto: alcune idee sbagliate
Diverse persone hanno proposto argomenti errati secondo cui l'algoritmo modificato è banalmente corretto, quindi può essere utile prevenire alcune idee sbagliate qui. Una falsa credenza popolare sembra essere che . Ecco un controesempio a tale affermazione. Dati i dischi come di seguito (il limite di è mostrato anche in rosso):un , b , c , d , e ⟨ un , b , e ⟩
possiamo avere ; e nota che :e ∉ ⟨ c , d ⟩
Ecco come può succedere. La prima osservazione è che :
- Desideriamo calcolare
- Scegli
- Sia
- Osserva che
- Quindi lascia che sia una base diB ′ ∪ { X } = { a , b , c , e }
- Osserva che
- Restituisci{ b , c } , che è
Adesso considera .
- Desideriamo calcolare
- Scegliere
- Permettere
- Osservalo
- Quindi lascia cheB ′ ∪ { X } = { b , c , d } sia una base di
- Osservalo
- Restituisce , ovvero{ c , d }
(Per motivi di chiarezza, supponiamo che i dischi abbiano tutti il raggio 2 e siano centrati su , , , e rispettivamente.)( 30 , 5 ) ( 30 , 35 ) ( 10 , 5 ) ( 60 , 26 ) ( 5 , 26 )
Aggiunto: una presentazione iterativa
Potrebbe essere più semplice pensare a una presentazione iterativa dell'algoritmo. Trovo certamente più facile visualizzarne il comportamento.
Input : una lista di dischi Output : una base di
- Lascia che .
- Shuffle modo casuale.
- Per ogni inL :
- Se :
- Sia una base di .
- Torna al passaggio 2.
- Return .
Il motivo per cui l'algoritmo termina, per inciso, è che il passaggio 5 aumenta sempre il raggio di - e ci sono solo finitamente molti possibili valori di .
La versione modificata non ha una presentazione iterativa così semplice, per quanto posso vedere. (Ho provato a dare uno nella modifica precedente a questo post, ma era sbagliato - e ha dato risultati errati.)
Riferimento
[1] Jiří Matoušek, Micha Sharir e Emo Welzl. Un limite subesponenziale per la programmazione lineare. Algorithmica, 16 (4-5): 498-516, 1996.