Dada una matriz entera (tamaño máximo 50000), tengo que encontrar la mínima y máxima de tal manera que para alguna , con .
He intentado este proceso: para todo . Lo precalculé en y luego el valor de para algunos , tal que es: . Así:
Pero este proceso es de . ¿Cómo puedo hacer eso de manera más eficiente?
Respuestas:
Sik es el tamaño de bits de los enteros, puede calcular el Max en tiempo O(nk) .
Básicamente, el problema es que, dadon , k -bitk enteros Si , encuentre i,j tal que Si⊕Sj es máximo.
cada como una cadena binaria (mirando la representación binaria) y crea un trie a partir de esas cadenas. Esto lleva tiempo.Si O(nk)
Ahora, para cada , intentas recorrer el complemento de en el trie que creaste (tomando la mejor rama básicamente en cada paso), encontrando una tal que sea máxima.Sj Sj j′ Sj⊕Sj′
Haga esto para cada , y encontrará la respuesta en el tiempo .j O(nk)
Dado que sus enteros están acotados, este algoritmo para max es básicamente lineal, y también lo es el algoritmo para min obtenido al ordenar (ya que la clasificación se puede hacer en tiempo lineal).
Por cierto, si no hubiera límites, puede reducir la distinción de elementos a la versión mínima.
fuente
La clasificación también ayuda con . Un poquito, al menos. Claramente, alcanzaría el máximo . Entonces, para cada una búsqueda binaria de . Ese es el tiempo , igual que la clasificación, por lo que sigue siendo la complejidad de todo el procedimiento.max x⊕¬x x=sumi ¬x O(nlogn)
fuente
Aquí es por qué la sugerencia de Strilanc funciona para . Considere su matriz , y suponga que logra el mínimo , donde . O bien (en cuyo caso ), o , para algunos . Suponga , y deje . Si entonces , mientras que si entonces . Por lo tanto .min sum ap,aq p<q ap=aq ap=ap+1 ap=x0y aq=x1z x,y,z q>p+1 ap+1=xbw b=0 ap⊕ap+1<ap⊕aq b=1 ap+1⊕aq<ap⊕aq q=p+1
fuente