├── Introduction_to_Algorithms_Third_Edition_(2009).pdf ├── README.md ├── LICENSE └── 01_cimientos ├── ElPapelDeLosAlgoritmosEnLaInformatica.md └── introduccion └── introduccion.md /Introduction_to_Algorithms_Third_Edition_(2009).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zelechos/Introduccion_a_los_Algoritmos/HEAD/Introduction_to_Algorithms_Third_Edition_(2009).pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduccion a los Algoritmos 2 | ---------------- 3 | Introducción a los Algoritmos es un repositorio de dedicado a la traducción de en castellano del libro *Introduction to Algorithms, 3rd Edition (The MIT Press)* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein dicho esto tambien habran ejemplos aplicados en diferentes lenguajes como Java, JavaScript, Python para que se facilite el aprendizaje con mucha practica y teoria. 4 | 5 | >ADVERTENCIA: 6 | >Esta traduccion es para agilizar el estudio del libro para los que no tienen conocimientos en ingles (SE RECOMIENDA APRENDER INGLES!!!). 7 | 8 | ## Fecha Estimada para Publicacion del Primer Capitulo 30/04/2025 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Alex Tumiri Huanca 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /01_cimientos/ElPapelDeLosAlgoritmosEnLaInformatica.md: -------------------------------------------------------------------------------- 1 | # 1 El Papel de los Algoritmos en la Informatica 2 | 3 | ¿Qué son los algoritmos? ¿Por qué vale la pena estudiarlos? ¿Cuál es el papel 4 | de los algoritmos en relación con otras tecnologías utilizadas en las computadoras? En este capítulo, 5 | responderemos estas preguntas. 6 | 7 | ## 1.1 Algoritmos 8 | 9 | De manera informal, un ***algoritmo*** es cualquier procedimiento computacional bien definido que toma 10 | un valor o un conjunto de valores como ***entrada*** y produce un valor o un conjunto de valores como 11 | ***salida*** . Por lo tanto, un algoritmo es una secuencia de pasos computacionales que transforman la 12 | entrada en la salida. 13 | También podemos considerar un algoritmo como una herramienta para resolver un ***problema computacional*** bien especificado. 14 | El enunciado del problema especifica en términos generales la relación ***entrada/salida*** deseada. 15 | El algoritmo describe un procedimiento computacional específico para lograr esa relación entrada/salida. 16 | Por ejemplo, podríamos necesitar ordenar una secuencia de números en un orden no decreciente. 17 | Este problema surge con frecuencia en la práctica y proporciona un terreno fértil para 18 | introducir muchas técnicas de diseño y herramientas de análisis estándar. Así es como definimos formalmente el ***problema de ordenación (sorting problem)***: 19 | 20 | Entrada: Una secuencia de $n$ numeros $\langle a_1, a_2,\dots, a_n \rangle$ 21 | 22 | Salida: Una permutación (reordenación) $\langle a'_1, a'_2, \dots, a'_n \rangle$ de la secuencia de entrada tal que 23 | $$a'_1 \leq a'_2 \leq \dots \leq a'_n.$$ 24 | 25 | 26 | Por ejemplo, dada la secuencia de entrada 27 | $$ 28 | \langle 31, 41, 59, 26, 41, 58 \rangle, 29 | $$ 30 | un algoritmo de ordenamiento devuelve como salida la secuencia 31 | $$ 32 | \langle 26, 31, 41, 41, 58, 59 \rangle. 33 | $$ 34 | 35 | Dicha secuencia de entrada se denomina una **instancia del problema de ordenamiento**. 36 | En general, una instancia de un problema consiste en la entrada (que satisface las restricciones impuestas en la definición del problema) 37 | necesaria para calcular una solución al problema. 38 | 39 | -- TODO : Continuar en la pagina 6 40 | -------------------------------------------------------------------------------- /01_cimientos/introduccion/introduccion.md: -------------------------------------------------------------------------------- 1 | # Introduccion 2 | ----- 3 | Esta parte lo iniciará a pensar en diseñar y analizar algoritmos. Está pretende ser una introducción suave a cómo especificamos algoritmos, algunas de las estrategias de diseño que utilizaremos a lo largo de este libro, y muchas de las ideas utilizadas en el análisis de algoritmos. Las partes posteriores de este libro se basarán en esta base. 4 | 5 | El **Capítulo 1** proporciona una descripción general de los algoritmos y su lugar en los sistemas informáticos modernos. Este capítulo define qué es un algoritmo y enumera algunos ejemplos. 6 | También argumenta que deberíamos considerar los algoritmos como una tecnología, junto con tecnologías como el hardware rápido, las interfaces gráficas de usuario, las tecnologías orientadas a objetos, sistemas y redes. 7 | 8 | En el **Capítulo 2**, vemos nuestros primeros algoritmos, que resuelven el problema de ordenar una secuencia de *n* números. Estos están escritos en un pseudocódigo que, aunque no son 9 | directamente traducible a cualquier lenguaje de programación convencional, transmite la estructura del algoritmo con la suficiente claridad como para poder implementarlo en el idioma de su elección. 10 | Los algoritmos de clasificación que examinamos son por ejemplo el ***Insertion Sort***, etc que utiliza un enfoque incremental, y ordenación por fusión, que utiliza una técnica recursiva conocida como "divide y vencerás". 11 | Aunque el tiempo que cada uno requiere aumenta con el valor de *n*, la tasa de aumento difiere entre los dos algoritmos. Nosotros determinaremos estos tiempos de ejecución en el Capítulo 2, y desarrollaremos una notación útil para expresarlos. 12 | 13 | El **Capítulo 3** se define con precisión la notación, a la que llamamos notación asintótica. Esto comienza definiendo varias notaciones asintóticas, que usamos para delimitar los tiempos de ejecución del algoritmo desde arriba y/o desde abajo. 14 | El resto del Capítulo 3 es principalmente una muestra de notación matemática, más para asegurar que su uso de la notación coincide con el de este libro para enseñarle nuevos conceptos matemáticos. 15 | 16 | El **Capítulo 4** profundiza aún más en el método de divide y vencerás introducido en el Capítulo 2. Proporciona ejemplos adicionales de algoritmos de divide y vencerás, incluido el sorprendente método de Strassen para multiplicar dos matrices cuadradas. 17 | El Capítulo 4 también contiene métodos para resolver recurrencias, los cuales son útiles para describir los tiempos de ejecución de los algoritmos recursivos. Una técnica poderosa es el "método maestro", que se usa frecuentemente para resolver recurrencias que surgen de algoritmos de divide y vencerás. Aunque gran parte del Capítulo 4 está dedicado a demostrar la corrección del método maestro, puedes omitir esta demostración y aun así emplear el método maestro. 18 | 19 | El **Capítulo 5** introduce el análisis probabilístico y los algoritmos aleatorizados. Generalmente, utilizamos el análisis probabilístico para determinar el tiempo de ejecución de un algoritmo en casos en los que, debido a la presencia de una distribución de probabilidad inherente, el tiempo de ejecución puede variar en diferentes entradas del mismo tamaño. 20 | 21 | En algunos casos, asumimos que las entradas siguen una distribución de probabilidad conocida, por lo que promediamos el tiempo de ejecución sobre todas las posibles entradas. En otros casos, la distribución de probabilidad no proviene de las entradas, sino de elecciones aleatorias realizadas durante la ejecución del algoritmo. Un algoritmo cuyo comportamiento está determinado no solo por su entrada, sino también por los valores producidos por un generador de números aleatorios, se denomina algoritmo aleatorizado. Podemos utilizar algoritmos aleatorizados para imponer una distribución de probabilidad en las entradas, asegurando así que ninguna entrada en particular cause siempre un rendimiento deficiente, o incluso para acotar la tasa de error de algoritmos que pueden producir resultados incorrectos en ciertos casos limitados. 22 | Los Apéndices A–D contienen material matemático adicional que te será útil a medida que leas este libro. Es probable que ya hayas visto gran parte del material en los capítulos de los apéndices antes de leer este libro (aunque las definiciones específicas y las convenciones de notación que usamos pueden diferir en algunos casos de lo que hayas visto en el pasado), por lo que debes considerar los Apéndices como material de referencia. Por otro lado, es probable que no hayas visto la mayoría del material de la Parte I. Todos los capítulos de la Parte I y los Apéndices están escritos con un enfoque tutorial. 23 | --------------------------------------------------------------------------------