Вы находитесь на странице: 1из 32

ndice

1.1 Conceptos previos 1.2 Punteros 1.3 Complejidad

Tema 1: Preliminares

Estructuras de Datos
Grado en Ingeniera de Computadores Universidad Rey Juan Carlos Jos Miguel Buenaposada Biencinto

Agradecimientos: a Ana Pradera y Juan Manuel Serrano por el planteamiento del curso, a Antonio Sanz y a algunos otros profesores del DCC por muchas (o algunas transparencias) segn el caso -.

URJC-ED-Introduccin

Qu debemos saber sobre Pascal?


Algn entorno de TurboPascal: Borland Turbo Pascal o bien Eclipse Gavab 2.0 (http://www.gavab.es/wiki/eclipsegavab/) Instrucciones de control Subprogramas Arrays Registros Ficheros

Ciclo de vida del software


Planificacin (estimacin de recursos, coste, tiempo y viabilidad) Anlisis: Qu se hace Diseo: Cmo se hace Codificacin: Se hace Pruebas: se prueba y se corrige Documentacin Uso y mantenimiento: se mejora y ampla

URJC-ED-Introduccin

URJC-ED-Introduccin

Disear la solucin antes de programar!


Fase de anlisis Fase de diseo

Normas de estilo
Evitar varias instrucciones en una misma lnea Tabular adecuadamente el anidamiento de sentencias. Evitar escribir:
IF precio>MAXIMO THEN WriteLn(Precio abusivo);

Problema
Atajo tentador

Algoritmo

Programa
Fase de implementacin

Dar nombres nemotcnicos a los identificadores que describan lo mejor posible su cometido o lo que representan (subprogramas y variables). Palabras reservadas: MAYUSCULAS
WHILE, FOR, RECORD,...
5
URJC-ED-Introduccin

URJC-ED-Introduccin

Normas de estilo (cont.)


Identificadores: descriptivos y minsculas
Palabras separadas, unidas por _ o utilizando primer carcter de la palabra sufija mayscula o ambos nombre_archivo, nombreArchivo, nombre_Archivo Constantes: MAYUSCULAS IVA, PI, NUMERO_E,... Procedimientos: Empezando por letra MAYUS. BusquedaBinaria, Apilar, PilaVacia,... Tipos: Empezando por Tipo o T TipoPila, TPila

Normas de estilo (cont.)


Mdulos y Ficheros:
Los nombres de programas y mdulos (unidades): Deben coincidir con los nombres de los ficheros que los contienen, y Deben empezar por MAYUSCULAS y resto minsculas

URJC-ED-Introduccin

URJC-ED-Introduccin

Normas de estilo (cont.)


Mdulos y Ficheros:
Deben contener una cabecera de identificacin como esta:

Normas de estilo (cont.)


Se recomienda emplear subprogramas para tareas bien identificadas (abstraccin procedimental). Emplear sentencias de repeticin (especialmente bucles FOR y WHILE) cuando sea posible. Evitar variables globales en subprogramas. Uso adecuado de funciones (devuelven un valor).

{************************************************************************************************* * * * Mdulo: Nombre * * Fichero: ( ) Programa ( ) Espec. TAD ( ) Impl. TAD ( ) Otros * * Autor(es): Nombre(s) * * Fecha: Fecha de actualizacin * * * * Descripcin: * * Breve descripcin del mdulo (prrafo corto) * * * *************************************************************************************************}

URJC-ED-Introduccin

URJC-ED-Introduccin

10

Conceptos aprendidos: Arrays


Un tipo de dato ARRAY se define en la seccin de declaracin de tipos TYPE

Conceptos aprendidos: Arrays (cont.)


Son estructuras de datos: De acceso directo: permiten almacenar y recuperar directamente los datos especificando su posicin dentro de la estructura. Homogneas: sus elementos son TODOS del MISMO TIPO. Estticas: su tamao se establece de forma FIJA cuando se declara variable de este tipo y no puede cambiar su tamao durante la ejecucin del programa.

TYPE Tipo1 TipoVector TipoMatriz TipoViviendas VAR var1: Tipo1;

= = = =

ARRAY ARRAY ARRAY ARRAY

[1..3] [1..3] [1..3, [1..3,

OF integer; OF real; 1..7] OF char; 1..3, A..E] OF boolean;

URJC-ED-Introduccin

11

URJC-ED-Introduccin

12

Conceptos aprendidos: Registros


Son estructuras de datos: Heterogneas: sus elementos pueden ser de DISTINTOS tipos. Estticas: su tamao se establece de forma FIJA cuando se declara variable de este tipo.
TYPE TNombreReg = idCampo1 : idCampo2 : ... idCampon : END; {Fin de RECORD idTipo1; idTipo2; idTipon TNombreReg}

Conceptos aprendidos: Registros (cont.)


Las funciones no pueden devolver un registro. Para acceder a un campo se usa el operador punto (.):
nombreVariableRegistro.nombreCampo

Tambin podemos acceder a los campos de un registro abriendo el registro con la sentencia WITH:
WITH nombreVariableRegistro DO Instruccin que con una expresin con nombreCampo

URJC-ED-Introduccin

13

URJC-ED-Introduccin

14

Conceptos aprendidos: Registros (cont.)


VAR profesor : TFicha; ... BEGIN writeln(profesor.nombre, profesor.edad, profesor.sueldo);

ndice
1.1 Conceptos previos 1.2 Punteros 1.3 Complejidad

Con sentencia WITH:


VAR profesor : TFicha; ... BEGIN WITH profesor DO writeln(nombre,edad,sueldo);

URJC-ED-Introduccin

15

URJC-ED-Introduccin

16

Memoria dinmica y punteros


Las estructuras de datos que conocemos (ARRAY, RECORD, integer, ) son de memoria esttica. Cuando no se sabe cunta memoria se va a necesitar para una estructura de datos en ejecucin, el programa pedir (y devolver) al sistema memoria dinmicamente (cuando sea necesario). La gestin de memoria dinmica en muchos lenguajes de programacin se realiza a travs de punteros.

Punteros
Una variable puntero sirve para albergar la direccin de memoria de otra variable (es decir, apunta a otra variable). Utilizando punteros podremos:
Pedir (reservar) nueva memoria dinmica al sistema. Liberar la memoria a la que se apunta. Acceder al valor del dato al que se apunta.

Pascal (como C, C++, y otros lenguajes) posee mecanismos para manejar memoria dinmica a travs de punteros.
17
URJC-ED-Introduccin

URJC-ED-Introduccin

18

Declaracin de enteros en Pascal


Recordemos como declarar una variable entera x:
VAR x: integer; { reserva memoria para un dato entero }

Declaracin de punteros en Pascal


Declaracin de un tipo y una variable p puntero a un entero:
TYPE TipoPuntero = ^integer; {tipo puntero a entero} VAR p: TipoPuntero; { reserva una celda de memoria que pueda contener la direccin de memoria de una variable entera }

El compilador de Pascal reservar 2 bytes en una posicin de memoria (podra ser un registro de la CPU) a la que llamar x.

El compilador de Pascal reservar N bytes (los necesarios para almacenar una direccin de memoria) en una posicin de memoria (podra ser un registro de la CPU) a la que llamar p.
URJC-ED-Introduccin

URJC-ED-Introduccin

19

20

El puntero a ninguna parte


NIL, es una constante de tipo puntero que indica que no apunta a ninguna celda de memoria.
TYPE TipoPuntero = ^integer; {tipo puntero a entero} VAR p: TipoPuntero; { no est inicializada, contiene un valor indeterminado que no es NIL } BEGIN p := NIL; { p no apunta a ninguna direccin }

Operaciones con punteros


Comparacin ( = y <> ) y asignacin ( := ) de punteros. Direccin de una variable v: @v
Se obtiene la direccin de memoria de una variable para asignarla a un puntero a ese tipo de variable.

Contenido de un puntero p: p^
Se accede a la variable apuntada por el puntero (a su contenido).
?

Grficamente:

distinto de dir. no asignada:


URJC-ED-Introduccin

21

URJC-ED-Introduccin

22

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3}

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3} Dir. Memoria: p 90 ? i 38 ?

URJC-ED-Introduccin

23

URJC-ED-Introduccin

24

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3} Dir. Memoria: p 90 ? i 38 ?

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3} Dir. Memoria: p 90 ? i 38 7

URJC-ED-Introduccin

25

URJC-ED-Introduccin

26

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3} Dir. Memoria: p 90 38 i 38 7

Ejemplo de operaciones con punteros


TYPE TipoPuntero = ^integer; VAR i: integer; p: TipoPuntero; BEGIN p := NIL; i := 7; p := @i; { Asignar la direccin de la variable i a p } p^ := 3; { Cambiar el contenido de lo apuntado por p } write(i); {escribe el valor 3} Dir. Memoria: p 90 38 i 38 3

Se dice que p apunta a i

Se dice que p apunta a i

URJC-ED-Introduccin

27

URJC-ED-Introduccin

28

Ejemplo de operacin ilegal


TYPE TipoPuntero = ^integer; p^ referencia la celda apuntada por p: VAR i: integer; p: TipoPuntero; BEGIN p := NIL; p := @i; { Asignar la direccin de la variable i a p } p^:= 3; { almacena el valor 3 en la celda de memoria apuntada por p } p := 3; { operacin ilegal: 3 es integer mientras que p es TipoPuntero y slo puede contener una direccin de memoria de una variable integer}

Operador contenido ^: ARRAY


Para un puntero a una variable ARRAY:
TYPE TipoArray = ARRAY [1..2] OF integer; TipoPuntero = ^TipoArray; VAR a: TipoArray; p: TipoPuntero; BEGIN p := @a; p^[1] := 5; p^[2] := 3;

URJC-ED-Introduccin

29

URJC-ED-Introduccin

30

Operador contenido ^: RECORD


Para un puntero a una variable registro:
TYPE TipoRegistro = RECORD dato: integer; indice: integer END; TipoPuntero = ^TipoRegistro; VAR r: TipoRegistro; p: TipoPuntero; BEGIN p := @r; p^.dato := 5;

Ejercicio 1
Qu valores escribe el programa?
PROGRAM Ejer1; VAR a, b: integer; pb: ^integer; BEGIN a := 10; pb := @a; b := pb^; writeln(a, , b); END.

URJC-ED-Introduccin

31

URJC-ED-Introduccin

32

Ejercicio 2
Qu valores escribe el programa?
PROGRAM Ejer2; VAR a: string; pa, pb: ^string; BEGIN a := Hola; pa := @a; pb := pa; writeln(a); pb^ := Adios; writeln(a); END.

Peticin de nueva memoria dinmica


new, procedimiento que reserva una nueva celda de memoria dinmica e inicializa la variable puntero tal que apunte a esta nueva celda.
TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p);

Si p es un puntero a integer reserva espacio para contener un integer. Si p es un puntero a char reserva espacio para albergar una valor de tipo char.
URJC-ED-Introduccin

33

URJC-ED-Introduccin

34

Semntica del procedimiento new


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p);

Semntica del procedimiento new


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p);

Memoria dinmica (del heap o montn) Dir. Memoria: p 90 ? Dir. Memoria: p 90 54 54 ?

Se dice que p apunta a un entero

URJC-ED-Introduccin

35

URJC-ED-Introduccin

36

Liberacin de memoria dinmica


dispose, procedimiento que libera el espacio de memoria indicado por la variable puntero que se pasa como parmetro.
TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p); dispose(p); { Una referencia posterior a p^ puede ser desastrosa, pues p apuntar a una celda que ya no est reservada. Conviene asignarle NIL } p = NIL;
URJC-ED-Introduccin

Semntica del procedimiento dispose


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p); dispose(p); p := NIL;

Dir. Memoria: p

90 ?

37

URJC-ED-Introduccin

38

Semntica del procedimiento dispose


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p); dispose(p); p := NIL; Memoria dinmica (del heap o montn) Dir. Memoria: p 90 54 54 ?

Semntica del procedimiento dispose


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p); dispose(p); p := NIL; Memoria dinmica (del heap o montn) marcada como libre

Dir. Memoria: p

90 54

54 ?

Se dice que p apunta a un entero

Se dice que p apunta a un entero

URJC-ED-Introduccin

39

URJC-ED-Introduccin

40

Semntica del procedimiento dispose


TYPE TipoPuntero = ^integer; VAR p: TipoPuntero; BEGIN new(p); dispose(p); p := NIL;

Al trabajar con punteros hay que


Declarar una variable de tipo puntero. Si es necesario reservar memoria en tiempo de ejecucin llamar a new. Despus de llamar a new el valor del contenido del puntero es indefinido (es necesario asignarle un valor). Variable_puntero es diferente de: Variable_puntero^ Es necesario liberar el espacio de memoria (dispose) cuando no se vaya a utilizar ms el dato apuntado.

Dir. Memoria: p

90

URJC-ED-Introduccin

41

URJC-ED-Introduccin

42

Ejercicio 3
Qu hace el programa?
PROGRAM Ejer3; VAR pa, pb: ^string; BEGIN new(pa); pa^ := Hola; pb := pa; writeln(pa^); pb^ := Adios; writeln(pa^); dispose(pb); END.

Perdida de memoria (memory leak)


La memoria disponible en el heap es limitada y cada vez que se llama a new una parte de esa memoria se marca como ocupada. Cada vez que se llama a dispose, la memoria ocupada se marca como libre.

Cuando se pide memoria con new(p) y se asigna otra direccin a p antes de hacer un dispose(p) se produce una prdida de memoria (la memoria apuntada por p queda ocupada e inaccesible).
URJC-ED-Introduccin

43

URJC-ED-Introduccin

44

Error de acceso
Cada vez que se llama a dispose(p), la memoria ocupada se marca como libre pero p mantiene la direccin anterior al dispose.

Ejercicio 4
Qu hace el programa?
PROGRAM Ejer4; VAR pa, pb: ^string; BEGIN new(pa); pa^ := Hola; new(pb); pb := pa; writeln(pa^); pb^ := Adios; writeln(pa^); dispose(pb); dispose(pa); END.
45
URJC-ED-Introduccin

Inmediantamente despus de dispose(p)un acceso al contenido de p, p^, producir un error de ejecucin.

URJC-ED-Introduccin

46

Punteros en llamadas a subprogramas


Pueden ser parmetros por valor y por referencia de los subprogramas:
FUNCTION F1 (VAR p1: ^integer; p2: ^integer): integer; PROCEDURE F2 (VAR p1: ^integer; p2: ^integer);

Punteros en llamadas a subprogramas (cont.)


El paso de punteros por valor equivale al paso por referencia de la variable que apuntan.
El subprograma recibe una copia del puntero y apunta a la misma informacin que el original, Un cambio en esa informacin es un cambio en la apuntada por el puntero original.
PROCEDURE Ej3 (p1: ^integer); BEGIN END; VAR p: ^integer; i: integer; BEGIN i := 2; p := @i; Ej3(p); Dir. Memoria: p 129 23 i 23 2

Se pueden devolver como resultado de una funcin:


FUNCTION F2 (a: integer): ^integer; VAR p: ^integer; BEGIN p := F2(4);
URJC-ED-Introduccin

p1 es copia de p p1 23

47

URJC-ED-Introduccin

48

Ejercicio 5
Qu valores escribe el programa?
PROGRAM Ejer5; TYPE TPuntEnt = ^integer; PROCEDURE X( x: TPuntEnt; y: integer; VAR z: integer ); VAR a, b, c: integer; BEGIN { Ejer5 } a := 2; b := 3; c := 4; X(@a, b, c); writeln(a, ,b, , c); END. { Ejer 5 }

ndice
1.1 Conceptos previos 1.2 Punteros 1.3 Complejidad

BEGIN x^ := x^ * x^; y := y * y; z := z * z; END;

URJC-ED-Introduccin

49

URJC-ED-Introduccin

50

Definicin de la complejidad
La complejidad o eficiencia de un algoritmo se define como el orden de magnitud de los recursos informticos que requiere el algoritmo para ser ejecutado.

Motivacin en Estructuras de Datos


Una estructura de datos:
Una especificacin nica (lo veremos). Mltiples posibles implementaciones (lo veremos)

El estudio de la complejidad de los algoritmos permite evaluar su coste, y as:


Comparar algoritmos entre s. Averiguar si un algoritmo es factible.

Cmo elegir entre las posibles implementaciones? Evaluando su complejidad!

URJC-ED-Introduccin

51

URJC-ED-Introduccin

52

Aspectos que intervienen en el clculo de complejidades


Cules son los recursos informticos que hay que estimar. En qu casos (para qu tipo de entradas) hay que estimar la complejidad. Qu significa calcular el orden de magnitud. Qu reglas prcticas existen para calcular complejidades.

Recursos informticos
Los recursos informticos a evaluar son el tiempo (de ejecucin) y/o el espacio (de memoria) requeridos por los algoritmos. Ambos dependen del tamao de la entrada. Se trata de calcular las funciones TA y EA:
TA(n) = tiempo requerido para la ejecucin del algoritmo A con una entrada de tamao n. EA(n) = espacio de memoria requerido para la ejecucin del algoritmo A con una entrada de tamao n.

URJC-ED-Introduccin

53

URJC-ED-Introduccin

54

Cmo estimar los recursos?


Mtodo emprico:
Programar el algoritmo y ejecutarlo en un ordenador. Inconveninente: el resultado depende del programador, el lenguaje elegido y la CPU.

Cmo estimar los recursos (tiempo)?


TA(n) = nmero de operaciones bsicas que realiza el algoritmo A con una entrada de tamao n

Mtodo terico:
Calcular el nmero de operaciones bsicas que realiza el algoritmo. Ventajas: el resultado no depende ni del programador, ni del lenguaje, ni de la CPU.

Una operacin bsica es aquella cuyo tiempo de ejecucin se puede acotar superiormente por una constante, independientemente del tamao de la entrada, la CPU, el lenguaje de programacin, el compilador, etc.

URJC-ED-Introduccin

55

URJC-ED-Introduccin

56

Casos para el estudio de la complejidad


Las funciones TA y EA no slo dependen del tamao de la entrada, sino tambin de su contenido: no se tarda lo mismo en ordenar 10 nmeros ya ordenados que en ordenar 10 nmeros totalmente desordenados ! Habr diferentes tipos de entradas unas ms difciles y otras ms fciles para un algoritmo determinado.

Casos para el estudio de la complejidad


El mejor caso, caso extremo en el que el nmero de Una estructura de datos: operaciones a ejecutar (o el espacio requerido) es el menor posible

fin := FALSO; k := 1; MIENTRAS (k<=N) Y (NO fin) HACER SI (V[k] == buscado) fin := true; k := k + 1;

Cmo es el array V (de tamao N) que produce el menor nmero de iteraciones?

URJC-ED-Introduccin

57

URJC-ED-Introduccin

58

Casos para el estudio de la complejidad


El caso medio o caso probabilstico, que representa una situacin intermedia (su evaluacin suele requerir tcnicas estadsticas).

Casos para el estudio de la complejidad


El peor caso, caso extremo en el que el nmero de operaciones a ejecutar (o el espacio requerido) es el mayor posible

fin := FALSO; k := 1; MIENTRAS (k<=N) Y (NO fin) HACER SI (V[k] == buscado) fin := true; k := k + 1;

Nmero promedio de iteraciones suponiendo igual probabilidad de encontrar buscado en cualquier posicin de V (de tamao N)?
59

fin := FALSO; k := 1; MIENTRAS (k<=N) Y (NO fin) HACER SI (V[k] == buscado) fin := true; k := k + 1;

Cmo es el array V (de tamao N) que produce el mayor nmero de iteraciones?

URJC-ED-Introduccin

URJC-ED-Introduccin

60

Casos para el estudio de la complejidad


El peor caso, caso extremo en el que el nmero de operaciones a ejecutar (o el espacio requerido) es el mayor posible

Medidas asintticas de complejidad


Si hay que ordenar un conjunto de 5 elementos, la eficiencia del algoritmo no importa demasiado (en cualquier caso el tiempo de ejecucin ser pequeo).

El clculo en el peor caso asegura que los recursos reales consumidos, sea cual sea el contenido de la entrada, nunca rebasarn el valor calculado!

Para analizar las funciones TA y EA bastar con estudiar su comportamiento asinttico (cmo se comportan cuando el tamao de la entrada, n, es grande).

URJC-ED-Introduccin

61

URJC-ED-Introduccin

62

Medidas asintticas de complejidad


Existen varias medidas para estudiar el comportamiento asinttico de una funcin:
Notacin O grande: O(f(n)) (cota superior: la ms usada) Notacin Omega: (f(n)) (cota inferior) Notacin Theta: (f(n)) (cota media)

Notacin asinttica O()


Dada una funcin f, queremos estudiar aquellas funciones g que a lo sumo crecen tan deprisa como f. Al conjunto de tales funciones se le llama cota superior de f y lo denominamos O(f).

URJC-ED-Introduccin

63

URJC-ED-Introduccin

64

Definicin notacin asinttica O()


Se dice que f es del orden de g, f(n) O(g(n)), si y slo si existen dos constantes positivas C y k tales que f(n) Cg(n) para todo n k.

Algunas propiedades tiles


O(logb n) = O(logc n) g(n) = amnm + am-1nm-1 + ... + a1n + a0 O(nm) si am 0 g(n) =

c = cn O(n)
i=1
n i =1
n

g(n) = i = g(n) =

(primero + ltimo)n trm (1 + n)n = O(n 2 ) 2 2


= n(n + 1)(2n + 1) O(n 3 ) 6

i
i =1

URJC-ED-Introduccin

65

URJC-ED-Introduccin

66

Conjuntos O(f) ms importantes y su ordenacin


complejidad constante O(1) O(log n) complejidad logartmica complejidad lineal O(n)

Conjuntos O(f) ms importantes y su ordenacin (cont.)

O(np) O(2n) O(n!)

complejidad polinmica (p=2: cuadrtica, p=3: cbica) complejidad exponencial complejidad factorial

O(1) O(log n) O(n) O(n log n) O(np) O(2n) O(n!)

URJC-ED-Introduccin

67

URJC-ED-Introduccin

68

El tamao de la entrada importa


Es mejor un algoritmo de O(n) que otro de O(n2)? Depende del tamao de las entradas, n, que se espera procesar.

En resumen
Para calcular la complejidad de un algoritmo A:
Estudiar el comportamiento asinttico de las funciones TA /EA (dependientes del tamao n de la entrada al algoritmo) en el peor caso o en un caso medio. Encontrar una funcin f tal que en el peor caso/caso medio se tenga TA /EAO(f ).

Algoritmo 1: T1(n) = 5n2 Algoritmo 2: T2(n) = 400n 5n2/400n = n/80

entradas n>80? entradas n=80? entradas n<80?

Los conjuntos O(f ) proporcionan cotas superiores. Se tratar de encontrar la menor de todas las funciones f tal que TA /EA O(f ).
69
URJC-ED-Introduccin

URJC-ED-Introduccin

70

Reglas prcticas para el clculo de la complejidad


Todo algoritmo est compuesto por una secuencia de instrucciones. Existen unas reglas prcticas para calcular el coste de cada uno de los posibles tipos de instrucciones. La complejidad de un algoritmo se basa en el coste de las instrucciones que lo componen pero el clculo depende de si el algoritmo es o no recursivo. Las reglas que se dan a continuacin permiten calcular la complejidad en el peor caso de los distintos tipos de instrucciones.
URJC-ED-Introduccin

Regla 1: Instrucciones elementales


Se llama instruccin elemental a las operaciones de entrada/salida, asignaciones y expresiones aritmticas en las que no est involucrada ninguna variable que dependa del tamao de la entrada del algoritmo..

[I instruccin

elemental] TI O(1)

71

URJC-ED-Introduccin

72

Regla 2: Secuencias de instrucciones

Regla 3: Instrucciones de seleccin


I SI B ENTONCES I1 SI TB O( f B ) TI1 O( f1 ) TI 2 O( f 2 ) NO I 2 T O(mx( f , f , f )) I B 1 2

I I1 ; I 2 TI1 O( f1 ) TI O(mx( f1 , f 2 )) TI 2 O( f 2 )

I CASO E EN caso 1: I1 ... caso k : I k TE O( f E ) TI O(mx( f E , f1 ,..., f k )) TIi O( fi ), i {1,...,k}

URJC-ED-Introduccin

73

URJC-ED-Introduccin

74

Regla 4: Instrucciones de repeticin


I MIENTRAS B HACER J f iter f nm . iteracione s ( peor caso ) T O ( fi ) I iter i =1 TB ; J O ( f i ), en la iteracin i

Ejemplos
PARA i DESDE 1 HASTA n HACER x := x + 1 PARA i DESDE 1 HASTA n HACER PARA j DESDE 1 HASTA n HACER x := x + 1 PARA i DESDE 1 HASTA n HACER PARA j DESDE 1 HASTA i HACER x := x + 1 i := 1 MIENTRAS i <= n HACER x := x + 1 i := i + 2
75
URJC-ED-Introduccin

{1}

{2}

La complejidad de un bucle

{3}

PARA i DESDE a1 HASTA a2 HACER J


se calcula igual que la de un bucle MIENTRAS salvo que en el caso PARA el coste de la condicin B se puede ignorar puesto que es siempre constante.

{4}

URJC-ED-Introduccin

76

Ejemplos (cont.)
x := 1 MIENTRAS x <= n HACER x := x*2 PARA i DESDE 1 HASTA n-1 HACER PARA j DESDE i+1 HASTA n HACER x := x + 1 {5}

Regla 5: Llamadas a subprogramas


La complejidad de la instruccin que llama al subprograma es equivalente a la complejidad que resulta de ejecutar el subprograma

{6}

[I llamada

a un subprogram a

P ] TI ( n) = Tp (n)

La complejidad depender de si el programa es o no recursivo.

URJC-ED-Introduccin

77

URJC-ED-Introduccin

78

Regla 5.1: Subprogramas no recursivos


Su complejidad es el mximo de las complejidades de las instrucciones que lo componen (la complejidad de cada una de estas instrucciones se calcula aplicando las reglas anteriores 1 a 4 -).

Regla 5.2: Subprogramas recursivos


Para calcular la complejidad de un algoritmo recursivo es necesario realizar dos pasos: 1. Plantear la ecuacin recurrente asociada con el tiempo de ejecucin, T(n), del subprograma. 2. Resolver la ecuacin recurrente anterior (encontrar una expresin no recursiva para el valor de T(n)). :

URJC-ED-Introduccin

79

URJC-ED-Introduccin

80

Paso 1: plantear la ecuacin recurrente


SUBPROGRAMA P( n ); { n = tamao entrada } SI es_caso_sencillo(n) ENTONCES instrucciones_caso_sencillo; { No recursivas } SI NO { Caso recursivo } P(reduccin(n)); P(reduccin(n)); { a llamadas recursivas a P } instrucciones_caso_resursivo; { No recursivas }

Paso 1: plantear la ecuacin recurrente


De la estructura general anterior podemos obtener la ecuacin recurrente asociada a T(n):

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


Donde:
f(n): coste de las instrucciones_caso_sencillo a: nmero de llamadas recursivas que se realizan g(n): coste de las instrucciones_caso_recursivo

Si a=1 recursividad lineal, si a>1 recursividad mltiple.

URJC-ED-Introduccin

81

URJC-ED-Introduccin

82

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1);

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT ( reduccin (n)) + g (n) e.o.c


URJC-ED-Introduccin

83

URJC-ED-Introduccin

84

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<1 instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT ( reduccin (n)) + g (n) e.o.c


URJC-ED-Introduccin

f ( n) si n < 1 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


85
URJC-ED-Introduccin

86

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<1 instrucciones_caso_sencillo DEVOLVER 1, con coste O(1) n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<1 instrucciones_caso_sencillo DEVOLVER 1, con coste O(1) n llamadas recursivas 1 reduccin(n) instrucciones_caso_recursivo

1 si n < 1 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 1 T (n)= 1T ( reduccin ( n)) + g ( n) e.o.c


87
URJC-ED-Introduccin

88

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<1 instrucciones_caso_sencillo DEVOLVER 1, con coste O(1) n llamadas recursivas 1 reduccin(n) n-1 instrucciones_caso_recursivo

Ejemplo 1
FUNCIN Ejemplo1(num:Natural) DEVUELVE Natural SI num < 1 ENTONCES DEV 1 SI NO DEV num * Ejemplo1(num-1); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<1 instrucciones_caso_sencillo DEVOLVER 1, con coste O(1) n llamadas recursivas 1 reduccin(n) n-1 instrucciones_caso_recursivo multiplicacin, con coste O(1)

1 si n < 1 T (n)= 1T (n 1) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 1 T (n)= 1T ( n 1) + 1 e.o.c


89
URJC-ED-Introduccin

90

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1);

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

91

URJC-ED-Introduccin

92

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) n<2 (n=0 n=1) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

f ( n) si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


93
URJC-ED-Introduccin

94

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) n<2 (n=0 n=1) instrucciones_caso_sencillo multiplicacin y retorno valor, O(1) n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) n<2 (n=0 n=1) instrucciones_caso_sencillo multiplicacin y retorno valor, O(1) n llamadas recursivas 2 reduccin(n) instrucciones_caso_recursivo

1 si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= 2T ( reduccin ( n)) + g ( n) e.o.c


95
URJC-ED-Introduccin

96

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) n<2 (n=0 n=1) instrucciones_caso_sencillo multiplicacin y retorno valor, O(1) n llamadas recursivas 2 reduccin(n) n-2 instrucciones_caso_recursivo

Ejemplo 2
FUNCIN Ejemplo2(num1, num2: Natural) DEVUELVE Natural SI num = 0 ENTONCES DEV num2; SI NO SI num1 = 1 ENTONCES DEV num2*num2; SI NO PARA i DESDE 1 HASTA num1 HACER num2 := num2 + i; DEV Ejemplo2(num1-2,num2)*Ejemplo2(num1-2,num2+num1); Tamao de la entrada num1 es_caso_sencillo(n) n<2 (n=0 n=1) instrucciones_caso_sencillo multiplicacin y retorno valor, O(1) n llamadas recursivas 2 reduccin(n) n-2 instrucciones_caso_recursivo bucle O(n) y resto O(1) O(n)

1 si n < 2 T (n)= 2T (n 2) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= 2T (n 2) + n e.o.c


97
URJC-ED-Introduccin

98

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num;

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

99

URJC-ED-Introduccin

100

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

f ( n) si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


101
URJC-ED-Introduccin

102

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) instrucciones_caso_recursivo

1 si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= 1T (reduccin ( n)) + g ( n) e.o.c


103
URJC-ED-Introduccin

104

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) n/2 instrucciones_caso_recursivo

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) n/2 instrucciones_caso_recursivo multiplicacin, suma, devolucin, O(1)

1 si n < 2 T (n)= 1T ( n / 2) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= 1T ( n / 2) + 1 e.o.c


105
URJC-ED-Introduccin

106

Ejemplo 3
FUNCIN Ejemplo3(num:Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV num SI NO DEV 5 * Ejemplo3(num/2) + num; Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) n/2 instrucciones_caso_recursivo multiplicacin, suma, devolucin, O(1)

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x);

1 si n < 2 T (n)= 1T ( n / 2) + 1 e.o.c


URJC-ED-Introduccin

107

URJC-ED-Introduccin

108

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

f ( n) si es _ caso _ sencillo ( n) T (n)= aT (reduccin ( n)) + g ( n) e.o.c


109
URJC-ED-Introduccin

110

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas reduccin(n) instrucciones_caso_recursivo

f ( n) si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= aT (reduccin ( n)) + g ( n) e.o.c


111
URJC-ED-Introduccin

112

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) instrucciones_caso_recursivo

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) n/2 instrucciones_caso_recursivo

1 si n < 2 T (n)= 1T (reduccin ( n)) + g ( n) e.o.c


URJC-ED-Introduccin

1 si n < 2 T (n)= 1T ( n / 2) + g ( n) e.o.c


113
URJC-ED-Introduccin

114

Ejemplo 4
FUNCIN Ejemplo4(num, x: Natural) DEVUELVE Natural SI num < 2 ENTONCES DEV x SI NO PARA i DESDE 1 HASTA num HACER x := x+1; DEV Ejemplo4(num/2,x); Tamao de la entrada parmetro entrada num es_caso_sencillo(n) n<2 instrucciones_caso_sencillo DEVOLVER num, O(1) n llamadas recursivas 1 reduccin(n) n/2 instrucciones_caso_recursivo bucle O(n) y resto O(1) O(n)

Paso 2: Resolver la ecuacin recurrente


En general, no es fcil. Existen algunos tipos de ecuaciones recurrentes para los que s se conoce su solucin: 1. Ecuaciones recurrentes obtenidas mediante substraccin:
Aquellas en las que reduccin(n) = n-b.

2. Ecuaciones recurrentes obtenidas mediante divisin:


Aquellas en las que reduccin(n) = n/b.

1 si n < 2 T (n)= 1T (n / 2) + n e.o.c


URJC-ED-Introduccin

115

URJC-ED-Introduccin

116

Ecuaciones recurrentes obtenidas mediante substraccin


Son de la forma:

Ecuaciones recurrentes obtenidas mediante substraccin


Solucin mediante frmula cerrada:

cn k si 0 n < b T (n)= k aT ( n b) + cn si n b
Donde:
a = nmero de llamadas recursivas que se realizan n - b = tamao de los sub-problemas generados cnk = coste de las instrucciones que no son llamadas recursivas

O ( n k +1 ) si a = 1 T (n) n div b ) si a > 1 O (a


Slo es aplicable para cuando f(n) y g(n) son potencias de n.

URJC-ED-Introduccin

117

URJC-ED-Introduccin

118

Ejemplo 1: sol. expansin recurrencias


1 si n < 1 T (n)= 1T ( n 1) + 1 e.o.c

Ejemplo 1: sol. frmula cerrada


1 si n < 1 T (n)= 1T ( n 1) + 1 e.o.c

URJC-ED-Introduccin

119

URJC-ED-Introduccin

120

Ejemplo 2: sol. expansin recurrencias


1 si n < 2 T (n)= 2T ( n 2) + n e.o.c

Ejemplo 2: sol. frmula cerrada


1 si n < 2 T (n)= 2T ( n 2) + n e.o.c

URJC-ED-Introduccin

121

URJC-ED-Introduccin

122

Ecuaciones recurrentes obtenidas mediante divisin


Son de la forma:

Ecuaciones recurrentes obtenidas mediante divisin


Solucin mediante frmula cerrada:

cn k si 1 n < b T (n)= k aT (n / b) + cn si n b
Donde:
a = nmero de llamadas recursivas que se realizan n /b = tamao de los sub-problemas generados cnk = coste de las instrucciones que no son llamadas recursivas

O ( n k ) si a < b k T (n) O ( n k log n) si a = b k O ( n logb a ) si a > b k


Slo es aplicable para cuando f(n) y g(n) son potencias de n.

URJC-ED-Introduccin

123

URJC-ED-Introduccin

124

Ejemplo 3: sol. expansin recurrencias


1 si n < 2 T (n)= 1T ( n / 2) + 1 e.o.c

Ejemplo 3: sol. frmula cerrada


1 si n < 2 T (n)= 1T ( n / 2) + 1 e.o.c

URJC-ED-Introduccin

125

URJC-ED-Introduccin

126

Ejemplo 4: sol. expansin recurrencias


1 si n < 2 T (n)= 1T (n / 2) + n e.o.c

Ejemplo 4: sol. frmula cerrada


1 si n < 2 T (n)= 1T (n / 2) + n e.o.c

URJC-ED-Introduccin

127

URJC-ED-Introduccin

128

Вам также может понравиться