Vous êtes sur la page 1sur 118

Algoritmos: correo e ecincia

Mario Leston
19 de maro de 2014
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 1 / 29
Tpicos abordados nesta aula
1
Livros teis
2
Invariantes
3
Busca linear
4
Mximo de um vetor
5
Segmento estritamente crescente de comprimento mximo
6
Busca binria
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 2 / 29
Livros teis
Knuth, The art of computer programming - Vols 1 and 3.
Cormen, Leiserson, Rivest, Stein, Introduction to algorithms. Third
edition. H uma traduo da terceira edio de tima qualidade.
Kleinberg, Tardos, Algorithm design.
Mehlhorn, Sanders, Algorithms and data structures.
Sedgewick, Algorithms in C - Part I-V.
Feolo, Algoritmos em linguagem C.
Goodrich, Tamassia, Data structures and algorithms in Java.
Weiss, Data structures and algorithm analysis in Java.
etc...
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 3 / 29
Invariantes
Invariantes
Suponha dada uma urna no-vazia que contm b bolas brancas e p bolas
pretas, e na qual de forma no-determinstica uma das operaes abaixo, se
possvel, selecionada e executada:
se duas bolas brancas so removidas da urna, ento devolva uma bola
branca para a urna;
se uma bola branca e uma preta so removidas, ento devolva a bola
preta para a urna; e
se duas bolas pretas so removidas, ento devolva uma bola branca
para a urna.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 4 / 29
Invariantes
Invariantes
Suponha dada uma urna no-vazia que contm b bolas brancas e p bolas
pretas, e na qual de forma no-determinstica uma das operaes abaixo, se
possvel, selecionada e executada:
se duas bolas brancas so removidas da urna, ento devolva uma bola
branca para a urna;
se uma bola branca e uma preta so removidas, ento devolva a bola
preta para a urna; e
se duas bolas pretas so removidas, ento devolva uma bola branca
para a urna.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 4 / 29
Invariantes
Invariantes
Suponha dada uma urna no-vazia que contm b bolas brancas e p bolas
pretas, e na qual de forma no-determinstica uma das operaes abaixo, se
possvel, selecionada e executada:
se duas bolas brancas so removidas da urna, ento devolva uma bola
branca para a urna;
se uma bola branca e uma preta so removidas, ento devolva a bola
preta para a urna; e
se duas bolas pretas so removidas, ento devolva uma bola branca
para a urna.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 4 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Invariantes
Perguntas:
O processo termina?
Sim. Aps cada operao o nmero p + b diminui de uma unidade.
possvel determinar a cor da nica bola que resta na urna sem
remov-la?
Sim. Note que a paridade de p no se altera aps cada uma das
operaes. Portanto, a paridade de p um invariante. Assim, a cor da
bola restante preta se e s se p mpar.
Informalmente, um invariante de um lao uma propriedade que vale
no incio de cada iterao do lao.
Vamos tentar usar esta ideia para o desenvolvimento de algoritmos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 5 / 29
Invariantes
Preliminares
Para inteiros l r seja [l : r ] o conjunto {l , l + 1, . . . , r }. Assim,
[2 : 5] {2, 3, 4, 5}.
Conveno: se l > r , ento [l : r ] .
Para um vetor a e ndices l , r , seja a[l : r ] o subvetor de a constitudo
dos elementos a[l ], a[l + 1], . . . , a[r ].
O comprimento de a[l : r ] o tamanho do conjunto [l : r ].
Assim, se l r , ento o tamanho de a[l : r ] r l + 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 6 / 29
Invariantes
Preliminares
Para inteiros l r seja [l : r ] o conjunto {l , l + 1, . . . , r }. Assim,
[2 : 5] {2, 3, 4, 5}.
Conveno: se l > r , ento [l : r ] .
Para um vetor a e ndices l , r , seja a[l : r ] o subvetor de a constitudo
dos elementos a[l ], a[l + 1], . . . , a[r ].
O comprimento de a[l : r ] o tamanho do conjunto [l : r ].
Assim, se l r , ento o tamanho de a[l : r ] r l + 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 6 / 29
Invariantes
Preliminares
Para inteiros l r seja [l : r ] o conjunto {l , l + 1, . . . , r }. Assim,
[2 : 5] {2, 3, 4, 5}.
Conveno: se l > r , ento [l : r ] .
Para um vetor a e ndices l , r , seja a[l : r ] o subvetor de a constitudo
dos elementos a[l ], a[l + 1], . . . , a[r ].
O comprimento de a[l : r ] o tamanho do conjunto [l : r ].
Assim, se l r , ento o tamanho de a[l : r ] r l + 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 6 / 29
Invariantes
Preliminares
Para inteiros l r seja [l : r ] o conjunto {l , l + 1, . . . , r }. Assim,
[2 : 5] {2, 3, 4, 5}.
Conveno: se l > r , ento [l : r ] .
Para um vetor a e ndices l , r , seja a[l : r ] o subvetor de a constitudo
dos elementos a[l ], a[l + 1], . . . , a[r ].
O comprimento de a[l : r ] o tamanho do conjunto [l : r ].
Assim, se l r , ento o tamanho de a[l : r ] r l + 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 6 / 29
Invariantes
Preliminares
Para inteiros l r seja [l : r ] o conjunto {l , l + 1, . . . , r }. Assim,
[2 : 5] {2, 3, 4, 5}.
Conveno: se l > r , ento [l : r ] .
Para um vetor a e ndices l , r , seja a[l : r ] o subvetor de a constitudo
dos elementos a[l ], a[l + 1], . . . , a[r ].
O comprimento de a[l : r ] o tamanho do conjunto [l : r ].
Assim, se l r , ento o tamanho de a[l : r ] r l + 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 6 / 29
Invariantes
Um exemplo simples
Dado um vetor a de ints, determinar a soma de seus elementos:
int s = 0;
for (int i = 0; i < a.length; i++) s = s + a[i];
No incio de cada iterao do for (imediatamente antes de i <
a.length) vale que s a[0] + a[1] + + a[i 1].
Vale no incio pois i 0 e s 0.
Suponha que s a[0] + a[1] + + a[i 1] e que i < a.length.
Ento no incio da prxima iterao, os comandos s = s + a[i] e
i++ restabelecem o invariante.
O lao para quando i a.length, donde
s a[0] + a[1] + + a[a.length 1].
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 7 / 29
Invariantes
Um exemplo simples
Dado um vetor a de ints, determinar a soma de seus elementos:
int s = 0;
for (int i = 0; i < a.length; i++) s = s + a[i];
No incio de cada iterao do for (imediatamente antes de i <
a.length) vale que s a[0] + a[1] + + a[i 1].
Vale no incio pois i 0 e s 0.
Suponha que s a[0] + a[1] + + a[i 1] e que i < a.length.
Ento no incio da prxima iterao, os comandos s = s + a[i] e
i++ restabelecem o invariante.
O lao para quando i a.length, donde
s a[0] + a[1] + + a[a.length 1].
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 7 / 29
Invariantes
Um exemplo simples
Dado um vetor a de ints, determinar a soma de seus elementos:
int s = 0;
for (int i = 0; i < a.length; i++) s = s + a[i];
No incio de cada iterao do for (imediatamente antes de i <
a.length) vale que s a[0] + a[1] + + a[i 1].
Vale no incio pois i 0 e s 0.
Suponha que s a[0] + a[1] + + a[i 1] e que i < a.length.
Ento no incio da prxima iterao, os comandos s = s + a[i] e
i++ restabelecem o invariante.
O lao para quando i a.length, donde
s a[0] + a[1] + + a[a.length 1].
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 7 / 29
Invariantes
Um exemplo simples
Dado um vetor a de ints, determinar a soma de seus elementos:
int s = 0;
for (int i = 0; i < a.length; i++) s = s + a[i];
No incio de cada iterao do for (imediatamente antes de i <
a.length) vale que s a[0] + a[1] + + a[i 1].
Vale no incio pois i 0 e s 0.
Suponha que s a[0] + a[1] + + a[i 1] e que i < a.length.
Ento no incio da prxima iterao, os comandos s = s + a[i] e
i++ restabelecem o invariante.
O lao para quando i a.length, donde
s a[0] + a[1] + + a[a.length 1].
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 7 / 29
Invariantes
Um exemplo simples
Dado um vetor a de ints, determinar a soma de seus elementos:
int s = 0;
for (int i = 0; i < a.length; i++) s = s + a[i];
No incio de cada iterao do for (imediatamente antes de i <
a.length) vale que s a[0] + a[1] + + a[i 1].
Vale no incio pois i 0 e s 0.
Suponha que s a[0] + a[1] + + a[i 1] e que i < a.length.
Ento no incio da prxima iterao, os comandos s = s + a[i] e
i++ restabelecem o invariante.
O lao para quando i a.length, donde
s a[0] + a[1] + + a[a.length 1].
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 7 / 29
Busca linear
Busca linear
Problema. Suponha que a[l : r ], um vetor de ints e x um int. Decidir
se existe i em [l : r ] tal que a[i ] x, e se este o caso, encontrar um tal i .
Recebe um vetor a[l : r ] de ints e um int x, e devolve ou um int i tal
que i [l : r ] e a[i ] x, ou l 1, caso contrrio.
Invariante. No incio de cada iterao do lao for (isto , imediatamente
antes de executar k <= r): a[l : k 1] x. Esta notao uma
abreviatura para a armao
para cada i em [l : k 1]: a[i ] x.
int lsearch(int[] a, int l, int r, int x) {
for (int k = l; k <= r; k++)
if (a[k] == x) return k;
return l-1;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 8 / 29
Busca linear
Busca linear - Anlise
Armao
a[l : k 1] x vale no incio de cada iterao do for.
Demonstrao.
Vale no incio da primeira iterao, pois k l .
Suponha que a[l : k 1] x no incio de uma iterao qualquer e
k r .
Se a[k] x, no h nada a vericar.
Se a[k] x, ento a[l : k] x, e portanto no incio da prxima
iterao (em virtude da operao k++) a[l : k 1] x.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 9 / 29
Busca linear
Busca linear - Anlise
Armao
a[l : k 1] x vale no incio de cada iterao do for.
Demonstrao.
Vale no incio da primeira iterao, pois k l .
Suponha que a[l : k 1] x no incio de uma iterao qualquer e
k r .
Se a[k] x, no h nada a vericar.
Se a[k] x, ento a[l : k] x, e portanto no incio da prxima
iterao (em virtude da operao k++) a[l : k 1] x.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 9 / 29
Busca linear
Busca linear - Anlise
Armao
a[l : k 1] x vale no incio de cada iterao do for.
Demonstrao.
Vale no incio da primeira iterao, pois k l .
Suponha que a[l : k 1] x no incio de uma iterao qualquer e
k r .
Se a[k] x, no h nada a vericar.
Se a[k] x, ento a[l : k] x, e portanto no incio da prxima
iterao (em virtude da operao k++) a[l : k 1] x.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 9 / 29
Busca linear
Busca linear - Anlise
Armao
a[l : k 1] x vale no incio de cada iterao do for.
Demonstrao.
Vale no incio da primeira iterao, pois k l .
Suponha que a[l : k 1] x no incio de uma iterao qualquer e
k r .
Se a[k] x, no h nada a vericar.
Se a[k] x, ento a[l : k] x, e portanto no incio da prxima
iterao (em virtude da operao k++) a[l : k 1] x.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 9 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Anlise do consumo de tempo
Qual o consumo de tempo do algoritmo?
Mais elementar ainda, o que o consumo de tempo de um algoritmo?
Informalmente, o nmero de operaes primitivas por ele realizadas.
O que uma operao primitiva?
So aquelas realizadas pela sua CPU.
Mas nem todas levam o mesmo tempo...
Para simplicar, vamos ento admitir que todas levam o mesmo
tempo.
Mas o consumo de tempo tambm depende de caractersticas da
entrada.
Por isso, estudamos o consumo de tempo no melhor, no pior, e no
caso mdio.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 10 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Busca linear - Anlise
A ateno tipicamente estar na anlise de pior caso.
A entrada para cada funo que voc escreve tem um certo tamanho.
Voc pode pensar que tal tamanho o nmero de bytes.
Vamos escrever A() para denotar o consumo de tempo de um
algoritmo A quando submetido a uma entrada de tamanho
denotado por ||.
Denimos ento a funo consumo de tempo no pior caso de A, T
A
pondo-se
T
A
(n) := max{A() | || = n}
para cada natural n.
Trocando-se max por min voc obtm a denio para o melhor caso.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 11 / 29
Busca linear
Anlise do consumo de tempo
Em geral muito difcil calcular T
A
para um certo algoritmo A.
Assim, o que faremos tentar encontrar uma funo f o mais
prxima possvel de T
A
tal que existe uma constante c com
T
A
(n) c f (n) para cada natural n.
Quando este for o caso, dizemos que o consumo de tempo de A
proporcional a f (posteriormente, vamos usar uma linguagem mais
tcnica).
Qual o papel da constante c na denio acima?
A constante c esconde os detalhes de hardware, compilador, sistema
operacional, etc.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 12 / 29
Busca linear
Anlise do consumo de tempo
Em geral muito difcil calcular T
A
para um certo algoritmo A.
Assim, o que faremos tentar encontrar uma funo f o mais
prxima possvel de T
A
tal que existe uma constante c com
T
A
(n) c f (n) para cada natural n.
Quando este for o caso, dizemos que o consumo de tempo de A
proporcional a f (posteriormente, vamos usar uma linguagem mais
tcnica).
Qual o papel da constante c na denio acima?
A constante c esconde os detalhes de hardware, compilador, sistema
operacional, etc.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 12 / 29
Busca linear
Anlise do consumo de tempo
Em geral muito difcil calcular T
A
para um certo algoritmo A.
Assim, o que faremos tentar encontrar uma funo f o mais
prxima possvel de T
A
tal que existe uma constante c com
T
A
(n) c f (n) para cada natural n.
Quando este for o caso, dizemos que o consumo de tempo de A
proporcional a f (posteriormente, vamos usar uma linguagem mais
tcnica).
Qual o papel da constante c na denio acima?
A constante c esconde os detalhes de hardware, compilador, sistema
operacional, etc.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 12 / 29
Busca linear
Anlise do consumo de tempo
Em geral muito difcil calcular T
A
para um certo algoritmo A.
Assim, o que faremos tentar encontrar uma funo f o mais
prxima possvel de T
A
tal que existe uma constante c com
T
A
(n) c f (n) para cada natural n.
Quando este for o caso, dizemos que o consumo de tempo de A
proporcional a f (posteriormente, vamos usar uma linguagem mais
tcnica).
Qual o papel da constante c na denio acima?
A constante c esconde os detalhes de hardware, compilador, sistema
operacional, etc.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 12 / 29
Busca linear
Anlise do consumo de tempo
Em geral muito difcil calcular T
A
para um certo algoritmo A.
Assim, o que faremos tentar encontrar uma funo f o mais
prxima possvel de T
A
tal que existe uma constante c com
T
A
(n) c f (n) para cada natural n.
Quando este for o caso, dizemos que o consumo de tempo de A
proporcional a f (posteriormente, vamos usar uma linguagem mais
tcnica).
Qual o papel da constante c na denio acima?
A constante c esconde os detalhes de hardware, compilador, sistema
operacional, etc.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 12 / 29
Busca linear
Busca linear - Anlise
Qual ento o consumo de tempo da busca linear no pior caso?
Escreva n := r l + 1. Ento o consumo de tempo proporcional
funo f (n) := n para cada natural n.
Neste caso, por abuso de linguagem dizemos que o consumo de
tempo, no pior caso, proporcional a n.
Mais detalhadamente, podemos primeiro observar que h uma
operao do algoritmo que realizada um nmero mximo de vezes.
Tal operao k <= r, que realizada uma vez para cada k no
intervalo [l : r + 1], e portanto, realizada r + 1 l + 1 vezes, isto ,
n + 1 vezes.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 13 / 29
Busca linear
Busca linear - Anlise
Qual ento o consumo de tempo da busca linear no pior caso?
Escreva n := r l + 1. Ento o consumo de tempo proporcional
funo f (n) := n para cada natural n.
Neste caso, por abuso de linguagem dizemos que o consumo de
tempo, no pior caso, proporcional a n.
Mais detalhadamente, podemos primeiro observar que h uma
operao do algoritmo que realizada um nmero mximo de vezes.
Tal operao k <= r, que realizada uma vez para cada k no
intervalo [l : r + 1], e portanto, realizada r + 1 l + 1 vezes, isto ,
n + 1 vezes.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 13 / 29
Busca linear
Busca linear - Anlise
Qual ento o consumo de tempo da busca linear no pior caso?
Escreva n := r l + 1. Ento o consumo de tempo proporcional
funo f (n) := n para cada natural n.
Neste caso, por abuso de linguagem dizemos que o consumo de
tempo, no pior caso, proporcional a n.
Mais detalhadamente, podemos primeiro observar que h uma
operao do algoritmo que realizada um nmero mximo de vezes.
Tal operao k <= r, que realizada uma vez para cada k no
intervalo [l : r + 1], e portanto, realizada r + 1 l + 1 vezes, isto ,
n + 1 vezes.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 13 / 29
Busca linear
Busca linear - Anlise
Qual ento o consumo de tempo da busca linear no pior caso?
Escreva n := r l + 1. Ento o consumo de tempo proporcional
funo f (n) := n para cada natural n.
Neste caso, por abuso de linguagem dizemos que o consumo de
tempo, no pior caso, proporcional a n.
Mais detalhadamente, podemos primeiro observar que h uma
operao do algoritmo que realizada um nmero mximo de vezes.
Tal operao k <= r, que realizada uma vez para cada k no
intervalo [l : r + 1], e portanto, realizada r + 1 l + 1 vezes, isto ,
n + 1 vezes.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 13 / 29
Busca linear
Busca linear - Anlise
Qual ento o consumo de tempo da busca linear no pior caso?
Escreva n := r l + 1. Ento o consumo de tempo proporcional
funo f (n) := n para cada natural n.
Neste caso, por abuso de linguagem dizemos que o consumo de
tempo, no pior caso, proporcional a n.
Mais detalhadamente, podemos primeiro observar que h uma
operao do algoritmo que realizada um nmero mximo de vezes.
Tal operao k <= r, que realizada uma vez para cada k no
intervalo [l : r + 1], e portanto, realizada r + 1 l + 1 vezes, isto ,
n + 1 vezes.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 13 / 29
Mximo de um vetor
Mximo de um vetor
Problema. Dado um vetor a[l : r ], l r de ints, deteminar um int
m tal que
m a[i ] para todo i em [l : r ], e
m a[i ] para algum i em [l : r ].
Qualquer m nas condies acima chamado de um mximo de a[l : r ].
Recebe um vetor a[l : r ], l r de ints e devolve um mximo de
a[l : r ].
int maximum(int[] a, int l, int r) {
int m = a[l];
for (int k = l+1; k <= r; k++)
if (a[k] > m) m = a[k];
return m;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 14 / 29
Mximo de um vetor
Mximo de um vetor
Problema. Dado um vetor a[l : r ], l r de ints, deteminar um int
m tal que
m a[i ] para todo i em [l : r ], e
m a[i ] para algum i em [l : r ].
Qualquer m nas condies acima chamado de um mximo de a[l : r ].
Recebe um vetor a[l : r ], l r de ints e devolve um mximo de
a[l : r ].
int maximum(int[] a, int l, int r) {
int m = a[l];
for (int k = l+1; k <= r; k++)
if (a[k] > m) m = a[k];
return m;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 14 / 29
Mximo de um vetor
Mximo de um vetor
Problema. Dado um vetor a[l : r ], l r de ints, deteminar um int
m tal que
m a[i ] para todo i em [l : r ], e
m a[i ] para algum i em [l : r ].
Qualquer m nas condies acima chamado de um mximo de a[l : r ].
Recebe um vetor a[l : r ], l r de ints e devolve um mximo de
a[l : r ].
int maximum(int[] a, int l, int r) {
int m = a[l];
for (int k = l+1; k <= r; k++)
if (a[k] > m) m = a[k];
return m;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 14 / 29
Mximo de um vetor
Mximo de um vetor
Problema. Dado um vetor a[l : r ], l r de ints, deteminar um int
m tal que
m a[i ] para todo i em [l : r ], e
m a[i ] para algum i em [l : r ].
Qualquer m nas condies acima chamado de um mximo de a[l : r ].
Recebe um vetor a[l : r ], l r de ints e devolve um mximo de
a[l : r ].
int maximum(int[] a, int l, int r) {
int m = a[l];
for (int k = l+1; k <= r; k++)
if (a[k] > m) m = a[k];
return m;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 14 / 29
Mximo de um vetor
Mximo de um vetor
Problema. Dado um vetor a[l : r ], l r de ints, deteminar um int
m tal que
m a[i ] para todo i em [l : r ], e
m a[i ] para algum i em [l : r ].
Qualquer m nas condies acima chamado de um mximo de a[l : r ].
Recebe um vetor a[l : r ], l r de ints e devolve um mximo de
a[l : r ].
int maximum(int[] a, int l, int r) {
int m = a[l];
for (int k = l+1; k <= r; k++)
if (a[k] > m) m = a[k];
return m;
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 14 / 29
Mximo de um vetor
Mximo de um vetor - Anlise
Eis a anlise:
(Exerccio) No incio de cada iterao do lao for,
m um mximo de a[l : k 1].
(Exerccio) O consumo de tempo, no pior caso, proporcional ao
tamanho de a[l : r ].
Qual o consumo de tempo no melhor caso?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 15 / 29
Mximo de um vetor
Mximo de um vetor - Anlise
Eis a anlise:
(Exerccio) No incio de cada iterao do lao for,
m um mximo de a[l : k 1].
(Exerccio) O consumo de tempo, no pior caso, proporcional ao
tamanho de a[l : r ].
Qual o consumo de tempo no melhor caso?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 15 / 29
Mximo de um vetor
Mximo de um vetor - Anlise
Eis a anlise:
(Exerccio) No incio de cada iterao do lao for,
m um mximo de a[l : k 1].
(Exerccio) O consumo de tempo, no pior caso, proporcional ao
tamanho de a[l : r ].
Qual o consumo de tempo no melhor caso?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 15 / 29
Mximo de um vetor
Mximo de um vetor - Anlise
Eis a anlise:
(Exerccio) No incio de cada iterao do lao for,
m um mximo de a[l : k 1].
(Exerccio) O consumo de tempo, no pior caso, proporcional ao
tamanho de a[l : r ].
Qual o consumo de tempo no melhor caso?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 15 / 29
Mximo de um vetor
Mximo de um vetor - Anlise
Eis a anlise:
(Exerccio) No incio de cada iterao do lao for,
m um mximo de a[l : k 1].
(Exerccio) O consumo de tempo, no pior caso, proporcional ao
tamanho de a[l : r ].
Qual o consumo de tempo no melhor caso?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 15 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Suponha que a[l : r ], um vetor de ints.
Dizemos que a[l

: r

] um segmento de a[l : r ] se [l

: r

] [l : r ], e
a[l

: r

] estritamente crescente se a[l

] < a[l

+ 1] < < a[r

].
Problema. Dado um vetor a[l : r ] determinar o comprimento de um
segmento estritamente crescente de a[l : r ] de comprimento mximo.
Por exemplo, um segmento estritamente crescente de comprimento
mximo do vetor (1, 4, 2, 3, 5, 2) (2, 3, 5), e portanto seu
comprimento 3.
Podemos encarar este problema como um de encontrar um certo
mximo em um vetor. No entanto, o universo de pesquisa com os
comprimentos dos segmentos no est diretamente disponvel.
Mesmo assim, podemos usar uma tcnica similar.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 16 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Suponha que a[l : r ], um vetor de ints.
Dizemos que a[l

: r

] um segmento de a[l : r ] se [l

: r

] [l : r ], e
a[l

: r

] estritamente crescente se a[l

] < a[l

+ 1] < < a[r

].
Problema. Dado um vetor a[l : r ] determinar o comprimento de um
segmento estritamente crescente de a[l : r ] de comprimento mximo.
Por exemplo, um segmento estritamente crescente de comprimento
mximo do vetor (1, 4, 2, 3, 5, 2) (2, 3, 5), e portanto seu
comprimento 3.
Podemos encarar este problema como um de encontrar um certo
mximo em um vetor. No entanto, o universo de pesquisa com os
comprimentos dos segmentos no est diretamente disponvel.
Mesmo assim, podemos usar uma tcnica similar.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 16 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Suponha que a[l : r ], um vetor de ints.
Dizemos que a[l

: r

] um segmento de a[l : r ] se [l

: r

] [l : r ], e
a[l

: r

] estritamente crescente se a[l

] < a[l

+ 1] < < a[r

].
Problema. Dado um vetor a[l : r ] determinar o comprimento de um
segmento estritamente crescente de a[l : r ] de comprimento mximo.
Por exemplo, um segmento estritamente crescente de comprimento
mximo do vetor (1, 4, 2, 3, 5, 2) (2, 3, 5), e portanto seu
comprimento 3.
Podemos encarar este problema como um de encontrar um certo
mximo em um vetor. No entanto, o universo de pesquisa com os
comprimentos dos segmentos no est diretamente disponvel.
Mesmo assim, podemos usar uma tcnica similar.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 16 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Suponha que a[l : r ], um vetor de ints.
Dizemos que a[l

: r

] um segmento de a[l : r ] se [l

: r

] [l : r ], e
a[l

: r

] estritamente crescente se a[l

] < a[l

+ 1] < < a[r

].
Problema. Dado um vetor a[l : r ] determinar o comprimento de um
segmento estritamente crescente de a[l : r ] de comprimento mximo.
Por exemplo, um segmento estritamente crescente de comprimento
mximo do vetor (1, 4, 2, 3, 5, 2) (2, 3, 5), e portanto seu
comprimento 3.
Podemos encarar este problema como um de encontrar um certo
mximo em um vetor. No entanto, o universo de pesquisa com os
comprimentos dos segmentos no est diretamente disponvel.
Mesmo assim, podemos usar uma tcnica similar.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 16 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Recebe um vetor a[l : r ] de ints e devolve o comprimento de um segmento
estritamente crescente de comprimento mximo de a[l : r ].
int segccm(int[] a, int l, int r) {
if (l > r) return 0;
int s = 1, c = 1;
for (int i = l+1; i <= r; i++)
if (a[i-1] < a[i]) c++;
else { s = max(s,c); c = 1; }
return max(s,c);
}
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 17 / 29
Segmento crescente mximo
Segmento estritamente crescente de comprimento mximo
Armao
No incio de cada iterao do lao for:
c o comprimento do maior segmento estritamente crescente que
termina em a[i 1], e
max{s, c} o comprimento de um segmento estritamente crescente
de comprimento mximo de a[l : i 1].
Demonstrao.
Exerccio.
Qual o consumo de tempo do algoritmo?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 18 / 29
Busca binria
Busca binria
Suponha que a[l : r ], um vetor de ints (poderia ser um outro tipo
qualquer para o qual esteja denida uma relao de ordem total) tal
que
a[l ] a[l + 1] a[r ]
e x um int. Decidir se existe i em [l : r ] tal que a[i ] x, e se este
o caso, encontrar um tal i .
O que devolver quando x no est em a[l : r ]?
Ideia: Digamos que [l : r ] o espao de busca. Reduzir o espao de
busca at que seja trivial decidir se x est em a[l : r ]. Esta a ideia
da busca linear, no?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 19 / 29
Busca binria
Busca binria
Suponha que a[l : r ], um vetor de ints (poderia ser um outro tipo
qualquer para o qual esteja denida uma relao de ordem total) tal
que
a[l ] a[l + 1] a[r ]
e x um int. Decidir se existe i em [l : r ] tal que a[i ] x, e se este
o caso, encontrar um tal i .
O que devolver quando x no est em a[l : r ]?
Ideia: Digamos que [l : r ] o espao de busca. Reduzir o espao de
busca at que seja trivial decidir se x est em a[l : r ]. Esta a ideia
da busca linear, no?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 19 / 29
Busca binria
Busca binria
Suponha que a[l : r ], um vetor de ints (poderia ser um outro tipo
qualquer para o qual esteja denida uma relao de ordem total) tal
que
a[l ] a[l + 1] a[r ]
e x um int. Decidir se existe i em [l : r ] tal que a[i ] x, e se este
o caso, encontrar um tal i .
O que devolver quando x no est em a[l : r ]?
Ideia: Digamos que [l : r ] o espao de busca. Reduzir o espao de
busca at que seja trivial decidir se x est em a[l : r ]. Esta a ideia
da busca linear, no?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 19 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
1
Vamos escrever um lao que satisfaz o seguinte invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Note que se e > d ento a[e : d] , donde o invariante arma que
x / a[l : r ].
3
fcil satisfazer o invariante no incio da primeira iterao. Tome
e := l e d := r .
4
Suponha que o invariante vlido e que e d.
5
Tome m := (e + d)/2. Ento e m d.
6
Se a[m] x, ento o algoritmo para e devolve m.
7
Suponha a[m] < x. Ora, e m e a[l ] a[l + 1] a[m], donde
x / a[l : m]. Tomando-se e := m + 1, o invariante restabelecido.
8
O raciocnio anlogo quando x < a[m]. Tome d := m 1.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 20 / 29
Busca binria
Busca binria
Recebe um vetor a[l : r ] de ints tal que l 1 r ,
a[l ] a[l + 1] a[r ] e um int x, e devolve ou um int i tal que
i [l : r ] e a[i ] x, ou l 1, caso contrrio.
int bb0(int[] a, int l, int r, int x) {
int e = l, d = r;
while (e <= d) {
int m = (e+d)/2;
if (a[m] == x) return m;
if (a[m] < x) e = m+1;
else d = m-1;
}
return l-1;
}
Observe que a cada iterao a distncia entre e e d diminui, e portanto o
algoritmo para!
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 21 / 29
Busca binria
Busca binria - Anlise
Eis uma outra forma de analisar o algoritmo:
Armao
No incio de cada iterao do lao while (imediatamente antes de executar
o teste e <= d)
1
a[e 1] < x < a[d + 1], onde a[l 1] e a[r + 1] , e
2
l e e d r ,
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 22 / 29
Busca binria
Busca binria - Anlise
Eis uma outra forma de analisar o algoritmo:
Armao
No incio de cada iterao do lao while (imediatamente antes de executar
o teste e <= d)
1
a[e 1] < x < a[d + 1], onde a[l 1] e a[r + 1] , e
2
l e e d r ,
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 22 / 29
Busca binria
Busca binria - Anlise
Eis uma outra forma de analisar o algoritmo:
Armao
No incio de cada iterao do lao while (imediatamente antes de executar
o teste e <= d)
1
a[e 1] < x < a[d + 1], onde a[l 1] e a[r + 1] , e
2
l e e d r ,
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 22 / 29
Busca binria
Busca binria - Anlise
Demonstrao.
Vale no incio da primeira, pois a[e 1] e a[d + 1] .
Suponha que e d. Por hiptese, l e e d r . Ento
l e m d r . Se a[m] x, no h mais nada a vericar, pois
m [l : r ].
Se a[m] < x, ento a[m] < x < a[d + 1]. No incio da prxima
iterao, e m + 1, e portanto a[e 1] < x < a[d + 1] e
l < m + 1 e.
Se x < a[m], ento a[e 1] < x < a[m]. No incio da prxima
iterao, d m 1, e portanto a[e 1] < x < a[d + 1] e
d m 1 < r .
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 23 / 29
Busca binria
Busca binria - Anlise
Demonstrao.
Vale no incio da primeira, pois a[e 1] e a[d + 1] .
Suponha que e d. Por hiptese, l e e d r . Ento
l e m d r . Se a[m] x, no h mais nada a vericar, pois
m [l : r ].
Se a[m] < x, ento a[m] < x < a[d + 1]. No incio da prxima
iterao, e m + 1, e portanto a[e 1] < x < a[d + 1] e
l < m + 1 e.
Se x < a[m], ento a[e 1] < x < a[m]. No incio da prxima
iterao, d m 1, e portanto a[e 1] < x < a[d + 1] e
d m 1 < r .
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 23 / 29
Busca binria
Busca binria - Anlise
Demonstrao.
Vale no incio da primeira, pois a[e 1] e a[d + 1] .
Suponha que e d. Por hiptese, l e e d r . Ento
l e m d r . Se a[m] x, no h mais nada a vericar, pois
m [l : r ].
Se a[m] < x, ento a[m] < x < a[d + 1]. No incio da prxima
iterao, e m + 1, e portanto a[e 1] < x < a[d + 1] e
l < m + 1 e.
Se x < a[m], ento a[e 1] < x < a[m]. No incio da prxima
iterao, d m 1, e portanto a[e 1] < x < a[d + 1] e
d m 1 < r .
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 23 / 29
Busca binria
Busca binria - Anlise
Demonstrao.
Vale no incio da primeira, pois a[e 1] e a[d + 1] .
Suponha que e d. Por hiptese, l e e d r . Ento
l e m d r . Se a[m] x, no h mais nada a vericar, pois
m [l : r ].
Se a[m] < x, ento a[m] < x < a[d + 1]. No incio da prxima
iterao, e m + 1, e portanto a[e 1] < x < a[d + 1] e
l < m + 1 e.
Se x < a[m], ento a[e 1] < x < a[m]. No incio da prxima
iterao, d m 1, e portanto a[e 1] < x < a[d + 1] e
d m 1 < r .
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 23 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
O que ocorre se o algoritmo devolve l 1?
Neste caso, e > d, donde e = d + 1.
O invariante garante que a[d] < x < a[d + 1].
Armao: no existe i em [l : r ] tal que a[i ] x.
Tome i em [l : r ].
Se i d, ento a[i ] a[d] < x.
Se i > d, ento x < a[d + 1] a[i ].
Logo, x no est em a[l : r ], como queramos.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 24 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Busca binria - Anlise
Qual o consumo de tempo no pior caso?
O pior caso ocorre quando x no est em a[l : r ].
Cada iterao leva tempo constante.
A cada iterao o tamanho do espao de busca diminui de um fator de
pelo menos 2.
Logo, o nmero de iteraes no mais que 1 + lg(r l + 1).
Pondo-se n := r l + 1.
Ento o consumo de tempo, no pior caso, proporcional a lg n
(posteriormente, vamos fornecer uma prova mais formal).
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 25 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Comentrios
Como escrever um algoritmo para resolver um problema?
No sei...
Mas, voc pode fazer o seguinte.
Com uma ideia preliminar tente pensar em um invariante que num
certo sentido convirja para a soluo do problema.
Pense numa sequncia de comandos que preserve este invariante.
Garanta que a cada execuo de tal sequncia h uma evoluo, isto
, voc est cada vez mais perto da soluo.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 26 / 29
Busca binria
Busca binria - cuidado
1
Vamos uma vez mais tentar satisfazer o mesmo invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Se e d, ento x a[l : r ] se e s se x a[e].
3
Suponha e < d. Ento e m < d.
4
Se a[m] x, ento tome e := m. Isto restabelece o invariante.
5
Se x < a[m], ento tome d := m 1. Isto restabelece o invariante.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 27 / 29
Busca binria
Busca binria - cuidado
1
Vamos uma vez mais tentar satisfazer o mesmo invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Se e d, ento x a[l : r ] se e s se x a[e].
3
Suponha e < d. Ento e m < d.
4
Se a[m] x, ento tome e := m. Isto restabelece o invariante.
5
Se x < a[m], ento tome d := m 1. Isto restabelece o invariante.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 27 / 29
Busca binria
Busca binria - cuidado
1
Vamos uma vez mais tentar satisfazer o mesmo invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Se e d, ento x a[l : r ] se e s se x a[e].
3
Suponha e < d. Ento e m < d.
4
Se a[m] x, ento tome e := m. Isto restabelece o invariante.
5
Se x < a[m], ento tome d := m 1. Isto restabelece o invariante.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 27 / 29
Busca binria
Busca binria - cuidado
1
Vamos uma vez mais tentar satisfazer o mesmo invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Se e d, ento x a[l : r ] se e s se x a[e].
3
Suponha e < d. Ento e m < d.
4
Se a[m] x, ento tome e := m. Isto restabelece o invariante.
5
Se x < a[m], ento tome d := m 1. Isto restabelece o invariante.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 27 / 29
Busca binria
Busca binria - cuidado
1
Vamos uma vez mais tentar satisfazer o mesmo invariante:
se x a[l : r ], ento x a[e : d] com l e e d r .
2
Se e d, ento x a[l : r ] se e s se x a[e].
3
Suponha e < d. Ento e m < d.
4
Se a[m] x, ento tome e := m. Isto restabelece o invariante.
5
Se x < a[m], ento tome d := m 1. Isto restabelece o invariante.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 27 / 29
Busca binria
Busca binria - cuidado
Eis o algoritmo sugerido pelo argumento anterior. Recebe um vetor a[l : r ]
de ints tal que l r e a[l ] a[l + 1] a[r ] e um int x, e devolve
ou um int i tal que i [l : r ] e a[i ] x, ou l 1, caso contrrio.
int bbe(int[] a, int l, int r, int x) {
int e = l, d = r;
while (e < d) {
int m = (e+d)/2;
if (a[m] <= x) e = m;
else d = m-1;
}
return a[e] == x ? e : l-1;
}
Mas isto est ERRADO! Onde est o erro?
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 28 / 29
Busca binria
Busca binria - cuidado
1
Considere o vetor (2, 4) e x 3.
2
Na primeira iterao temos e 0, d 1 e m 0.
3
Alm disso, a[0] 3, donde no incio da prxima iterao e m.
4
Logo, o algoritmo no para.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 29 / 29
Busca binria
Busca binria - cuidado
1
Considere o vetor (2, 4) e x 3.
2
Na primeira iterao temos e 0, d 1 e m 0.
3
Alm disso, a[0] 3, donde no incio da prxima iterao e m.
4
Logo, o algoritmo no para.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 29 / 29
Busca binria
Busca binria - cuidado
1
Considere o vetor (2, 4) e x 3.
2
Na primeira iterao temos e 0, d 1 e m 0.
3
Alm disso, a[0] 3, donde no incio da prxima iterao e m.
4
Logo, o algoritmo no para.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 29 / 29
Busca binria
Busca binria - cuidado
1
Considere o vetor (2, 4) e x 3.
2
Na primeira iterao temos e 0, d 1 e m 0.
3
Alm disso, a[0] 3, donde no incio da prxima iterao e m.
4
Logo, o algoritmo no para.
Mario Leston () Algoritmos: correo e ecincia 19 de maro de 2014 29 / 29

Vous aimerez peut-être aussi