Dado que esta es una pregunta de la entrevista, aquí está mi oportunidad de una solución. (Como DCN señala más adelante, esto no está garantizado para devolver la solución óptima, aunque todavía debe ser una heurística decente. Buena captura, DCN!)
- crear un conjunto S p con una sola punto P.
- Calcule la distancia entre cada punto en S p y cada punto fuera de ella, luego agregue el punto con la distancia máxima más pequeña a S p.
- Repita 2. hasta que S p tenga k puntos.
- Repita 1-3 usando cada punto una vez como la P. inicial Tome la S p que tiene la distancia máxima más pequeña.
hay puntos O (k) en S p, y o puntos (n) fuera de él, por lo que encontrar el punto con la distancia máxima más pequeña es O (nk). Repetimos este k veces, y luego repetir el procedimiento entero n veces, por una complejidad global del O (n k).
Podemos mejorar en esto por el almacenamiento en caché la distancia máxima entre cualquier punto en S p y cada punto exterior de S p. Si maxDistanceFromPointInS[pointOutsideS]
es, por ejemplo, una tabla hash O (1) que contiene la distancia máxima actual entre cada punto pointOutsideS
y algún punto dentro de S p, entonces cada vez que agreguemos un nuevo punto newPoint
, establecemos maxDistanceFromPointInS[p] = Max(maxDistanceFromPointInS[p], distance(newPoint, p))
para todos los puntos p
de S p.Luego, encontrar la distancia máxima más pequeña es O (n), agregar un punto a S p es O (n). Repetir este k veces nos da O ((n + n) k) = O (nk). Finalmente, repetimos el procedimiento entero procedimiento n veces, para una complejidad total de O (n k).
Podríamos mejorar la búsqueda de la distancia máxima más pequeña a O (1) usando un montón, pero eso no cambiaría la complejidad general.
Por cierto, se tardó una hora para escribir todo esto para arriba - no hay manera de que podría haber hecho esto en una entrevista.
Tengo la sensación de que este problema es NP-completo, un boceto de una reducción de un conocido problema NP-completo sería suficiente :) – pathikrit
Listo: aceptó una respuesta (aunque es solo un enlace a un diario) – pathikrit