Ho una domanda su questo problema algoritmico; Incollerò il problema quindi passerò ai miei pensieri e soluzioni attuali.Segmenti segmento di movimento
Ci sono N (up to 100,000)
segmenti definiti [(x1, y1), (x2, y2)]
, dove x1 < x2
e y1 < y2
(ad esempio i segmenti hanno pendenza positiva). Nessun segmento di linea tocca o interseca, anche ai punti finali. Il primo segmento ha (x1, y1) = (0, 0)
. Immagina ogni segmento come una collina 2-D che una persona deve scalare.
Una persona inizia a (0, 0)
e atterra sulla prima collina. Ogni volta che una persona atterra su una collina, si arrampica fino alla fine, che è (x2, y2)
e salta verso il basso. Se atterra su un'altra collina (ovunque sul segmento), il processo continua: sale quella collina e salta. Se non ci sono più colline, cade a -INFINITY
e il processo è finito. Ogni collina (x1, y1) -> (x2, y2)
dovrebbe essere (x1, y1)
come contenente il punto (x1, y1)
ma non contenente il punto (x2, y2)
, in modo che la persona atterrerà sulla collina se cade sopra di esso a una posizione con x = x1
, ma non atterrerà sulla collina se cade su da sopra a x = x2
.
L'obiettivo è contare quante colline tocca.
mio attuale pensiero
sto pensando di spazzare una linea attraverso il piano lungo l'asse x. Ogni segmento è costituito da un evento BEGIN ed END; ogni volta che incontriamo l'inizio di un segmento di linea, lo aggiungiamo in un set. Ogni volta che incontriamo la fine di un segmento di linea, lo rimuoviamo dal set. E quando raggiungiamo il punto FINE della collina attuale, dovremmo controllare il set per la collina più alta su cui possiamo atterrare. Tuttavia, non so come determinare come controllare rapidamente, perché potrebbero esserci potenzialmente N voci all'interno del set. Inoltre, dopo aver saltato su un'altra collina, l'ordine di questi cambierà perché le pendenze di ciascun segmento sono probabilmente diverse, e non so come spiegare questa differenza.
Qualche idea?
Nessuno ha pubblicato nulla che eviti di attraversare una lista 'O (n)' ad ogni evento. Sto osservando da vicino questa domanda. – japreiss
Potresti collegare ad alcuni dati di riferimento per provare diverse ottimizzazioni? – japreiss