Buscar

Programação Python #6

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1
cederj
Aula 6Aula 6
Conteúdo:
 - Algoritmos de Busca
- Busca Simples
- Busca com Sentinela
- Busca Binária
 - Busca do Menor e Maior Elementos
 - Noções de Complexidade de Algoritmos
2
cederj
Algoritmos de BuscaAlgoritmos de Busca
O problema de busca é caracterizado pela 
procura de um determinado elemento em um grupo 
de elementos do mesmo tipo.
Exemplos:
- encontrar o registro de um cliente entre todos os 
registros dos clientes de um banco, para que seja possível 
informar seu saldo.
- encontrar o registro de um aluno dentre todos os 
registros dos alunos de uma universidade, para que seja 
possível gerar o seu histórico escolar.
3
cederj
Algoritmos de BuscaAlgoritmos de Busca
Algoritmos de busca visam resolver o problema 
da busca e são, portanto, bastante utilizados em 
computação.
Necessita-se então de algoritmos eficientes de 
busca. De forma simplificada, um algoritmo eficiente é 
aquele que realiza sua tarefa em tempo computacional 
reduzido.
4
cederj
Algoritmos de BuscaAlgoritmos de Busca
É claro que o tempo de execução de um algoritmo 
de busca depende do tamanho do conjunto de elementos 
a serem consultados. É mais rápido procurar um 
elemento em um grupo de 100 do que em um grupo de 
100.000.
Além disso, a eficiência do processo de busca 
depende do algoritmo adotado. Exploraremos o conceito 
de complexidade de algoritmos no sentido de tentar 
avaliar a eficiência dos algoritmos estudados.
5
cederj
Algoritmos de BuscaAlgoritmos de Busca
Sem perda de generalidade, o problema será atacado 
considerando-se que:
1. Os elementos a serem percorridos são numéricos, 
distintos e estão armazenados em um vetor;
2. O número de elementos define o tamanho do vetor;
3. O elemento procurado pode não estar no vetor (no 
conjunto de elementos).
6
cederj
Algoritmos de BuscaAlgoritmos de Busca
197 4 10 8 1
numeros: contém o grupo de elementos 
10 2 8 93
posição dos elementos
(índices) 
tamanho do vetor: len(valores) = 10
(número de elementos: 9+1=10)
18 6 3 12
54 76
Exemplo 1) Elemento procurado: 18 Resposta: posição 4 
Exemplo 2) Elemento procurado: 5 Resposta: não encontrado 
7
cederj
# Subprogramas
...
# Programa Principal de Busca
numeros = [0]*10 # Cria o vetor numeros zerado, com tamanho n = 10
preenche(numeros)
# dado: o elemento a ser procurado
dado = int(input(“Escolha valor a ser procurado: ”))
# onde: o local no vetor onde dado foi encontrado ou -1 se nao encontrado
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
8
cederj
# Subprogramas
def preenche(valores):
 for ind in range(len(valores)):
 valores[ind] = int(input(“Elemento[”+str(ind)+“]=”))
 return
def buscaElemento(valores, procurado):
 ...
def escreverResposta(valor, pos):
 if pos<0:
 print(valor,“não foi encontrado”)
 else:
 print(valor, “foi encontrado na posição”, pos)
 return
# Programa Principal de Busca
numeros = [0]*10
preenche(numeros)
dado = int(input(“Escolha valor a ser procurado: ”))
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
9
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: -1
10
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
1 2 8 93 54 76
procurado: 18
local: -1
indice: 0 
11
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
1 2 8 93 54 76
procurado: 18
local: -1
indice: 1 
12
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: -1
indice: 2 
1 2 8 93 54 76
13
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: -1
indice: 3 
1 2 8 93 54 76
14
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 4 
1 2 8 93 54 76
15
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 5 
1 2 8 93 54 76
16
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 6 
1 2 8 93 54 76
17
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 7 
1 2 8 93 54 76
18
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 8 
1 2 8 93 54 76
19
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 9 
1 2 8 93 54 76
20
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
197 4 10 8 1
valores: contém o grupo de elementos 
0
18 6 3 12
Todas as posições do vetor são comparadas com o 
valor procurado.
procurado: 18
local: 4
indice: 9 
1 2 8 93 54 76
Resultado
21
cederj
# Subprogramas
def preenche(valores):
 ...
def buscaElemento(valores, procurado):
 local = -1
 for indice in range(len(valores)):
 if valores[indice]==procurado:
 local = indice
 return local
def escreverResposta(valor, pos):
 ...
# Programa Principal de Busca
numeros = [0]*10
preenche(numeros)
dado = int(input(“Escolha valor a ser procurado: ”))
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
22
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor))
Todas as posições do vetor são comparadas com o 
valor procurado, mesmo quando este é encontrado antes 
do fim do vetor.
Nitidamente, esta é uma busca ineficiente.
O algoritmo avalia necessariamente n elementos, 
onde n é o tamanho do vetor. Portanto, sua complexidade é 
da ordem de n, representado por O(n).
23
cederj
Busca SimplesBusca Simples (utilizando (utilizando forfor com saída rápida) com saída rápida)
Utilizando-se sub-programação, não se considera uma má 
prática de programação se realizar um return dentro de uma repetição. 
Assim, o subprograma buscaElemento pode ter sua eficiência 
melhorada quando encontra o elemento no vetor, não necessitando 
repetir todos os índices previstos no for:
def buscaElemento(valores,procurado):
 for indice in range(len(valores)):
 if valores[indice]==procurado:
 return indice # retorna ao encontrar o local
 return -1 # retorna -1 se terminar sem encontrar
24
cederj
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
Neste algoritmo, o processo de busca é interrompido 
quando o elemento procurado é encontrado.
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
procurado: 4
local: -1
indice: 0
25
cederj
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
Neste algoritmo, o processo de busca é interrompido 
quando o elemento procurado é encontrado.
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
procurado: 4
local: -1
indice: 1
26
cederj
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
Neste algoritmo, o processo de busca é interrompido 
quando o elemento procurado é encontrado.
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
procurado: 4
local: -1
indice: 2
27
cederj
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
Neste algoritmo, o processo de busca é interrompido 
quando o elemento procurado é encontrado.
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
procurado: 4
local: 2
indice: 2
28
cederj
Resultado
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
Neste algoritmo, o processo de busca é interrompido 
quando o elemento procurado é encontrado.
197 4 10 8 1
valores: contém o grupo de elementos 
10 2 8 93
18 6 3 12
54 76
procurado: 4
local: 2
indice: 10
29
cederj
# Subprogramas
def preenche(valores):
 ...
def buscaElemento(valores, procurado): # primeira solucao
 local = -1
 indice = 0
 while indice<len(valores):
 if valores[indice]!=procurado:
 indice = indice + 1
 else:
 local = indice
 indice = len(valores)
 return local
def escreverResposta(valor, pos):
 ...
# Programa Principal de Busca
numeros = [0]*10
preenche(numeros)
dado = int(input(“Escolha valor a ser procurado: ”))
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
30
cederj
# Subprogramas
def preenche(valores):
 ...
def buscaElemento(valores, procurado): # segunda solução
 indice = 0
 while indice<len(valores):
 if valores[indice]!=procurado:
 indice = indice + 1
 else:
 return indice # retorna ao encontrar local
 return -1 # retorna -1 se terminar sem encontrar
def escreverResposta(valor, pos):
 ...
# Programa Principal de Busca
numeros = [0]*10
preenche(numeros)
dado = int(input(“Escolha valor a ser procurado: ”))
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
31
cederj
Em média, este algoritmo executa n/2 vezes o corpo da 
repetição while. Em algumas vezes, o dado será encontrado 
logo na primeira posição, em outras, na última posição.
No pior caso, o algoritmo avalia n elementos. Portanto, 
sua complexidade também é da ordem de n, representado por 
O(n).
Busca SimplesBusca Simples (utilizando (utilizando whilewhile))
32
cederj
O algoritmo anterior poderia executar menos comparações, se 
não houvesse a necessidade de evitar ultrapassar o fim do vetor, caso 
o elemento procurado não se encontre no conjunto. 
Propõe-se então alocar uma posição a mais no vetor e inserir 
forçadamente o elemento procurado nesta posição. 
Desta forma, necessariamente o elemento procurado será 
encontrado. Se for encontrado na posição n+1, significa que o 
elemento não pertence ao conjunto original.
Apesar de executar menos comparações, o algoritmo avalia, 
no pior caso, n+1 elementos. Portanto, sua complexidade também é 
da ordem de n, representado por O(n).
Busca com SentinelaBusca com Sentinela (utilizando (utilizando whilewhile))
33
cederj
# Subprogramas
def preenche(valores):
 ...
def buscaElemento(valores, procurado):
 indice = 0
 while valores[indice]!=procurado:
 indice = indice + 1
 if indice==len(valores)-1:
 local = -1 # local do sentinela, informa que não achou
 else:
 local = indice
 return local
def escreverResposta(valor, pos):
 ...
# Programa Principal de Busca
numeros = [0]*10
preenche(numeros)
dado = int(input(“Escolha valor a ser procurado: ”))
numeros.append(dado) # coloca o procurado no final: o sentinela
onde = buscaElemento(numeros, dado)
escreveResposta(dado, onde)
34
cederj
Busca BináriaBusca Binária
Os algoritmos apresentados até o momento foram
projetados sem levar em consideração se os elementos do 
vetor encontram-se ordenados ou não.
Caso os elementos se encontrem ordenados, 
algoritmos mais eficientes podem ser implementados.
No algoritmo chamado busca binária, cada passo
divide o espaço de busca em dois grupos até encontrar o 
elemento sendo procurado.
35
cederj
31 4 5 9 10
valores 
21 3 9 104
7 8 14 17
65 87
Os n elementos encontram-se ordenados no vetor.
procurado: 14
Busca BináriaBusca Binária
11 12 13 14
12 13 18 19
inicio fim
150
15 20
36
cederj
31 4 5 9 10
valores 
7 8 14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
meio
15 20
14 > 10
Número de elementos comparados: 1
21 3 9 104 65 87 11 12 13 14
inicio fim
150
37
cederj
31 4 5 9 10
valores 
7 8 14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
inicio
fim
15 20
Número de elementos comparados: 1
meio
21 3 9 104 65 87 11 12 13 14 150
38
cederj
 3 1 4 5 9 10
valores 
 7 8 14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
inicio meio fim
15 20
14 < 15
Número de elementos comparados: 2
21 3 9 104 65 87 11 12 13 14 150
39
cederj
valores 
14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
inicio fim
15 20
Número de elementos comparados: 2
 3 1 4 5 9 10 7 8
21 3 9 104 65 87 11 12 13 14 150
40
cederj
valores 
14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
inicio fim
15 20
Número de elementos comparados: 3
meio
14 > 13
21 3 9 104 65 87 11 12 13 14 150
 3 1 4 5 9 10 7 8
41
cederj
valores 
14 17
procurado: 14
Busca BináriaBusca Binária
12 13 18 19
inicio fim
15 20
Número de elementos comparados: 3
 3 1 4 5 9 10 7 8
21 3 9 104 65 87 11 12 13 14 150
42
cederj
valores 
procurado: 14
Busca BináriaBusca Binária
14 = 14
Número de elementos comparados: 4
inicio fim
meio
1712 13 18 1915 20 3 1 4 5 9 10 7 8
21 3 9 104 65 87 11 12 13 14 150
14
43
cederj
Resposta: local = 10
Número de elementos comparados: 4
valores 
procurado: 14
Busca BináriaBusca Binária
14 = 14
inicio fim
meio
1712 13 18 1915 20 3 1 4 5 9 10 7 8
21 3 9 104 65 87 11 12 13 14 150
14
44
def buscaElemento(valores, procurado):
 inicio = 0
 fim = len(valores)-1
 meio = (inicio + fim) // 2
 while (inicio!=fim) and (procurado!=valores[meio]):
 if procurado>valores[meio]:
 inicio = meio + 1
 else:
 fim = meio -1
 meio = (inicio + fim) // 2
 if procurado!=valores[meio]:
 local = -1 
 else:
 local = meio
 return local
cederj
Busca BináriaBusca Binária
45
cederj
Busca BináriaBusca Binária
Na busca binária, a cada passo, divide-se o espaço de busca 
em doisaté que o elemento procurado seja encontrado.
Considerando-se um vetor de 16 posições, no máximo 4 
divisões podem ser feitas. E portanto, no máximo 4 elementos do vetor 
serão comparados com o elemento procurado.
Observe que se o vetor for de 32 posições (vetor duplicado), no 
máximo 5 elementos do vetor serão acessados (apenas um a mais). Ou 
ainda, se o vetor tiver 32.000 posições, apenas 15 avaliações serão 
necessárias.
Na prática, se o vetor tiver n posições, a busca binária avaliará, 
no pior caso, log2(n) elementos. Portanto, sua complexidade é da 
ordem de log(n), representado por O(log(n)).
46
cederj
Busca do Menor e Maior ElementosBusca do Menor e Maior Elementos
Este problema é caracterizado pela procura do menor 
e do maior elementos em um grupo de elementos do mesmo 
tipo.
Sem perda de generalidade, o problema será atacado 
considerando-se que:
- os elementos a serem percorridos são numéricos e estão
 armazenados em um vetor;
- estes elementos podem não ser distintos;
- o número de elementos define o tamanho do vetor.
47
cederj
194 4 10 19 1
valores: contém o grupo de elementos 
21 3 90 4
posição dos elementos
(indices) 
tamanho do vetor: 9+1 = 10
(número de elementos: n)
18 6 3 18
65 87
Resposta: Menor Elemento: 1
Maior Elemento: 19 
10
Busca do Menor e Maior ElementosBusca do Menor e Maior Elementos
48
cederj
# Subprogramas
def preenche(valores):
 for ind in range(len(valores)):
 valores[ind] = int(input(“Elemento[”+str(ind)+“]=”))
 return
def buscaMenorMaiorElementos(valores):
 ...
def escrever(infos):
 print(“O menor elemento =”, infos[0], “e o maior elemento =”, infos[1])
 return
# Programa Principal de Busca do Menor e do Maior Elementos
numeros = [0]*10
preenche(numeros)
extremos = buscaMenorMaiorElementos(numeros)
escreve(extremos)
Busca do Menor e Maior ElementosBusca do Menor e Maior Elementos
49
cederj
# Subprogramas
def preenche(valores):
 ...
def buscaMenorMaiorElementos(valores):
 menor = valores[0] 
 maior = valores[0]
 for indice in range(1,len(valores)):
 if menor > valores[indice]:
 menor = valores[indice]
 elif maior < valores[indice]:
 maior = valores[indice]
 return [menor, maior]
def escrever(infos):
 ...
# Programa Principal de Busca do Menor e do Maior Elementos
numeros = [0]*10
preenche(numeros)
extremos = buscaMaiorMenorElementos(numeros)
escreve(extremos)
50
cederj
O algoritmo apresentado encontra o menor e o 
maior elementos em um vetor de n elementos.
Dado que cada um dos n elementos é avaliado 
necessariamente uma vez, a sua complexidade é da 
ordem de n, representado por O(n).
Busca do Menor e Maior ElementosBusca do Menor e Maior Elementos
51
cederj
Aula 6Aula 6
Conteúdo:
 - Algoritmos de Busca
- Busca Simples
- Busca com Sentinela
- Busca Binária
 - Busca do Menor e Maior Elementos
 - Noções de Complexidade de Algoritmos
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide 26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31
	Slide 32
	Slide 33
	Slide 34
	Slide 35
	Slide 36
	Slide 37
	Slide 38
	Slide 39
	Slide 40
	Slide 41
	Slide 42
	Slide 43
	Slide 44
	Slide 45
	Slide 46
	Slide 47
	Slide 48
	Slide 49
	Slide 50
	Slide 51

Continue navegando