Considere el siguiente problema:
Entrada: dos matrices y de longitud , donde está en orden.B n B
Consulta: ¿ y contienen los mismos elementos (con su multiplicidad)?B
¿Cuál es el algoritmo determinista más rápido para este problema?
¿Se puede resolver más rápido que ordenarlos? ¿Se puede resolver este problema en tiempo lineal determinista?
algorithms
reference-request
sorting
Albert Hendriks
fuente
fuente
Respuestas:
No ha especificado su modelo de cálculo, por lo que asumiré el modelo de comparación.
Considere el caso especial en el que la matriz se toma de la lista En palabras, el ésimo elemento es o .{ 1 , 2 } × { 3 , 4 } × ⋯ × { 2 n - 1 , 2 n } . i 2 i - 1 2 iB
I afirman que si el algoritmo llega a la conclusión de que y contienen los mismos elementos, que el algoritmo ha comparado cada elemento en a su contraparte en . De hecho, se supone que el algoritmo llega a la conclusión de que y contienen los mismos elementos, pero nunca compara el primer elemento de a su contraparte en . Si cambiamos el primer elemento, entonces el algoritmo procedería exactamente de la misma manera, aunque la respuesta sea diferente. Esto demuestra que el algoritmo debe comparar el primer elemento (y cualquier otro elemento) a su contraparte en .B B A A B B A AA B B A A B B A A
Esto significa que si y contienen los mismos elementos, a continuación, después de verificar esta el algoritmo conoce el orden de clasificación de . Por lo tanto, debe tener al menoshojas diferentes, por lo que lleva tiempo .B A n ! Ω ( n log n )A B A n! Ω(nlogn)
fuente
En conclusión, si elegimos una aleatoria de tamaño aproximadamente entre un conjunto de al menos primos diferentes, y un módulo aleatorio , entonces cuando las matrices no contienen los mismos elementos, nuestra prueba fallará con probabilidad . Ejecutar la prueba lleva tiempo ya que ajusta a un número constante de palabras de máquina.p n2 n2 x0 p 1−O(1/n) O(n) p
Usando pruebas de primalidad de tiempo polinomial y dado que la densidad de primos de tamaño aproximadamente es , podemos elegir un primo aleatorio en el tiempo . La elección de un módulo aleatorio puede implementarse de varias maneras, y se hace más fácil ya que en nuestro caso no necesitamos un aleatorio completamente uniforme .n2 Ω(1/logn) p (logn)O(1) x0 p x0
En conclusión, nuestro algoritmo se ejecuta en el tiempo , siempre genera SÍ si las matrices contienen los mismos elementos, y genera NO con probabilidad si las matrices no contienen los mismos elementos. Podemos mejorar la probabilidad de error de para cualquier constante .O(n) 1−O(1/n) 1−O(1/nC) C
fuente
Propondré otro algoritmo (o al menos un esquema de dicho algoritmo)
El esquema asume que los valores (supuestos " enteros ") están dentro de un rango (¿estrecho?) Entre[min,max]
En el tiempo escaneando las dos matrices, podemos encontrar los valores y para ambas y su multiplicidad, si estas difieren, las matrices no son permutaciones entre síO(n)
min
max
Reste el valor
min
de todos los valores de ambas matrices (aquí no se tiene en cuenta el hecho de que una matriz ya está ordenada, presumiblemente esto se puede mejorar)Suponga que los valores en las matrices representan masas y aplicamos una aceleración / velocidad a cada uno de magnitud (esto puede mejorarse a una magnitud de en ciertos casos)c > 11 c>1
mueva las masas hasta que alcancen el valor máximoO((max−min)n)
max-min
, esto tiene una complejidad de . Esto permite encontrar los mismos valores y su multiplicidad, si estos difieren, las matrices no son permutaciones entre sí. De lo contrario, decida que las matrices son permutaciones entre sí.tenga en cuenta que el esquema de algoritmo anterior puede ser (determinísticamente) bastante rápido en muchas situaciones prácticas.
El esquema de algoritmo anterior es una variación de un algoritmo de clasificación de tiempo lineal que emplea " masas en movimiento ". La intuición física detrás del algoritmo de clasificación de " masas en movimiento " es la siguiente:
Suponga que el valor de cada elemento representa su magnitud de masa e imagine organizar todos los elementos en una línea y aplicar la misma fuerza de aceleración.
Luego, cada elemento se moverá hasta una distancia relacionada con su masa, más masiva menos distancia y viceversa. Luego, para recuperar los elementos ordenados, simplemente recójalos en orden inverso por la distancia recorrida.
Este algoritmo es de tiempo lineal y determinista , pero existe la advertencia de que la cantidad de fuerza de aceleración inicial y la distancia a recorrer (o el tiempo de espera) está relacionada con la distribución de valores (es decir, las " masas ", el factor anterior). También se puede tratar de discretizar el espacio para que los elementos viajen a una cuadrícula y ganar un factor constante en la velocidad del algoritmo (y usar una rutina de clasificación rápida para ordenar diferentes elementos en la misma celda ).max−min
A este respecto, el algoritmo anterior es similar a los algoritmos basados en numéricos de clasificación (por ejemplo radix-tipo , conteo-especie )
Uno puede pensar que este algoritmo podría no significar mucho, pero muestra al menos una cosa. Que, " fundamentalmente ", a nivel físico, clasificar números arbitrarios es una operación de tiempo lineal en el número de elementos.
fuente