Vous êtes sur la page 1sur 5

Eficiencia Algortmica - Wikipedia, la enciclopedia libre

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).

Algunos ejemplos de notacin de O grande incluyen:

Notacin Nombre Ejemplos


Determinar si un nmero es par o impar. Usar una tabla de consulta que asocia constante/tamao. Usar una funcin
constante
hash para obtener un elemento.
Buscar un elemento especfico en un array utilizando un rbol binario de bsqueda o un rbol de bsqueda
logartmico
balanceado, as como todas las operaciones en un Heap binomial.
lineal Buscar un elemento especfico en una lista desordenada o en un rbol degenerado (peor caso).
loglinear o
Ejecutar una transformada rpida de Fourier; heapsort, quicksort (caso peor y promedio), o merge sort
quasilinear
Multiplicar dos nmeros de n dgitos por un algoritmo simple. bubble sort (caso peor o implementacin sencilla),
cuadrtico
Shell sort, quicksort (caso peor).
Encontrar la solucin exacta al problema del viajante utilizando programacin dinmica. Determinar si dos
exponencial
sentencias lgicas son equivalentes utilizando una bsqueda por fuerza bruta

Benchmarking: midiendo la eficiencia

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.

Medidas del uso de recursos


Las medidas de eficiencia son normalmente expresadas en funcin del tamao de la entrada n.

Las dos medidas ms comunes son:

Complejidad temporal: cuanto se demora un algoritmo en terminar.


Complejidad espacial: cuanta memoria operativa (RAM usualmente) es requerida por el algoritmo. Esto tiene dos apartados, la cantidad de memoria
que necesita el cdigo y la cantidad que necesitan los datos sobre los que opera el algoritmo.

Para computadoras cuya energa es por batera (e.g. laptops), o para grandes clculos (e.g. supercomputadoras) otras medidas tambin son de inters:

Consumo directo de energa: energa requerida por la computadora.


Consumo indirecto de energa: energa requerida para el enfriamiento, la iluminacin, etc.

En algunos casos otras medidas podran ser relevantes:

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.

Existen 4 aspectos relevantes a considerar:

La cantidad de memoria requerida por el cdigo del algoritmo.


La cantidad de memoria requerida para almacenar los datos de entrada.
La cantidad de memoria requerida para los datos de salida (algoritmos como los de ordenacin suelen reorganizar los datos de entrada y por ello no
necesitan memoria extra para la salida).
La cantidad de memoria requerida en cuanto a espacio de trabajo del algoritmo para realizar los clculos y asignaciones (tanto para variables como
cualquier espacio necesario en la pila para almacenar llamadas a subrutinas, este espacio es particularmente significativo para algoritmos que utilizan
tcnicas recursivas).

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.

Ejemplos de Algoritmos eficientes


quicksort El primer algoritmo de ordenacin con un orden de .
heapsort Otro algoritmo de rpida ejecucin.
Bsqueda binaria Bsqueda en una tabla ordenada
Algoritmo de Boyer-Moore para bsqueda de cadenas Buscar una cadena dentro de otra.

Crticas al estado actual de la programacin

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)

Competencias por el mejor Algoritmo


Las siguientes competiciones dan admisin para los mejores algoritmos basados en algunos criterios arbitrarios decididos por los jueces:-

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

(ACM) 6 (4), http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf, consultado el 19 May 2013


3. a b Floating Point Benchmark: Comparing Languages (Fourmilog: None Dare Call It Reason) (http://www.fourmilab.ch/fourmilog/archives/2005-08
/000567.html). Fourmilab.ch (4 de agosto de 2005). Consultado el 14 de diciembre de 2011.
4. Whetstone Benchmark History (http://www.roylongbottom.org.uk/whetstone.htm#anchorPC2). Roylongbottom.org.uk. Consultado el 14 de diciembre de 2011.
5. The Computer Language Benchmarks Game (http://benchmarksgame.alioth.debian.org/). benchmarksgame.alioth.debian.org. Consultado el 14 de diciembre de
2011.
6. 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] (http://dspace.mit.edu/handle/1721.1/5753)
7. http://www.cs.bris.ac.uk/~dave/iee.pdf
8. http://www.the-adam.com/adam/rantrave/computers.htm
9. Atrocious Programming Thrives (http://www.idinews.com/atrocious.html). Idinews.com (9 de enero de 2003). Consultado el 14 de diciembre de 2011.
10. Fagone, Jason (2010-11-29). Teen Mathletes Do Battle at Algorithm Olympics (http://www.wired.com/magazine/2010/11/mf_algorithmolympics/all/1). Wired.

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

Vous aimerez peut-être aussi