Ensayo

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

Universidad Fermín Toro

Vice-Rectorado Académico
Facultad de Ingeniería
Escuela de Ingeniería en Computación
Cabudare – Lara.

Alumno:
Humberto Rivas
Cedula: V-26.990.816
Sección: Saia A
Materia: Autómatas, Lenguajes Formales
Profe.: Edecio Freitez

Cabudare, enero del 2023.


La ciencia de la Computación es el cuerpo sistematizado del conocimiento concerniente al cálculo.
Sus principios se remontan al diseño de algoritmos por parte de Euclides, al uso de la complejidad
asintótica y la deducibilidad por parte de los babilónicos. La ciencia de la Computación se sustenta
en dos áreas básicas: los conceptos fundamentales subyacentes al cálculo que trajo como
consecuencia la existencia de funciones probablemente no calculables o computables, y por otra
parte, las técnicas de ingeniería para el diseño de sistemas de computación basadas en técnicas de
diseño de algoritmos: algoritmos voraces (divide y vencerás), algoritmos aleatorizados, algoritmos
con retroceso, etc. Este artículo está pensado en subrayar la importancia de la primera área, al
relacionar los aspectos teóricos que se presentan en el estudio de la ciencia de la Computación y
los aspectos prácticos con los que los estudiantes están familiarizados. Los estudiantes con
conocimientos en programación, estructura de datos e ingeniería de software presentan problemas
para establecer una relación con otros temas como: teoría de autómatas, lenguajes formales y
funciones recursivas. Se tiene como objetivo resaltar la necesidad de enseñar a los alumnos
habilidades para una buena programación y simultáneamente capacidad de análisis de algoritmos,
con la finalidad de dotarlos de una infraestructura lógico matemática, sobre la cual fundamentar los
conceptos e ideas de complejidad y que ésta se relacione y/o vincule estrechamente a los temas
prácticos. No debe sorprendernos el hecho de que las ideas básicas de la teoría de autómatas se
desarrollaron para resolver cuestiones teóricas de los fundamentos de las matemáticas, como lo
estableció el matemático alemán David Hilbert (1862-1943). Un proceso computacional, también
llamado proceso algorítmico o algoritmo, es fundamental para la ciencia de la Computación, puesto
que un computador no puede ejecutar un problema que no tenga una solución algorítmica. Así,
cualquier limitación de las capacidades de los procesos computacionales constituye también una
limitación de las capacidades de la computadora. Evaluar la eficiencia de los algoritmos tiene
mucho que ver con evaluar la complejidad de los mismos. Aunque esta labor pueda resultar ardua,
compensa el hecho de obtener programas con alta garantía de corrección y la satisfacción
intelectual de haberlos construido bien desde el principio, sin esperar el veredicto del sistema
computacional. Sin embargo, el tema que nos aborda es establecer si una función es calculable o
computable, soslayando las especificaciones de un sistema computacional especifico. En 1935, el
matemático y lógico inglés Alan Mathison Turing (1912-1954) se interesó en el problema de
decisión de Hilbert, que preguntaba si podría existir un método general aplicable a cualquier
enunciado, para determinar si éste era verdadero. El enfoque de Turing lo llevó a pensar lo que
ahora se conoce como la máquina de Turingn. El tema de la computabilidad tiene mucho que ver
con la búsqueda de las estructuras que se requieren en un lenguaje de programación, de tal forma
que se asegure que un programa expresado en dicho lenguaje pueda resolver cualquier problema
que tenga una solución algorítmica.
ANÁLISIS DE ALGORITMOS
La Teoría de la Complejidad Computacional es la parte de la teoría de la computación que estudia
los recursos requeridos durante el cálculo para resolver un problema. Un cálculo resulta complejo si
es difícil de realizar. En este contexto podemos definir la complejidad de cálculo como la cantidad
de recursos necesarios para efectuar un cálculo. Así, un cálculo difícil requerirá más recursos que
uno de menor dificultad. Los recursos comúnmente estudiados son el tiempo (número de pasos de
ejecución de un algoritmo para resolver un problema) y el espacio (cantidad de memoria utilizada
para resolver un problema). Un algoritmo que resuelve un problema pero que tarda mucho en
hacerlo, difícilmente será de utilidad. Igualmente, un algoritmo que necesite un gigabyte de
memoria no será probablemente utilizado. A estos recursos se les puede añadir otros, tales como el
número de procesadores necesarios para resolver el problema en paralelo. Si un cálculo requiere
más tiempo que otro decimos que es más complejo y lo llamamos complejidad temporal. Por otro
lado, si un cálculo requiere más espacio de almacenamiento que otro decimos que es más
complejo, en este caso hablamos de una complejidad espacial. Es claro que el tiempo que se
requiere para efectuar un cálculo en un computador moderno es menor que el requerido para
hacer el mismo cálculo con las máquinas de las décadas pasadas, y seguramente que el tiempo en
una máquina de la próxima generación será mucho menor. El estudio de los procesos
computacionales, conduce a una clasificación de los problemas en dos grandes clases: los
problemas con solución y los problemas sin solución. Los problemas solucionables, requieren gran
cantidad de recursos como tiempo y espacio de almacenamiento. El análisis requerido para
estimar el uso de recursos de un algoritmo es una cuestión teórica, y por tanto necesita un marco
formal.
Los problemas que tienen una solución con orden de complejidad lineal son los problemas que se
resuelven en un tiempo que se relaciona linealmente con su tamaño. Aunque actualmente la
mayoría de los algoritmos resueltos por las máquinas tienen como máximo una complejidad o
costo computacional polinómico, es decir, la relación entre el tamaño del problema y su tiempo de
ejecución es polinómica. Éstos son problemas agrupados en la clase P. Los problemas con costo no
polinomial están agrupados en la clase NP. Estos problemas no tienen una solución algorítmica, es
decir, una máquina no puede resolverlos en un tiempo razonable. Existe una escala para medir la
complejidad, la que incluye, entre otros: P, Resoluble en tiempo polinómico; P-completo, los
problemas más difíciles en P. NP problemas con respuestas positivas verificables en tiempo
polinómico y NP-completo, los más difíciles problemas de NP. Muchas de estas clases tienen una
co-clase que contiene los problemas complementarios a los de la clase original. Por ejemplo, si X
está en NP, el complemento de X está en co-NP. Sin embargo, no debe entenderse que NP y co-NP
sean complementarios; hay problemas que pertenecen a ambas clases, y otros que no están en
ninguna de los dos. Cada cierto tiempo se duplica el número de instrucciones por segundo que los
computadores pueden ejecutar. Los profanos y no tan profanos piensan que esto puede inducir a
muchos programadores a pensar que basta esperar algunos años para que problemas que hoy
necesitan muchas horas de cálculo puedan resolverse en pocos segundos, soslayando la necesidad
de evaluar y obtener algoritmos eficientes. Este artículo pretende deshacer tal suposición,
mostrando que el factor predominante que delimita lo que es soluble en un tiempo razonable de
lo que no lo es, es precisamente el algoritmo elegido para resolver el problema. El hombre es
creativo por naturaleza, la tecnología le ofrece un mundo de posibilidades de exploración, por
tanto, no debe sustraerse de los beneficios que ésta le provee. Particularmente, el advenimiento
de nueva tecnología debe tomarse como un estímulo para buscar algoritmos más eficientes.
COMPUTABILIDAD Es conveniente suponer que un sistema computacional es fijo (abstracto), con
la finalidad de eliminar las variaciones de un sistema a otro. Brookshear elimina estas variaciones
de análisis en sistemas diferentes y evalúa la complejidad de cálculo suponiendo un sistema fijo
basado en una máquina de Turing, ya que supone que a partir de ella puede trasladar sus
resultados a otros sistemas y mantener la complejidad. Un lenguaje de programación (el preferido
por usted) tiene un poder expresivo ya que permite escribir cualquier algoritmo (una idea) en ese
lenguaje. Sin embargo, suponemos que existen algunos algoritmos que no pueden representarse
haciendo uso de ese lenguaje. Consideremos una clase que contiene todas las funciones
computables. Una función es computable si existe un algoritmo para ella, sin importar como
pueda implantarse o expresarse ese algoritmo. Puede construirse un conjunto que contenga todas
las funciones computables, para ello se utiliza un método muy usado por los matemáticos, el
método recursivo generacional. Este método permite que, a partir de un conjunto básico de
funciones computables, consideradas como funciones iniciales, puedan construirse las demás
combinándolas en forma recursiva y así obtener el conjunto mayor de todas las funciones
computables. Puede demostrarse, aunque no es el objetivo de este artículo, que una función de
esta clase puede calcularse por medio de una máquina de Turing.
La Teoría de la Complejidad Computacional se basa en un enfoque no funcional, en donde interesa
como se lleva el cálculo y su complejidad en función de los recursos que utiliza. La Teoría de la
Computabilidad se interesa en hallar una solución a un problema, mas no se interesa por los
métodos específicos de expresar una solución algorítmica en un sistema computacional; es decir,
no interesa cómo se pueda implantar.

También podría gustarte