El problema huele a rangos, y una de las buenas estructuras de datos para este problema sería un árbol de segmentos. Someresources para ayudarlo a comenzar.
La raíz del árbol del segmento puede representar las direcciones (0.0.0.0 - 255.255.255.255). El subárbol izquierdo representaría las direcciones (0.0.0.0 - 127.255.255.255) y el subárbol derecho representaría el rango (128.0.0.0 - 255.255.255.255), y así sucesivamente. Esto continuará hasta que alcancemos rangos que no pueden subdividirse más. Digamos, si tenemos el rango 32.0.0.0 - 63.255.255.255, mapeado a alguna ciudad arbitraria, será un nodo hoja, no subdividiremos ese rango cuando lleguemos allí, y lo etiquetaremos a la ciudad específica.
Para buscar una asignación específica, seguimos el árbol, tal como lo hacemos en un árbol de búsqueda binaria. Si su IP se encuentra en el rango del subárbol de la izquierda, muévase al subárbol de la izquierda, de lo contrario, muévase al subárbol de la derecha.
Las buenas partes:
- no es necesario tener todos los sub-árboles, sólo se suman los sub-árboles que se requieren.Por ejemplo, si en sus datos, no hay una ciudad mapeada para el rango (0.0.0.0 - 127.255.255.255), no construiremos ese subárbol.
- Somos eficientes en el uso del espacio. Si todo el rango está asignado a una ciudad, ¡crearemos solo el nodo raíz!
- Esta es una estructura de datos dinámica. Puede agregar más ciudades, rangos de división más adelante, etc.
- Realizará un número constante de operaciones, ya que la profundidad máxima del árbol sería 4 x log2 (256) = 32. Para este problema en particular, resulta que Segment Trees sería tan rápido como van-Emde Boas árboles, y requieren menos espacio (O (N)).
- Esta es una estructura de datos simple, pero no trivial, que es mejor que ordenar, porque es dinámico y más fácil de explicar a su entrevistador que los árboles de van-Emde Boas.
- Esta es una de las más sencillas estructuras de datos no triviales para codificar :)
Tenga en cuenta que en algunos tutoriales árbol segmento, que utilizan matrices para representar el árbol. Esto probablemente no es lo que quieres, ya que no estaríamos poblando todo el árbol, por lo que asignar nodos dinámicamente, como lo hacemos en un árbol binario estándar, es lo mejor.
Por favor, siéntase libre de aceptar una respuesta si estaba convencido. Esto se puede deshacer más adelante, si encuentra una respuesta mejor :-) – reddragon