Ho bisogno di risolvere il problema dell'algoritmo convex dinamico, ovvero mantenendo lo scafo convesso di punti 2D, dove posso aggiungere e cancellare punti.Algoritmo di Scafo Convesso Dinamico sublinale ma semplice?
L'approccio ingenuo è chiaramente O(N)
; ogni volta che uno dei punti N
viene aggiunto/eliminato, ricalcolo lo scafo convesso da zero. Tuttavia, non posso permettermi il tempo lineare, quindi sto cercando un algoritmo sublineare. Finora, ho trovato un mucchio di carta che descrive un algoritmo sofisticato con limiti di tempo pazzeschi che richiederebbero anni per essere implementato. Anche il più vecchio algoritmo efficiente, dovuto a Overmars e Leeuween, che è O(log^2 N)
, sembra troppo complicato. (Come al solito, la maggior parte degli algoritmi descritti in tali articoli hanno tonnellate di dipendenze in termini di strutture/algoritmi da altri documenti di riferimento)
Sto cercando qualcosa di più semplice, non necessariamente nuovo, che esegue meglio di lineare nel caso peggiore (ad es. O(sqrt N)
). Infine, non mi importa se il tempo è ammortizzato. Qualche idea?
(da semplice, in primo luogo dire qualcosa che non richiede più di qualche centinaio di righe di codice.)
Non direi che la soluzione di complessità lineare sia ingenua in quanto trovare lo scafo convesso di N punti nel tempo lineare è ingenuo. In effetti non conosco un algoritmo tale che possa risolvere il problema anche per un singolo insieme in tempo lineare. –
izo è corretto: C'è un limite inferiore Omega (n log n) (con il modello di calcolo più comune). –
Con "O (N)", intendo il costo per operazione. L'approccio ingenuo sta mantenendo i punti ordinati e facendo la scansione Graham in 'O (N)' in ogni fase (dopo ogni rimozione/inserimento). – eold