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