(Una aproximación a la medición de la calidad)
- Objetivos
- Estrategias
metodológicas - Mediciones
- Métricas
- Validación
del proceso - Generalidades
- Análisis
detallado - Bibliografía
- Se diferencien claramente los diferentes aspectos que
están vinculados con la calidad del
software. - Se entreguen las herramientas
teóricas y practicas para realizar una correcta evaluación (medición) y adecuación de un
proyecto.
- Clase magistral, para los temas correspondientes a
fundamentación teórica. - Ejercicios desarrollados en clase, para
comprensión y aplicación de los
temas. - Lecturas de elementos teóricos que permitan la
crítica y generen la duda acerca de las formas de
evaluación.
Estrategias evaluativas
- A través de tareas de aplicación y
medición de algoritmos. - Elaboración de casos de medición para
un modelo
desarrollado. - Aplicación de los aspectos de calidad
(ISO), para
la dar fiabilidad en el producto
terminado. - Consultas de elementos adicionales y algoritmos
de alto desempeño para cubrir aspectos necesarios
en la calidad del software.
Sin importar cualquiera que sea el tipo de software a
ser desarrollado sea de sistemas (Son
programas
que sirven a otros programas en
el trabajo
de desarrollo
como compiladores,
editores, ..), tiempo real
(Software encargado de analizar datos del mundo
en forma real tales como análisis de datos, control
automatizado, monitoreo de datos), gestión (a esta categoría se
incluye el software comercial a nivel empresarial nominas,
inventarios),
ingeniería y científico (es
software que posee un amplio manejo numérico usado en
biología, astronomía, CAD, …), empotrado
(software que se encuentra residente en memoria, tales
como : controles automáticos en los vehículos,
sistemas de
background, partes del sistema
operativo, …), computación personal
(software comercial de uso local como procesadores de
texto, hojas electrónicas, navegadores
web,
calendarios, agendas, recetarios, …), inteligencia
artificial (software de procesamiento especial sistemas
expertos, sistemas basados en el
conocimiento, generalmente no usan algoritmos
numéricos). Todos los tipos de
software mencionados requieren que los analistas,
diseñadores y desarrolladores apliquen características y elementos de calidad
para que se logren productos a
las necesidades del usuario, estas necesidades se comienzan a
encontrar un camino de solución a través de la
aplicación de elementos de calidad, así se
presentan dos de los más valiosos como son la eficiencia y la
eficacia.
El uso eficiente y eficaz de la tecnología de los computadores es un
objetivo que
aún está distante. Para representar lo anterior,
sólo basta señalar los reportes de fracasos y
dificultades de muchos proyectos en
los que se pretende involucrar a la tecnología de los
computadores.
La ingeniería del software pretende utilizar
los recursos
computacionales de tal manera que se produzcan soluciones
eficientes y eficaces a los problemas
informáticos, el éxito
de un proyecto
involucra elementos como la planeación, la
administración y la utilización de
metodologías de desarrollo
de software.
A través de la planeación se determinan los recursos
necesarios para el desarrollo del
proyecto, la factibilidad
del mismo y el tiempo estimado
de desarrollo; unido a ello con la administración se controla, evalúa
y corrige la dirección de acuerdo a las contingencias
y demás elementos que se vayan presentando durante el
desarrollo; finalmente, a través del uso de una metodología se busca lograr el acople de
los participantes y la garantía de una determinada
calidad. Debe notarse que las metodologías de
desarrollote software sólo constituyen uno de los
mecanismos que actualmente se utilizan para alcanzar software
de calidad; no debemos dejar de lado aspectos de la dirección de proyectos que
también buscan calidad en el proceso de
desarrollo y en el producto
final.
Considerando que la calidad es un término
bastante impreciso se ha decidido establecer este tema como
punto de partida. Como complemento se trata el tema del manejo
de la complejidad puesto que es un tópico fundamental
dentro de una metodología, que es la herramienta
fundamental con la que se pretende guiar el proceso de
elaboración de un producto software de alta
calidad.
Calidad en la ingeniería del software.
En una versión sucinta la
calidad en la ingeniería del software es un
grupo de
características que representa la
efectividad y la eficiencia de
un sistema de
información. Es importante enfatizar en dos puntos
:
- Un software de calidad debe ser eficaz, es decir, que
debe realizar las funciones
establecidas, debe ser amigable. Un usuario
debe utilizar el software porque produce resultados confiables,
realiza todas las operaciones que
se requieren, ejecuta las operaciones en
un tiempo aceptado y es fácilmente usado por el grupo de
usuarios a quien este dirigido. - Un software de calidad debe ser
eficiente, es decir el
costo de su
desarrollo tomando todos los recursos y el costo de su
operación debe ser tal que las organizaciones
involucradas en su desarrollo y uso obtengan el máximo
beneficio o por lo menos un beneficio aceptable en un
período de tiempo establecido.
Para ilustrar el concepto de
calidad de manera más profunda, es necesario considerar
algunos aspectos fundamentales que caracterizan al software de
calidad como son : solidez, exactitud, completitud,
mantenibilidad, reutilizabilidad, claridad en la documentación, entre otros que
serán descritos a continuación.
- Aspectos básicos de calidad de
software.
La descripción que se hace de los factores
que influyen en un software de calidad se basan principalmente
en las ideas presentadas por Robert Dunn, Philip Crosby y Roger
S. Pressman. Sin embargo, también se han tomado algunos
aportes de Bertrand Meyer y Mauricio Fernando Alba.
Robert Dunn presenta la calidad en el software tomando
dos puntos de vista : la calidad en el proceso de desarrollo y
la calidad en el producto final, estos dos grupos
principales los agrupa en los siguiente aspectos de calidad :
confiabilidad, utilizabilidad, mantenibilidad, y
adaptabilidad.
Roger Pressman describe similares factores de calidad
agrupados en tres grupos :
calidad en operación, calidad en revisión y
calidad en transición.
A continuación se presentan los factores de
calidad de acuerdo al orden dado por Dunn.
Confiabilidad. Este termino es necesario sea
separado en varios elementos que permiten darle al software el
matiz de fiable. Sus componente son :
- Completitud
- Consistencia y precisión
- Solidez
- Simplicidad
- Calidad en los procesos
de desarrollo - Seguridad y Verificabilidad, estas dos
últimas que se determinan con el sistema en
uso.
Usabilidad. Si bien es cierto que la
confiabilidad es un factor muy importante en la calidad del
software también lo es el hecho de que es necesario
considerar otros factores como los que se mencionan en esta
sección puesto que de nada sirve un software que
funcione correcta y confiablemente si el usuario prefiere no
utilizarlo.
- Exactitud de los procesos
- Claridad y exactitud de la
documentación - Completitud
- Eficiencia y verificabilidad del
software - Claridad y amigabilidad de la interfaz
Mantenibilidad. Este aspecto de
calidad involucra los
elementos que simplifican la labor de prevención,
corrección o ampliación del código del programa.
Retomar un código escrito meses antes es un trabajo
dispendioso y agobiante, en especial cuando las aplicaciones no
cuentan con la característica a la cual aquí se
hace referencia. Se pueden considerar como atributos de este
aspecto :
- Exactitud y claridad en la
documentación - Modularidad acoplamiento
- Facilidad de lectura
- Simplicidad
Portabilidad. Es la capacidad que posee un
sistema de
información que le permite funcionar en
diferentes plataformas ya sean hardware o de
software.
A continuación se describen cada uno de los
aspectos de calidad
mencionados:
Calidad en los procesos de
desarrollo. Se resume en la frase "bien planeado y
cuidadosamente ejecutado". Este aspecto asegura la
confiabilidad, puesto que el plan que se
realice para desarrollar el sistema, debe incluir pruebas bien
seleccionadas que evalúen la confiabilidad del programa en
cualquier situación.
Claridad y amigabilidad de la interfaz. De
igual forma la interfaz debe ser clara y agradable al usuario,
las interfaces complejas son causa de la no utilización
de los sistemas de
información.
Claridad y exactitud de la
documentación. Hay que anotar que toda
aplicación requiere de una documentación suficientemente clara con
el fin de que cualquier persona con
conocimientos básicos en computación pueda aprender la forma de
operación sin que requiera la asesoría de los
desarrolladores o conocedores de la herramienta, a menos que se
trate de eventualidades donde realmente sea necesario consultar
al proveedor.
Completitud o adecuación. Se refiere a
que los resultados de operaciones sean acordes al comportamiento del mundo real desde todos los
estados y condiciones permitidos por la aplicación, es
decir, el programa debe reflejar la realidad. Un programa es
inconsistente si presenta respuestas erróneas en algunos
casos. Una mala especificación de rangos en un dominio sobre
los cuales realizan diferentes operaciones matemáticas puede llevar a que algunos
cálculos se realicen dentro de límites
inapropiados, obteniéndose resultados erróneos.
Otro caso de inconsistencia se presenta cuando ocurren eventos que
paran abruptamente la ejecución del programa,
sólo un sistema de calidad podrá conservar datos
consistentes después de una falla.
Eficiencia y verificabilidad del software. Otro
aspecto que no debe pasar por alto es el de la verificablidad,
puesto que es imprescindible contar con los requerimientos, y
sobretodo en aquellos sistemas donde se obtengan resultados que
no sean visibles.
Exactitud de los procesos. Un programa no
será utilizado por un usuario si sus resultados no son
exactos. Tampoco se puede garantizar el uso de un programa que
no presta las utilidades que el usuario requiere, es decir, que
sea incompleto. Además, un programa ineficiente que no
cumpla con los requerimientos de tiempo, memoria o
flexibilidad no podrá satisfacer las expectativas de
quienes lo utilizan.
Robustez o solidez. Se refiere a la capacidad
del software de defenderse de las acciones
anormales que llevan al sistema a un estado no
deseado o por lo menos no previsto, causando un comportamiento inesperado, indeseado y
posiblemente erróneo. El software de hoy, debe estar en
capacidad de analizar los datos que recibe para hacer cumplir
requerimientos o condiciones del software y enfrentar de la
mejor manera los errores cometidos por un usuario al utilizar
la aplicación. Es importante resaltar, que la solidez no
siempre es generada por la digitación inapropiada del
usuario, sino también por un mal procesamiento o un mal
encadenamiento de procesos. El resultado de un proceso, aunque
sea correcto, puede estar fuera de los límites
permitidos en los parámetros del módulo que lo
recibe y si este módulo no controla los
parámetros que le entran caerá en un estado
inesperado.
Seguridad y auditabilidad. Son importantes,
puesto que un usuario no puede confiar en los datos de un
sistema que no le ayude a controlar el acceso de personas no
autorizadas o a detectar errores de operación en los que
se introducen y generan datos erróneos.
Simplicidad. Promueve la utilización de
estructuras
de fácil manipulación con el fin de evitar que el
programador se aleje del problema que desea resolver.
Además, se reduce la probabilidad de
cometer errores. Así que, no es aconsejable hacer uso de
estructuras
complejas a menos que se necesite cumplir con requerimientos de
vital importancia tales como tiempos máximos de proceso
u otros similares.
- Calidad de software. Se define la calidad de
software como la ausencia de errores de funcionamiento, la
adecuación a las necesidades del usuario, y el alcance
de un desempeño apropiado (tiempo, volumen,
espacio), además del cumplimiento de los
estándares. Los objetivos
que la calidad persigue son : La aceptación
(utilización real por parte del usuario) y la
Mantenibilidad (posibilidad y facilidad de corrección,
ajuste y modificación durante largo tiempo). Para
alcanzar estos objetivos,
es necesaria una actitud y
compromiso de todo el personal que se
encuentre en el desarrollo del proyecto, y en todas y cada una
de las etapas (en general, planeación, análisis, diseño, programación, pruebas,
mantenimiento) correspondientes al ciclo de
vida que se hubiese seleccionado para el proyecto. En forma
adicional durante el proceso de aplicación de las
metodologías se requiere tener en cuenta :
- Realización de Revisiones
Técnicas Formales
durante cada etapa. - Realización de pruebas y revisiones por
personas "externas" al proyecto. - Elaboración de la adecuada
documentación del software, y de los
cambios. - Verificación del cumplimiento de los
estándares de desarrollo - Medición permanente de la productividad
del proceso y de la calidad de los resultados. - Desarrollo y ajustes de modelos
estadísticos de calidad y productividad. - Control de la desviación de los promedios de
calidad y productividad.
Uno de los elementos que permite dar garantía
acerca de la calidad del software es la aplicación de
métricas, estas son medidas estadísticas aplicadas a un software
determinado, garantizando calidad así como lo afirma
Pressman: "La garantía de calidad del software, es una
"Actividad de protección" que se
aplica a lo largo de todo el proceso de ingeniería del
software"
Todos los elementos anteriormente enumerados indican
herramientas
que se deben tener en cuenta al momento de desarrollar un
software, agrupando en una definición estos elementos se
afirma que : Un software debe estar desarrollado "En
concordancia con los requisitos
funcionales y de rendimiento explícitamente
establecidos, con los estándares de desarrollo
explícitamente documentados y con las
características implícitas que se espera de todo
software" , si cumple los aspectos señalados se puede
afirmar que se posee un software de calidad. Teniendo en cuenta
esto, se puede afirmar
- Los requisitos del software son la base de las
medidas de la calidad. - Los estándares especificados definen un
conjunto de criterios de desarrollo que guían la forma
en que se aplica la ingeniería del software, Si no se
distinguen esos criterios no habrá calidad del
software. - Existe un conjunto de requisitos implícitos
que a menudo no se mencionan, si no se alcanzan estos
requerimientos podría la calidad quedar en entredicho.
Los requisitos son llamados por los usuarios finales llaman
elementos obvios, los cuales el diseñador no debe
dejar pasar sin explicación.
Para estar seguros de las
anteriores afirmaciones se tienen en cuenta factores que se
pueden medir estos son llamados factores de calidad. Los
factores de calidad se agrupan en dos bloque así
:
- Factores que pueden ser medidos directamente
(errores, líneas, tiempo, …) - Factores que sólo pueden ser medidos
indirectamente (facilidad de uso, mantenimiento, …)
Otro autor que contribuye con el aspecto de las
medidas en el software es McCall, él y sus colegas
proponen tres factores de calidad y sus partes así
:
Factor 1. Características operativas,
relacionadas con las operaciones del producto.
- Corrección
- Fiabilidad
- Eficiencia
- Integridad
- Facilidad de uso
Factor 2. Capacidad de soportar cambios,
relacionado con la revisión del producto.
- Facilidad de mantenimiento
- Flexibilidad
- Facilidad de prueba
Factor 3. Adaptabilidad, relacionado con la
transición del producto.
- Portabilidad
- Reusabilidad – Reutilizabilidad
- Interoperabilidad
McCall propone para las métricas asociadas al
software un nivel de evaluación entro cero (0) y diez (10)
como medidas. Además, aclara que las métricas y la
evaluación son procesos subjetivos. Los elementos que se
pueden tener en cuenta para la evaluación son :
- Autodocumentación – Que el
archivo
ejecutable entregue documentación
significativa. - Completitud – Se han implementado las
funciones
requeridas. - Concisión – Compacto en
líneas de código. - Consistencia – Uso de métodos
de diseño, técnicas
de documentación a través del
desarrollo. - Eficiencia en la ejecución –
Medida del tiempo de ejecución. - Estandarización de los datos –
Manejar tipos abstractos de datos (TAD) a través del
programa. - Exactitud –
Preciso en cálculos y control. - Facilidad de auditoria – Comprobar la
conformidad con los estándares. - Facilidad de expansión– Facilidad de
ampliar diseños arquitectónicos, de datos, o
procedimiento. - Facilidad de operación –
- Facilidad de traza – Realizar
ingeniería en reversa. Que tan fácil es
devolverme a los requerimientos. - Formación – Debe poseer un buen
sistema de ayudas para que los nuevos usuarios apliquen el
sistema. - Generalidad – Amplitud de
aplicación potencial de los componentes del programa. Es
decir, los módulos creados pueden ser útiles en
otras aplicaciones del mismo tipo, o aplicaciones que manejen
tipos de datos
semejantes. - Independencia del hardware – Que los
diseños sean independientes de la máquina o
máquinas que se tienen destinadas para el
software. A calidad. pero no a
implantación - Independencia del sistema software
– Hasta donde el programa es independiente de la
plataforma de desarrollo. - Instrumentación – En que grado el
programa muestra
funcionamiento e identifica errores, - Modularidad – División del
programa en componentes funcionales. Acoplamiento, cohesión. - Normalización de las
comunicaciones – Que tanto se usan
estándares, interfaces, protocolos,
entre otros elementos que pueden ser de
importancia. - Seguridad –
- Simplicidad – El sistema de
información debe ser fácil de
entender. - Tolerancia de errores– Que tanto se pierde al
ocurrir un daño grave. - Metodologías de desarrollo. Una
metodología de desarrollo de software permite producir
organizada y económicamente software de alta calidad,
siguiendo una serie de pasos donde se utilizan un conjunto de
técnicas, notación y normas de
documentación preestablecidas.
El análisis y diseño, como elementos
esenciales del proceso de desarrollo, obligan a tener especial
atención y por tal motivo se han ido
creando metodologías que sirven de base para tomar las
decisiones que afectarán el producto final. Con el
advenimiento de la disciplina
de la ingeniería del software se inicial el proceso de
desarrollo de metodologías las primeras de ellas fueron
las estructuradas, y en forma posterior aparecen las
metodologías orientadas a objetos, siendo estas
últimas las mas difundidas actualmente en el
medio.
Una metodología de desarrollo de software
presenta una forma de modelar el mundo real con el fin de
llevarlo al dominio del
computador,
a través del modelo se
puede obtener una visión global del sistema, para
facilitar la especificación de los requerimientos, las
restricciones del sistema, y de la solución del
problema.
Mostow sugiere que el propósito de
diseñar es construir un sistema que :
- Satisfaga una especificación funcional
dada. - Este de acuerdo con las limitaciones del mundo
real. - Encuentre los requerimientos implícitos o
explícitos sobre la ejecución y uso de
recursos. - Satisfaga las restricciones sobre el proceso de
desarrollo mismo, tales como tiempo, costo de las
herramientas disponibles para hacer el diseño, entre
otras.
La construcción de modelos en
ingeniería tienen gran aceptación por tomar los
conceptos de descomposición, abstracción y
jerarquía. Cada modelo en un diseño describe un
aspecto específico del sistema que esta en
consideración.
"Un método
de diseño de renombre está basado en fundamentos
teóricos sólidos y ofrece grados de libertad
para innovación artística"
Como elementos principales de los métodos
se han considerado : la notación (Es el lenguaje
para expresar las especificaciones del sistema) y el
proceso (Son los pasos generales para la construcción del sistema). Estos pasos
son complementados con procedimientos
específicos o técnicas que sirven para construir
modelos. Entre estas técnicas se pueden mencionar :
Modelo entidad-relación, diagramas de
flujos de datos, modelos objetos, diagramas de
actores, diagramas de transición, entre
otros.
Un tercer elemento que se relaciona con los anteriores
y día a día es más esencial agrupa a las
herramientas (CASE) o instrumentos que eliminan
el tedio de construir modelos. Gracias a ellos se obliga a
hacer uso de las reglas de los modelos y por ende los errores y
las inconsistencias pueden ser expuestos para que sean
eliminados por el diseñador.
El enfoque estructurado. Presentar las
características de las metodologías orientadas a
objetos.
El enfoque orientado a objetos. El paradigma
orientado a objetos se caracteriza por la solución de
problemas a
través del estudio y representación de los
objetos del mundo real y las interacciones entre
sí.
Yourdon representa la orientación a objetos en
la ecuación :
Orientado_Objeto = Clases y objetos + Herencia +
Comunicación con mensajes
cohesión
Coad y Yourdon consideran las siguientes razones para
hacer uso del enfoque orientado a objetos :
- Toda la información está basada en los
datos y estos conforman la parte más estable de un
sistema y por ende le dan estabilidad a la aplicación.
Las estructuras se especifican de forma que sean flexibles al
cambio,
esto implica que las modificaciones a los requerimientos no
afectan la estabilidad del sistema ya que no provocan
alteraciones traumáticas a menos que se trate de
cambios significativos. - Los resultados del
análisis,(modelo de
análisis RIP) diseño e
implementación son reutilizables. La
representación del mundo real a través del
Análisis Orientado a Objetos (AOO) lleva a una
modularidad formada por paquetes de clases y objetos. Estos a
su vez conforman subsistemas reutilizables en futuros
proyectos. Es de anotar que la Modularidad aquí llega
más allá de dividir un programa en funciones
como se hace en las metodologías
estructuradas. - Mejora el análisis y la interacción
expertos-dominio "Casos de
Uso" del problema. A través del enfoque
orientado a objetos se construye un modelo desde la
visión del experto que representa el problema en forma
más natural, haciendo prevalecer el pensamiento de los usuarios directos del
futuro sistema. - La manera como se agrupan los elementos del mundo
con sus operaciones como un todo, incrementa la consistencia
entre el modelo y el mundo real. - Representa explícitamente los elementos
comunes. AOO utiliza la herencia para
identificar y capitalizar los atributos y servicios
comunes. - Promociona la utilizabilidad usabilidad.
Otras razones del uso del enfoque orientado a objetos
son las siguientes :
- De acuerdo con la experiencia de algunos, se ha
notado que se produce menos código y por ende es
más fácil de mantener favoreciendo la
relación costo beneficio. - Muchas de las personas que no trabajan con
computador encuentran el enfoque orientado a
objetos muy natural.
- De acuerdo con la experiencia de algunos, se ha
- Ejercicio practico 1. Indicar que
características básicas de las métricas
apoyan a los aspectos de calidad de software. (Justificar)
Trabajo a ser desarrollado en grupos preferiblemente en clase
para que se desarrolle discusión abierta, cada grupo
tomará uno o varios aspectos dependiendo de la cantidad
de grupos. - Ejercicio practico 2. Con base en las
metodologías descritas, indicar como la
metodología en sus procesos y pasos apoya los factores
de calidad, justifique. Trabajo a ser desarrollado en grupos.
Al igual que el anterior los aspectos de calidad deben ser
entregados a los grupos de trabajo.
En los procesos de calidad de software uno de los
elementos que más puede inquietar a los diseñadores
es el adecuado manejo de los algoritmos y su eficiencia, para que
el resultado sea óptimo al momento de ser implementado,
para eliminar esta preocupación por parte del
diseñador aparece en la disciplina de
la ingeniería del software un tema que es el
análisis de algoritmos, en este tema aparecen elementos
como la complejidad computacional, verificación de
programas, entre otros.
Complejidad computacional – La complejidad
computacional estudia los costos de
cómputo necesarios para resolver un problema;
entendiéndose por costos los
recursos de espacio de almacenamiento y
de, principalmente, tiempo de cómputo. La complejidad
temporal tiene que ver con el tiempo que tarda un programa para
ejecutarse, la complejidad espacial estudia la cantidad de
almacenamiento
que es necesario para una operación. Al analizar la
complejidad de un algoritmo, el
tiempo está expresado en términos de pasos de
computación elementales (asignaciones, comparaciones,
operaciones matemáticas básicas, etc), por
ejemplo, una operación de asignación ocupa una
unidad de tiempo para ejecutarse, un ciclo ocupa el número
de iteraciones en que está definido, etc.
Para cualquier tiempo de ejecución que se desea
determinar siempre se asumirá el peor de los
casos.
Sea el siguiente ejemplo :
(1) suma = 0
(2) for (i=1; i<= n; i++)
(3) suma += i;
La instrucción (1) ocupa una unidad de
tiempo.
La instrucción (3) ocupa dos unidades de
tiempo, una para la suma y otra para la asignación, y es
ejecutada N veces, por lo que ocupa 2N unidades de
tiempo.
La instrucción (2) tiene involucrada una
asignación que utiliza una unidad de tiempo, N+1
comparaciones y N incrementos, por lo que ocupa 2N+2 unidades
de tiempo.
El tiempo total del algoritmo es
T(N) = 1+2N+2+2N, esto es : T(N) = 4N + 3
De otra forma se podría ver como la existencia
de tiempos para cada una de las posibles operaciones
individuales, así : Ta – Tiempo de
asignación, Tc – Tiempo de comparación, To
– Tiempo de operación, Ti – Tiempo de
incremento.
La instrucción (1) posee Ta
La instrucción (3) posee un Ta y un
To.
La instrucción (2) posee un Ta para i=1, Tc
para i<=n, Ti para i++
Con base en estas valoraciones los tiempos
serían así para el ciclo for las instrucciones
internas se hacen la cantidad de veces que indique el ciclo, la
instrucción interna tarda (Ta + To) el ciclo se realiza
n-veces, lo cual indica un tiempo de n(Ta+To), ahora el ciclo
realiza n veces el incremento de i++ es decir n(Ti) y las
comparaciones son n+1 ya que el ciclo debe llegar hasta n+1
para que el ciclo pueda terminar, es por ello que es (n+1)Tc, y
falta la asignación de i=1 es decir Ta, el tiempo total
del algoritmo es : T(n) = n(Ta + To) + n(Ti) + (n+1)Tc + Ta +
Ta, el total eliminando las agrupaciones es : n(Ta) + n(To) +
n(Ti) + n(Tc) + Tc + Ta + Ta, factorizando n(Ta + To + Ti + Tc)
+ Tc + Ta + Ta, se aplica que cada uno de los tipos de
operación tarda una unidad de tiempo, esta difiere en
cada computador, por ello se toma general para este caso lo
asumimos con valor 1, por
ello sería el total final n(4) + 3, es decir el
tiempo
T(n) = 4n + 3.
La pretensión de la segunda forma de
evaluación es que se determine cuanto tiempo se tarda en
cada uno de los tipos de operación, en caso de ser
necesario.
Orden de un algoritmo – La función
que define el tiempo de ejecución de un programa
proporciona información interesante para clasificar los
diferentes algoritmos que existen para resolver problemas. Con
esta función es
posible comparar el desempeño de diferentes algoritmos
desarrollados para un problema en particular.
Para simplificar el estudio de la complejidad, se han
adoptado ciertas convenciones en su notación, una de
ellas es el concepto de orden, que indica, de forma
simple, el grado de complejidad de un algoritmo sin considerar
por completo la función de tiempo.
Sea el siguiente algoritmo :
for (i=1; i<n; i++)
for (j=i+1; j<=n; j++)
if (vec[i] <= vec[j])
{
temp = vec[i];
vec[i] = vec[j];
vec[j] = temp;
}
El anterior algoritmo lo pueden reconocer como el
ordenamiento de burbuja, el cual posee una función de
tiempo de n(n-1)/2, la demostración de este valor se
deja como ejercicio para el lector, esto es igual a
(n2 – n)/2, y se dice que es de orden
n2 , o simplemente O(n2). Para determinar
el orden un algoritmo, a partir de su función de tiempo,
se eliminan todos los términos excepto el de mayor grado
y se eliminan todos los coeficientes del término
mayor.
Existen algunas reglas que son útiles para
determinar el orden de un algoritmo:
Regla 1 (Ciclos FOR) : El tiempo de
ejecución de un ciclo FOR es al menos el tiempo de
ejecución de las instrucciones dentro de él
multiplicado por el número de iteraciones.
Ejemplo : Para orden O(n).
for (i=1; i<=n; i++)
suma += i;
La función de tiempo para el algoritmo es T(N)
= 4N+2, ya que ciclo ocupa 2n+2 y la sumas 2n, por lo que tiene
un orden O(n).
Regla 2 (Ciclos FOR anidados) : Se analiza
desde dentro hacia fuera. El tiempo de una instrucción
dentro de un conjunto de ciclos anidados es igual al tiempo de
ejecución de las instrucciones internas multiplicado por
el producto del tamaño de los ciclos.
Ejemplo : Para orden O(n2)
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
suma += i*j;
Regla 3 (Condicional) : El tiempo de
ejecución nunca es mayor que el tiempo de
ejecución de la condicional más el mayor de los
tiempos de ejecución de las alternativas.
Ejemplo : Algoritmo es O(n2)
If (i==j)
for (i=1; i<=n; i++)
suma += i;
else
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
suma += i*j;
Debido a que el tiempo de ejecución de la
condición es de orden O(1) más el mayor tiempo de
ejecución de las alternativas : cuando se cumple la
condición es o(n) y cuando no se cumple es
O(n2), por lo cual el orden es O(1) + O(n) +
O(n2), pero, como ya se ha dicho, solo se toma el
mayor, quedando el orden del programa en
O(n2).
A los algoritmos de orden n se les llama de orden
lineal, los de n2 de orden cuadrado, etc.
A continuación una gráfica muestra la
características de orden de los algoritmos.
Se puede decir que un algoritmo tiene complejidad
polinomial, o se ejecuta en tiempo polinomial, si tiene
un orden O(nx). Estos algoritmos se dice que son
algoritmos eficientes y los problemas que se resuelven con
estos algoritmos se dice son problemas tratables.
Un algoritmo tiene complejidad exponencial si la
función de tiempo T(n) tiene un orden O(xn).
Los problemas que se resuelven usando algoritmos de tiempo
exponencial se conocen como problemas intratables y a los
algoritmos como algoritmos ineficientes.
Ejemplo : El problema de las Torres de Hanoi tiene
complejidad exponencial de orden 2n. El algoritmo es
el siguiente :
void Hanoi(int N, int A, int B, int C)
{
if (n==1)
MueveAnillo(A,B);
else{
Hanoi(n-1,A,C,B);
MueveAnillo(A,B);
Hanoi(n-1,C,B,A);
}
}
Debido a que el algoritmo es recursivo, el tiempo de
ejecución puede ser descrito por la función T(n)
= 2t(n-1) + constante, al aumentar el tamaño de la
entrada, el tiempo se duplica (factor de dos), por lo que se
puede deducir que el orden del algoritmo es
O(2n).
Matemáticas de los algoritmos. (Para el
caso de medición en el peor de los casos y para la
media)
Sea M(n) el valor medio del tiempo de ejecución
de todas las entradas de tamaño n. Para este caso se
define los siguientes elementos :
Dn – conjunto de entradas de tamaño
n.
T(i) – número de operaciones
básicas correspondientes a la entrada I <-
Di
P(n) – Tiempo de ejecución en el peor de los
casos
P(n) = Max(T(i), V I є Dn)
M(n) = Media del número de operaciones
básicas
En la practica casi siempre es más
difícil determinar el tiempo de ejecución
promedio que el del peor caso, pues si las p(i) no son iguales,
cosa que normalmente ocurre, el análisis se hace
intratable en matemáticas, y la noción de entrada
"promedio" puede carecer de un significado claro.
Para el caso de la búsqueda
secuencial.
i=1
mientras ((i=n) and (A[i] <> x)) haga
i = i + 1
fin mientras
En forma general P(n) es n si se toma como
operación la comparación de elementos del
arreglo.
Vector A.
I – Entrada iesima
|
|
|
| x |
|
|
|
|
1 n
Con base en la medida del valor medio, se
tiene
Sea q la probabilidad de
x estar en el vector, significando con la entrada I
– iesima que el elemento x ocupa la
posición iesima.
Los valores de
p(I) son iguales :
q (probabilidad de que el elemento este en la
lista) en (i) número de iteraciones realizadas
para encontrar (x).
(1-q) (probabilidad de que el elemento no este
en la lista) en (n) número de iteraciones
posibles en el vector. Este valor de determina por el principio
básico de la estadística de un valor máximo
(100%) corresponde a uno (1).
Es por ello que aparece la siguiente ecuación :
(1-q)*n + q*i, este valor me representa el 100% de efectividad,
en el proceso. Luego se aplican los elementos que componen la
ecuación de la media y se reemplazan
Factorizando
Asumiendo que q sea 1 el resultado es : M(n) =
(n+1)/2
Trabajo practico ( Ejercicio :
Medición de los tiempos de asignación,
operación, comparación e incremento)
Página siguiente |