Presentación
Nombre: Víctor Jofreiki Parra Soto
Materia: Algoritmos Computacionales
Matricula: 24-MISN-6-012
Tema: Conceptos de Algoritmos
Profesor: Felipe Arturo Duran Rodríguez
Sección: 313
Universidad: O&M
1
introducción
en esta práctica se hablará acerca de un algoritmo que es un conjunto de
instrucciones para resolver problemas lógicos y matemáticos o para realizar alguna
otra tarea. Una receta es un buen ejemplo de algoritmo porque dice lo que se
debe hacer, paso a paso. Toma datos (ingredientes) y produce un resultado (el
plato terminado).
Las palabras «algoritmo» y «algorismo» provienen del nombre de
un matemático persa llamado Al-Khwārizmī ( persa : خوارزمی, c. 780–850).
De manera informal, un algoritmo puede denominarse "lista de pasos". Los
algoritmos pueden escribirse en lenguaje corriente , y eso puede ser todo lo que
una persona necesite.
En informática, un algoritmo es una lista precisa de operaciones que podría realizar
una máquina de Turing . A efectos informáticos, los algoritmos se escriben en
pseudocódigo, diagramas de flujo o lenguajes de programación.
2
Conceptos elementales de algoritmos
Elementos de un algoritmo:
Entrada: Los datos que el algoritmo recibe para procesar.
Proceso: Las instrucciones que se ejecutan sobre los datos de entrada.
Salida: El resultado final que produce el algoritmo.
Ahora para mayor claridad, vamos a desarrollar cada uno de los elementos de un
algoritmo:
1. Entrada:
La entrada se refiere a los datos o información que el algoritmo recibe para su
procesamiento. Estos datos pueden provenir de diversas fuentes como el usuario
(a través de un teclado, por ejemplo), de archivos, o de otros sistemas. La entrada
debe estar bien definida para que el algoritmo funcione correctamente, ya que es
la base sobre la que se realizarán los cálculos o procesos.
Ejemplo: Imagina que tienes un algoritmo para calcular el promedio de un
conjunto de números. La entrada serían los números que el usuario ingresa en el
sistema.
2. Proceso:
El proceso es la serie de pasos o instrucciones que el algoritmo sigue para
transformar la entrada en la salida. Este paso es crucial, ya que define cómo se
manipulan los datos de entrada. Los procesos pueden involucrar cálculos
matemáticos, comparaciones lógicas, transformaciones de datos, entre otras
acciones. Un algoritmo bien diseñado tiene un proceso eficiente que minimiza el
tiempo y los recursos necesarios para ejecutar la tarea.
Ejemplo: Siguiendo con el ejemplo del cálculo de un promedio, el proceso
consistiría en sumar todos los números ingresados y luego dividir esa suma entre
la cantidad de números.
3. Salida:
La salida es el resultado final que el algoritmo produce después de ejecutar el
proceso sobre los datos de entrada. La salida es lo que el algoritmo devuelve o
muestra al usuario. Dependiendo de la complejidad del algoritmo, la salida puede
ser un valor único, una lista de valores, o incluso una acción (como mostrar un
mensaje en pantalla).
3
Algoritmos
Primero recalcar que un algoritmo es un conjunto de instrucciones o pasos
definidos y ordenados para resolver un problema o realizar una tarea específica. Los
algoritmos son fundamentales en la programación de computadoras y se utilizan en
diversas áreas, desde matemáticas hasta la inteligencia artificial. El propósito de un
algoritmo es proporcionar una solución clara y eficiente a un problema, y puede
implementarse en diversos lenguajes de programación.
Características de un Algoritmo:
1. Definido: Un algoritmo debe ser claro y preciso, cada paso debe estar bien
especificado para evitar ambigüedades.
2. Finito: Un algoritmo debe terminar después de un número finito de pasos.
Si no termina, se considera un bucle infinito, lo cual es un error.
3. Entrada: Un algoritmo puede recibir cero o más entradas, las cuales se
procesarán durante su ejecución.
4. Salida: Un algoritmo debe generar al menos una salida, es decir, un
resultado esperado.
5. Eficiencia: Los algoritmos deben ser eficientes en cuanto a tiempo y
recursos. Un algoritmo eficiente resuelve el problema en el menor tiempo
posible y utilizando la menor cantidad de recursos (memoria, procesamiento,
etc.).
6. Generalidad: Un buen algoritmo debe ser aplicable a una clase de
problemas, no solo a un caso específico.
4
Tipos de algoritmos
Claro, aquí te ofrezco una explicación más detallada de los tipos de algoritmos,
con ejemplos y un análisis más profundo sobre sus características y cuándo se
utilizan.
1. Algoritmos Secuenciales
Descripción:
Son los algoritmos más sencillos. En estos algoritmos, las instrucciones se ejecutan
en orden, de manera secuencial, sin decisiones ni repeticiones. Cada paso se
ejecuta una sola vez, y el flujo de control va de una instrucción a la siguiente hasta
que se completa el proceso.
Características:
Ejecución en línea recta: Los pasos se ejecutan uno tras otro.
Sin ramificaciones ni ciclos, no hay condiciones ni repeticiones.
Son fáciles de entender y de implementar.
Ejemplo: Algoritmo para sumar dos números.
1. Leer número A.
2. Leer número B.
3. Sumar A y B.
4. Mostrar el resultado
2. Algoritmos Condicionales (Algoritmos de Decisión)
Descripción:
Los algoritmos condicionales permiten tomar decisiones en el flujo de ejecución,
basándose en condiciones. Usan estructuras como if-else o switch-case.
Dependiendo de si una condición es verdadera o falsa, el algoritmo tomará
diferentes rutas o pasos a seguir.
Características:
Contienen decisiones (condiciones).
El flujo de ejecución puede ramificarse en diferentes caminos según el valor
de las condiciones.
A menudo se usan para resolver problemas en los que el comportamiento
del algoritmo depende de datos de entrada o del estado del sistema.
5
Ejemplo: Algoritmo para verificar si un número es positivo, negativo o cero.
1. Leer número N.
2. Si N > 0, entonces imprimir "Positivo".
3. Si N < 0, entonces imprimir "Negativo".
4. Si N == 0, entonces imprimir "Cero".
3. Algoritmos Iterativos (Algoritmos con Ciclos o Bucles)
Descripción:
Los algoritmos iterativos repiten una serie de pasos un número determinado de
veces o hasta que se cumpla una condición específica. Esto se logra mediante
estructuras de repetición como for, while o do-while.
Características:
Utilizan bucles (for, while, do-while) para repetir acciones.
El número de iteraciones puede ser fijo o depender de una condición
dinámica.
Son útiles cuando se necesita realizar la misma operación varias veces (por
ejemplo, sumar varios números, recorrer listas, etc.).
Ejemplo: Algoritmo para calcular la suma de los primeros 10 números naturales.
1. Inicializar variable suma en 0.
2. Para i = 1 hasta 10, hacer:
a. Sumar i a suma.
3. Mostrar suma.
4. Algoritmos Recursivos
Descripción:
Un algoritmo recursivo es aquel que se llama a sí mismo para resolver un
problema. La clave de los algoritmos recursivos es que se dividen en subproblemas
más pequeños del mismo tipo. Estos algoritmos generalmente tienen un caso
base que detiene la recursión.
Características:
Se llama a sí mismo dentro de su definición.
Debe tener un caso base para evitar la recursión infinita.
6
Son útiles para problemas que pueden dividirse en subproblemas más
pequeños del mismo tipo (por ejemplo, problemas con estructuras
jerárquicas).
Ejemplo: Algoritmo recursivo para calcular el factorial de un número.
1. Si N == 0, devolver 1 (caso base).
2. Si N > 0, devolver N * factorial(N-1).
5. Algoritmos Greedy (Codiciosos)
Descripción:
Los algoritmos greedy o codiciosos buscan la solución óptima mediante la
selección de la mejor opción disponible en cada paso, sin considerar el impacto de
esa elección en el futuro. Estos algoritmos no garantizan siempre una solución
óptima, pero son rápidos y útiles en muchos casos prácticos.
Características:
Toman decisiones basadas en el beneficio local más inmediato (la "mejor
opción local").
No siempre garantizan la solución global óptima, pero son útiles cuando las
soluciones óptimas globales son difíciles de encontrar.
Son eficaces cuando se busca una solución rápida y aproximada.
Ejemplo: Algoritmo para encontrar el cambio más pequeño con monedas.
1. Inicializar el monto de cambio que se necesita.
2. Mientras el monto de cambio sea mayor que 0, hacer:
a. Elegir la moneda más grande posible que sea menor o igual al monto de
cambio restante.
b. Restar esa moneda del monto de cambio.
3. Repetir hasta que el monto de cambio sea 0.
6. Algoritmos de Divide y Vencerás
Descripción:
Los algoritmos de divide y vencerás resuelven un problema dividiendo el
problema original en subproblemas más pequeños y resolviendo cada subproblema
recursivamente. Después, se combinan las soluciones parciales para obtener la
solución final.
7
Características:
El problema se divide en partes más pequeñas y se resuelve de manera
recursiva.
La combinación de los resultados parciales es una parte clave de estos
algoritmos.
Suelen ser eficientes y aplicados a problemas complejos.
Ejemplo: Algoritmo de Merge Sort para ordenar una lista de números.
1. Si la lista tiene 1 o menos elementos, ya está ordenada (caso base).
2. Dividir la lista en dos mitades.
3. Ordenar cada mitad de forma recursiva.
4. Combinar las dos mitades ordenadas para obtener la lista final ordenada.
7. Algoritmos de Backtracking (Retroceso)
Descripción:
El algoritmo de backtracking es una técnica utilizada para resolver problemas de
búsqueda en los que se exploran todas las posibilidades para encontrar una
solución. Si una decisión parcial no lleva a una solución, el algoritmo retrocede y
prueba con la siguiente opción.
Características:
Se exploran todas las opciones posibles de manera progresiva.
Si una opción no es válida, se retrocede y prueba otras alternativas.
Muy útil para problemas de búsqueda y optimización, como en juegos
de ajedrez, resolución de rompecabezas, completar Sudoku, etc.
Ejemplo: Algoritmo para resolver el problema de las 8 reinas.
1. Colocar una reina en la primera fila.
2. Comprobar si la colocación es válida.
3. Si es válida, avanzar a la siguiente fila.
4. Si no es válida, retroceder y probar otra posición.
5. Repetir hasta que todas las reinas estén colocadas correctamente.
8
Historia de los algoritmos:
Orígenes Antiguos (Siglos VIII-X)
El término algoritmo proviene de Al-Juarismi, un matemático persa del
siglo IX, cuyo libro sobre la resolución de ecuaciones influyó en el desarrollo
de métodos sistemáticos para resolver problemas matemáticos.
Aunque el concepto de algoritmo no existía como tal, los métodos para
hacer cálculos, como la división larga, sentaron las bases.
Edad Media y Renacimiento
Los matemáticos árabes y europeos mejoraron los métodos matemáticos y
numéricos, pero aún no había un concepto formal de algoritmo.
Siglo XIX: Primeras Computadoras
Charles Babbage, conocido como el padre de la computación, diseñó la
máquina analítica, una computadora mecánica programable, y Ada
Lovelace escribió el primer algoritmo para una máquina, sentando las
bases para la programación.
Principios del Siglo XX: Teoría de la Computación
Alan Turing definió la máquina de Turing, que formalizó lo que significa
un algoritmo y ayudó a desarrollar la teoría de la computación.
John von Neumann desarrolló la arquitectura de computadoras
modernas, facilitando la ejecución de algoritmos.
Años 1950-1970: Lenguajes de Programación
Surgieron lenguajes como Fortran y Algol que permitieron escribir
algoritmos de forma más eficiente y estructurada.
Donald Knuth publicó "The Art of Computer Programming", que
profundizó en la teoría y análisis de algoritmos.
Finales del Siglo XX y XXI: Expansión de los Algoritmos
Los algoritmos se hicieron esenciales en internet, con ejemplos como los
motores de búsqueda de Google y las redes sociales.
La inteligencia artificial y el aprendizaje automático empezaron a
utilizar algoritmos más complejos para resolver tareas como predicciones y
toma de decisiones.
Hoy en Día
9
Los algoritmos están en todas partes: desde las recomendaciones de
Netflix hasta los mapas de Google.
Se usan en áreas como ciencia de datos, optimización, criptografía y
procesamiento de imágenes.
Lenguajes algorítmicos
Lenguajes de Descripción Formal (Lenguajes de Máquina)
A medida que los algoritmos se hicieron más complejos, surgieron lenguajes
formales que se utilizan para describir algoritmos de manera precisa y rigurosa.
Estos lenguajes tienen una sintaxis estricta y se utilizan más en teorías de
computación, desarrollo de compiladores y algoritmos complejos.
Lenguajes de Programación
Los lenguajes de programación son lenguajes formales utilizados para escribir
algoritmos que serán ejecutados por computadoras. Estos lenguajes tienen una
sintaxis estricta y permiten que los algoritmos se implementen en un formato que
las máquinas pueden entender
Diagrama de Flujo
Un diagrama de flujo es una representación gráfica de un algoritmo, donde cada
paso se muestra como una figura geométrica (rectángulos, rombos, círculos, etc.),
y las conexiones entre ellos indican el flujo del proceso. Los diagramas de flujo son
muy útiles para visualizar el proceso y entender de manera clara la lógica detrás
del algoritmo.
Características:
Gráfico: Representa el flujo de un algoritmo a través de formas
geométricas.
Clarity: Facilita la comprensión de la lógica del algoritmo al mostrar de
forma visual las decisiones y las secuencias de pasos.
Fácil de seguir: Muy útil en la enseñanza y documentación de procesos.
10
Ejemplo:
Un diagrama de flujo para un algoritmo que suma dos números podría incluir:
Un rectángulo para leer los números.
Un rombo para la operación de suma.
Un rectángulo para mostrar el resultado.
Pseudocódigo
El pseudocódigo es una forma de representar un algoritmo utilizando un
lenguaje cercano al humano, pero con la estructura de un lenguaje de
programación. No tiene una sintaxis estricta y se utiliza principalmente para
describir el algoritmo de forma general y fácil de entender, sin preocuparse por
detalles específicos del lenguaje de programación.
Características:
Cercano al lenguaje humano: Usa palabras comunes para describir el
flujo del algoritmo (por ejemplo, "Si", "Mientras", "Leer", "Mostrar").
Flexible: No sigue una sintaxis estricta, por lo que se puede adaptar
fácilmente.
Entendible: Es fácil de leer y entender para personas sin conocimientos
técnicos profundos.
Ejemplo de pseudocódigo:
Inicio
Leer número A
Leer número B
Sumar A y B
Mostrar resultado
Fin
11
Diagrama N-S
El diagrama N-S (también conocido como diagrama de flujo N-S) es una
forma de representar un algoritmo de manera gráfica utilizando símbolos
específicos para expresar las diferentes operaciones, decisiones y procesos dentro
de un algoritmo. Es especialmente útil en la enseñanza de algoritmos porque
facilita la comprensión del flujo de ejecución de un proceso o programa.
Elementos del Diagrama N-S:
El diagrama N-S se basa en el uso de cuatro elementos básicos, cada uno con
un significado específico. Los diagramas N-S se leen de arriba hacia abajo y de
izquierda a derecha.
1. Inicio y Fin: Representados por círculos, indican el inicio y el final del
algoritmo.
2. Operación: Representada por un rectángulo, muestra los pasos o acciones
que se realizan, como cálculos.
3. Decisión: Representada por un rombo, se usa para condiciones (por
ejemplo, "Si A es mayor que B").
4. Entrada/Salida: Representada por un paralelogramo, indica la lectura de
datos o la presentación de resultados. Ejemplo: Un algoritmo que suma
dos números:
Inicio → Leer A, B → A + B → Mostrar Resultado → Fin
Ventajas:
Fácil de entender y visualizar el flujo de un algoritmo.
Ideal para representar algoritmos simples.
Limitación:
No es adecuado para algoritmos complejos, ya que puede volverse difícil de
leer.
12
Niveles de Complejidad de los Algoritmos
La complejidad de un algoritmo es una medida de cuán eficiente es este para
resolver un problema dado. En otras palabras, nos indica cuánto tiempo y espacio
(memoria) requiere el algoritmo para producir una solución, a medida que
aumenta el tamaño de la entrada
Complejidad Temporal:
Hace referencia al tiempo que un algoritmo tarda en ejecutarse dependiendo del
tamaño de los datos de entrada.
2. Complejidad Espacial:
Hace referencia a la cantidad de memoria que un algoritmo requiere para
ejecutarse en función del tamaño de los datos de entrada.
Niveles de complejidad más comunes:
1. Complejidad constante (O(1)):
El tiempo de ejecución o el uso de memoria no cambia, independientemente
del tamaño de la entrada.
Ejemplo: Acceder a un elemento en una lista por su índice.
2. Complejidad logarítmica (O(log n)):
El tiempo de ejecución crece de manera más lenta en relación con el
tamaño de los datos. Se ve a menudo en algoritmos de búsqueda o
divisiones repetidas.
Ejemplo: La búsqueda binaria en una lista ordenada.
3. Complejidad lineal (O(n)):
El tiempo de ejecución o uso de memoria crece proporcionalmente al
tamaño de la entrada. Es decir, si duplicas el tamaño de los datos, el tiempo
de ejecución se duplica.
Ejemplo: Recorrer una lista de tamaño n para buscar un elemento.
13
4. Complejidad lineal-logarítmica (O(n log n)):
Un algoritmo que tiene una complejidad entre lineal y logarítmica. Este es
un comportamiento común en muchos algoritmos eficientes de ordenación.
Ejemplo: Algoritmos como Merge Sort y Quick Sort.
5. Complejidad cuadrática (O(n²)):
El tiempo de ejecución crece cuadráticamente con el tamaño de la entrada.
Es común en algoritmos que requieren dos bucles anidados.
Ejemplo: El algoritmo de ordenación por burbuja.
6. Complejidad cúbica (O(n³)):
El tiempo de ejecución crece en proporción al cubo del tamaño de la
entrada. Suele aparecer en algoritmos con tres bucles anidados.
Ejemplo: Algunos algoritmos de multiplicación de matrices.
7. Complejidad exponencial (O(2^n)):
El tiempo de ejecución crece muy rápidamente con el tamaño de los datos.
Los algoritmos con esta complejidad suelen ser muy ineficientes para
entradas grandes.
Ejemplo: Algoritmos de fuerza bruta para problemas de optimización o
resolución de problemas NP-completos.
8. Complejidad factorial (O(n!)):
El tiempo de ejecución crece de manera extremadamente rápida con el
tamaño de la entrada. Es la peor complejidad posible.
Ejemplo: El problema de la ruta más corta en un grafo completo con
fuerza bruta.
14
Conclusión
En conclusión, los algoritmos son fundamentales para resolver problemas de
manera sistemática y eficiente en la computación. Son secuencias de pasos bien
definidos que permiten procesar datos de entrada y generar resultados específicos,
siendo esenciales en el desarrollo de software, la optimización de procesos y la
resolución de tareas complejas.
Existen distintos lenguajes algorítmicos para representarlos, como el
pseudocódigo, los diagramas de flujo y los lenguajes de programación.
Cada uno tiene sus ventajas dependiendo del contexto, desde ser accesibles para
principiantes hasta ejecutables por computadoras.
La complejidad de los algoritmos es un factor clave para evaluar su eficiencia,
tanto en tiempo como en espacio, y se clasifica en varios niveles, desde la
complejidad constante (O(1)) hasta la complejidad factorial (O(n!)). Estos
niveles nos permiten comparar cómo un algoritmo se comporta con el crecimiento
de los datos de entrada, ayudando a seleccionar el más adecuado según las
necesidades del problema.
Bibliografia
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to
Algorithms (3rd ed.). MIT Press.
Knuth, D. E. (1968). The Art of Computer Programming (Vols. 1-4). Addison-Wesley.
Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.
Este libro es accesible para estudiantes y cubre una amplia gama de algoritmos, desde los
más sencillos hasta los más complejos. Incluye implementaciones prácticas y análisis de
complejidad.
Aho, A. V., Ullman, J. D., & Hopcroft, J. E. (2003). Design and Analysis of Algorithms
(3rd ed.). Addison-Wesley.
GeeksforGeeks. (s.f.). Introduction to Algorithms. Recuperado de
https://www.geeksforgeeks.org/
Turing, A. M. (1936). On Computable Numbers, with an Application to the
Entscheidungsproblem. Proceedings of the London Mathematical Society.
Wikipedia - Algoritmo. (2025). Recuperado de https://es.wikipedia.org/wiki/Algoritmo
15