¿Algoritmo de clasificación de tiempo lineal para cadenas?

Tengo una serie de cadenas, cada una con una longitud diferente. p.ej:

s[0] = "sSWXk"
s[1] = "qCk"
s[2] = "sOQQXPbk"
.
.
.
s[x] = "KVfdQk";

a mi tambien me dan eso

n = s[0].length() + s[1].length() + ... + s[x].length()

Necesito un algoritmo de clasificación con complejidad temporal O(n) para clasificar estas cadenas lexicográficamente, de modo que (por ejemplo)

a < ab < b < bbc < c < ca

¿Alguna sugerencia? La complejidad temporal es el requisito esencial en el algoritmo.

preguntado el 12 de junio de 12 a las 20:06

¿Es esta tarea? -

La persona que le dé una respuesta a esto en general obtendrá una respuesta aceptada y unos cuantos millones de dólares. No puede ordenar (en general) en O (n), sin realizar algunas innovaciones serias de CS. -

@Oleksi: Puedes hacerlo en este caso. El OP no pregunta exactamente sobre el caso general. -

tenga cuidado con la definición de "n". ¡aquí "n" no es el número de elementos, sino el número total de caracteres de todas las cadenas! -

@EhsanKhodarahmi: Entonces estás diciendo que si tienes m cadenas de 1000 caracteres de largo, espera poder ordenarlas en O(m) ¿hora? (ya que O(1000*m) es el mismo que O(m)) -

3 Respuestas

Hay una estructura de datos llamada trie que es ideal para esto. Si inserta todas las palabras en el trie y luego hace un DFS sobre el trie, obtendrá las palabras en orden. Hacerlo también lleva el tiempo O(n), donde n es el número total de caracteres en todas las cadenas.

Como asumo que esto es tarea, dejaré los detalles de cómo implementar el trie como ejercicio. :-)

¡Espero que esto ayude!

Respondido el 12 de junio de 12 a las 20:06

Tuve una pregunta de prueba similar, que respondí incorrectamente, pero me ha molestado desde entonces. Así que seguí investigando y creo que hay otros dos métodos que podrían producir resultados en tiempo lineal. Una es tratar las cadenas como una serie de enteros con una base de 26 y usar la ordenación radix en la matriz después de rellenar las cadenas para que tengan la misma longitud (de alguna manera, probablemente haya una forma ingeniosa de hacer esto sin aumentar drásticamente el espacio de almacenamiento , simplemente no he resuelto los detalles). No he creado un ejemplo ni lo he probado, por lo que no puedo decir con certeza que esto funcionaría, pero el principio parece sólido. Otro método sería la ordenación de cubos, utilizando una matriz de 26 elementos que contiene punteros a 26 listas (los cubos). Ordene cada cadena en las listas vinculadas a cubos apropiadas (aquellas que comienzan con 'a' en la lista a la que apunta el primer elemento de la matriz, etc.) Luego ordene cada lista usando un método O(n log n) estándar. No entiendo completamente las matemáticas, pero de acuerdo con el libro de texto de Cormen "Introducción a los algoritmos", el uso de la clasificación de cubos de esta manera termina teniendo una complejidad de tiempo lineal. Sin embargo, parece que el espacio sería más grande que el método de estilo Radix, siempre que se pueda cumplir con el requisito de relleno adecuado sin asignarle un montón de espacio de almacenamiento.

Respondido 09 Oct 20, 16:10

Debido a que este es un problema de tarea, solo puedo dar una pista. Sugerencia: use una versión modificada de ordenamiento por conteo. Es práctico si asumimos que un char es de 8 bits.

Respondido 14 Oct 15, 09:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.