Comencemos definiendo que es un algoritmo y por que es importante conocerlos a detalle. Es importante definir de manera clara y formal que es un algoritmo, pues si queremos estudiarlos y entenderlos a detalle debemos partir de las mismas definiciones. Si bien todos tenemos la idea de qué es un algoritmo, realmente no es tan fácil definirlo. Pausa el video y escribe en tus propias palabras que es un algoritmo? Coloquialmente un algoritmo es cualquier procedimiento o fórmula que nos ayuda a resolver un problema. Formalmente es: una secuencia finita de operaciones bien definidas que pueden ser implementadas en una computadora, que nos pueden ayudar a resolver problemas. Un algoritmo no tiene que ser estrictamente implementado en una computadora, basta con que pueda ser implementado. Si bien la definición actual de algoritmo está asociada a las computadoras, su existencia es mucho más vieja. La palabra y su definición derivan de un científico llamado al-Khwarizmi. Puede que ya estés familiarizado con este gran científico. Realmente un algoritmo es cualquier serie de instrucciones que produzcan un resultado definido. Un ejemplo típico de que es un algoritmo pueden ser las recetas de cocina. Pues son una serie de pasos bien definidos y explícitos. Teóricamente pueden ser ejecutados por una computadora, como una thermomix. La fórmula para resolver ecuaciones cuadradas, también es un algoritmo. Pues a través de una serie de pasos definidos implementables en una computadora podemos utilizarla. Cualquier programa que implementemos en python o en cualquier lenguaje de programación es un algoritmo, pues son una serie de pasos bien definidos y ejecutados en una computadora. En estricto sentido, no se puede patentar un algoritmo, pues legalmente son considerados manipulaciones de conceptos abstractos, números o señales. Sin embargo es posible, bajo ciertas condiciones, patentar la aplicación específica de un algoritmo. En general, es difícil y controversial patentar algoritmos, pues se consideran parte del dominio público. Como podemos imaginarnos existe una infinidad de algoritmos, algunos son famosos y otros no. Algunos tienen nombre, y otros se pierden en el repositorio de git de las personas. Dada la gran cantidad y variabilidad de los algoritmos, es necesario introducir formalidad al momento de estudiarlos. Las ciencias en computación se han encargado del estudio formal de los algoritmos durante las últimas décadas. Esta rama tiene su origen moderno en las máquinas de Turing, que son una abstracción creada por el gran científico y humano Alan Turing. No solo nos ayudó a resolver el código de las fuerzas del eje durante la segunda guerra mundial, sino también planteó el modelo abstracto de la computadora moderna, sentó las bases de la inteligencia artificial moderna y contribuyó a decenas de las ramas modernas de la metamatemática, solo por mencionar algunas contribuciones. Lamentablemente fue castrado quimicamente por el gobierno pues no era homesexual, lo que provoco su suicidio a la edad de 41 años. Sin embargo, fue capaz de revolucionar todas y cada una de las ramas de la ciencia con sus contribuciones. Básicamente, un algoritmo es cualquier procedimiento que puede ser ejecutado en una máquina de Turing. Esta máquina manipula símbolos en una cinta de acuerdo a una serie de reglas o transiciones finitas. Formalmente, una máquina de Turing tiene una cinta infinita dividida en celdas que puede moverse a la izquierda o la derecha. La máquina cuenta con una aguja que es capaz de leer, y escribir. El usuario presenta una tabla con instrucciones finitas de que hacer dependiendo del estado y lo que lea la aguja de la máquina en donde se encuentre. Esta simple abstracción es capaz de ejecutar cualquier algoritmo que se le ocurra a la humanidad, y por ello es ampliamente utilizada en el estudio formal de los algoritmos. Actualmente Turing y una representación tabular de su máquina se encuentran en billete de 50 libras. El billete contiene una frase que nos parece muy adecuada en nuestros tiempos con el advenimiento del internet, inteligencia artificial, y el poder masivo y distribuido de cómputo que existe en nuestros días. “Esto es sólo un anticipo de lo que está por venir y solo una sombra de lo que va a ser” Las ramas de las ciencias en computación que se dedican al estudio de las propiedades abstractas de algoritmos son conocidas como Computabilidad y Complejidad. En esta materia nos concentramos en la segunda, el área de la complejidad que se dedica estudiar qué tan complejos o eficientes son los algoritmos. Si deseas conocer más acerca de turing, su máquina y la rama de computabilidad te recomendamos revisar las secciones de material adicional. Y no te preocupes la teoría y formalidad de las máquinas de turing no serán analizadas en esta clase ni en los cuestionarios, sin embargo es de suma importancia estar familiarizados con estos conceptos, pues son el lenguaje y la base de todo lo que veremos en el resto de la materia. Además, siempre es bueno tener en cuenta el contexto histórico en el que se desarrollan las cosas. Ahora, pasaremos a formalizar la notación Big-O que nos permitirá analizar y comparar la eficiencia o complejidad de los algoritmos.