Estoy buscando un espacio de vectores de longitud 12, con entradas 0, 1, 2. Por ejemplo, uno de esos vectores es
001122001122. Tengo alrededor de mil buenos vectores y cerca de mil vectores malos. Para cada vector malo, necesito ubicar el vector bueno más cercano. La distancia entre dos vectores es solo el número de coordenadas que no coinciden. Los buenos vectores no están especialmente bien organizados, y la razón por la que son "buenos" no parece ser útil aquí. Mi principal prioridad es que el algoritmo sea rápido.Cómo encontrar el vector más cercano en {0,1,2}^12, una y otra vez
Si hago una búsqueda simple y exhaustiva, tengo que calcular unas 1000 * 1000 distancias. Eso parece bastante espeluznante.
Si aplico el algoritmo de Dijkstra primero usando los vectores buenos, puedo calcular el vector más cercano y la distancia mínima para cada vector en el espacio, de modo que cada vector malo requiera una búsqueda simple. Pero el espacio tiene 3^12 = 531,441 vectores, por lo que la precomputación es de medio millón de cálculos de distancia. No hay mucho ahorro.
¿Puede ayudarme a pensar en una mejor manera?
Editar: Desde que las personas preguntaron seriamente qué los hace "buenos": Cada vector representa una descripción de una imagen hexagonal de seis triángulos equiláteros, que es la imagen 2D de una disposición 3D de cubos (piense en Q-bert generalizado). Los triángulos equiláteros son mitades de caras de cubos (45-45-90), inclinados en perspectiva. Seis de las coordenadas describen la naturaleza del triángulo (piso percibido, pared izquierda, pared derecha), y seis coordenadas describen la naturaleza de los bordes (continuidad percibida, dos tipos de discontinuidad percibida). Los 1000 buenos vectores son los que representan hexágonos que se pueden ver al ver cubos en perspectiva. El motivo de la consulta es aplicar correcciones locales a un mapa hexagonal llena de triángulos ...
"La razón por la que son 'buenos' no parece ser útil aquí". Si sus dedos no se caen al intentarlo, podría ser bueno explicar qué hace que los vectores sean "buenos" y "malos". Me ha pasado muchas veces que pensé que algo era inútil y alguien más descubrió cómo usarlo. – aaronasterling
Encontrar distancias de 1000 * 1000 realmente no parece que tomaría mucho tiempo ... un millón de cálculos de distancia probablemente tomaría un segundo o dos hasta codificados en un lenguaje de alto nivel. – mellamokb