<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>azrael</title>
	<atom:link href="http://azrael.cauterized.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://azrael.cauterized.net</link>
	<description>Mis proyectos e inquietudes.</description>
	<pubDate>Sun, 06 Apr 2008 17:45:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Una serie digna de verse.</title>
		<link>http://azrael.cauterized.net/2008/04/06/una-serie-digna-de-verse/</link>
		<comments>http://azrael.cauterized.net/2008/04/06/una-serie-digna-de-verse/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 17:45:35 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2008/04/06/una-serie-digna-de-verse/</guid>
		<description><![CDATA[Hoy os voy a descubrir una pequeña maravilla del arte independiente.
Una serie cojonuda (y no es porque en ella participen mi padre y sobre todo, mi primo Jorge).
Como la vida misma,  http://www.averlasvenir.es/
32 minutos de metraje, que me han pasado realitavamente cómo 5.
Un ejemplo de cómo con pocos medios y menos actores, puede hacerse una serie [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy os voy a descubrir una pequeña maravilla del arte independiente.</p>
<p>Una serie cojonuda (y no es porque en ella participen mi padre y sobre todo, mi primo Jorge).</p>
<p>Como la vida misma,  <a href="http://www.averlasvenir.es/wordpress/">http://www.averlasvenir.es/</a></p>
<p>32 minutos de metraje, que me han pasado realitavamente cómo 5.</p>
<p>Un ejemplo de cómo con pocos medios y menos actores, puede hacerse una serie mucho mejor que las &#8220;profesionales&#8221;.</p>
<p>P.D.: ¡QUIERO UN PAPEL! xD Yo tambien tengo mi historia&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2008/04/06/una-serie-digna-de-verse/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Explicación sencilla de OSort.</title>
		<link>http://azrael.cauterized.net/2008/01/04/explicacion-sencilla-de-osort/</link>
		<comments>http://azrael.cauterized.net/2008/01/04/explicacion-sencilla-de-osort/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 12:10:37 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2008/01/04/explicacion-sencilla-de-osort/</guid>
		<description><![CDATA[El algoritmo es básicamente un QuickSort, al revés y usando busqueda binaria.
Proviene de la idea (fundamental) de que ordenar n elementos de un vector, es equivalente a hacer un &#8220;merge&#8221; de n vectores ordenados de un elemento (un vector ordenado de un elemento, es un elemento desordenado, lógico).
Por lo tanto lo que hallé es la [...]]]></description>
			<content:encoded><![CDATA[<p>El algoritmo es básicamente un <a href="http://es.wikipedia.org/wiki/Quicksort">QuickSort</a>, al revés y usando busqueda binaria.</p>
<p>Proviene de la idea (fundamental) de que ordenar n elementos de un vector, es equivalente a hacer un &#8220;<a href="http://es.wikipedia.org/wiki/Ordenamiento_por_mezcla">merge</a>&#8221; de n vectores ordenados de un elemento (un vector ordenado de un elemento, es un elemento desordenado, lógico).</p>
<p>Por lo tanto lo que hallé es la forma de mezclar n vectores ordenados de forma óptima.</p>
<p>Como estaba convencido de que era una generalización de la <a href="http://es.wikipedia.org/wiki/B%C3%BAsqueda_dicot%C3%B3mica">búsqueda binaria</a> (ya que es ordenación por comparación), no fué &#8220;tan&#8221; dificil:</p>
<p>Si quieres mezclar n vectores ordenados en un sólo vector ordenado, tan sólo has de coger el vector central, elegir su elemento central como pivote y situarlo dentro de los vectores que se encuentren en el centro de cada mitad. Pero para eso los elementos de los otros vectores tienen que estar ya situados respecto al resto, es recursivo.</p>
<p>Simplificando, cada elemento ha de buscarse únicamente en dos vectores, uno anterior y uno posterior, de forma recursiva y mediante búsqueda binaria y ¡voilá!</p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2008/01/04/explicacion-sencilla-de-osort/feed/</wfw:commentRss>
		</item>
		<item>
		<title>¡Por fin algo tangible (aunque de momento con pocos resultados)!</title>
		<link>http://azrael.cauterized.net/2008/01/04/%c2%a1por-fin-algo-tangible-aunque-de-momento-con-pocos-resultados/</link>
		<comments>http://azrael.cauterized.net/2008/01/04/%c2%a1por-fin-algo-tangible-aunque-de-momento-con-pocos-resultados/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 12:03:29 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2008/01/04/%c2%a1por-fin-algo-tangible-aunque-de-momento-con-pocos-resultados/</guid>
		<description><![CDATA[He subido a la forja de rediris  los algoritmos que funcionan de lo que llevo escrito .
No es aún, el algoritmo de ordenación definitivo, pero se le acerca.
De momento, el algoritmo más rápido  es poco más o menos igual de rápido que Quicksort, pero se debe exclusivamente a la implementación, pues en ambas implementaciones uso [...]]]></description>
			<content:encoded><![CDATA[<p>He subido a la forja de rediris <a href="https://forja.rediris.es/projects/csl2-ordenacion/"> los algoritmos que funcionan de lo que llevo escrito .</a></p>
<p>No es aún, el algoritmo de ordenación definitivo, pero se le acerca.</p>
<p>De momento, el algoritmo más rápido  es poco más o menos igual de rápido que Quicksort, pero se debe exclusivamente a la implementación, pues en ambas implementaciones uso o(n log n) memoria auxiliar (un autentico despilfarro).</p>
<p>Está en camino una implementación con un uso de memoría <strong>constante</strong> (es decir, un algoritmo in-place), pero requiere bastante trabajo. De momento tengo los algoritmo escritos de forma recursiva, pero &#8220;conociendo&#8221; a los compiladores, más vale que los escriba de forma iterativa a mano.</p>
<p>Creo que la mejor versión será usando el algoritmo de merge que he llamado (muy original) oMerge (de óptimo).</p>
<p>Una vez que tenga ese algoritmo en su versión iterativa, prescindiré de algoritmos auxiliares, y escribiré un algoritmo con una sola recursión, como el de Quicksort. Pero creo que se puede ir más allá y eliminar esa recursión tambien, ya que al contrario que en quicksort, las llamadas recursivas del algoritmo principal no dependen de las anteriores.</p>
<p>Bueno, el que quiera ya puede probar las diferentes velocidades de los diferentes merges. Trastenado un poquito con el código fuente, tambien los tipos de ordenación, pero ya digo que de momento, no he escrito AÚN nada mucho más rápido que mergesort.</p>
<p>Feliz navidad y feliz año ;).</p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2008/01/04/%c2%a1por-fin-algo-tangible-aunque-de-momento-con-pocos-resultados/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Optimal Sort.</title>
		<link>http://azrael.cauterized.net/2007/11/20/optimal-sort/</link>
		<comments>http://azrael.cauterized.net/2007/11/20/optimal-sort/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 21:53:23 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[II CUSL]]></category>

		<category><![CDATA[algoritmia]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/20/optimal-sort/</guid>
		<description><![CDATA[He modificado la imagen que en wikipedia ilustra Mergesort (de dominio público) para mostrar como funciona mi Optimal Comparison Sort.Recuerdo que para mezclar tres vectores, se usa el Merge3.Aprovecho para comentar que es el equivalente a un árbol balanceado.Las comparaciones en este caso son 10 para mi Optimal Comparison Sort ,  14 para Mergesort [...]]]></description>
			<content:encoded><![CDATA[<p>He modificado la imagen que en wikipedia ilustra M<a href="http://en.wikipedia.org/wiki/Merge_sort">ergesort</a> (de dominio público) para mostrar como funciona mi <a href="http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/">Optimal Comparison Sort</a>.Recuerdo que para mezclar tres vectores, se usa el <a href="http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/">Merge3</a>.<a href="http://azrael.cauterized.net/files/2007/11/optimalsortdiagram.PNG" title="optimalsortdiagram.PNG"><img src="http://azrael.cauterized.net/files/2007/11/optimalsortdiagram.PNG" alt="optimalsortdiagram.PNG" /></a>Aprovecho para comentar que es el equivalente a un árbol balanceado.Las comparaciones en este caso son 10 para mi <a href="http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/">Optimal Comparison Sort</a> ,  14 para <a href="http://en.wikipedia.org/wiki/Merge_sort">Mergesort</a> y 15 para <a href="http://en.wikipedia.org/wiki/Quicksort">Quicksort</a> eligiendo como pivote el elemento central. Espero un comportamiento proporcional para vectores aleatorios más grandes.<span id="more-87"></span> EDITO: No son 10 sino 15 comparaciones. De todas formas confío en que en el caso medio sea más rápido. <!--more-->EDITO2: De todas formas no deja de ser un caso particular, ya que para N=7, OSort hará siempre entre 2+2+2+2=8 y 6+4+2+1+2=15 comparaciones, mientras Quicksort hará entre 6+2+2=10 y 6+5+4+3+2+1=21 (de la forma n-1(n)/2, por la fórmula de la suma de los n primeros números). Mergesort hará  3+3+2+6=14.</p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/20/optimal-sort/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmo óptimo de ordenación por comparación.</title>
		<link>http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/</link>
		<comments>http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 00:30:11 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[II CUSL]]></category>

		<category><![CDATA[algoritmia]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/</guid>
		<description><![CDATA[Sabemos la forma óptima de mezclar tres vectores ordenados, la de mezclar cuatro no será tan sencilla. Queremos ordenar n datos por comparación, por lo tanto sabemos que necesitamos localizarlos en un arból binario equilibrado. El problema de Quicksort es intentar crear ese árbol de arriba a abajo y no de abajo a arriba, y ahora veremos [...]]]></description>
			<content:encoded><![CDATA[<p>Sabemos la forma óptima de mezclar tres vectores ordenados, la de mezclar cuatro no será tan sencilla.<span id="more-86"></span> Queremos ordenar n datos por comparación, por lo tanto sabemos que necesitamos localizarlos en un arból binario equilibrado.<!--more--> El problema de Quicksort es intentar crear ese árbol de arriba a abajo y no de abajo a arriba, y ahora veremos porqué.Sea un vector de 7 elementos.La mejor operación que sabemos realizar es ordenar 3 elementos, si la realizamos para los elementos a la izquierda y a la derecha del centro, hemos creado dos árboles binarios (vectores ordenados, de los que el elemento central será el padre). Ahora sólo falta situar el elemento central en esos dos árboles/vectores ordenados, la forma óptima es el merge 3 que ya hemos desarrollado. <!--more--> Esto lo hemos hecho para un vector de 7 elementos para visualizarlo más fácilmente, pero podemos generalizarlo fácilmente. Crear un árbol binario con el elemento central del vector como raíz y recursivamente con sus lados, después vas ordenando desde la profundidad K hasta arriba.<!--more--> En pseudocódigo:  <br />
<blockquote> function Sort (v:vector) return v  </p></blockquote>
<blockquote><blockquote>	medio:=(v&#8217;primero+v&#8217;ultimo/2);  </p></blockquote>
<blockquote><p>	return merge3(sort(v(v&#8217;primero..medio-1),v(medio),sort(v(v&#8217;medio+1..v&#8217;ultimo));</p></blockquote>
</blockquote>
<blockquote><p>fin </p></blockquote>
<p> Si no fuera por el <a href="http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/">merge3</a>, sería más corto que Quicksort.En los próximos días lo implementaré, haré unas pruebas a ver si no sólo hace el numero mínimo de comparaciones, si no también es el más rápido (y sino porqué), y luego dejaré estar esto un tiempo, para estudiar (que ya me toca). Llevo dándole vueltas desde marzo del 2007. Si no me sobra tiempo antes, en febrero haré la implementación para el II CUSL.De momento hasta aquí he llegado con la ordenación ;). </p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/20/algoritmo-optimo-de-ordenacion-por-comparacion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>No se puede hacer un algoritmo óptimo en el número de comparaciones para todos los casos.</title>
		<link>http://azrael.cauterized.net/2007/11/20/no-se-puede-hacer-un-algoritmo-optimo-en-el-numero-de-comparaciones-para-todos-los-casos/</link>
		<comments>http://azrael.cauterized.net/2007/11/20/no-se-puede-hacer-un-algoritmo-optimo-en-el-numero-de-comparaciones-para-todos-los-casos/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 23:59:19 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/20/no-se-puede-hacer-un-algoritmo-optimo-en-el-numero-de-comparaciones-para-todos-los-casos/</guid>
		<description><![CDATA[Me temo, que hoy, sin querer, he demostrado que el mejor algoritmo de ordenación no puede tener n-1 comparaciones para datos ordenados. La mala noticia es que las comparaciones para un algoritmo &#8220;óptimo&#8221; serán siempre superiores a n-1. La buena es que demostrando esto he encontrado un algoritmo de ordenación óptimo, tan óptimo como es [...]]]></description>
			<content:encoded><![CDATA[<p>Me temo, que hoy, sin querer, he demostrado que el mejor algoritmo de ordenación no puede tener n-1 comparaciones para datos ordenados. La mala noticia es que las comparaciones para un algoritmo &#8220;óptimo&#8221; serán siempre superiores a n-1. La buena es que demostrando esto he encontrado un algoritmo de ordenación óptimo, tan óptimo como es posible.<span id="more-85"></span>Todo empieza con <a href="http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/">mi merge de 3 vectores</a>. Es óptimo en el número de comparaciones para tres vectores cualquiera, esto incluye ordenar 3 elementos de forma óptima. El  problema empieza al generalizarlo. No encontraba ningún algoritmo que lo generalice, siendo óptimo para un vector de N elementos ordenados. ¿Porque? Porque es imposible que sea óptimo para el caso mejor con n-1 comparaciones y el caso peor.<br />
<blockquote> Demostración a continuación:  </p></blockquote>
<blockquote><blockquote>Queremos ordenar con el mínimo de comparaciones posibles N datos, por lo tanto necesitaremos crear un <a href="http://es.wikipedia.org/wiki/Árbol_binario">árbol binario</a> de N nodos. Para facilitar la tarea usaremos 7 datos (por forma un árbol binario lleno y perfecto -o árbol completo). </p></blockquote>
</blockquote>
<blockquote><blockquote>Supongamos el vector: |1|2|3|4|5|6|7|, vamos a ordenarlo ;). </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p>Sabemos la forma óptima de ordenar tres elementos, de modo que, ordenemos de forma óptima los tres primeros y los tres últimos, para depues ordenar todos juntos.</p></blockquote>
<blockquote><p> </p></blockquote>
</blockquote>
<blockquote><blockquote>Tenemos  |1|2|3| con dos comparaciones y |5|6|7| con otras dos. Ahora falta ordenar el |4|, si queremos tener el minimo de comparaciones (n-1), por lo tanto, necesitamos comparar el 4 con el 3 y con el 5. PERO, si comparamos primero con el 3 y con el 5, hacemos que el caso peor, necesite , al menos una comparación extra. </p></blockquote>
<blockquote><p>Esto es así porque no hacemos el equivalente a lo que sería una búsqueda binaria para localizar la posición del elemento central en los dos vectores ordenados. Como sabemos que la búsqueda binaria es la forma más rápida de media de buscar un elemento en un vector ordenado, el algoritmo óptimo no podrá ser así.</p></blockquote>
<blockquote><p>Por lo tanto el algoritmo óptimo de ordenación por comparación SIEMPRE, hará más de n-1 comparaciones.</p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p>Después de esto es fácil deducir el algoritmo óptimo, que presentaré en el siguiente post.</p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
</blockquote>
<blockquote><p>Ya sé que como demostración no es muy rigurosa, ni sigue un modelo formal, pero a partir del ejemplo no debería de ser difícil generalizarla, y no quiero perder el tiempo con algo que ahora veo trivial. </p></blockquote>
<blockquote><blockquote>  </p></blockquote>
</blockquote>
<blockquote><p> </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/20/no-se-puede-hacer-un-algoritmo-optimo-en-el-numero-de-comparaciones-para-todos-los-casos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Generalizando un poquito más aún.</title>
		<link>http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/</link>
		<comments>http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 19:43:57 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[II CUSL]]></category>

		<category><![CDATA[algoritmia]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/</guid>
		<description><![CDATA[De momento (creo que) tenemos el algoritmo de merge óptimo para dos vectores&#8230; pero nuestro objetivo va más allá.La idea es hallar un merge para N vectores, pero como no parece fácil, vayamos pasito a pasito.Lo hemos hecho para dos, intentémoslo para tres vectores. Sean tres vectores, v1, v2 y v3, parece que una generalización del [...]]]></description>
			<content:encoded><![CDATA[<p>De momento (creo que) tenemos el algoritmo de merge óptimo para dos vectores&#8230; pero nuestro objetivo va más allá.La idea es hallar un merge para N vectores, pero como no parece fácil, vayamos pasito a pasito.Lo hemos hecho para dos, intentémoslo para tres vectores. Sean tres vectores, v1, v2 y v3, parece que una generalización del algoritmo anterior debería de empezar por comparar los centros, al menos uno de ellos.Como queremos que el merge sea estable, las posiciones de los vectores si que importan, por lo tanto empezaremos por el vector central.<br />
<blockquote>
<blockquote> v1: |1|2|3|4|5|6|7|8|9|  </p></blockquote>
<blockquote><p>v2: |1|2|3|4|5|6|7|8|9| </p></blockquote>
</blockquote>
<blockquote><blockquote>v3: |1|2|3|4|5|6|7|8|9|  </p></blockquote>
</blockquote>
<blockquote><blockquote>   </p></blockquote>
</blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p>Seguimos  comparando centros de vectores, por lo tanto elegiremos el central de los centros como pivote, y empezaremos por comapararlo con los otros dos centros.</p></blockquote>
<blockquote><p>Tenemos 5&lt;=5&lt;=5.</p></blockquote>
<blockquote><p>Por lo tanto: </p></blockquote>
<blockquote><blockquote>v1: 			|6|7|8|9|   </p></blockquote>
<blockquote><p>v2: |1|2|3|4|5|6|7|8|9|</p></blockquote>
<blockquote><p>v3: |1|2|3|4| </p></blockquote>
</blockquote>
<blockquote><p>Ahora tenemos 7&gt;5&gt;2, por tanto:</p></blockquote>
<blockquote><blockquote>v1: 			 |6|   </p></blockquote>
<blockquote><p>v2: |1|2|3|4|5|6|7|8|9|v3: |3|4|</p></blockquote>
</blockquote>
<blockquote><p> 6&gt;5&gt;3</p></blockquote>
<blockquote><blockquote>v1: 			v2: |1|2|3|4|5|6|7|8|9|v3: |4|   </p></blockquote>
</blockquote>
<blockquote><p>5&gt;4</p></blockquote>
<blockquote><p>En resumen, hemos separado los tres vectores en relación a nuestro pivote que era el elemento más central, por ser del que más información se obtiene al compararlo.</p></blockquote>
<blockquote><p>Tenemos</p></blockquote>
<blockquote><p>|1|2|3|4|5|         |6|7|8|9|</p></blockquote>
<blockquote><p>|1|2|3|4|     5     |6|7|8|9|</p></blockquote>
<blockquote><p>|1|2|3|4|             |5|6|7|8|9|</p></blockquote>
<blockquote><p>Tán sólo nos queda repetir la operación de forma recursiva, y tenemos el mejor merge que haya visto un mergesort, usandolo en lugar del merge tradicional, se reduciría el número de comparaciones y sobre todo el movimiento de datos, al mezclar los vectores de forma óptima de tres en tres.</p></blockquote>
<p> <span id="more-84"></span>Ahora cabe observar, que este merge, que es equivalente a ordenar tres elementos de un vector, sigue exactamente los mismos pasos que haría quicksort con tres elementos. Elige como pivote el elemento central, y lo compara con los otros dos, separando en un casó optimo, los tres elementos ordenados, o en el peor de los casos, separando uno de los datos como menor o mayor y ordenando recursivamente los otros dos datos.Es decir, Quicksort es óptimo para 3 elementos, exactamente lo que buscamos, hace un mínimo de dos comparaciones y un máximo de 3 para ordenarlos.Pero con más de 3 elementos eso ya no es cierto. Si continuamos usando el elemento central como pivote, independientemente de los resultados de la comparaciones, nos encontramos con que si el vector esta ordenado no iremos comparando los elementos contiguos. Esto lleva a quicksort a su peor caso. Si los elementos estan ordenados en orden creciente o decreciente, las comparaciones son O(n^2). Quicksort en un vector ordenado, eligiendo como pivote el elemento central es de O( n log n), pero sigue habiendo un caso de O(n^2), si cada pivote que eliges es máximo o minimo de los restantes elementos. Eso conlleva, que el merge óptimo de 4 vectores deja de ser sencillo.De hecho aún no tengo una idea muy clara de como debe hacerse, he hecho cientos de hipotesis pero en todas he acabado encontrando fallos (con los merges de 2 y 3 tambien me ha pasado, pero esos, creo que ya los tengo solucionados).Esta mañana se me ha ocurrido una idea increible, me ha recordado a <a href="http://en.wikipedia.org/wiki/Emmett_Brown">Emmett Brown</a> dándose un golpe en la cabeza y viendo de repente el condensador de fluzo. La idea no es tán buena, ya que sigue dejando casos de O(n^2).Puede que sea una chorrada, pero estoy convencido que todos los algoritmos de ordenación &#8220;buenos&#8221; son algoritmos incompletos, todos tienen partes de uno mejor. Lo que yo busco es que en el caso de que los datos estén ordenados, el algoritmo sólo haga n-1 comparaciones, y que el caso peor se resuelva de la mejor forma posible, así que ¿que tal una mezcla de Quicksort con Mergesort y puede que incluso con un poquito de Bubblesort?Me explico, la idea es elegir un primer pivote, que ha de ser el elemento central, despues se compara este con el siguiente y el anterior, igual que haría un quicksort en su primer paso, pero, la diferencia esta aquí, si esos tres elementos están ordenados (en orden creciente o decreciente), es decir, si ambas comparaciones son iguales, en lugar de seguir comparando, pasaría a haber dos pivotes, uno a cada lado del pivote anterior. Cada pivote iría comprobando que los siguientes elementos siguen el mismo orden, y en el momento que eso ya no sea así, el vector ordenado que hemos obtenido se guardará, para hacer un merge con los vectores ordenados que obtengamos en cada uno de los lados (llamadas recursivas).De momento he estado probando con cuatro elementos y parece óptimo, en el mejor caso son 3 comparaciones y en el peor 5.Esto no es así, porque sigue estando el caso de que el pivote sea máximo o minimo, es decir, el algoritmo sería O(n log n) de media, con O(n) para un vector ordenado, pero con casos &#8220;malos&#8221; de O(n^2).Recordemos <a href="http://www.research.att.com/~njas/sequences/A036604">esta lista</a> que contiene los valores conocidos, de la serie del número mínimo de comparaciones para ordenar un vector en el peor caso.<br />
<blockquote>Son: </p></blockquote>
<blockquote><p>| 0 | 1 | 3 | 5 | 7 | 10 | 13 | 16 | 19 | 22 | 26 | 30 | 34 | 38 |</p></blockquote>
<blockquote><blockquote>  </p></blockquote>
</blockquote>
<blockquote><p>Para:</p></blockquote>
<blockquote><p>| 1 | 2 | 3 | 4 | 5 |  6 |  7 |  8 | 9  | 10 | 11 | 12 | 13 | 14 |</p></blockquote>
<blockquote><blockquote>  </p></blockquote>
</blockquote>
<blockquote><p>  </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p>         </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/15/generalizando-un-poquito-mas-aun/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Generalizando un poco más.</title>
		<link>http://azrael.cauterized.net/2007/11/15/generalizando-un-poco-mas/</link>
		<comments>http://azrael.cauterized.net/2007/11/15/generalizando-un-poco-mas/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 18:52:32 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/15/generalizando-un-poco-mas/</guid>
		<description><![CDATA[Ordenar N elementos será igual que ordenar N vectores ordenados de un elemento.Esta operación es la fusión de vectores (merge), y conseguir el merge óptimo de N vectores ordenados sería equivalente al algoritmo de ordenación óptimo.De momento sabemos la forma de buscar un elemento en un vector, pero lo que necesitamos es el merge de [...]]]></description>
			<content:encoded><![CDATA[<p>Ordenar N elementos será igual que ordenar N vectores ordenados de un elemento.Esta operación es la fusión de vectores (<a href="http://en.wikipedia.org/wiki/Merge_algorithm">merge</a>), y conseguir el merge óptimo de N vectores ordenados sería equivalente al algoritmo de ordenación óptimo.De momento sabemos la forma de buscar un elemento en un vector, pero lo que necesitamos es el merge de dos vectores.Por lo tanto intentemos generalizar el algoritmo de búsqueda binaria, para dos vectores. El mejor algoritmo de merge conocido hasta el momento es muy simple, y dados dos vectores de a y b elementos respectivamente, siempre hace a+b-1 comparaciones.Evidentemente ese algoritmo no es el que buscamos, pero nos dará una cota de lo que buscamos que sea el peor caso para el merge de dos vectores.<br />
<blockquote>Empecemos. Tenemos dos vectores, v1 y v2 </p></blockquote>
<blockquote><blockquote>v1: |1|2|3|4|5|6|7|8|9| </p></blockquote>
<blockquote><p>v2:|1|2|3|4|5|6|7|8|9|</p></blockquote>
<p>Como queremos generalizar la búsqueda binaria, lo que es evidente es que la primera comparación a realizar será comparar los dos centros. 5&lt;=5Tras ello, querremos situar uno de los dos centros comparados dentro del otro vector. La elección igual que con el redondeo en búsqueda binaria, no parece tener mucha importancia. Por las mismas razones que antes, elegiremos el primer centro de los dos.  Este elemento será nuestro pivote, para esta iteración del algoritmo.Por lo tanto:  <br />
<blockquote>v1: |1|2|3|4|5|6|7|8|9| </p></blockquote>
<blockquote><p>v2:|1|2|3|4|</p></blockquote>
</blockquote>
<blockquote><p>5&gt;2 </p></blockquote>
<blockquote><blockquote>v1: |1|2|3|4|5|6|7|8|9| </p></blockquote>
<blockquote><p>v2:|3|4|</p></blockquote>
</blockquote>
<blockquote><p>5&gt;3</p></blockquote>
<blockquote><blockquote>v1: |1|2|3|4|5|6|7|8|9| </p></blockquote>
<blockquote><p>v2:|4|</p></blockquote>
</blockquote>
<blockquote><p>5&gt;4</p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p>Por lo tanto, tenemos la posición del elemento central del primer vector en el segundo. Es decir, hemos separado los datos de la forma siguiente.</p></blockquote>
<blockquote><blockquote> </p></blockquote>
<blockquote><p> </p></blockquote>
</blockquote>
<blockquote><blockquote>|1|2|3|4|   |5|    |6|7|8|9|</p></blockquote>
</blockquote>
<blockquote><blockquote> </p></blockquote>
</blockquote>
<blockquote><blockquote>|1|2|3|4|            |5|6|7|8|9|</p></blockquote>
</blockquote>
<blockquote><p>Podemos repetir la operación recursivamente, para los vectores que nos quedan a la izquierda de nuestro pivote por un lado, y para los vectores que nos quedan a la derecha de nuestro pivote por el otro. </p></blockquote>
<blockquote><p>Ya tenemos un algoritmo de merge de dos vectores, óptimo en el número de comparaciones.</p></blockquote>
<blockquote><p>Como prueba de que no me equivoco, el numero de comparaciones siempre es igual o inferior al del merge clásico (a+b-1 para dos vectores de tamaño a y b).</p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><p> </p></blockquote>
<blockquote><blockquote>
<blockquote></blockquote>
</blockquote>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/15/generalizando-un-poco-mas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Una idea para empezar.</title>
		<link>http://azrael.cauterized.net/2007/11/14/una-idea-para-empezar/</link>
		<comments>http://azrael.cauterized.net/2007/11/14/una-idea-para-empezar/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 11:07:25 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/14/una-idea-para-empezar/</guid>
		<description><![CDATA[Intuitivamente, creo que un algoritmo óptimo de ordenación por comparación, será una generalización de la búsqueda binaría.¿Porqué?Porque la búsqueda binaría es el algoritmo óptimo de búsqueda la posición de un elemento entre otros elementos ordenados. Esto se debe a que si tenemos N elementos ordenados, y como única operación la comparación, la operación que más información [...]]]></description>
			<content:encoded><![CDATA[<p>Intuitivamente, creo que un algoritmo óptimo de ordenación por comparación, será una generalización de la <a href="http://es.wikipedia.org/wiki/Búsqueda_binaria">búsqueda binaría</a>.¿Porqué?Porque la búsqueda binaría es el algoritmo óptimo de búsqueda la posición de un elemento entre otros elementos ordenados. Esto se debe a que si tenemos N elementos ordenados, y como única operación la comparación, la operación que más información nos dará será siempre comparar con el elemento central, de esta forma a cada paso descartamos la mitad de los elementos a comparar.<br />
<blockquote>Por ejemplo, si buscamos la posición el dato D en el vector V: <br />
<blockquote>i)                          V= |1|2|3|4|5|6|7|8|9 |                                        D=6 </p></blockquote>
</blockquote>
<blockquote><p>Nuestra primera comparación será preferentemente 5&lt;=6, ya que  5 es el elemento central del vector.  Así, descartamos las comparaciones con los elementos anteriores al 5 (y con el 5).</p></blockquote>
<blockquote><blockquote>ii)                     V1= |6|7|8|9|				     D=6 </p></blockquote>
</blockquote>
<blockquote><p>Al quedar un número par de elementos, podemos elegir entre el redondeo a la izquierda o a al derecha, en terminos de valor medio, ambas elecciones resultan en la misma cantidad de comparaciones, sin embargo, en los computadores, las cachés hacen que en general los accesos secuenciales, de izquierda a derecha sean más rápidos. Aunque puede que eso no suponga una diferencia significativa, lo que es evidente es que no va a resultar peor.Por lo tanto la comparación será 7&gt;6, con lo que descartamos todos los elementos superiores al 7, y el 7.</p></blockquote>
<blockquote><blockquote>iii)                    V2= |6|                            D=6 </p></blockquote>
</blockquote>
<blockquote><p>Comparamos 6&lt;=6, por lo tanto tenemos el vector |6|6| ordenado.Lo juntamos con los &#8220;trozos&#8221; de vectores que hemos ido descartando, y nos da el resultado  |1|2|3|4|5|6|6|7|8|9 | </p></blockquote>
<blockquote><p> </p></blockquote>
<p><span id="more-82"></span><br />
<blockquote>Una pequeña puntualizacion. Esto es cierto porque hemos definido como óptimo, que sea óptimo en comparaciones, si nos saltasemos esa regla, esta misma operación de búsqueda podría hacerse mucho más rápido.La <a href="http://es.wikipedia.org/wiki/Búsqueda_binaria">búsqueda binaría</a> hace Log2(n) comparaciones para situar un dato , sin embargo, con una <a href="http://en.wikipedia.org/wiki/Interpolation_search">búsqueda interpolatoria lineal</a>, las comparaciones en el caso medio, pasarían a ser log2 log2 (n), mucho más rápido, pero aquí ya no se usa únicamente la operación de comparación, sino también el valor del dato. Creo que el limite estaría en usar una función interpolatoria de todos los datos ordenados, y hayar la posición de forma directa en tiempo constante.Puede que mediante interpolación se puedan ordenar n elementos en O(n), pero eso se sale de mis objetivos actuales, que ya de por si son muy ambiciosos, y requiere una gran habilidad matemática.                         </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/14/una-idea-para-empezar/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La importancia de la ordenación.</title>
		<link>http://azrael.cauterized.net/2007/11/14/la-importancia-de-la-ordenacion/</link>
		<comments>http://azrael.cauterized.net/2007/11/14/la-importancia-de-la-ordenacion/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 10:32:03 +0000</pubDate>
		<dc:creator>azrael</dc:creator>
		
		<category><![CDATA[Algoritmos ordenación.]]></category>

		<category><![CDATA[II CUSL]]></category>

		<guid isPermaLink="false">http://azrael.cauterized.net/2007/11/14/la-importancia-de-la-ordenacion/</guid>
		<description><![CDATA[A parte de su interés practico evidente (ordenar datos rápido), un algoritmo &#8220;óptimo&#8221; supone un gran reto.
 
Este es mucho mayor cuando se han desarrollado métodos desde hace decenas de años. Algunos son muy buenos, pero ninguno es óptimo en función de unos parámetros deseables. Por ejemplo, mi objetivo para el II CUSL es hallar un algoritmo [...]]]></description>
			<content:encoded><![CDATA[<p>A parte de su interés practico evidente (ordenar datos rápido), un algoritmo &#8220;óptimo&#8221; supone un gran reto.<br />
<blockquote> </p></blockquote>
<p><span id="more-81"></span>Este es mucho mayor cuando se han desarrollado métodos desde hace decenas de años. Algunos son muy buenos, pero ninguno es óptimo en función de unos parámetros deseables.<!--more--> Por ejemplo, mi objetivo para el II CUSL es hallar un algoritmo de ordenación por comparación, óptimo en el número de comparaciones. Es decir un algoritmo que ordene N datos, utilizando únicamente la operación &#8220;&lt;=&#8221; (y en consecuencia &#8220;&lt;&#8221;, la misma operación negada), y que realice el número mínimo necesario de estas comparaciones entre dos elementos, para garantizar que los n elementos estan ordenados.Resumiendo, si alcanzo mi objetivo, para N elementos cualesquiera, el numero de comparaciones estarán entre N-1 (si todos los elementos estan ordenados) y log2(n!) (en el peor caso, ningún tipo de orden aprovechable), con una suave transición entre los dos limites. <!--more-->Además, también me gustaría (y creo firmemente que es posible) que el algoritmo resultante sea sencillo y con un tiempo de ejecución del orden de O(n log n). Como ilustración el algoritmo más rápido de media, conocido es <a href="http://en.wikipedia.org/wiki/Quicksort">Quicksort</a>, de C.A.R. Hoare, sólo es óptimo en el número de comparaciones para el caso de elementos completamente desordenados, en el caso medio nunca son óptimas, y en el caso de N elementos ordenados son de N-1+N-2+&#8230;.+1. Es decir hace entre O(n lo n) comparaciones y O(n^2) comparaciones.<!--more-->El problema de la ordenación parece sin embargo simple; de una entrada de N datos desordenados, proporcionar esos mismos N datos ordenados tal que D1&lt;=D2&#8230;.Dn-1&lt;=Dn.<!--more--> Surgen varias dudas: ¿Porque no es facil resolverlo de forma óptima? Y mejor aún:¿Si encontramos una forma simple de resolverlo de forma óptima, podrá aplicarse esta para la resolución óptima de otros problemas más complejos?  </p>
]]></content:encoded>
			<wfw:commentRss>http://azrael.cauterized.net/2007/11/14/la-importancia-de-la-ordenacion/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
