2011-02-02 12 views
8

Esta es una pregunta de tareas, por lo que me gustaría evitar las respuestas completas y preferiría sugerencias si es posible.Algún algoritmo de ordenación de O (n)

Dada una matriz de enteros aleatorios A [1 ... x], el programa debe devolver los primeros elementos de la matriz y en orden creciente donde 1 < = y < = sqrt (x). Entonces, básicamente, dado un conjunto [5,9,2,8] ey = 2, el programa debería devolver [2,5].

La respuesta "ordenar primero, devolver primero y elementos" está fuera de la ventana ya que lo mejor que podemos hacer es n * tiempo de logn con merge o quicksort. La respuesta tiene que hacer uso del hecho de que solo devolvemos la mayoría de los elementos sqrt (x), y la única otra respuesta que tengo hasta ahora es hacer una búsqueda for-loop para el elemento mínimo en la matriz, eliminando el mínimo de la matriz, guardándolo en una nueva matriz, digamos B, y repetir el proceso en la versión ahora más pequeña modificada de una de largo x-1, lo que nos da el tiempo de funcionamiento de esta manera:

x + (x-1) + (x-2) + ... + (x-y) 

que cuenta el número de iteración for-loop de min-search, y nos da como máximo iteraciones y o sqrt (x) en el peor de los casos, y hay como máximo x elementos en la matriz. Así que tenemos sqrt (x) * x, que es mejor que O (n * logn) pero todavía no del todo O (n): /.

+4

¿Ha mirado a [clasificación del cubo] (http://en.wikipedia.org/wiki/Bucket_sort)? Cuando veo los requisitos O (n), es lo único que me viene a la mente. –

+0

"el programa debe devolver los primeros y * dígitos *". Tal vez * números *? – ruslik

+0

@ruslki - sí, quise decir los primeros elementos de la matriz. Arreglando eso ahora. – thezhaba

Respuesta

9

Consejo: Supongamos que tenemos un O (n) algoritmo de tiempo para recoger la y º elemento ...

+1

¿Entonces no tendría que llamarlo sqrt (x) veces? Eso sigue siendo sqrt (x) * y. – thezhaba

+2

@thezhaba: Vas en la dirección incorrecta. Para una sugerencia adicional: piense en el primer paso en el quicksort. –

+2

Parece que las personas menosprecian sin siquiera saber si lo que está escrito es correcto o incorrecto. Especialmente con las respuestas incompletas con solo pistas, es aún más difícil estar seguro de que algo anda mal. ¡Ridículo! :-) –

0

En realidad sqrt (x) crece más rápido que log (x), por lo que O (x * sqrt (x)) es peor que O (n * log (x)). Entonces (aún) no lo has hecho mejor que ordenar toda la lista.

Existen varias formas de solucionar este problema. Para uno de ellos, mira http://en.wikipedia.org/wiki/Sorting_algorithm#Summaries_of_popular_sorting_algorithms y mira todos los algoritmos de clasificación comunes. ¿Qué algoritmo puede proporcionarle los primeros elementos de manera más eficiente?

+3

Hay * montones * de buenos algoritmos de clasificación en esa página ... :) –

0

donde 1 = y < < = sqrt (x)

Nota lo que este requisito se da. Si Y ≤ √ x, entonces y log y ≤ (√ x log x)/2 ∈ O (x y frac12; log x) ⊂ O (x).

Sort-then-filter puede estar fuera de la ventana, pero es aceptable filtrar y clasificar.

-1

Para y, utilice las ideas de clasificación rápida, escoja un número aleatorio y divídalo en 2 partes. Parte1 (más pequeño) y parte2 (más grande).
Si la longitud de Part1 < y, a continuación, hacer la partición en la Parte 2 con y '= y - len (Part1) Si la longitud de Part1> y, a continuación, hacer la partición en Part1 con y' = y Si la longitud de Part1 == y, luego ordena Part1.

para la partición, la media debe estar casi en O (n) (no puedo aprobar ahora, pero es muy rápido) (Voy a tratar de encontrar algún material de esta parte) ..
Ordenar por y requiere ylog (y) < sqrt (x) log (sqrt (x)) -> 1/2 * sqrt (x) * log (x) < 1/2 * sqrt (x) * sqrt (x) => 1/2 x.

+0

Es una pista muy detallada y específica. Y el tiempo de ejecución es en promedio O (n). Pero el peor de los casos es O (n * n), no O (n). No sé si eso es suficiente para este problema de tarea. – btilly

-1

Solo quieres una pista, ¿verdad?

Lea el comentario de random_hacker muy con cuidado en caso de que haya olvidado la gran pista que le está dando. Hay un algoritmo para clasificar una matriz en la que un pequeño cambio producirá su algoritmo.

En general, si y no está restringido a sqrt (x), se obtiene un algoritmo que funciona en O (x + y * log x), que es O (x) si y = O (x/log x), que es por supuesto el caso cuando y < = sqrt (x).

+0

pista @gnasher: echar un vistazo a las fechas, thezhaba bien puede ser un conferenciante por ahora. – greybeard

Cuestiones relacionadas