Enteros de "casi clasificación" en tiempo lineal

16

Estoy interesado en ordenar una matriz de valores enteros positivos L=v1,,vn en tiempo lineal (en el modelo RAM con una medida de costo uniforme, es decir, los enteros pueden tener un tamaño logarítmico pero se supone que las operaciones aritméticas en ellos tomar unidad de tiempo). Por supuesto, esto es imposible con algoritmos de clasificación basados ​​en comparación, por lo que estoy interesado en calcular un tipo "aproximado", es decir, calcular alguna permutación vσ(1),,vσ(n) de Lque no es realmente ordenados en general, sino una "buena aproximación" de la versión ordenada de L . Asumiré que estamos ordenando los enteros en orden decreciente porque hace que la secuela sea un poco más agradable de decir, pero, por supuesto, uno podría expresar el problema al revés.

Un posible criterio para una clasificación aproximada es el siguiente (*): dejando que N sea ivi , por cada 1in , requerimos que vσ(i)N/i (es decir, el "cuasi-ordenado "la lista está limitada desde arriba por la función decreciente iN/i ). Es fácil ver que el tipo real satisface esto: vσ(2) debe ser mayor que vσ(1)entonces es como máximo (vσ(1)+vσ(2))/2 que es N/2 , y en general vσ(i) debe ser mayor que (jivσ(i))/i que es N/i .

Por ejemplo, el requisito (*) puede lograrse mediante el algoritmo a continuación (sugerido por @Louis). Mi pregunta es: ¿Existe trabajo en esta tarea de "casi ordenar" enteros en tiempo lineal, imponiendo algún requisito como (*) que el tipo real satisfaría? ¿El algoritmo a continuación, o alguna variante del mismo, tiene un nombre establecido?

Editar: corrigió el algoritmo y agregó más explicaciones


Algoritmo:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

Este algoritmo funciona según lo previsto por los siguientes motivos:

  1. Si un elemento v está en el cubo j entonces vN/j .

    v se coloca en el cuboj=min(N/v,n) , por lo tantojN/vN/v

  2. Si un elemento v está en el depósito j entonces N/(j+1)<v o j=n .

    v se coloca en el cuboj=min(N/v,n) , por lo tantoj=N/v oj=n . En el primer caso,j=N/v que significajN/v<j+1 y, por lo tanto,N/(j+1)<v .

  3. Para j<n , hay, a lo sumo, elementos j en los cubos de 1 a j .

    Sea j<n y sea k el número total de elementos en uno de los cubos 1..j. Por 2. tenemos que cada elemento v en un cubo i (con ij ) es tal que N/(j+1)N/(i+1)<v . Por lo tanto, la suma K de todos los elementos en los cubos de 1 a j es mayor que k×N/(J+1) . Pero esta sumaK también es menor queN tanto,k×N/(j+1)<KN y, por lo tanto, k/(j+1)<1 que nos dak<j+1 okj .

  4. T satisface (*) es decir, elelementoj -ésimo deT es tal queT[j]N/j

    Por 3. tenemos que T[j] , el elemento j -ésimo de T , proviene de un cubo i con ij por lo tanto T[j]N/iN/j .

  5. Este algoritmo lleva tiempo lineal.

    El cálculo de N toma tiempo lineal. Los cubos se pueden implementar con una lista vinculada que tiene inserción e iteración O(1) . El bucle anidado se ejecuta tantas veces como haya elementos (es decir, n veces).

a3nm
fuente
1
No descartar la pregunta (+1, es buena), pero ¿la clasificación por radix no haría más de lo que necesita?
user541686
@Mehrdad: ¡Gracias por tu comentario! La ordenación por radix ordenaría los enteros, pero llevaría tiempo . O(nlog(maxivi))
a3nm
¿Podría comentar qué es exactamente lo indeseable de esa complejidad temporal? ¿Tienes un número entero muy grande y todo lo demás es pequeño, por ejemplo?
user541686
1
@ a3nm la clasificación de radix no es O (n log n) es O (n) por lo tanto lineal si el tamaño de los enteros es fijo, por ejemplo, números de 32 bits o números de 64 bits. ¿Los números que ordena tienen tamaño variable?
Xavier Combelle
1
@XavierCombelle: Sí, estoy trabajando en el modelo de RAM y no puedo suponer que los enteros de entrada están limitados por una constante.
a3nm

Respuestas:

8

Esto se parece mucho al algoritmo ASort. Ver este artículo de Giesen et. Alabama.:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

Desafortunadamente, el tiempo de ejecución no es del todo lineal. El artículo anterior demuestra que cualquier algoritmo aleatorio basado en comparación que clasifica elementos dentro de n 2 / ν ( n ) tiene un límite inferior de n l o g ( ν ( n ) ) (suponiendo que ν ( n ) < n ).nn2/ν(n)nlog(ν(n))ν(n)<n


EDITAR , en respuesta a las aclaraciones en la pregunta:

Lo que estás haciendo es simplemente una especie de cubo . Sin embargo, el algoritmo para la clasificación de cubetas no es lineal en este caso. El problema: tienes que sumar los números naturales y luego realizar la división en cada uno de ellos. Como los números no tienen límites de tamaño, ya no es una operación de tiempo constante. Tomará más tiempo realizar los números que necesita sumar.N/V[i]

¿Cuanto tiempo más? La división depende del número de dígitos, por lo que es , multiplicado por n operaciones de división. Eso probablemente suena familiar. :)lg(n)n

Trixie Wolf
fuente
1
¡Gracias por indicarnos este artículo! De hecho, está un poco relacionado con la pregunta. Sin embargo, mi algoritmo (ni la versión original ni la versión revisada ligeramente diferente) no es tan similar a ASort ;. Primero, creo que mi algoritmo se ejecuta en , no en tiempo superlineal como ASort. Segundo, el criterio (*) es bastante diferente de la aproximación de la distancia de la regla de pie de Spearman; por ejemplo, el criterio (*) es más o menos estricto dependiendo de los valores de los enteros, a diferencia de la distancia de la regla de pie. En tercer lugar, aunque tanto nuestro algoritmo como ASort son elementos de unión, los criterios son bastante diferentes. O(n)
a3nm
@ a3nm La aclaración de lo que publicó anteriormente sugiere que está utilizando una clasificación de cubetas , que es lineal (y no basada en la comparación, lo que significa probar dos elementos uno contra el otro). El problema es que no funciona para todos los enteros matemáticos. Solo funciona si el tamaño entero está acotado.
Trixie Wolf
Cuando dices "Solo funciona si el tamaño entero está acotado", creo que esto solo es cierto si realmente estuviera ordenando los enteros. Pero, en general, el algoritmo que publiqué en realidad no los clasifica, solo aplica el criterio más débil (*). Así que creo que se ejecuta en tiempo lineal incluso cuando el tamaño entero no está acotado.
a3nm
2
@ a3nm No es lineal. Vea mi respuesta ampliada arriba.
Trixie Wolf
Gracias por la respuesta, y perdón por la demora. Creo que hay cierta confusión sobre el modelo. Estoy trabajando en el modelo RAM con una medida de tiempo uniforme (como en Van Emde Boas, Machine Models and Simulations, en Handbook of Computation): por lo que los números que manipulo pueden tener un tamaño logarítmico, pero las operaciones aritméticas en estos números tienen un costo unitario. He editado mi pregunta en consecuencia. Creo que, en este modelo, el algoritmo que propongo realmente se ejecuta en tiempo lineal (pero, por supuesto, en este modelo, el límite inferior para la ordenación basada en la comparación real todavía se aplica). nlogn
a3nm
2

Como resultado, mi pregunta es bastante irrelevante después de todo. De hecho, estoy trabajando en la máquina RAM con una medida de costo uniforme (es decir, tenemos registros cuyos registros no son necesariamente de tamaño constante pero pueden almacenar enteros de tamaño logarítmico en la entrada como máximo, y las operaciones en estos registros toman tiempo constante, incluyendo al menos además). Y, de hecho, en este modelo, la clasificación de enteros (al realizar esencialmente una clasificación de radix) se puede hacer en tiempo lineal. Esto se explica en el artículo de 1996 de Grandjean, Clasificación, tiempo lineal y el problema de la satisfacción .

(Esto no responde a mi pregunta de si hay nociones bien estudiadas de "casi ordenar" un conjunto de enteros, pero para que sean interesantes, uno probablemente necesitaría estas nociones más débiles para que sean más fáciles de aplicar, es decir, trabajar en un más débil modelo o de alguna manera ejecutado en tiempo sublineal. Sin embargo, actualmente no estoy al tanto de un sentido en el que este sería el caso).

a3nm
fuente