Si tengo un gran conjunto de rangos continuos (ej. [0..5], [10..20], [7..13], [- 1. .37]) y puede organizar esos conjuntos en cualquier estructura de datos que me guste, ¿cuál es la forma más eficiente de probar a la cual establece un número de prueba en particular?algoritmo eficiente para probar _que establece un número particular
He pensado en almacenar los conjuntos en un árbol binario equilibrado basado en el bajo número de un conjunto (y cada nodo tendría todos los conjuntos que tengan el mismo número mínimo de su conjunto). Esto le permitiría podar eficientemente el número de conjuntos según si el test_number que está probando contra los conjuntos es menor que el número más bajo de un conjunto, y luego pode ese nodo y todos los nodos a la derecha de ese nodo (que tener un número bajo en su rango que es mayor que el número de prueba). Creo que podaría aproximadamente el 25% de los conjuntos en promedio, pero luego tendría que buscar linealmente en el resto de los nodos en el árbol binario para determinar si el número de prueba pertenecía a esos conjuntos. (Podría optimizar aún más ordenando las listas de conjuntos en cualquier nodo por el número más alto en el conjunto, lo que me permitiría realizar búsquedas binarias dentro de una lista específica para determinar qué conjunto, si lo hay, contiene el número de prueba. Desafortunadamente, la mayoría de los conjuntos con los que trataré no tienen límites de conjunto superpuestos.)
Creo que este problema se ha resuelto en el procesamiento de gráficos ya que han descubierto maneras de probar eficientemente qué polígonos en su modelo completo contribuyen a un píxel específico, pero no conozco la terminología de ese tipo de algoritmo.
Un árbol de segmentos no es el método más rápido para simplemente contar la cantidad de conjuntos. Como requerirá O (m. (Log (n) + k)) donde m es el número de comprobaciones, y k es la cantidad de conjuntos en los que cae, n es el número total de conjuntos. Mi algoritmo es O (m.log (n)) –
Mehrdad, su idea es inmejorable para los conjuntos de datos apropiados. Pero el árbol de segmentos es drásticamente más flexible. Puede manejar dobles mientras que el tuyo está limitado a enteros. Y manejará sin esfuerzo enormes gamas (digamos [0..2000000000] que harán del suyo una enorme fuente de espacio y tiempo. – Sol
Si solo está interesado en contar, solo almacena la cantidad de conjuntos en el árbol de segmentos, y entonces el costo de recuperar el conteo se convierte en O (n log n). –