LEI 2.1, 2013-14 Equipa Docente: Jorge Sousa Pinto (coordenador) Atendimento: 6a.fa. 11:0013:00 Maria Jo ao Frade Jos e Bernardo Barros Apoio na Web via Blackboard jsp@di.uminho.pt
mjf@di.uminho.pt jbb@di.uminho.pt
Programa Resumido
I. Introdu c ao ` a An alise de Correc c ao de Algoritmos II. An alise de Tempo de Execu c ao de Algoritmos III. Estruturas de Dados Fundamentais: quest oes de eci encia na pesquisa; IV. Algoritmos Fundamentais sobre Grafos V. Problemas NP-completos
Avalia c ao
Epoca normal: NF = .5 Teste1 + .5 Teste2 Nota m nima de 5 valores (em 20) em ambos os testes. Exame recurso sobre toda a mat eria Estrutura dos testes e exame: Parte A: 75% valores de compet encias m nimas Parte B: 25% valores de compet encias complementares Ao contr ario de edi c oes anteriores, a aprova c ao n ao implica qualquer nota m nima na parte A.
3
Bibliograa Recomendada
[1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Cliord Stein. Introduction to Algorithms. MIT Press, Cambridge, Mass., third edition, 2009. [2] Robert L. Kruse, Bruce P. Leung, and Clovis L. Tondo. Data Structures and Program Design in C. Prentice Hall, second edition, 1997. [3] Donald E. Knuth. The Art of Computer Programming : (1) Fundamental Algorithms, (2) Seminumerical Algorithms, (3) Sorting and Searching (4) Combinatorial Algorithms. AddisonWesley, 19972011.
O que e um algoritmo?
Um algoritmo e um procedimento computacional bem denido que aceita um valor (ou conjunto de valores) como input e produz um valor (ou conjunto de valores) como output. Deni c oes alternativas: uma sequ encia de passos computacionais que transformam um input num output. um m etodo para resolver um problema computacional bem denido; problema esse que dene a rela c ao I/O pretendida. Em geral diz-se que um determinado input constitui uma inst ancia do problema resolvido pelo algoritmo.
permitem comparar os algoritmos quanto ` a sua eci encia. A estrat egia que um algoritmo adopta para desempenhar uma determinada tarefa ou resolver um determinado problema e tamb em muito importante.
9
10
Correc c ao de um Algoritmo
Um algoritmo diz-se correcto se para todos os valores dos inputs (vari aveis de entrada) ele p ara com os valores correctos dos outputs (vari aveis de sa da). Neste caso diz-se que ele resolve o problema computacional em quest ao. Nem sempre a incorrec c ao e um motivo para a inutilidade de um algoritmo: Em certas aplica co es basta que um algoritmo funcione correctamente para alguns dos seus inputs. Em problemas muito dif ceis, poder a ser suciente obter solu c oes aproximadas para o problema. A an alise da correc c ao de um algoritmo pretende determinar se ele e correcto, e em que condi c oes. Esta an alise pode ser efectuada com um elevado grau de formalismo recorrendo a uma l ogica de programas, baseada em provas indutivas utilizando invariantes de ciclo. Pode tamb em ser conduzida de modo semi-formal.
11
An alise de Correc c ao
A demonstra c ao da correc c ao de um algoritmo cuja estrutura n ao apresente ciclos pode ser efectuada por simples inspec c ao. Exemplo: int soma(int a, int b) { int sum; sum = a+b; return sum; } No caso de algoritmos recursivos, a prova adv em da deni c ao da solu c ao. Exemplo: int factorial(int n) { int f; if (n<1) f = 1; else f = n*factorial(n-1); return f; }
12
{P } C {Q} P e uma pr e-condi c ao C e o programa cuja correc c ao se considera Q e uma p os-condi c ao O triplo {P } C {Q} e v alido quando todas as execu c oes de C partindo de estados iniciais que satisfa cam P , caso terminem, resultem num estado nal do programa que satisfaz Q. Utilizaremos um sistema formal conhecido como L ogica de Hoare para raciocinar sobre a correc c ao de programas.
14
{P } C1 {R}
{R} C2 {Q}
{P } C1; C2 {Q}
{P b} Ct {Q}
{P b} Cf {Q}
15
{P } C {Q} {P } C {Q}
se |= P P
{P } C {Q} {P } C {Q }
se |= Q Q
16
{x = x0 y = y0 } t = x; x = y; y = t; {y = x0 x = y0}
17
{x = x0 y = y0} |= x = x0 y = y0 x = x0 y = y0 {x = x0 y = y0} t = x; {t = x0 y = y0} x = y; { t = x 0 x = y0 } y = t; {y = x0 x = y0} Propagamos a p os-condi c ao para tr as, at e que atingimos a pr e-condi c ao. Neste ponto utilizamos uma regra de consequ encia para garantir que a pr e-condi c ao e mais forte do que a condi c ao propagada (neste caso e equivalente, mas n ao e sempre assim: a pr e-condi c ao podia ser por exemplo x = x0 y = y0 x > 0).
18
{x = x0 y = y0} sort2 {x y ((x = x0 y = y0) (y = x0 x = y0))} Considerando uma implementa c ao concreta de sort2: {x = x0 y = y0 } if (x > y ) { t = x; x = y ; y = t } else { } {x y ((x = x0 y = y0) (y = x0 x = y0))} Propagaremos agora a p os-condi c ao ao longo dos dois ramos do condicional, o que dar a origem a duas utiliza c oes da regra de consequ encia.
19
{I b} C {I } {I } while (b) C {I b} A utiliza c ao desta regra para provar a correc c ao de um triplo {P } while (b) C {Q} com uma pr e-condi c ao P e uma p os-condi c ao Q arbitr arias, d a origem ` as seguintes condi c oes de verica c ao: Preserva c ao do invariante: as CVs da prova de correc c ao de {I b} C {I } Inicializa c ao do invariante: |= P I (regra de consequ encia) Utilidade do invariante: |= I b Q (regra de consequ encia).
22
23
Utilidade
No nal da execu c ao do ciclo, i = b + 1. Como o invariante se mant em v alido ao longo de toda a execu c ao do ciclo, ent ao: se o valor k existe entre as posi c oes [a..b] do vector, ent ao f ter a o valor da u ltima posi c ao onde foi encontrado; caso contr ario, f ter a o valor -1.
24
Isto corresponde ` a prova de validade do triplo de Hoare {I b} C {I }. Exerc cio: Reescrever esta prova em estilo formal, come cando por escrever o invariante em linguagem matem atica.
25
26
// { I /\ i <= b } if (vector[i]==k) // VC3: I /\ i <= b /\ vector[i]==k -> I [i -> i+1][f -> i] // { I [i -> i+1][f -> i] } f = i else // VC4 : I /\ i <= b /\ ~(vector[i]==k) -> I [i -> i+1] // { I [i -> i+1] } {} // { I [i -> i+1] } i++; // { I }
29
31
34
|= I b v 0
A utiliza c ao desta regra para provar a correc c ao de um triplo [P ] while (b) C [Q] d a origem ` as seguintes condi c oes de verica c ao: Inicializa c ao do variante: |= I b v 0 Preserva c ao do invariante e decr escimo do variante: as CVs da prova de correc c ao de [I b v = v0] C [I v < v0] Inicializa c ao do invariante: |= P I (regra de consequ encia) Utilidade do invariante: |= I b Q (regra de consequ encia).
36
// { P } // VC1: P -> I [i -> a][f -> -1] // { I [i -> a][f -> -1] } f = -1; // { I [i -> a] } i = a; // { I } while (i<=b) { // VC0: I /\ i <= b -> b-i >= 0 // { I /\ i<=b} CORPO // { I } } // { I /\ ~(i<=b) } // VC2: I /\ ~(i<=b) -> Q // { Q }
37
38