Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ir a la navegaciónIr a la búsqueda
En Ciencias de la Computación, el término eficiencia algorítmica es usado para
describir aquellas propiedades de los algoritmos que están relacionadas con la
cantidad de recursos utilizados por el algoritmo. Un algoritmo debe ser analizado
para determinar el uso de los recursos que realiza. La eficiencia algorítmica puede
ser vista como análogo a la ingeniería de productividad de un proceso repetitivo o
continuo.
Índice
1 Conocimiento Previo
2 Introducción
2.1 Análisis Teórico
2.2 Benchmarking: midiendo la eficiencia
2.3 Detalles de implementación
3 Medidas del uso de recursos
3.1 Complejidad temporal
3.1.1 Teoría
3.1.2 En la práctica
3.2 Complejidad espacial
4 Ejemplos de Algoritmos eficientes
5 Críticas al estado actual de la programación
6 Competencias por el mejor Algoritmo
7 Ver Además
8 Referencias
9 Enlaces externos
Conocimiento Previo
La importancia de la eficiencia con respecto a la complejidad temporal fue
enfatizada por Ada Lovelace en 1843 como resultado de su trabajo con el motor
analítico mecánico de Charles Babbage:
"En casi todo cómputo son posibles una gran variedad de configuraciones para la
sucesión de un proceso, y varias consideraciones pueden influir en la selección de
estas según el propósito de un motor de cálculos. Un objetivo esencial es escoger
la configuración que tienda a minimizar el tiempo necesario para completar el
cálculo."1
Introducción
Un algoritmo es considerado eficiente si su consumo de recursos está en la media o
por debajo de los niveles aceptables. Hablando a grandes rasgos, 'aceptable'
significa: que el algoritmo corre en un tiempo razonable en una computadora dada.
Desde 1950 hasta la actualidad las computadoras han tenido un avance impresionante
tanto en poder computacional como en la capacidad de memoria disponible, lo que
indica que los niveles aceptables de eficiencia en la actualidad hubieran sido
inadmisibles 10 años atrás.
Análisis Teórico
En el estudio teórico de un algoritmo, lo normal es estimar su complejidad de forma
asintótica, i.e. usar notación O grande para representar la complejidad de un
algoritmo como una función que depende del tamaño de la entrada n, esto es
generalmente acertado cuando n es lo suficientemente grande, pero para n pequeños
podría ser erróneo (e.g. bubble sort puede ser más rápido que quicksort cuando solo
unos pocos valores deben ser ordenados).
Detalles de implementación
Los detalles de implementación también tienen un efecto sobre la eficiencia, como
la elección de un lenguaje de programación, o la forma en que el algoritmo está
actualmente implementado, o la elección de un compilador para un lenguaje
particular, incluso el sistema operativo que se está usando. En algunos casos un
lenguaje interpretado pudiera ser mucho más lento que uno compilado.3
Existen otros factores que pueden afectar la eficiencia temporal y espacial, y que
pueden estar fuera del control del programador, entre estos están: granularidad de
los datos, recolector de basura, paralelismo a nivel de instrucción, y llamadas a
subprocesos.6
En la práctica
Se utilizan benchmarks para medir el uso de un algoritmo. Muchos lenguajes de
programación presentan funciones para medir el tiempo de uso del procesador. En
casos de algoritmos que se ejecutan en un tiempo considerablemente largo, dicho
tiempo pudiera resultar de interés. El resultado es generalmente un promedio de los
resultados de varias pruebas consecutivas aplicadas sobre el objetivo.
Complejidad espacial
Esta sección se enfoca en el uso de memoria (usualmente RAM) por los algoritmos
mientras son ejecutados. Así como la complejidad temporal, explicado anteriormente,
parte del análisis de un algoritmo se hace vía la complejidad espacial para obtener
un estimado del uso de memoria principal expresado mediante una función según el
tamaño de la entrada. El resultado es expresado usualmente en notación O grande.
Las computadoras actuales cuentan con una memoria operativa suficientemente grande
(16 Gb y más), o sea que obligar a un algoritmo a ejecutarse reducidamente en
cierta cantidad de memoria ya no representa el mismo problema que solía ser. Pero
la presencia de tres categorías diferentes de memoria pudiera ser significativa:
Continua expresando
En sistemas ubicuos, dividiendo a la mitad el número de instrucciones ejecutadas se
puede duplicar la vida de la batería y los grandes conjuntos de datos brindan
grandes oportunidades para mejores softwares y algoritmos: Reducir el número de
operaciones de N x N a N x log(N) tiene un efecto dramático para un N grande...
para N = 30 billones, este cambio es equivalente a 50 años de mejoras tecnológicas
Conrad Weisert brinda ejemplos, algunos de los cuales fueron publicados en el ACM
SIGPLAN (Special Interest Group on Programming Languages (Grupo con interés
especial en los lenguajes de programación)). Nótese en diciembre de 1995 en:
"Atrocious Programming Thrives"9
Marc Andreessen co-fundador de Netscape es citado en "Mavericks at Work" (ISBN 0-
06-077961-6) diciendo "Cinco programadores geniales pueden completamente superar a
1000 programadores mediocres."[2]
Competencias por el mejor Algoritmo
Las siguientes competiciones dan admisión para los mejores algoritmos basados en
algunos criterios arbitrarios decididos por los jueces:-
Wired10
Ver Además
Análisis de algoritmos - como determinar los recursos necesitados por un algoritmo
Escribir códigos aritméticamente— una suerte de codificación entrópica de longitud
variable para la compresión eficiente de datos
Arrays asociativos— una estructura de datos que puede hacerse más eficiente usando
árboles de Patricia o arrays de Judy
Algoritmos de búsqueda binaria— una técnica simple y eficiente para búsqueda en
arrays ordenados
Benchmark— un método para medir la ejecución comparativa de los tiempos de
ejecución para casos definidos
Caso mejor, caso peor y caso average— Consideraciones para estimar los tiempos de
ejecución en los tres casos
Tabla de saltos— una técnica para reducir la longitud del camino de las
instrucciones, el tamaño del código de máquina, (y usualmente el uso de memoria)
Comparación de los paradigmas de programación— consideraciones de desempeño
específicas a los paradigmas
Optimización del compilador— optimización referente al compilador
Teoría de la complejidad computacional
Performance de las computadoras— mediciones del hardware de las computadoras
Compresión de Datos— reduciendo el ancho de banda de la transmisión de datos y el
uso de disco
Indexado de Bases de datos— una estructura de datos que mejora la velocidad de
recuperación de datos en una tabla de base de datos
Codificación entrópica— Codificar los datos de manera eficiente usando la
frecuencia de ocurrencia de cadenas como un criterio para sustitución
Recolector de Basura— liberación automática de memoria después de su uso
Computación verde— una migración hacia tecnologías más 'verdes' consumiendo menos
recursos
Algoritmo de Huffman— un algoritmo para la codificación eficiente de datos
Localidad de referencia— para evitar que el cache de la CPU se retrase por el
acceso a memoria no local
Optimización de ciclos
Manejo de Memoria
Optimización
Análisis de rendimiento— métodos para medir el rendimiento real de un algoritmo en
tiempo de ejecución
Computación en tiempo real— más ejemplos de aplicaciones que son dependientes del
tiempo de manera crítica
Análisis del tiempo de ejecución— estimación del tiempo esperado de ejecución y de
la escalabilidad de los algoritmos
Super-threading
Multihilos simultáneos
Ejecución especulativa o Ejecución impaciente
Código con hilos— similar al método de tabla virtual o tabla de ramas
Tabla de método virtual— tabla de ramas con punteros asignados dinámicamente para
su uso
Improving Managed code Performance|Mejoras al rendimiento del código manejado—
Librería de Microsoft MSDN
Referencias
Green, Christopher, Classics in the History of Psychology, consultado el 19 de
mayo de 2013
Knuth, Donald (1974), «Structured Programming with go-to Statements», Computing
Surveys (ACM) 6 (4), archivado desde el original el 24 de agosto de 2009,
consultado el 19 de mayo de 2013
«Floating Point Benchmark: Comparing Languages (Fourmilog: None Dare Call It
Reason)». Fourmilab.ch. 4 de agosto de 2005. Consultado el 14 de diciembre de 2011.
«Whetstone Benchmark History». Roylongbottom.org.uk. Consultado el 14 de diciembre
de 2011.
«The Computer Language Benchmarks Game». benchmarksgame.alioth.debian.org.
Archivado desde el original el 31 de diciembre de 2012. Consultado el 14 de
diciembre de 2011.
Guy Lewis Steele, Jr. "Debunking the 'Expensive Procedure Call' Myth, or,
Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO".
MIT AI Lab. AI Lab Memo AIM-443. October 1977.[1]
«Copia archivada». Archivado desde el original el 3 de marzo de 2016. Consultado
el 11 de diciembre de 2013.
http://www.the-adam.com/adam/rantrave/computers.htm
«Atrocious Programming Thrives». Idinews.com. 9 de enero de 2003. Consultado el 14
de diciembre de 2011.
Fagone, Jason (29 de noviembre de 2010). «Teen Mathletes Do Battle at Algorithm
Olympics». Wired.
Enlaces externos
Wikilibros alberga un libro o manual sobre Optimizing Code for Speed.
Animation of the Boyer-Moore algorithm (Applet Java)
"How algorithms shape our world". A TED Talk by Kevin Slavin.
Misconceptions about algorithmic efficiency in high-schools
Control de autoridades
Proyectos WikimediaWd Datos: Q1296251IdentificadoresGND: 4013585-8Microsoft
Academic: 116709606
Categorías: Análisis de algoritmosComplejidad computacionalOptimización de
softwareIngeniería de softwareAnálisis asintótico