Buscar

Cap. 1 Introdução

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

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

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ê viu 3, do total de 28 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

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

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ê viu 6, do total de 28 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

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

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ê viu 9, do total de 28 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

Prévia do material em texto

INTRODUÇÃO
Complemento de Algoritmia e Complexidade
Capítulo I
 Corpo docente:
◦ Dikiefu Fabiano, Msc.
 Monitores:
◦ Bongo Cahisso (4º Ano)
◦ Hélio Sbantana (4º Ano)
 Avaliação
◦ 2 provas parcelares (PP1 e PP2)
◦ Um projecto (continuação do projecto da cadeira de AED + Análise da 
complexidade do código do projecto) Proj
◦ 1 Exame de Época Normal
 Nota final
◦ Época Normal: [(PP1+PP2+Proj)/3]*0,4 + EXN*0,6
◦ Época de Recurso: [(PP1+PP2+Proj)/3]*0,4 + REC*0,6
Nota
EXN: Exame Normal 
REC: Exame de Recurso
◦ bbbbb
Complemento de Algoritmo e Complexidade
Índice
1. Introdução
2. Fundamentos da análise da eficiência do algoritmo
2.1 Mecanismos de análise
2.1.1 Medição de tamanho de entrada
2.1.2 Unidades para medição de tempo de execução
2.1.3 Ordens de crescimento
2.1.4 Eficiências de pior caso, melhor caso e caso médio.
2.1.5 Sumário
2.2 Notação Assintótica e classes de eficiências básicas.
2.2.1 Definição Informal
2.2.2 Notações O,  e 
2.2.3 Propriedades de notações assintótica
2.2.4 Uso de limites para comparação de ordens de crescimento
2.2.5 Classes de eficiências básicas
2.3 Análise matemática de algoritmos não recursivos
2.4 Análise matemática de algoritmos recursivos
2.5 Exemplo: Números de Fibonacci
3. Força bruta
3.1 Ordenação por selecção e bolhas
3.2 Busca sequencial
3.3 Problemas de closest-pair e convex-hull
3.4 Busca exaustiva
3.4.1 Problema de comerciante viajante
3.4.2 Problema Knapsack
4. Divide e Conquista
4.1 Ordenação por Mergesort
4.2 Ordenação por Quicksort
4.3 Pesquisa Binária
4.4 Arvore binária transversal. Propriedades
Cont.
5. Reduz e conquista
5.1 Ordenação por inserção
5.2 Pesquisa em Depth-first e Breadth-first
5.3 Ordenação por topologia
5.4 Algoritmos do tipo Redução pelo factor constante
5.4.1 Problema de Fake-Coin (Moeda falsa)
5.4.2 Multiplicação à la Russe
5.4.3 Problema de Josephus
6. Transformar e conquistar
6.1 Pre-Ordenação
6.2 Eliminação de Gauss
6.3 Pesquisa balanceada de arvore
6.4 Heaps e Heapsort
6.5 Problemas de redução
O que é um algoritmo?
Um algoritmo é uma sequência de instruções 
inequívocas para resolver um problema, ou seja, 
para a obtenção de uma saída requerida para 
qualquer entrada legítimo em uma quantidade 
finita de tempo.
Computador
Problema
Algoritmo
Entrada Saida
Porquê Estudo Algoritmos?
 Todos programas do computador dependem de 
algoritimos
◦ Todas as empresas e muitas facetas da vida 
diária dependem de programas de computador
◦ Computadores e Telescópios
 Aprender a escrever Excelente Algoritmos 
significa aprender a usar Excelente Técnicas 
Resolução de Problemas
Porquê estudar algoritmos? (parte 2)
 Importância teórica
◦ o núcleo da ciência da computação
 Importância prática
◦ Conjunto de ferramentas de algoritmos 
conhecidos de um praticante
◦ Estrutura para desenhar e analisar algoritmos 
para novos problemas
Citação de Donald Knuth
Uma pessoa bem treinada em ciência da
computação sabe como lidar com algoritmos: como
construí-los, manipulá-los, compreendê-los, analisá-
los. Este conhecimento é a preparação para muito
mais do que escrever bons programas de
computador, é uma ferramenta mental, de propósito
geral, que será uma ajuda definitiva para a
compreensão de outras disciplinas, sejam eles
química, linguística, ou música, etc.
O que é um algoritmo?
 Receita, processo, método, técnica, 
procedimento de rotina, ... com os seguintes 
requisitos:
◦ Finitude
 termina depois de um número finito de passos
◦ Definitude
 rigorosamente e sem ambiguidades especificada
◦ Entrada
 As entradas válidas são claramente especificados
◦ Saída
 pode ser provado para produzir a saída correcta dada uma 
entrada válida
◦ Eficácia
 passos são suficientemente simples e básico
Pontos importantes de algoritmos a considerar
 Cada passo de um algoritmo deve ser não-ambígua.
Nota: isto não significa necessariamente – “deve ser 
discreto”
 A gama de inputs para um algoritmo tem de ser 
especificado com cuidado.
 O mesmo algoritmo pode ser representado de diversas 
maneiras.
 Podem existir vários algoritmos para resolver o mesmo 
problema.
◦ Algoritmos para o mesmo problema pode ser baseada em 
idéias muito diferentes e pode resolver o problema com 
velocidades dramaticamente diferentes (também, que as suas 
necessidades de recursos podem ser dramaticamente 
diferentes - geralmente estes são considerações opostas) 
 Suscita a noção de qual algoritmo é "melhor" (assumindo que ambos 
os algoritmos são "corretas"
Alguns problemas computacionais bem 
conhecidos. 
 Ordenação
 Busca
 Caminhos mais curtos no grafo
 Árvore Geradora Mínima (Minimum spanning 
tree)
 Testes de primalidade
 Problema do caixeiro viajante
 Problema da mochila
 Torres de Hanoi
Exemplo do problema computacional : Ordenação
 Declaração de problema:
◦ Entrada: Uma sequencia de n números <a1, a2, …, an>
◦ Saída: Uma sequencia de entrada reordenada 
<a1´, a2´, …, an´> tal que ai´≤ aj´ onde i < j
 Exemplo: A sequencia <5, 3, 2, 8, 3>
◦ Entrada: 5, 3, 2, 8, 3
◦ Saída : 2, 3, 3, 5, 8
 Algoritimos:
◦ Ordenação por Selecção
◦ Ordenação por Inserção
◦ Ordenação por intercalação (Mergesort)
◦ (muito outros)
Ordenação por Selecção
 Entrada: vector a[1],…,a[n]
 Saída: vector ordenada em ordem decrescente
 Algoritmo:
para i=1 até n
troca a[i] com menor de a[1],…a[n]
Questões básicas relacionadas aos Algoritmos
 Como projectar algoritmos
◦ Sua compreensão do domínio do problema (o que é um pré-requisito para 
resolver esse tipo de problema em geral), e compreensão da forma de 
representação das soluções irão necessariamente crescer e evoluir em 
paralelo.
 Como expressar algoritmos
◦ Pseudocódigo.
◦ Além disso, o nível de complexidade e expressividade será necessário. 
 Provando correção
◦ Fortes provas matemáticas de correção, às vezes é possível. 
 Eficiência
◦ A análise teórica
◦ A análise empírica
 Optimalidade
◦ Matematicamente, o que representa o melhor desempenho absoluto de 
qualquer algoritmo que possa surgir.
◦ Se o nosso algoritmo tem esse desempenho, então ele deve ser o ideal.
Análise de Algoritmos
 Como é bom o algoritmo?
◦ Correcto
◦ Eficiência de tempo
◦ Eficiência de espaço
 Será que não existe um algoritmo melhor?
◦ limites inferiores
◦ Optimalidade
Algoritmo de Euclide
Problema: 
Encontra o mdc(m,n), o máximo divisor comum de dois 
inteiros não negativo, não ambos zero m e n
Exemplos: mdc(60,24) = 12, mdc(60,0) = 60, mdc(0,0) = ?
Algoritmo de Euclides é baseado na aplicação repetida de 
igualdade
mdc(m,n) = mdc(n, m mod n)
até que o segundo número é 0, o que torna o problema 
trivial.
Exemplo: mdc(60,24) = mdc(24,12) = mdc(12,0) = 12
Não impressionado?
Qual é o máximo divisor comum entre 3885 e 1736?
mdc(3885, 1736)= mdc(1736,413)
= mdc(413,84)
= mdc(84,77)
= mdc(77,7)
= mdc(7,0) 
= 7
Duas descrições de algoritmo de Euclides
Euclide de Alexandria – 3rd Century B.C.
Passo 1 Se n = 0, retorna m e pára; 
Senão vá para o passo 2
Passo 2 Divide m por n e atribui o valor do resto para r
Passo 3 Atribui o valor de n para m e valor de r para n. 
Va para Passo1.
enquanto n ≠ 0 faça
r ← m mod n
m← n
n ← r
retorna m
Outro método para o cálculo de mdc(m,n)
 Algoritmo de verificação inteiro consecutivo
Passo 1 Atribuir o valor de min {m, n} para t
Passo 2 Divide m por t. Se o resto for 0, vá para a passo 3; 
caso contrário, vá para a passo 4
Passo 3 Divide n port. Se o resto for 0, retorna t e pára; caso 
contrário, vá para a passo 4
Passo 4 Reduz t por 1 e vá para a passo 2
Nota: Isto não funciona quando um dos números de 
entrada (m ou n) é zero.
Outro método para o cálculo de mdc(m,n)
 Procedimento do ensino médio
(Parafraseando a partir do seu professor de ensino médio, 
século 20):
Passo 1 Encontre os factores primos de m
Passo 2 Encontre a factores primos de n
Etapa 3 Encontre todos os factores primos comuns
Passo 4 Calcule o produto de todos os factores primos 
comuns e retorná-lo como mdc (m, n)
 É este um algoritmo?
Isso foi um algoritmo?
 Podes usar o algoritmo para encontrar mdc 
(23458222, 3423333)?
◦ Como encontrar as listas de factores primos?
◦ Como classifica estas listas para encontrar os 
factores em comum?
 O procedimento anterior, não é um algoritmo pois 
não é definitivamente inequívoca.
◦ além: encontrar a lista de factores principais para 
um grande número acaba por ser difícil
Crivo de Eratóstenes
O Crivo de Eratóstenes é um algoritmo e um método simples e prático para 
encontrar números primos até um certo valor limite. Segundo a tradição, foi criado 
pelo matemático grego Eratóstenes (a.c. 285-194 a.C.).
Para exemplificá-lo, vamos determinar a lista de números entre 1 e 20.
Inicialmente, determina-se o maior número a ser checado. Ele corresponde à raiz 
quadrada do valor limite, arredondado para baixo. No caso, a raiz de 20, 
arredondada para baixo, é 4.
Crie uma lista de todos os números inteiros de 2 até o valor limite: 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 e 20.
O primeiro número da lista 2 é um número primo.
Remova da lista todos os múltiplos do número primo encontrado. 
Neste caso temos: 2, 3, 5, 7, 9, 11, 13, 15, 17 e 19.
O próximo número da lista é primo. Repita o procedimento. No caso, o próximo 
número da lista é 3. 
Removendo seus múltiplos, a lista fica: 2, 3, 5, 7, 11, 13, 17 e19. 
3 é o último número a ser verificado pois que o 4 fora eliminado em virtude de 
ser multiplo de 2, conforme determinado inicialmente. Assim, a lista encontrada 
contém somente números primos.
Vide http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes
Crivo Erastótenes (Simulação)
Algoritmo
Entrada: inteiro n ≥ 2
Saida Lista de números primos menor ou igual que n
para p ← 2 até n faça 
A[p] ← p
para p ← 2 até n faça
Se A[p] ≠ 0 // p não tiver sido previamente eliminadas
// da lista
j ← p* p
enquanto j ≤ n faça
A[j] ← 0 // marca o elemento como eliminado
j ← j + p
Example: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Vide http://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes
Duas questões principais relacionadas com 
algoritmos
 Como desenhar algoritmos
 Como analisar a eficência do algoritmo
Estratégias de desenho de algoritmos
 A força bruta
 Dividir para conquistar
 Diminuir para conquistar
 Transformar e conquistar
 Abordagem gulosa
 Retrocesso(Backtracking) e Branch and bound
 Programação Dinamica
 Compensações de Espaço e Tempo (Space and time 
tradeoffs)
Estruturas de dados fundamentais
 lista
◦ Sequencial
◦ Ligadas
◦ Pilha
◦ Fila
◦ Fila de prioridade,
◦ etc
 Grafo
 Árvore
 Conjuntos e dicionário

Outros materiais