Sto cercando uno spazio di vettori di lunghezza 12, con voci 0, 1, 2. Ad esempio, uno di tali vettori è
001122001122. Ho circa un migliaio di buoni vettori e circa un migliaio di vettori cattivi. Per ogni vettore errato ho bisogno di localizzare il vettore buono più vicino. La distanza tra due vettori è solo il numero di coordinate che non corrispondono. I buoni vettori non sono particolarmente ben disposti, e la ragione per cui sono "buoni" non sembra essere d'aiuto qui. La mia priorità principale è che l'algoritmo sia veloce.Come trovare il vettore più vicino in {0,1,2}^12, più e più volte
Se eseguo una ricerca esaustiva semplice, devo calcolare circa 1000 * 1000 distanze. Sembra abbastanza spessa.
Se applico l'algoritmo di Dijkstra prima utilizzando i buoni vettori, posso calcolare il vettore più vicino e la distanza minima per ogni vettore nello spazio, in modo che ogni vettore errato richieda una ricerca semplice. Ma nello spazio ci sono 3^12 = 531.441 vettori, quindi la precomputazione è di mezzo milione di calcoli a distanza. Non molti risparmi.
Potete aiutarmi a pensare a un modo migliore?
Edit: Dato che la gente ha chiesto ardentemente ciò che li rende "buona": Ogni vettore rappresenta una descrizione di un quadro esagonale di sei triangoli equilateri, che è l'immagine 2D di una disposizione 3D di cubi (si pensi generalizzata Q-bert). I triangoli equilateri sono metà di facce di cubi (45-45-90), inclinati in prospettiva. Sei delle coordinate descrivono la natura del triangolo (pavimento percepito, parete sinistra, parete destra) e sei coordinate descrivono la natura dei bordi (continuità percepita, due tipi di discontinuità percepita). I 1000 buoni vettori sono quelli che rappresentano esagoni che possono essere visti quando si vedono i cubi in prospettiva. La ragione per la ricerca è quello di applicare le correzioni locali ad una mappa esagonale piena di triangoli ...
"La ragione per cui sono 'buoni' non sembra essere utile qui." Se le tue dita non cadono cercando, potrebbe essere utile spiegare cosa rende i vettori 'buoni' e 'cattivi'. Mi è successo molte volte che pensavo che qualcosa fosse inutile e qualcun altro avesse capito come usarlo. – aaronasterling
Trovare distanze 1000 * 1000 in realtà non sembra che richiederebbe molto tempo ... un milione di calcoli di distanza richiederebbe probabilmente un secondo o due anche codificati in un linguaggio di alto livello. – mellamokb