Estoy interesado en ordenar una matriz de valores enteros positivos 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 de que no es realmente ordenados en general, sino una "buena aproximación" de la versión ordenada de . 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 sea , por cada , requerimos que (es decir, el "cuasi-ordenado "la lista está limitada desde arriba por la función decreciente ). Es fácil ver que el tipo real satisface esto: debe ser mayor que entonces es como máximo que es , y en general debe ser mayor que que es .
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:
- Si un elemento está en el cubo entonces .
se coloca en el cubo , por lo tanto
- Si un elemento está en el depósito entonces o .
se coloca en el cubo , por lo tanto o . En el primer caso, que significa y, por lo tanto, .
Para , hay, a lo sumo, elementos en los cubos de 1 a .
Sea y sea el número total de elementos en uno de los cubos 1..j. Por 2. tenemos que cada elemento en un cubo (con ) es tal que . Por lo tanto, la suma de todos los elementos en los cubos de a es mayor que . Pero esta suma también es menor que tanto, y, por lo tanto, que nos da o .
satisface (*) es decir, elelemento -ésimo de es tal que
Por 3. tenemos que , el elemento -ésimo de , proviene de un cubo con por lo tanto .
Este algoritmo lleva tiempo lineal.
El cálculo de toma tiempo lineal. Los cubos se pueden implementar con una lista vinculada que tiene inserción e iteración . El bucle anidado se ejecuta tantas veces como haya elementos (es decir, veces).
Respuestas:
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 ).n n2/ν(n) n∗log(ν(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
fuente
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).
fuente