Académique Documents
Professionnel Documents
Culture Documents
Eficiencia Algortmica
De Wikipedia, la enciclopedia libre
En Ciencias de la Computacin, el trmino eficiencia algortmica es usado para describir aquellas propiedades de los algoritmos que estn 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
algortmica puede ser vista como anlogo a la ingeniera de productividad de un proceso repetitivo o continuo.
Con el objetivo de lograr una eficiencia mxima se quiere minimizar el uso de recursos. Sin embargo, varias medidas (e.g. complejidad temporal,
complejidad espacial) no pueden ser comparadas directamente, luego, cual de dos algoritmos es considerado ms eficiente, depende de cual medida de
eficiencia se est considerando como prioridad, e.g. la prioridad podra ser obtener la salida del algoritmo lo ms rpido posible, o que minimice el uso de
la memoria, o alguna otra medida particular.
Note que este articulo no trata de optimizacin, concepto que es abordado en optimizacin de programas, compiladores de optimizacin,
optimizacin de bucles, optimizacin de cdigos orientados a objetos, etc. El trmino optimizacin en si puede causar confusin, ya que todo lo que
generalmente se puede hacer es en realidad una 'mejora'.
ndice
1 Conocimiento Previo
2 Introduccin
2.1 Anlisis Terico
2.2 Benchmarking: midiendo la eficiencia
2.3 Detalles de implementacin
3 Medidas del uso de recursos
3.1 Complejidad temporal
3.1.1 Teora
3.1.2 En la prctica
3.2 Complejidad espacial
4 Ejemplos de Algoritmos eficientes
5 Crticas al estado actual de la programacin
6 Competencias por el mejor Algoritmo
7 Ver Adems
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
analtico mecnico de Charles Babbage:
"En casi todo cmputo son posibles una gran variedad de configuraciones para la sucesin de un proceso, y varias consideraciones pueden
influir en la seleccin de estas segn el propsito de un motor de clculos. Una objetivo esencial es escoger la configuracin que tienda a
minimizar el tiempo necesario para completar el clculo."1
Las primeras computadoras electrnicas estaban considerablemente limitadas tanto por la velocidad de procesamiento como por la cantidad de memoria
disponible. En algunos casos se not que exista una renunciacin espacio-tiempo (tradeoff), por lo cual una tarea poda ser tratada usando tanto un
algoritmo eficiente en cuanto a tiempo pero que utiliza gran cantidad de memoria activa como un algoritmo ms lento pero que utiliza poca memoria
activa. La ingeniera de 'tradeoff' fue entonces para usar el algoritmo ms rpido que se acomodara en la memoria disponible.
Las computadoras modernas son mucho ms rpidas que las primeras computadoras, y cuentan con cantidades muy superiores de memoria disponible
(Gigabytes en vez de Kilobytes). No obstante, Donald Knuth enfatiz que la eficiencia sigue siendo un tema importante a considerar:
"En disciplinas de ingeniera establecidas, un 12% de mejora obtenido con facilidad, nunca es considerado un resultado marginal, y creo que
el mismo punto de vista prevalece para la ingeniera de software."2
Introduccin
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 aos atrs.
Los fabricantes de computadoras estn frecuentemente lanzando nuevos modelos, normalmente con mejor rendimiento. El costo de mejorar el software
pude ser bastante caro, por ello en muchos casos la forma ms simple y barata de alcanzar un mejor rendimiento es comprar un computadora con mejor
rendimiento de por s.
Existen muchas maneras para medir la cantidad de recursos utilizados por un algoritmo: las dos medidas ms comunes son la complejidad temporal y
espacial; otras medidas a tener en cuenta podran ser la velocidad de transmisin, uso temporal del disco duro, as como uso del mismo a largo plazo,
consumo de energa, tiempo de respuesta ante los cambios externos, etc. Muchas de estas medidas dependen del tamao de la entrada del algoritmo (i.e. la
cantidad de datos a ser procesados); adems podran depender de la forma en que los datos estn organizados (e.g. algoritmos de ordenacin necesitan
hacer muy poco en datos que ya estn ordenados o que estn ordenados de forma inversa).
http://es.wikipedia.org/wiki/Eficiencia_Algortmica
Eficiencia Algortmica - Wikipedia, la enciclopedia libre
En la prctica existen otros factores que pueden afectar la eficiencia de un algoritmo, tales como la necesidad de cierta precisin y/o veracidad. La forma
en que un algoritmo es implementado tambin puede tener un efecto de peso en su eficiencia, muchos de los aspectos asociados a la implementacin se
vinculan a problemas de optimizacin.
Anlisis Terico
En el estudio terico de un algoritmo, lo normal es estimar su complejidad de forma asinttica, i.e. usar notacin O grande para representar la complejidad
de un algoritmo como una funcin que depende del tamao de la entrada n, esto es generalmente acertado cuando n es lo suficientemente grande, pero para
n pequeos podra ser errneo (e.g. bubble sort pude ser ms rpido que quicksort cuando solo unos pocos valores deben ser ordenados).
Benchmarks (desc. estndar de comparacin, cota de referencia, punto de referencia, conjunto de procedimientos para avaluar el rendimiento de un
ordenador) son usados para realizar comparaciones entre programas en competencia o para probar versiones nuevas de software que se quiera liberar, y
sirve como indicador relativo para medir la eficiencia de un algoritmo. Si un nuevo algoritmo de ordenacin es implementado, por ejemplo puede ser
comparado con su predecesor para asegurar su eficiencia al menos con los datos conocidos o recopilados por este ltimo, teniendo en cuenta claro las
mejoras funcionales del nuevo algoritmo. Los benchmarks pueden ser utilizados por los clientes para comparar varios productos de diferentes proveedores
con el objetivo de estimar cul producto satisface sus necesidades en trminos de eficiencia.
Algunos benchmarks prestan servicios para producir comparaciones detalladas sobre la velocidad relativa de varios lenguajes compilados e interpretados,
por ejemplo3 4 , The Computer Language Benchmarks Game5 compara la eficiencia entre una gran variedad de lenguajes sobre la implementacin de
problemas tpicos de programacin.
Detalles de implementacin
Los detalles de implementacin tambin tienen un efecto sobre la eficiencia, como la eleccin de un lenguaje de programacin, o la forma en que el
algoritmo est actualmente implementado, o la eleccin de un compilador para un lenguaje particular, incluso el sistema operativo que se est usando. En
algunos casos un lenguaje interpretado pudiera ser mucho ms 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 estn:
granularidad de los datos, recolector de basura, paralelismo a nivel de instruccin, y llamadas a subprocesos.6
Algunos procesadores tienen la capacidad de procesado vectorial, lo que permite que una instruccin se capaz de operar sobre varios datos; puede ser fcil
o no para un programador o un compilador usar estas herramientas. Los algoritmos diseados para ser procesados de forma secuencial necesitaran ser
completamente rediseados para hacer uso del procesamiento en paralelo.
Otro detalle de implementacin importante referente a los procesadores aparece cuando estos implementan una instruccin de forma diferente, o sea que
una instruccin que es relativamente rpida en algunos modelos podra ser ms lenta en otros, esto hace difcil el trabajo para un compilador guiado a la
optimizacin.
Para computadoras cuya energa es por batera (e.g. laptops), o para grandes clculos (e.g. supercomputadoras) otras medidas tambin son de inters:
Capacidad de transmisin: el ancho de banda puede llegar a ser un factor limitante. La compresin de datos es utilizada para reducir la cantidad de
http://es.wikipedia.org/wiki/Eficiencia_Algortmica
Eficiencia Algortmica - Wikipedia, la enciclopedia libre
datos a transmitir.
Espacio externo: cantidad de espacio requerido en disco o algn otro dispositivo externo; esto podra ser solo una necesidad temporal, o sea solo se
requiere dicho espacio mientras est corriendo e algoritmo o podra ser una necesidad a largo plazo para futuras referencias.
Tiempo de respuesta: Esto es particularmente relevante en tiempo real para una aplicacin cuando el sistema de la computadora debe responder de
forma rpida a los eventos externos.
Complejidad temporal
Teora
Para analizar un algoritmo generalmente se usa la complejidad temporal para obtener un estimado del tiempo de ejecucin expresado en funcin del
tamao de la entrada. El resultado es tpicamente expresado en notacin O grande. Esto suele ser til para comparar algoritmos, especialmente cuando se
necesita procesar una gran cantidad de datos. Estimaciones ms detallas se requieren para comparar algoritmos que procesan pequeas cantidades de datos
(de todas formas en estos casos el tiempo no debera ser un problema). Algoritmos implementados para usar procesamiento paralelo de los datos son
mucho ms difciles de analizar.
En la prctica
Se utilizan benchmarks para medir el uso de un algoritmo. Muchos lenguajes de programacin 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 inters. El resultado es
generalmente un promedio de los resultados de varias pruebas consecutivas aplicadas sobre el objetivo.
Este tipo de pruebas son altamente sensibles a configuraciones de hardware y existe la posibilidad de que otros programas se estn ejecutando al mismo
tiempo en un ambiente capas de procesar varias tareas a la vez.
Dichas pruebas tambin dependen intrnsecamente del lenguaje de programacin, el compilador y las opciones del compilador, lo que implica que dos
algoritmos que se comparan debern estar implementados bajo las mismas condiciones.
Complejidad espacial
Esta seccin se enfoca en el uso de memoria (usualmente RAM) por los algoritmos mientras son ejecutados. As como la complejidad temporal, explicado
anteriormente, parte del anlisis de un algoritmo se hace va la complejidad espacial para obtener un estimado del uso de memoria principal expresado
mediante una funcin segn el tamao de la entrada. El resultado es expresado usualmente en notacin O grande.
Las primeras computadoras electrnicas y computadoras de escritorio, contaban con muy poca capacidad de memoria operativa. E.g. la EDSAC 1949 tena
un mximo de 1024 17-bit words, mientras que la Sinclair ZX80 1980 surgi con solo 1024 8-bit bytes de memoria operativa.
Las computadoras actuales cuentan con una memoria operativa suficientemente grande (16 Gb y ms), o sea que obligar a un algoritmo a ejecutarse
reducidamente en cierta cantidad de memoria ya no representa el mismo problema que sola ser. Pero la presencia de tres categoras diferentes de memoria
pudiera ser significativa:
Memoria Cach (usualmente RAM-esttica): esta opera a una velocidad comparable a la del CPU.
Memoria fsica principal (usualmente RAM-dinmica): esta opera un tanto ms lenta que el CPU.
Memoria virtual (usualmente en disco): esta da la impresin de una gran cantidad de memoria utilizable y opera en el orden de los miles ms lenta
que el CPU.
Un algoritmo cuyas necesidades pueden ser satisfechas con la memoria cach ser mucho ms rpido que uno que necesite de la memoria principal y en
consecuencia mucho ms rpido que uno que necesita recurrir a la memoria virtual. Si se quiere profundizar an ms dicho problema, existen sistemas que
tienen hasta tres niveles de memoria cach, con diferentes y variadas velocidades. Sistemas diferentes tendrn diferentes cantidades asignadas a los tipos
de memoria comentados, lo que conlleva a que las necesidades de memoria de un algoritmo varen significativamente entre un sistema y otro.
En los das veteranos de las computadoras electrnicas si un algoritmo requera ms memoria que la brindada por la memoria principal, dicho algoritmo no
poda ser utilizado. En nuestros das la memoria virtual resuelve dichos problemas, bajo un costo de eficiencia. Un algoritmo que se suple solo de la
memoria cach presenta excelentes resultados en cuanto a velocidad, en estos casos la optimizacin del espacio repercute de forma relevante en la
optimizacin del tiempo.
http://es.wikipedia.org/wiki/Eficiencia_Algortmica
Eficiencia Algortmica - Wikipedia, la enciclopedia libre
David May FRS un Cientfico de la Computacin Britnico, actualmente Profesor de Ciencias de la Computacin en la Universidad de Bristol
adems de ser fundador y CTO de XMOS Semiconductor, cree que la confianza en la Ley de Moore para resolver ineficiencias es uno de los
problemas que existen. l ha avanzado en una 'alternativa' a la ley de Moore (la ley de May), expresada como sigue:7
La eficiencia del software se divide a la mitad cada 18 meses compensando la ley de Moore
Continua expresando
En sistemas ubicuos, dividiendo a la mitad el nmero de instrucciones ejecutadas se puede duplicar la vida de la batera y los grandes
conjuntos de datos brindan grandes oportunidades para mejores softwares y algoritmos: Reducir el nmero de operaciones de N x N a N
x log(N) tiene un efecto dramtico para un N grande... para N = 30 billones, este cambio es equivalente a 50 aos de mejoras
tecnolgicas
El creador de Software Adam N. Roseenburge en su blog "The failure of the Digital computer", describi el estado actual de la programacin como
cercano al "Software event horizon"(Horizonte de eventos del Software), (aludiendo al ficticio "shoe event horizon"(horizonte del evento zapato o
horizonte del zapato) descrito por Douglas Adams en su libro Hitchhiker's Guide to the Galaxy8 ).
El estima que ha habido un factor de 70dB en prdida de productividad o ""99.99999%, en su capacidad para funcionar correctamente"", desde los
1980"Cuando Arthur C. Clarke compar el estado de la computacin en el 2001 a la computadora HAL en su libro 2001: A Space Odyssey, seal cuan
increblemente pequeas y poderosas computadoras haban pero cuan decepcionante se haba vuelto la programacin".
Conrad Weisert brinda ejemplos, algunos de los cuales fueron publicados en el ACM SIGPLAN (Special Interest Group on Programming Languages
(Grupo con inters especial en los lenguajes de programacin)). Ntese 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] (http://www.linkedin.com/news?actionBar=&articleID=590198259&
ids=0NdjgSd3wOejkIc3cPej0VczARb3ARczwVcj0VdiMVczcUcP8OejkIc3gTdj0TczAR&aag=true&freq=weekly&trk=eml-tod-b-ttle-96)
Wired10
Ver Adems
Anlisis de algoritmos - como determinar los recursos necesitados por un algoritmo
Escribir cdigos aritmticamente una suerte de codificacin entrpica de longitud variable para la compresin eficiente de datos
Arrays asociativos una estructura de datos que puede hacerse ms eficiente usando rboles de Patricia o arrays de Judy
Algoritmos de bsqueda binaria una tcnica simple y eficiente para bsqueda en arrays ordenados
Benchmark un mtodo para medir la ejecucin comparativa de los tiempos de ejecucin para casos definidos
Caso mejor, caso peor y caso average Consideraciones para estimar los tiempos de ejecucin en los tres casos
Tabla de saltos una tcnica para reducir la longitud del camino de las instrucciones, el tamao del cdigo de mquina, (y usualmente el uso de
memoria)
Comparacin de los paradigmas de programacin consideraciones de desempeo especficas a los paradigmas
Optimizacin del compilador optimizacin referente al compilador
Teora de la complejidad computacional
Performance de las computadoras mediciones del hardware de las computadoras
Compresin de Datos reduciendo el ancho de banda de la transmisin de datos y el uso de disco
Indexado de Bases de datos una estructura de datos que mejora la velocidad de recuperacin de datos en una tabla de base de datos
Codificacin entrpica Codificar los datos de manera eficiente usando la frecuencia de ocurrencia de cadenas como un criterio para sustitucin
Recolector de Basura liberacin automtica de memoria despus de su uso
Computacin verde una migracin hacia tecnologas ms 'verdes' consumiendo menos recursos
Algoritmo de Huffman un algoritmo para la codificacin eficiente de datos
Localidad de referencia para evitar que el cache de la CPU se retrase por el acceso a memoria no local
Optimizacin de ciclos
Manejo de Memoria
Optimizacin
Anlisis de rendimiento mtodos para medir el rendimiento real de un algoritmo en tiempo de ejecucin
Computacin en tiempo real ms ejemplos de aplicaciones que son dependientes del tiempo de manera crtica
Anlisis del tiempo de ejecucin estimacin del tiempo esperado de ejecucin y de la escalabilidad de los algoritmos
Super-threading
Multihilos simultneos
Ejecucin especulativa o Ejecucin impaciente
Cdigo con hilos similar al mtodo de tabla virtual o tabla de ramas
Tabla de mtodo virtual tabla de ramas con punteros asignados dinmicamente para su uso
Improving Managed code Performance|Mejoras al rendimiento del cdigo manejado (http://msdn.microsoft.com/en-us/library/ff647790.aspx)
Librera de Microsoft MSDN
Referencias
1. Green, Christopher, Classics in the History of Psychology (http://psychclassics.yorku.ca/Lovelace/lovelace.htm), http://psychclassics.yorku.ca/Lovelace
/lovelace.htm, consultado el 19 May 2013
2. Knuth, Donald (1974), Structured Programming with go-to Statements (http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf), Computing Surveys
http://es.wikipedia.org/wiki/Eficiencia_Algortmica
Eficiencia Algortmica - Wikipedia, la enciclopedia libre
Enlaces externos
Wikilibros alberga un libro o manual sobre Optimizing Code for Speed.
Animation of the Boyer-Moore algorithm (http://cgjennings.ca/fjs/index.html) (Applet Java)
"How algorithms shape our world". (http://www.dailymotion.com/video/xn8cg8_ted-talk-kevin-slavin-how-algorithms-shape-
our-world_tech#.UNqz4axdxlM) A TED Talk by Kevin Slavin.
Misconceptions about algorithmic efficiency in high-schools (http://dx.doi.org/10.1016/j.compedu.2003.07.004)
Obtenido de http://es.wikipedia.org/w/index.php?title=Eficiencia_Algortmica&oldid=72840490
Categoras: Anlisis de algoritmos Complejidad computacional Optimizacin de software Ingeniera de software Anlisis asinttico
Esta pgina fue modificada por ltima vez el 26 feb 2014, a las 14:16.
El texto est disponible bajo la Licencia Creative Commons Atribucin Compartir Igual 3.0; podran ser aplicables clusulas adicionales. Lanse los
trminos de uso para ms informacin.
Wikipedia es una marca registrada de la Fundacin Wikimedia, Inc., una organizacin sin nimo de lucro.
http://es.wikipedia.org/wiki/Eficiencia_Algortmica