Algoritmo determinista de tiempo lineal para verificar si una matriz es una versión ordenada de la otra

19

Considere el siguiente problema:

Entrada: dos matrices y de longitud , donde está en orden.B n BABnB

Consulta: ¿ y contienen los mismos elementos (con su multiplicidad)?BAB

¿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?

Albert Hendriks
fuente
1
FWIW el enfoque probabilístico es hashing con una función hash independiente del orden. Carter y Wegman escribieron uno de los documentos originales sobre esto ( sciencedirect.com/science/article/pii/0022000081900337 ), pero no he visto nada en las citas de ese documento que sugiera un algoritmo determinista (hasta ahora).
KWillets
1
La afirmación que cita es sobre el modelo de máquina de Turing, que es solo de interés teórico. Los algoritmos generalmente se analizan con respecto al modelo de RAM.
Yuval Filmus
Ah, entonces ese es el modelo que estoy buscando. Ajusté la pregunta.
Albert Hendriks
¿Por qué no sumas los elementos de la matriz y luego comparas la suma? Con respecto a su título, es lineal y responde a la pregunta '¿es una matriz la versión ordenada de otra? '. Soy consciente de que no es el modelo de máquina de Turing, sino una solución práctica.
atayenel
1
@AlbertHendriks Usted (muy probablemente) no puede ordenar una matriz en en una máquina Turing. Algunos límites inferiores en SAT (por ejemplo, cs.cmu.edu/~ryanw/automated-lbs.pdf ) son en realidad para la máquina RAM, perdón por mi comentario anterior engañoso. O(nlogn)
Yuval Filmus

Respuestas:

14

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

{1,2}×{3,4}××{2n1,2n}.
i2i12i

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 AABBAABBAA

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 )ABAn!Ω(nlogn)

Yuval Filmus
fuente
Pensé que esto implicaría que en general, pero aparentemente el modelo de comparación es diferente con eso. P=Ω(nlogn)
Albert Hendriks el
@AlbertHendriks, es el mismo modelo utilizado para mostrar n lg n límite inferior para la clasificación. Significa que si la única operación que puede realizar es la comparación, entonces no puede hacerlo mejor. Creo que esto responde a tu pregunta.
Kaveh
[Cntd] ¡no tenemos límites más fuertes incluso para clasificar! y si puede ordenar más rápido que n lg n, entonces puede usarlo para resolver el problema más rápido que n lg n.
Kaveh
1
@AlbertHendriks, ¿conoce los algoritmos de tiempo lineal para ordenar enteros? Búscalo en CLRS. Su caso podría ser uno de los casos en que podemos ordenar en tiempo lineal.
Kaveh
66
Los enteros se pueden ordenar en (ver nada.kth.se/~snilsson/fast-sorting ), o en el tiempo esperado O ( n O(nloglogn)(verieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1181890), o incluso en tiempo lineal si el tamaño de la palabra es lo suficientemente grande (ver LNCS 8503, p. 26ff). O(nloglogn)
Yuval Filmus
10

O(logn)O(1)nO(1)

a1,,anb1,,bn1/n

i=1n(xai)=i=1n(xbi).
px0
i=1n(x0ai)i=1n(x0bi)(modp).
Si las matrices son iguales, la prueba siempre pasará, así que concentrémonos en los casos en que las matrices son diferentes. En particular, algún coeficiente de no es cero. Como tienen una magnitud , este coeficiente tiene una magnitud , por lo que tiene como máximo primo factores de tamaño . Esto significa que si elegimos un conjunto de al menos primos de tamaño al menos (digamos), entonces para un primo aleatorio de este conjunto se mantendrá con una probabilidad de al menos que i=1n(xai)i=1n(xbi)ai,binO(1)2nnO(n)=nO(n)O(n)Ω(n)n2pn2p11/n
i=1n(xai)i=1n(xbi)0(modp).
Un módulo aleatorio será testigo de esto con probabilidad (ya que un polinomio de grado como máximo tiene como máximo raíces). px0p1n/p11/nnn

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.pn2n2x0p1O(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)x0px0

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)1O(1/n)1O(1/nC)C

Yuval Filmus
fuente
1
Si bien este algoritmo es aleatorio, explica cómo implementar las ideas en algunas de las otras respuestas para que realmente funcionen. También tiene una ventaja sobre el enfoque de tabla hash: está en su lugar.
Yuval Filmus
Creo que al OP no le gustan los algoritmos probabilísticos ya que no le gustó el algoritmo de tiempo lineal esperado usando una tabla hash.
Kaveh
Kaveh tienes razón. Pero, por supuesto, esta solución también es interesante y debe mantenerse, resuelve el caso de los algoritmos probabilísticos. Además, creo que usa el modelo que estoy buscando.
Albert Hendriks
1
Me pregunto si la notación O (1 / n) es correcta. Por supuesto, sé lo que quieres decir, pero creo que, según la definición de big-O, esto es equivalente a O (1).
Albert Hendriks el
2
De ningún modo. Es una cantidad limitada por para suficientemente grande . Esa es una mejor garantía que . n O ( 1 )C/nnO(1)
Yuval Filmus
-3

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]

  1. 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)minmax

  2. Reste el valor minde 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)

  3. 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 > 11c>1

  4. mueva las masas hasta que alcancen el valor máximo 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í.O((maxmin)n)

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 ).maxmin

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.

Nikos M.
fuente
En términos de recopilar los elementos en el orden inverso de la distancia recorrida, ¿eso no se traduciría en comparaciones a nivel de implementación, y en ese punto no tiene que ordenar las "distancias"?
JustAnotherSoul