¿Existe una mejor complejidad que O (n log n) para ordenar?

Si se refiere a algoritmos de clasificación basados ​​en la comparación en los que en cada paso necesita comparar dos elementos de una secuencia de entrada general , entonces el límite inferior de dicha complejidad del algoritmo es [matemática] O (n \ log n). [/ Matemática] Este resultado ya se discute en muchos libros de texto como: la sección 8.1 de Introducción a los algoritmos, 3a edición.

La idea principal de la prueba es que podemos representar el algoritmo basado en comparación mencionado anteriormente para un problema de clasificación de elementos [matemáticos] n [/ matemáticos] en forma de un árbol de decisión. Cada nodo interno (no hoja) del árbol está etiquetado con un atributo [math] f_ {i, j} [/ math] que es principalmente una comparación de elementos [math] i [/ math] y [math] j [ / math] de la matriz de entrada. Suponiendo que los elementos son distintos, cada nodo interno tendrá dos aristas que saldrán indicando los casos en que el elemento [math] i [/ math] es menor que [math] j [/ math] y viceversa. Las hojas de este árbol están etiquetadas por permutaciones de los índices de la matriz de entrada. El árbol representa un algoritmo correcto basado en la comparación si para cualquier matriz de entrada de longitud [matemática] n [/ matemática] el resultado de atravesar el árbol en esta matriz (basado en la evaluación de atributos en los nodos que comienzan en la raíz y terminan en una hoja ) es el orden ordenado de los elementos de esta matriz.

Cualquier árbol de decisión tendrá al menos [math] n! [/ Math] ya que cualquier permutación de una matriz de entrada arbitraria puede ser su orden ordenado. Y dado que el árbol es binario, sabemos que la altura del árbol será al menos [matemática] O (\ log n!) = O (n \ log n) [/ matemática].

PD: tenga en cuenta que la respuesta supone que la secuencia de entrada es general y que el algoritmo de clasificación depende de la comparación de elementos.

El límite N * log (N) es realmente bastante obvio si lo miras desde una perspectiva de teoría de la información.

  • El número de bits necesarios para describir el índice de un elemento en la matriz ordenada de tamaño N es proporcional a log (n)
  • La única operación que usa para decidir a dónde va algo es una comparación, que proporciona 1 bit de información.
  • Tienes que comparar todos los N elementos al menos una vez obviamente

Esto significa que debe crear N * log (N) bits de información de alguna manera para ordenar N elementos

Una comparación proporciona solo 1 bit de conocimiento, así que no importa lo que hagas, debes terminar haciendo N * log (N) comparaciones

Algunos tipos, como la clasificación de radix, parecen pasar por alto este límite, pero si observa con cuidado, debe haber múltiples pases, proporcionales al registro (N), de una clasificación de conteo para realizar una clasificación de radix.

Cuando haces una especie de radix de enteros de 32 bits usando 4 pasadas con un tamaño de palabras de 8 bits, explotas el hecho de que el circuito de memoria de la computadora puede hacer 8 comparaciones por ti internamente, cuando colocas un valor en la ubicación de 8 bits X, la RAM demultiplexa esos 8 bits internamente en una operación; si se representara como software, serían 8 operaciones.

Por lo tanto, incluso la clasificación de radix solo aparece como O (n) : desde una perspectiva más amplia, sigue siendo O (N * log (N))

Si está buscando algoritmos de clasificación de propósito general, entonces sí, O (n log n) es tan bueno como parece.

Pero si sabes algo sobre la entrada, puedes hacer trampa.

Por ejemplo, si sabe que el conjunto de datos de entrada solo contendrá potencias de dos entre 2 ^ 0 y 2 ^ 63 sin repeticiones, podría encontrar un algoritmo de clasificación que sea O (n).

P.ej. Utilice un entero de 64 bits como un mapa de bits que se pone a cero inicialmente; analiza la entrada y voltea los bits correspondientes a la posición de encendido en tu mapa de bits; luego itere sobre los bits en su mapa de bits para obtener la secuencia ordenada.

Cuanto más sepa acerca de sus datos y / o más suposiciones pueda hacer, más se adaptarán sus algoritmos de clasificación y búsqueda.

Para la ordenación de propósito general: O (n log n) es tan bueno como se pone.

Depende del dominio de los datos . Supongo que ordena la matriz y solo los algoritmos deterministas. Si el tamaño del dominio de datos es muy pequeño en comparación con el número de elementos, entonces se puede usar la ordenación de conteo, que tiene una complejidad mejor que O (N log N) donde N es el número de elementos en la matriz.

Si está hablando de la clasificación in situ, entonces lo mejor que puede hacer en términos de complejidad temporal es O (nlogn). Si el espacio no es un problema, puede hacerlo en el tiempo O (n) usando el conteo de clasificación, la clasificación de radix, etc.

Radix sort.

Complejidad: O (n * k), donde k es la longitud de la clave.

(Considerando que la longitud de las teclas es constante).

More Interesting

¿Puede un camino más corto contener un ciclo?

¿Cómo crean los algoritmos los programadores de software?

¿Es posible implementar un montón dinámico paralelo?

¿Cómo aprenden los algoritmos de aprendizaje de refuerzo del juego de ajedrez a jugar bien, dado que cada movimiento no está etiquetado como bueno o malo, a diferencia del aprendizaje supervisado donde cada dato está etiquetado como bueno o malo?

¿Cuánta competencia en la estructura de datos y el algoritmo es más que suficiente para ingresar a Google / Facebook y cuál debería ser la estrategia de 4 meses para aprenderlo?

¿Podría haber un límite superior en la 'inteligencia' de una IA?

¿Cuál es la diferencia entre el algoritmo de Prim y el vecino más cercano?

Cómo combinar la ordenación por fusión y la ordenación por peine

¿Cómo implementas quicksort en c? Sé que hay respuestas disponibles en línea, pero estoy buscando idealmente la forma más elegante.

La solución de este problema Problema - C - Codeforces es este Ideone.com pero ¿qué está sucediendo dentro con los punteros, especialmente las líneas 27, 28, 36?

¿Cómo saben las computadoras cuándo comienza y termina una cadena binaria?

¿Es posible tener análisis predictivos utilizando motores de recomendación? En caso afirmativo, ¿cuáles son algunos de los algoritmos de análisis predictivo utilizados por los motores de recomendación?

Si creció en una familia alcohólica, ¿cuál fue su historia y los desafíos que enfrenta personal y profesionalmente debido a la educación?

¿Cuál es la diferencia entre los algoritmos de Dijkstra, Kruskal y Prim?

¿Qué es el diagrama de flujo?