12 julio, 2007

Memes desde Springfield

Como Pinar y yo, currar, lo que se dice currar, más bien poco (nos dedicamos a la investigación y ya se sabe que, en España, para que la investigación esté bien pagada lo mejor es hacer lo mínimo posible) pues a veces almorzamos -de verdad- y a veces comentamos -electrónicamente- lo que vemos por la web.

Así me he enterado de lo que es un "meme". Recién llegado a la blogosfera, Aitor Menta está en pañales todavía. Pues nada. Para quien no lo sepa, un meme viene a ser una chorrada que se divulga rápido. Más que nada porque en la blogosfera es práctica habitual difundirlo a otros blogueros con los que uno esté en conexión (5 personas, por lo común). A veces son preguntas personales o manías... a veces son cosas como ésta.

Pues eso, que me he creado un avatar con la imagen de Aitor Menta, tal y como (yo creo que) sería de haber nacido en Springfield. Aprovecho para decir que el personaje favorito de Aitor Menta es el jefe Wiggum, al cual adora y reverencia.

Pero como a través de mis ojos Aitor Menta es demasiado guapo, creo que será mejor pedir ayuda a una mano inocente para que me ayude. Por supuesto, yo también plasmaré la esbelta figura de Aitor en Springfield... y luego publicaré ambas. De este modo sabremos hasta qué punto mi visión está sesgada por mi admiración por Aitor.

Así que la cosa continuará. Por cierto, que debería pasar este meme a cinco personas. Pero como no tengo mucho amigos, aparte (claro está) del vendedor de camisetas personalizadas, pues aquí lo dejo. Por otro lado, ya he explicado que a los informáticos nos dan miedo las potencias... y las de cinco ya ni te cuento.

Actualización

¡Ya están los avatares listos!. Pues bien, sorpresas no ha habido. La mano "inocente" que ha retratado a Aitor Menta (la llamaremos "Química Loca") ha finalizado su trabajo y por fin podemos comparar los resultados.



Este de la izquierda es el que he hecho yo. Y este, más bajito y cachas lo ha hecho Química Loca. ¡Muchas gracias, por cierto a la susodicha!

En fin, que habrá que preguntar a Pinar qué piensa del resultado. Lo siguiente será enviar a los creadores de la serie el avatar, por si les interesa tener algún informático menos freak que no esté obsesionado con los Monty Phyton.

¡Saludos desde Springfield!

Cosas del japonés (y la japonesa): Respeto

¡Qué cosas tienen los japoneses!. Eso, o algo similar es lo que decimos al contemplar, desde la ventana de Youtube, los vídeos que desde el país del sol naciente nos llegan. Dado que la cultura nipona es tan diferente de la nuestra (apenas hace 50 años que la cultura occidental ha penetrado en las islas), no puede dejar de sorprendernos.

La lengua propia recoge de forma natural las características de la cultura y es la correa transmisora de ésta. Un ejemplo que no me invento yo: la palabra esposa, que se puede escribir con los kanjis 家内 (casa y dentro) o 女房 (mujer y habitación). ¿Qué por qué sucede esto? Pues por esto.

El estudiante de japonés descubre estas características poco a poco. Y tardará más en aprender a usar correctamente el lenguaje. Pero una de las cosas que primero aprende y más llama la atención del estudiante es el respeto impreso en el lenguaje. Podemos decir que el japonés distingue entre el idioma formal y el informal... y nos quedaríamos muy cortos.


Existen tres tipos de lenguaje formal: el lenguaje de respeto 尊敬語 (sonkeigo), el de modestia 謙譲語 (kenjougo) y el pulcro 丁寧語 (teineigo). [Los más avispados concluirán que "go" significa lenguaje o idioma]. El informal admite muchas gradaciones, aunque principalmente se distingue entre coloquial y vulgar. La diferencia va más allá de lo que podemos expresar con ejemplos en castellano: la lengua japonesa es demasiado rica en ese sentido y muchos matices se suelen perder en la traducción. Pondremos algunos ejemplos sencillos, sin embargo.

Existen varios pronombres personales para referirse a la primera persona, por ejemplo. El uso de uno u otro dependerá del nivel de formalidad de la situación. Para los pronombres podemos distinguir hasta 4 grados de formalidad. Los mas formales sólo se utilizan en documentos oficiales o están sencillamente en desuso. Los más vulgares son insultos en sí mismos. Eso sucede con los pronombres para referirse a la segunda persona del singular: てめえ temee y きさま kisama. Se utilizan con profusión en mangas y animes y las traducciones siempre quedan algo cojas. Podemos traducir kisama por tú, gilipollas. Pero es más complicado traducir algo como てめえの力 temee no chikara (tu fuerza). Una solución es: Tu fuerza, gilipollas. Convendrán conmigo en que se pierde el toque.

Tabla ejemplo de pronombres:


Algunos pronombres (¡hay muchos más!)
Primera persona (singular) Segunda persona (singular)
Muy formal

watakushi


Formal私 watashiあなた anata
Informal僕 boku (hombres)
あたし atashi (mujeres)
君 kimi
Coloquial俺 ore (hombres)
お前  omae (hombres)
あんた anta (mujeres)
Vulgarあっし asshi (hombres)

(insultos)

てめえ

きさま



Hombres y mujeres no usan los mismos pronombres (y ese es el significado de los paréntesis). Esa es otra característica notoria del idioma. Expresiones, prefijos o partículas son usados exclusivamente por hombres o mujeres. Evidentemente, el hombre que "se equivoca" de partícula es visto como afeminado. La mujer que usa una expresión de hombre es "ruda".

Una vez conocemos los pronombres, suele ser útil aprender algunos verbos y decir cosas como "tú lees", o "yo escribo", o frases de similar trascendencia léxica. Conjugar verbos en japonés es más fácil que en castellano, y muy diferente. Fundamentalmente, porque existen dos tipos de conjugaciones: formal e informal. Por cierto, que sólo hay un pasado y un presente (y no hay futuro verbal). Incluso hay una conjugación especial para sonkeigo, y versiones kenjougo de algunos verbos.

De nuevo, atendiendo a la situación, tendremos que seleccionar la forma verbal que más se ajuste al grado de formalidad en que se desarrolle la conversación. No será lo mismo hablar con un desconocido que con un amigo íntimo. No es lo mismo un desconocido al que ayudamos que un desconocido que visita nuestra casa. El desconocido puede estar situado jerárquicamente por encima de nosotros (y utilizaremos el kenjougo) o puede tener un empleo de menor entidad (teineigo). Y, por si todo esto fuera poco, ¡también depende de lo que hablemos!.

Se entiende por tanto que el japonés pueda sonar completamente diferente en función de la situación en que se produzca la conversación (bueno, sólo si se entiende algo: de no entender nada suena todo igual). Y eso es lo hizo que Richard Feynman (que se dedicó a hacer de todo) desistiese del estudio del japonés. Según se cuenta en "¿Está usted de broma, Sr. Feynman?", no pudo entender por qué la misma frase, con el mismo significado, se debía expresar de forma distinta según quién la expresase. Así que al fin y al cabo, Feynman tenía una limitación poderosa: la lógica.

Y, como el tema da mucho de sí, lo dejaremos para otro día... y a otra cosa mariposa.

Japonés en viñetas. Norma editorial.
Japonés en viñetas 2. Norma editorial.

06 julio, 2007

CSI III: Ordenando longanizas (y 3)

Aprovecho para indicar que CSI significa Cosas que SÍ se dan en Informática, que, para quien no lo sepa, es una serie de cosas que se estudian en la carrera de Ingeniero Informático según el plan de estudios aprobado en les Corts que correspondan.

Vale, tras los posts 1 y 2 de la serie Ordenando Longanizas, tenemos algoritmos (formas de hacer cosas) para ordenar un vector. Todos tienen coste cuadrático en el peor caso, lo cual implica que, a malas y con un conjunto de datos muy grande, tendremos que inventar alguna excusa creíble (la red, un virus, el Windows...) para justificar el cuelgue. En eso somos muy buenos, los informáticos.

Afortunadamente, existen métodos mejores para ordenar vectores. Afortunadamente digo, porque los inventó gente bastante más lista que tú y que yo. Cuando se recuerda al autor de un algoritmo, entonces es que es muy bueno. Y uno de los más buenos es:

El Quicksort, de Sir Richard Hoare


En 1960 este señor inventó una técnica para ordenar vectores que, tras muchas aportaciones, se ha convertido en una de las más populares y eficaces para ordenar vectores. La idea es la siguiente: seleccionaré un elemento cualquiera del vector (pivote) y situaré los elementos más pequeños que él a su izquierda y los más grandes a su derecha. Cuando esto suceda, el pivote estará en su posición final.

Vale, eso es fácil de decir. ¿Cómo situamos a la derecha y a la izquierda para todos los elementos?. Bueno, pues sencillamente intercambiaremos los elementos mayores que el pivote que estén a la derecha (descolocados) con los menores que el pivote que estén a la izquierda (descolocados). Vamos recorriendo por ambos lados el vector y cuando nos crucemos... ahí colocaremos el pivote. En total sólo tenemos que recorrer la longitud del vector para obtener la posición de un elemento (como los trenes que al chocar suman la distancia que les separaba).

A ver 4 7 2 43 14 1. Suponed que cogemos el 4 como pivote. Empezamos a ver si tenemos que intercambiar por los extremos. Como 7 es mayor que el pivote y el 1 menor, los intercambio, hop: 1 2 43 14 7. Seguimos: como el 2 no es mayor que el 4 avanzo el indice y miro el 43. Lo señalo y busco elementos menores que 4 desde atrás: 14, no, 43, no, 2... un momento: ¡me he pasado!. Eso quiere decir que ya estoy señalando el lugar correcto donde insertar el pivote. Lo pongo donde señala el 2. Diréis: lo más listo sería ponerlo donde el 43. Sí, pero los algoritmos no son listos: hacen lo que tienen programado y ya. Como hemos intercambiado, tenemos algo como 2 1 4 43 14 7.

Y ahora viene lo bueno. El 4 está ordenado. Lo que no lo está son las 2 subvectores que tiene a cada lado. Para ordenarlas... aplicaremos el mismo algoritmo a cada una de ellas. La lista 2 1, el pivote es el 2 y hay que cambiar con el 1. Por tanto intercambio 2 con el 1. ¡La única dificultad consiste en saber cuándo parar de hacer esto!.

Por cierto que esto que hemos hecho (utilizar la función dentro de la misma función) se llama llamada recursiva. Al principio de programar no es sencillo pensar en funciones recursivas pero una vez las conocemos, resulta difícil no hacer uso de ellas.

Así que Quicksort funciona así: intercambia los elementos descolocados en relación al pivote y finalmente sitúa el mismo en su posición final de la lista. Luego utiliza el mismo algoritmo para ordenar los dos (o uno) subvectores que quedan a los lados del pivote.

¿Y cuánto cuesta esto?. Supongamos que, en el mejor caso, el pivote escogido resulta quedar en el medio del vector, partiendo el mismo en dos mitades equilibradas. Sabemos que entonces hay 1 elemento ordenado. Las siguientes llamadas a Quicksort hacen lo mismo, de modo que tras ellas, el vector queda dividido en cuatro partes equilibradas: en ese momento hay 3 elementos ordenados. Luego en 8, 16... . En fin que estamos calculando potencias de 2, que nos permiten ordenar tantos elementos -1. Razonando de forma inversa, si tenemos n elementos a ordenar, ¿cuántas veces hemos de aplicar este algoritmo?: pues los que nos enseñaron que era "el contrario" de la potencia: log(n).

Podemos imaginar este proceso en forma de árbol. En el primer nivel ordenamos el primer pivote y llamamos a las funciones para ordenar los elementos que quedan a la izquierda y a la derecha. Estas llamadas forman parte del segundo nivel, que ordenan otros dos elementos. El tercer nivel ordena cuatro más... Como las cantidades crecen muy rápido, el número de datos que podemos ordenar también lo hace sin más que aumentar un poco la altura del árbol. Por eso son tan buenos los algoritmos de costes logarítmico.

En cada nivel, las distintas llamadas sólo tratan partes disjuntas del vector original, de tamaño n. Ya sabemos que en cada una de ellas el coste de colocar un elemento en su posición es lineal con orden del tamaño del vector. Como las partes del vector en cada nivel suman n, el coste de cada nivel es O(n). Como tenemos log(n) niveles, el coste total del Quicksort en su mejor caso es O(nlog(n)).

¡Pero eso no nos vale!. ¿Qué pasa en el peor caso?. Pues que tenemos la mala pata de elegir siempre un pivote que resulta ser el mayor o el menor elemento de los que tenemos que ordenar. De modo que siempre perdemos una de las ramas del árbol y resulta que tenemos llamar n veces a una función que tarda O(n) en ejecutarse:. Total O(n2). Sucedería si siempre escogiésemos como pivote el primer elemento en un vector ordenado. Hay formas muy sencillas de evitar esto, escoger como pivote el mediano de tres elementos, o escogerlo simplemente al azar.

Pero ya sabemos un poco más y nos preguntamos: ¿qué sucede en el caso medio?. Pues que, aunque la elección del pivote separe de forma descompensada el resto de elementos, el coste sigue teniendo una forma logarítmica. Supongamos un caso mínimamente mejor que el peor caso: sólo dejando dos elementos a ordenar en un lado en cada partición. En ese caso la altura del árbol se reduce a la mitad y por tanto, el coste es la mitad que el del peor caso. La altura del árbol se reduce mucho con poco que equilibremos las ramas

Resultado final: mejor caso O(nlog(n)), peor caso (evitable) O(n2), caso medio O(nlog(n)). Por cierto no hay ningún algoritmo que ordene un vector con coste teórico inferior a O(nlog(n)). Los hay que tienen mejor coste en circunstancias muy especiales, los hay que arrojan mejores resultados experimentales que el Quicksort en el caso medio, los hay cuyo peor caso es mejor... Pero si usted descubre algún método de ordenar longanizas con un coste teórico menor... no se lo cuente a nadie y envíelo a Aitor Menta para que, amablemente, lo publique verifique.

Posts relacionados


25 junio, 2007

Cosas que SÍ se dan en Informática (II)

Ordenando longanizas. Segundo capítulo.

Vale. Supongamos que nos hemos leído el primer capítulo. Dado que esto no es como una novela de Dan Brown, sería aconsejable haberlo leído para entender lo que viene ahora, sobretodo si uno no estudió informática (que raro, no estudiar informática).

Tenemos un procedimiento para ordenar vectores que tiene un coste temporal cuadrático O(n2) y ahora queremos otro método mejor, es decir, con un coste menor. O con el mismo coste y que además reproduzca una música linda al terminar.

Una idea consiste en disponer de un procedimiento (función) que calcule el mayor elemento de un vector, para colocarlo al final. Esta función es muy sencilla, recorre los elementos del vector comparando el mayor obtenido con el siguiente elemento. Es decir, almacena el mejor encontrado a cada paso, recorriendo todos los elementos. Esa función tiene por tanto un coste lineal -O(n)-, pues se ha pateado los n elementos. ¿Cuántas veces tenemos que llamara a esa función?. Pues n-1. Cuando todos los mayores elementos - 1 estén en su posición, el primero será el más pequeño. Cada vez que llamamos a la función, por otro lado disminuimos en uno el tamaño del vector, ya que la última posición ya ha sido correctamente ocupada por el mayor elemento que la función obtiene. Esto no nos preocupa cuando calculamos costes, como ya vimos. Por tanto el coste temporal es O(n2)


En resumen, que no hemos obtenido nada mejor de lo que teníamos. Al contrario, es peor, pues no podemos distinguir mediante este procedimiento si el vector está ordenado, así que aquí no hay mejor caso. En cualquier caso es una patata. Por eso es el primero que se aprende.

Imaginemos otra función que, en cambio, sirva para insertar un elemento en un vector ya ordenado. Esta función tiene un coste lineal y es muy sencilla. Para cada elemento, compara con el más grande (que estará a la derecha) y mientras el elemento a insertar sea más pequeño, le hace un hueco desplazando los más grandes a la derecha.
Un ejemplo: quiero insertar un 4 en el vector ordenado 2 7 43. Comparo con 43, como es más grande, muevo el 43 para hacer sitio al 4. Y nos queda esto: 2 7 (hueco) 43. Comparo con el 7, y éste, que es más grande, se aparta educadamente: 2 () 7 43. Pero al comparar con el 2, vemos que éste no se tiene que apartar. Y ha quedado un hermoso hueco donde ponemos el 4: 2 4 7 43.

¡Pero no tenemos un vector ordenado! ¡No queríamos esto!. Wakarimashita. Pero lo construiremos. Y si nos fijamos vemos que siempre hay una pequeña parte del vector ordenado: el primer elemento. El primer elemento es un vector ordenado... de un elemento. Y con nuestra maravillosa función podemos añadir cualquier elemento a este mini vector ordenado. Evidentemente, a no ser que queramos hacer el idiota un rato, los elementos que añadiremos serán los del propio vector desordenado. De este modo, construiremos nuestro vector.

El procedimiento es simple: recorreremos el vector llamando incrementalmente a nuestra función que inserta elementos. Tenemos nuestro glorioso vector 4 7 2 43 14 1. El 4 ya está ordenado... en el vector formado por el 4. Insertamos el 7 en ese vector. Y tenemos el 4 y el 7 ordenados en el vector 4 7. Al vector se apunta el 2, y los otros números le hacen hueco para que ocupe su lugar. Así tenemos 2 4 7. Insertamos el 43, que se queda muy atrás, cómodamente. Insertamos el 14 en 2 4 7 43. Sólo se mueve el 43 para dejarle hueco: 2 4 7 14 43. Por último, insertamos el 1, que obligará a todos los elementos a moverse un poco. Y ya está: 1 2 4 7 14 43.

Si habéis pillado lo del cálculo de costes y tenéis un poco de picardía me diréis: ¡eh! si la función para insertar tiene coste lineal (n) y hay que recorrer n-1 posiciones del vector llamándola, ¡volvemos a tener coste cuadrático!. ¡Chapuzas, más que chapuzas!

Tenéis razón, pero no. La gracia está en que la función para insertar tiene coste lineal... en el peor caso. Es decir, cuando ha de insertar el elemento más pequeño (como cuando insertamos el 1 en nuestro ejemplo). Entonces hay que recorrer todo el vector haciéndole hueco. Pero en promedio no será necesario llegar hasta el final. Cuando hemos insertado el 7 o el 43, la función ha tenido coste constante. y cuando hemos insertado el 14, sólo hemos recorrido un elemento. Al igual que el Bubble Sort, distinguimos entre un mejor caso (vector ordenado, coste O(n)) y un peor caso, coste (O(n2)).

Este algoritmo un mejor comportamiento que Bubble Sort, porque aprovecha el orden parcial en el que se encuentre el vector y no debe esperar a que se encuentre completamente ordenado como éste para obtener beneficios. ¿Cómo medimos lo que tarda el algoritmo en el caso medio, por otro lado?. Pues hemos de contar el número de veces que hemos tenido que "dejar hueco". A esto se le llaman inversiones. El dos ha realizado dos inversiones, puesto que antes estaba 2 posiciones más allá del 4 y el 7. Estos no han realizado ninguna, claro está. El cálculo absoluto es difícil de hacer, pero para eso están las notaciones. Decimos que en caso medio, el algoritmo cuesta O(n+d), donde d es el número de inversiones, una medida de lo (des)ordenado que está el vector.

Por supuesto, este genial procedimiento no lo ha inventado Aitor Menta, así que ya tenía nombre: Insertion Sort.

¿Nos quedamos con este algoritmo tan maravilloso?. Pues no, porque no nos vale. Para jugar con pocos elementos está bien, pero no podemos permitirnos un coste cuadrático cuando tratamos con cantidades realmente grandes. ¿Saben lo que hace una función n2 con datos grandes?.

¿Existe alguna función que nos ayude a ordenar vectores con coste inferior a Insertion Sort? La respuesta (afirmativa) a tan interesante cuestión será dilucidada en el siguiente -y último de la serie- capítulo de: ¡Ordenando Longanizas!

21 junio, 2007

Cosas que SÍ se dan en Informática

Ya sabemos que Aitor es informático. Lo explicábamos en este post, donde también vimos qué cosas no hace un informático. Entre lo que aprende un informático y lo que la gente espera que sepa un informático hay enorme vacío, que sólo se puede llenar con muchos fascículos "La informática es fácil" y revistas "MAXimiza TODO TU PC".

Hay informáticos, compañeros de carera, que a la pregunta: qué ordenador tienes responden, uno blanco. Hay informáticos que se quejan de que escriben su contraseña y sólo aparecen asteriscos. Hay doctores que no saben qué es UNIX y dan clases de seguridad en UNIX (de estos hay al menos uno).

Si no nos enseñan a formatear un disco duro, ni a configurar una tarjeta de video ni a hacer páginas web... ¿qué nos enseñan en la carrera?.

Con este post iniciamos una apasionante a la par que didáctica serie:

Cosas que SÍ se dan en Informática


Capítulo 1. Ordenando longanizas.

Aitor me sugiere un problema clásico de la algoritmia para comenzar. Algoritmia es, para nosotros, el arte de resolver problemas paso a paso. El problema, que se estudia en primero de carrera, consiste en ordenar un vector. Un vector no es más que una longaniza de números, que se sitúan consecutivamente en memoria. En inglés se llaman arrays y en Sudamérica lo apañan y los llaman arreglos. He aquí una gloriosa representación de un vector: 4 7 2 43 14 1. Y éste es el mismo vector ordenado: 1 2 4 7 14 43. No parece difícil hacerlo y, de hecho, no lo es. Ahora veamos cómo le decimos a un computador que lo haga.

Un computador dispone de una serie de operaciones -instrucciones-. Entre éstas, saber si un número es mayor que otro, sumar, restar... y poco más, al fin y al cabo. Y una restricción que me invento yo: no puede conocer el valor de más de dos posiciones del vector en la misma operación, es decir, en el mismo instante. Si los computadores tuviesen una instrucción para comparar hasta un millón de números, ordenar vectores sería más sencillo. Pero como no la hay, restringimos a dos los números a comparar y nos las ingeniamos, que la tecnología es cara y los ingenieros baratos.

Veamos cómo lo hacemos. Cogemos los dos primeros números y los comparamos. Si el segundo es menor que el primero, los intercambiamos. En nuestro caso no sería necesario pues 4 es menor que 7. Damos un pasito y realizamos la misma operación. Ahora sí que se cumple nuestra condición e intercambiamos el 7 con el 2. Por tanto, en el siguiente paso compararemos otra vez el 7 con el 43. No cambiamos, damos un pasito, e intercambiamos 43 y 14. Un pasito e intercambiamos 43 con 1. De este modo hemos llegado al final del vector (hemos iterado sobre el vector una vez) y tenemos una cosa como ésta: 4 2 7 14 1 43. Y, como no hemos acabado... ¡empezamos otra vez!

Pero ahora... ¿hace falta llegar al final?. Pues no, porque con este método nos hemos asegurado de arrastrar al elemento más grande hasta el final. Así que cada vez que hagamos una iteración podemos acabar un elemento antes. Tras la segunda iteración, nuestro vector será así: 2 4 7 1 14 43. El 14 ya esta en su lugar. Luego 2 4 1 7 14 43 -> 2 1 4 7 14 43 -> 1 2 4 7 14 43. Hemos hecho tantas iteraciones como elementos del vector menos uno.

Algo tan tonto tenía que tener nombre. Este sistema se llama Bubble Sort. Me dijeron que se llamaba así porque veías cómo los elementos más grandes (burbujas) subían rápidamente hacia arriba. A lo largo de esta fascinante serie veremos cómo los informáticos tenemos mala pata para poner nombre a las cosas.

Un momento... ¿hemos acabado?. Hombre, pues, sí, el vector está ordenado. Pero un informático no sería un ingeniero si se contentase con esto, no señor, ni mucho menos. Vale, tenemos un método para ordenar vectores, pero... ¿es el mejor método posible sobre el mundo mundial para ordenar siempre toda clase de vectores?.

Lo mejor varía según quien considere el problema. Los informáticos atendemos a dos variables para evaluar lo buena que es una solución algorítmica: el tiempo que lleve completarla y el espacio que necesitemos en memoria para resolver el problema (costes temporal y espacial). Un empresario también evalúa en función del tiempo y coste: el tiempo en que tiene que tener listo el producto (o urgencia) y lo que le cueste el informático.

Los costes se determinan, normalmente, en función de la entrada. Los costes constantes no se suelen considerar. Si un algoritmo requiere siempre trescientos segundos para resolver cualquier problema (independientemente de la complejidad del problema), es posible que nos parezca lento para decirnos la hora... pero es que no lo dedicaremos a decir horas. Le pediremos que nos haga la quiniela.

En nuestro caso, necesitamos n-1 iteraciones para resolver el problema (donde n es el número de datos de entrada), pero ese -1 es irrelevante para un n grande. Decimos entonces que la complejidad temporal depende de n. ¿Hasta qué punto?. Pues, en general, cada vez que empezamos una iteración tenemos que recorrer el vector, primero hasta el final, luego hasta el final - 1 posición, luego - 2... como los informáticos no atendemos estas disquisiciones matemáticas, decimos que el coste temporal es de n*n, es decir, de n2. No contentos con decirlo lo notamos así: O(n2). Esto significa que, en el peor caso, los datos de entrada al cuadrado serán una cota máxima a la complejidad temporal de la solución. Por otro lado, la complejidad espacial de este algoritmo es "nula": no requerimos más espacio que el propio vector durante el proceso.

¿Qué es el peor caso?. Pues depende. En nuestra solución, que el vector esté ordenado, pero al revés. ¿Existe un mejor caso para nuestra solución?. Sí, que ya esté ordenado. Si tras la primera iteración no hemos hecho ningún cambio, sería idiota continuar el proceso. El coste sería O(n). También existe el concepto de caso medio, pero por hoy ya hemos tenido bastante.

Así que tenemos un algoritmo de coste temporal cuadrático para ordenar un vector... ahora bien: ¿existe algún otro método para ordenar longanizas de números que sea mejor?.

La respuesta en el siguiente capítulo.

Pista: sí.

Posts relacionados