Buscar

Conjectura, RAM e Algoritmos

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 30 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 30 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 30 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

Conjectura: afirmação sem demonstração e ninguém fornece uma contra-prova que a 
afirmação é falsa.
-
Caso Base: n=1
1 = 12
Hipótese: n=k
1+3+5+...+(2k-1) = k2
Passo de Indução: n=k+1
1+3+5+...+(2(k+1)-1) = (k+1)2
1+3+5+...(2k-1) + (2(k+1)-1) = (k+1)2
k2 + (2(k+1)-1) = (k+1)2
k2 + 2k+1 = (k+1)2
Ex: 1+3+5+...+(2n-1) = n2○
Princípio da Indução Matemática:-
Técnicas de Demonstração de Teoremas
quarta-feira, 3 de março de 2010
08:02
 Página 1 de P.A.A. 
Random Acces Machine: modelo simplificado-
Instruções executadas sequencialmente (não há concorrência)-
Aritméticos: ADD, SUBTRACT, MULTIPLY, DIVIDE, REMINDER, FLOOR, CEILING○
Movimentação de Dados: LOAD, STORE, COPY○
Controle de Fluxo: JUMP INCONDICIONAL, CHAMA DE SUBROTINA, RETURN○
Há instruções comumente encontradas em computadores reais-
Cada instrução exige uma quantidade de tempo específica-
Tipos de Dados: Inteiro e Float-
Modelo RAM
Em geral, o tempo de execução de um algoritmo é proporcional ao (está em função do) 
tamanho da entrada.
-
Ex: ordenar, de forma crescente, a sequencia "1,2,3,4,5,6" é mais rápido que ordenar 
"6,5,4,3,2,1", na melhor da hipóteses (caso 1) serão feitas n comparações, e na pior 
(caso 2), serão feitas n*n comparações.
○
O formato da entrada influencia no tempo de execução do algoritmo-
Ex: multiplicação de 2 números○
Para muitos problemas, a medida mais natural é o número de itens da entrada. Para muitos 
problemas, a melhor medidade é a quantidade bits necessários para representar a entrada em 
notação binária.
-
Deve-se indicar a medidade do tamanho da entrada que está sendo usada em cada problema 
estudado.
-
Tamanho da Entrada do Problema: quantidade de dados que serão executados no programa
É o conjunto de passos (operações primitivas) executadas pelo algortimo.-
É necessário que seja tão independente de máquina quanto possível.-
Costuma-se adotar uma quantidade de tempo de execução constante "Ci " para cada linha "i".-
Tempo de Execução:
Paradigmas de Projetos de Algortimos
segunda-feira, 8 de março de 2010
10:53
 Página 2 de P.A.A. 
Abordagem Incremental: insere-se aos poucos os valores○
Ordenado o vetor A[1...(j-1)] insere-se um novo item A[j] em seu devido lugar em [1...j]○
Características:-
Entrada: uma sequência com "n" números A[i] = <a1, a2, ... , an>○
Saída: uma permutação <a'1, a'2, ... , a'n> tal que a'1 < a'2 < ... < a'n>○
Dados-
Código Custo Vezes
1. PARA j <- 2 ATÉ N FAÇA
2. KEY <- A[j] 
3. /*insere A[j] na sequência ordenada 
A[1..(j-1)] */
4. i <- j-1
5. ENQUANTO (i>0 E A[i]>KEY) FAÇA
6. A[i+1] <- A[i]
7. i <- i-1
8. FIM ENQUANTO
9. A[i+1] <- KEY
10.FIM PARA
C1
C2
C4
C5
C6
C7
C9
 
N
N-1
N-1
2+3+...+n
(2-1) + (3-1) + ... + 
(n-1)
(2-1) + (3-1) + ... + 
(n-1)
N-1
Tempo de Execução Total:
f(n) = ( C1 * N ) +
 [ C2 * (N-1) ] +
 [ C4 * (N-1) ] +
 [ C5 * (2+3+...+N) ] +
 [ C6 * ((2-1) + (3-1) + ... + (n-1)) ] +
 [ C7 * ((2-1) + (3-1) + ... + (n-1)) ] +
 [ C9 * (N-1) ]
 
 
 
- 1 (Provado por Indução)
 
 
 
(Provado por Indução)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-1 (Provado por Indução)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Tj significa o número de iterações realizadas no loop durante a execução do 
algoritmo

Supondo que:
 + 
 
 
 
 
 
 
 
□
 + 
 
□
 □
a*n+b□
Ɵ(n)□
Tj = 1
Melhor Caso:
Tj = j
Pior Caso:
Algortimo-
Exemplo: Ordenação por Inserção 
Incremental
segunda-feira, 8 de março de 2010
10:51
 Página 3 de P.A.A. 
 + 
 
 
 
 
 
 
 
□
 + 
 
 
 
 
 
 
 
 
 
 
□
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
□
a*n2 + b*n + c□
Ɵ(n2)□
Tj = j
Tj = j/2
Caso Médio:
 Página 4 de P.A.A. 
Conceito: Divide o problema em cários subproblemas similares ao problema original, mas menores. 
Resolve os problemas recursivamente e então combina as soluções para construir a solução do 
problema original.
Divida o problema em certo numero de subproblemas.-
Conquista os subproblemas ao resolvê-los recursivamente. Se os tamanhos dos subproblemas 
são pequenos, resolva-os trivialmente.
-
Combine as soluções dos subproblemas em uma solução para o problema original.-
Envolve 3 passos q cada nível de recursão:
Divida a sequência com itens em 2 subsequências, sendo cada com (n/2) itens.-
Conquista: orndene as 2 subsequências recursivamente usando merge sort. Retorne quando a 
sequência tiver 1 item.
-
A: é um vetor
p: inicial□
q: meio da sequência□
r: final□
p, q, r: índices que numeram os itens do vetor, tal que p<=q<r
merg(A,p,q,r),○
Combine: intercale as 2 subsequências ordenadas para produzir a resposta ordenada. Para 
realizar a intercalação, usa-se o procedimento:
-
O procedimento supõe que os subarrays A[p..q] e A[q+1..r] estão ordenandos. O 
procedimento interncala as 2 sequências para formar o subarray A[p..r]
Tempo de Execução expresso por uma função linear n=r-p+1. O número de itens intercalados-
Algoritmo: Ɵ(n)-
Merge(A,p,q,r)
01. n1 <- q-p+1 Cte
02. n2 <- r-p Cte
03. /*cria vetores L[1..n1+1] e R[1..n2+1]
04. PARA i <- 1 ATÉ n1 FAÇA N1+1
05. L[i] <- A[p+i-1] N1
06. FIM PARA
07. PARA j<- 1 ATÉ n2 FAÇA N2+1
08. R[j] <- A[q+j] N2
09. FIM PARA
10. L[n1 + 1] <- oo Cte
11. R[n2 + 1] <- oo Cte
12. i <- 1 Cte
13. j <-1 Cte
14. PARA k <- p ATÉ r r=p+1
15. SE (L[i] <= R[j]) ENTÃO
16. A[k] <- L[i]
17. i <= i+1
18. SENÃO
Exemplo: Ordenação por Merge segue se maneira estrita o paradigma "Divisão e Conquista".
Divisão e Conquista
segunda-feira, 8 de março de 2010
10:53
 Página 5 de P.A.A. 
18. SENÃO
19. A[k] <- R[j]
20. j <- j+1
21. FIM SE
22. FIM PARA
Melhor Caso: Ω(n lg n)
Pior caso: Ơ(n lg n)
 Página 6 de P.A.A. 
Indução
quarta-feira, 14 de abril de 2010
08:06
 Página 7 de P.A.A. 
Fibonacci
Retorna n;
Se (n <= 1){
}
Retorna Fib(n-1) + Fib(n-2);
Senão{
}
Fib(n){
}
Recursividade
quarta-feira, 14 de abril de 2010
08:07
 Página 8 de P.A.A. 
Exemplo: Encontrar um item numa tabela (verificar seqüencialmente todas as entradas da 
tabela) é chamado de busca linear.
Exemplo: encontrar os divisores de um número natural n.
- Força Bruta / Pesquisa Exaustiva: um algoritmo que enumera sistematicamente todas as 
alternativas possíveis para a solução, e verifica se cada alternativa satisfaz o problema.
Força Bruta
segunda-feira, 12 de abril de 2010
11:14
 Página 9 de P.A.A. 
Backtracking é uma árvore de pesquisa exaustiva, cujos nós correspondem a soluções parciais. 
Percorrer a árvore em direção às folhas corresponde a obter soluções parciais no caminho da 
solução final. Percorrer a árvore das folhas para a raiz corresponde a retroceder 
(backtracking). Para alguma solução parcial geral obtida anteriormente, a partir da qual seja 
interessante prosseguir em direção a outras folhas.
Exemplo: encontrar a saída de um labirinto: segue-se em uma direção, sempre guardando os 
pontos em que haja mais de um caminho a seguir. Ao encontrar o final de uma passagem, 
retorna-se ao último ponto guardado e percorre-se um novo caminho que ainda não havia sido 
percorrido. Fazer isto até sair do labirinto. (um algoritmo Força Bruta voltaria ao início a cada 
tentativa mal sucedida).
Exemplo: 3-coloring: seja o grafo G(V,E), que terão seus vértices coloridos, tal que 2 vértices 
adjacentes não podem ter a mesma cor. O número de soluções possíveis é 3n, onde n é o 
número de vértices.
Se (U=V) então imprima “Coloração Completa”Obtenha um vértice v que não pertença a U
Adicione v a U com cor c
3-cores (G,U)
Se nenhum vizinho de v está colorido com a cor c, então
Fim-Se
Para c<-1 a 3, faça
Fim-Para
Senão
Fim-Se
Inicio
Fim
- Branch and Bound: é uma variação do backtracking para problemas de otimização. Encontrar 
o mínimo ou o máximo de alguma função objetiva.
Exemplo: encontrar o mínimo de cores para coloris um grafo, sendo que vértices adjacentes 
não poder ter a mesma cor.
Se (U=V) então imprima “Coloração Completa”
Obtenha um vértice v que não pertença a U
Adicione v a U com cor c
3-cores (G,U)
Se nenhum vizinho de v está colorido com a cor c, então
Fim-Se
Para c<-1 a 3 m, faça
Fim-Para
Senão
Fim-Se
Inicio
Fim
- Tentativa e Erro / Backtracking: é uma melhoria para a abordagem “Força Bruta”. Durante a 
execução de um algoritmo “Tentativa e Erro”, é gerada uma árvore de subtarefas formada pelos 
possíveis caminhos de desenvolvimento do problema. Um algoritmo do tipo “Backtracking” 
consegue eliminar múltiplas soluções não-ótimas sem ser necessário examiná-las explicitamente. Tal 
melhoria economiza quantidade relevante de recursos que eram gastos analisando soluções 
inválidas.
Backtracking
segunda-feira, 12 de abril de 2010
11:14
 Página 10 de P.A.A. 
Dijkstra: o menor caminho de um vértice para todos os outros. Não funciona com pesos 
negativos
○
Entrada: G(V,A) não orientado, conexo, ponderado, com n vértices
Saída: árvore T
T <- uma aresta de peso mínimo
e <- aresta de peso mínimo incidente a um vértice em T e que não 
forme ciclo em T se adicionada à árvore
T <- T+{e}
Para i<-1 até n-2 faça
Fim-Para
Retorne T
Inicio
Fim
Prim: gradativamente insere-se novos vértices, partindo de qualquer aresta e formando 
o caminho através da escolha da menor aresta dentre as opções de escolha. Sempre 
tomando cuidado para manter a estrutura da árvore (não formar ciclos).
○
Kruskal: gradativamente insere-se novos vértices, escolhendo sempre a aresta de menor 
peso e formando o caminho através da escolha de outras menores arestas, formando 
várias árvores, se necessário. Sempre tomando cuidado para manter a estrutura da 
árvore (não formar ciclos). 
○
Entrada: G(V,A) não orientado, conexo, ponderado, com n vértices
Saída: árvore T
T<- vazia
"Construa uma fila de prioridade F contendo todas as arestas A com 
custos associados"
Insere (v, C)
Para cada vértice v que pertença a V faça
Fim-Para
C<- vazio
(v,w) <- retira(f)
C <- R1 união R2 - R1 - R2
Insere((v,w), T)
Se v e w estão em conjuntos distintos R1 e R2 em C, então
Fim-Se
Enquanto |C| < 1 faça
Fim-enquanto
Retorne T
Inicio
Fim
Árvore geradora minima é uma árvore que percorrerá os vértices○
Exemplo:
- Algoritmos Gulosos: constróem a solução a cada alternativa , sempre escolhendo a próxima que 
ofecere o benefício mais evidente e imediato.
Algortimos Gulosos
segunda-feira, 12 de abril de 2010
11:15
 Página 11 de P.A.A. 
Bellman-Ford: complexidade n3-
Floyd-Warshall: complexidade n3-
Entrada: G(V,A): grafo orientado, ponderado, com (n) vértices, representado pela matriz de adjacência C[n][n]
Saída: C[n][n] alterada
C[i][j] <- min ( C[i][j] , C[i][k] + C[k][j] ) //relaxamento: "sair de i e chegar em j passando por k"
Se (i != j) e (j != k) então
Fim-Se
Para j<-1 até n, faça
Fim-Para
Para i<-1 até n, faça
Fim-Para
Para k<-1 até n, faça
Fim-Para
Retorne C
Início
Fim
C 1 2 3
1 0 4 9
2 ∞ 0 1
3 7 ∞ 0
k i j Alterações
1 1 1 (sem alteração) : i=j
2 (sem alteração)
3 (sem alteração)
2 1 (sem alteração) : j=k
2 (sem alteração) : i=j
3 (sem alteração)
3 1 (sem alteração)
2 Alterado : C[3][2] = 11
3 (sem alteração) : i=j
2 1 1
2
3 Alterado : C[1][3] = 5 
2 1
2
3
3 1
2
3
3 1 1
2
3
2 1
2
3
Conceito: Calcula a solução para todos os subproblemas, partindo dos subproblemas menores para os maiores. Armazena os resultados dos 
subproblemas menores em uma tabela. A resolução dos subproblemas maiores utilizam os resultados dos menores.
É método de Tabulamento (não é um código computacional)Programação Dinâmica
segunda-feira, 12 de abril de 2010
08:00
 Página 12 de P.A.A. 
3 1
2
3
(n3)
Fibonacci-
mem[0] <- 0
mem[1] <- 1
ind <- 1
mem[ind+1] <- mem[ind]+mem[ind-1]
ind <- ind+1
Se (n= ind+1){
}
mem[n]<- fib(n-2)+fib(n-1)
ind<-n
Senão Se (n>ind){
}
Retorne mem[n]
Fib(n)
}
 Página 13 de P.A.A. 
Diferenças entre Paradigmas
Força-Bruta Backtracking Branch-and-Bound
Testa todas as opções e, se não obter 
sucesso, voltará ao início para tentar as 
outras opções.
Testa todas as opções e, se não obter 
sucesso, voltará ao subproblema anterior 
para tentar as outras opções.
Para de testar as opções quando nota-se que a 
melhor solução foi encontrada. Se não obter 
sucesso, voltará ao subproblema anterior para 
tentar as outras opções.
Incremental Gulosos
Adiciona-se um novo elemento à solução. Problemas de minimização
Gulosos Programação Dinâmica
Pode não resultar na solução ótima global porque faz uso de 
soluções ótimas locais (melhor solução, que é óbvia no 
momento).
- Utiliza o resultado de subproblemas para resolver problemas maiores.-
Não pode ser sempre utilizada porque nem sempre se tem a solução menor.-
Divisão e Conquista Prog. Dinâmica
Conquista é recursiva.-
Diferenças entre Algortimos de Árvore Geradora Mínima
Prim Kruskal
Procura a menor aresta adjacente.-
Sem formar ciclos.-
Procura a menor aresta.-
Sem formar ciclos.-
Diferenças entre Algortimos de Caminho Mínimo
Dijkstra Bellman-Ford Floyd-Warshall
Inicio em 1 vértices, fim em qualquer vértice.-
Não aceita pesos negativos-
Inicio em 1 vértices, fim em qualquer vértice.-
Aceita pesos negativos-
Início em qualquer vértices, fim em qualquer vértice.-
Aceita pesos negativos-
Algoritmos para Ciclos em Grafos
Ciclo Euleriano Caminho Euleriano Caminho Hamiltoniano
Passar por todos os vértices sem repetir arestas.-
Formar um ciclo (iniciar e terminar no mesmo vértice)-
Há solução se não houver vértice de grau ímpar.-
Passar por todas as arestas sem repetir vértices.-
Iniciar e terminar em quaisquer vértices.-
Há solução se todos os vértices ...-
Passar por todos os vértices sem repetir arestas.-
Iniciar e terminar em quaisquer vértices.-
...-
REVISÃO
segunda-feira, 10 de maio de 2010
10:23
 Página 14 de P.A.A. 
A ordem de crescimento de funções do tempo de execução dos algortimos fornece uma 
caracterização da eficiência do algoritmo e também permite comparar o desempenho de algoritmos 
distintos para o mesmo problema.
Apesar de, por vezes, ser possível determinar o tempo de execução exato do algoritmo, como foi 
feito para o algortimo de ordenação por inserção, a precisão pode não justificar a problemática do 
cálculo.
Ex: Se f(n2 + 4n + 60), para entradas grandes, basta f(n2)
Para entradas grandes, as constantes multiplicativas e termos de baixa ordem de um tempo de 
execução exatos são dominados pelos efeitos do tamanho da entrada do termo de mais alta ordem.
Ao se estudar tamanhos de entrada bastantegrandes para se conhecer a ordem de crescimento 
relevante, estuda-se a eficiência assintótica de algoritmos: o tempo de execução de um algoritmo 
aumenta com o tamanho da entrada no limite.
Geralmente, um algoritmo que é assintóticamente mais eficiente será a melhor escolha, exceto para 
entradas muito pequenas.
Notação Ơ (ômicron grande): fornece um limite superior (upper bound) de crescimento 
assintótico de uma função. Para uma função dada g(n), denota-se por Ơ(g(n)), o conjunto de 
funções:
-
Ơ(g(n)) = { f(n) : existem constantes positivas c e nƠ, tal que 0 <= f(n) <= c g(n)
 "é um conjunto": para qualquer n >= nƟ }
Uma função f(n) E Ơ(g(n)). Se há constante positiva c tal que f(n) é igual ou inferior a c g(n), 
para n suficientemente grande.
Um abuso de linguagem comum entre autores:
f(n) = Ơ(g(n)) ou f(n) é Ơ(g(n))
OBS: nƟ é o valor de entrada menor possível que, a partir desse valor, as entradas são 
consideradas grandes.Para valores menores, as funções não podem ser definidas como "mais 
eficiente" ou não.
f(n) = a*n + b
g(n) = n
Ex: Melhor Caso (Inserção):
Notação Ω (ômega grande): fornece um limite inferior (lower bound) de crescimento 
assintótico de uma função. Para uma função dada g(n), denota-se por Ω(g(n)), o conjunto de 
funções:
-
Ω(g(n)) = { f(n) : existem constantes positivas c e nƟ, tal que 0 <= c g(n) <= f(n)
 "é um conjunto": para qualquer n >= nƟ }
Uma função f(n) E Ω(g(n)). Se há constante positiva c tal que f(n) é igual ou superiora c g(n), 
para n suficientemente grande.
f(n) = a*n2 + b*n + c
g(n) = n2
Ex: Pior Caso (Inserção):
Um abuso de linguagem comum entre autores:
Notação de Funções
segunda-feira, 15 de março de 2010
10:05
 Página 15 de P.A.A. 
Um abuso de linguagem comum entre autores:
f(n) = Ω(g(n)) ou f(n) é Ω(g(n))
Notação Ɵ (teta): fornece um limite restrito (tight bound) de crescimento assintótico de uma 
função. Para uma função dada g(n), denota-se por Ɵ(g(n)), o conjunto de funções:
-
Ɵ(g(n)) = { f(n) : existem constantes positivas c1, c2, e nƟ, tal que 0 <= c1 g(n) <= f(n) <= c2 g(n)
 "é um conjunto": para qualquer n >= nƟ }
Uma função f(n) E Ɵ(g(n)). Se há constantes positivas c1 e c2 tal que f(n) é igual ou superior a c1
g(n) e f(n) é igual ou inferior a c2 g(n), para n suficientemente grande.
Um abuso de linguagem comum entre autores:
f(n) = Ɵ(g(n)) ou f(n) é Ɵ(g(n))
Melhor Caso: Ω(n lg n)
Pior caso: Ơ(n lg n)
Logo, Ɵ(n lg n) - (NÃO É CASO MÉDIO)
Ex: Merge Sort: (ver teorema abaixo)
Intuitivamente, vamos estudar a razão de se ignorar os termos de mais baixa ordem e os 
coeficientes do termo de mais alta ordem de uma função. Por exemplo:
 
 
 
Deve-se determinar constantes positivas c1, c2, e nƟ tal que:
 
 
 
 
Dividindo-se por n2, obtém-se: 
 
 
 
 
O lado direito da inequação pode ser verificado para qualquer valor n>= 1. Ao se escolher c2 >= 1/2
O lado esquerdo da inequação pode ser verificado para qualquer valor n>= 7. Ao se escolher c1 <=
1/14
Já que toda constante é um polinômio de grau zero, expressa-se Ɵ(n0) ou Ɵ(1), outro abuso de 
linguagem bastane utilizado.
Se f(n) E Ɵ(g(n)), então f(n) E Ơ(g(n)), porque Ɵ(g(n)) está contido em Ơ(g(n))
Teorema: para 2 funções f(n) e g(n), f(n) E Ɵ (g(n)) se, e somente se, f(n) E Ω(g(n)) e f(n) E Ơ(g(n)).
 Página 16 de P.A.A. 
Raiz: c*f(n)
a: número de chamadas recursivas (número de filhos da raiz)
Ex:
 
 
 
 
Nível 1: c*n
Nível 2: 2*c*n
Nível 3: 4*c*n
Nível 4: 8*c*n
...
Nível T(1): c*n2
 
Número de Níveis: 
Custo Total: 1cn+2cn+4cn+8cn+16cn...
 
 
 
 
Método Árvore de Recursão
segunda-feira, 29 de março de 2010
10:22
 Página 17 de P.A.A. 
Serve para obter limites assintóticos de recorrência par algoritmos de divisão e conquista.
Consiste, em princípio, em 2 passos:
1. Estimar (adivinhar) a forma da solução
2. Usar a indução matemática para encontar as constantes e mostrar que a solução está correta.
Ex:
 
 
 
 
Estima-se que a solução é Ơ(n lg n).
Deve-se provar que T(n) <= c n lg n par auma escolha apropriada da constante.
Hipótese (o limite é verificado para 
 
 
 ):
 
 
 
 
 
 
 
 
 
 
Substitui-se na recorrência:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Base da Indução: deve-se mostar que T(n) <= cnlg(n) é verificado para as condições de contorno.
Supõe-se que T(0)=0 e T(1)=1
 
 
 
 
 
Para n=1, o limite T(n)<=c*n*lg(n) torna-se T(1)<=c*1*lg(1), que não verifica T(1)=1
Utilizando-se notação assintótica, deve-se provar que T(n)<=cnlg(n) para n>=no, onde no é uma 
constante que deve ser escolhida.
 
 
 
 
 
P r T * * :
 
Para c=1, a base da indução falha.
Para c=2, a base da indução é verdadeira.
Concusão: para qualquer valor de n, apenas constantes maiores ou iguais a 2 atendem a condição.
A função "chão" foi retirada porque trata-se de 
uma inequação "menor ou igual".
Estudar PAA (Substituição)Método Substituição
segunda-feira, 22 de março de 2010
10:10
 Página 18 de P.A.A. 
Fornece limites para recorrência com a forma:
 
 
 
 
Onde T(n/b) representa a "conquista" e f(n) representa a "divisão".
a: quantas vezes o algortimo se chama
b: valor que o vetor é dividido a cada iteração
Teorema Mestre:
Considere a>=1, b>1 e f(n) é uma função.
 
 
 
 
 
 
 
 
 
 
 
 
 
T(n) pode ser limitada assintoticamente como:
Ou seja, usado quando 
1. Se para alguma constante e>0, então 
Ou seja, usado quando 
2. Se ,então .
Ou seja, usado quando 
3. Se para alguma constante e>0 e se 
 
 
 para alguma constante c<1 e 
todos n suficientemente grandes, entçao T(n)=Ɵ(f(n))
Ex:
 
 
 
 
a=9; b=3; f(n)=n
 
Como (assintoticamente), será usado o caso 1.
 
 
 
Logo, e=1.
Isso foi possível por que polinomialmente
Por sim, conclui-se que:
 
Ex:
 
 
 
 
a=1; b=3/2; f(n)=1
Método Mestre
segunda-feira, 22 de março de 2010
10:51
 Página 19 de P.A.A. 
a=1; b=3/2; f(n)=1
 
Como (assintoticamente), será usado o caso 2.
 
Ex:
 
 
 
 
a=3; b=4; f(n)=n*lg(n)
 
Como (assintoticamente), será usado o caso 3.
 
 
e=0,2
Verificar a condição de regularidade:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c=3/4
Como encontrou-se uma constante "c" válida, a condição foi satisfeita
Ex: 
 
 
 
 
a=2 ; b=2 ; f(n)=n*lg(n)
 
Como (assintoticamente), será usado o caso 3.
 
 
e=0, mas como e precisa ser maior que zero, não é possível resolver pelo Método Mestre
Ex:
 
 
 
 
a=4 ; b=2 ; f(n)=n
 
Como (assintoticamente), será usado o caso 1.
 
 
 
Logo, e=1.
Isso foi possível por que polinomialmente
Por sim, conclui-se que:
 
 Página 20 de P.A.A. 
Ex:
 
 
 
 
a=3 ; b=2 ; f(n)=n
 
Como (assintoticamente), será usado o caso 1.
 
 
 
Logo, e=1,58.
Por fim, conclui-se que:
 
 Página 21 de P.A.A. 
Ciclo Euleriano: percorre todas as arestas do grafo uma única vez. (voltando ao vértice inicial)
Caminho Hamiltoniano: percorre todos os vértices do grafo uma única vez. (não há algortimo que o resolva)
Caixeiro Viajante: percorrer todos os vértices formando um ciclo de custo mínimo.
A quantidade de vértices de grau ímpar (quantidade de vértices incidentes ímpar) é par.-
Um ciclo Euleriano não possui vértices de grau ímpar.-
Afirmações:
Ciclos e Caminhos em Grafos
quarta-feira, 14 de abril de 2010
08:59
 Página 22 de P.A.A. 
Força Bruta: um algoritmo trivial para resolver o PCV consiste em simplesmente enumerar todas as 
n! permutações dos n vértices do grafo. Calcular os custos de cada viagem corresponde a cada uma 
das permutações e escolher uam viagem de custo mínimo.
Algoritmo Guloso:
G(V,A) grafo conexo, ponderado, orientado, representado por uma matriz de adjacências.-
Vértice inicial i (passa a ser o vértice corrente durante o algoritmo)-
Entrada:
Vetor cv[] com n vértices, one n = |v|.-
Saída:
cv[]: (os vértices são nomeados por números inteiros)-
j: ajuda a procurar a soluçãoótima local-
temp: vértice da solução ótima local (que forma caminho de menor custo a partir de i atual)-
vis: quantidade de vértices que já foram visitados-
Inteiro:
cv[1] <- i
vis = 1
temp <- i
j <- 1
j <- j+1
continue //irá testar novamente o laço mais interno
Se (j = i) então //não avalia um vértice para ele mesmo
Fim-Se
j <- j+1
continue
Se (visitado(j, cv, vis)) então //não considera se já houve visita em j
Fim-Se
temp <- j
Se (m[i][temp] > m[i][j]) então
Fim-Se
j <- j+1
Enquanto j <= n faça
Fim-Enquanto
cv[vis+1] <- temp // atualiza o proximo vértice da rota
vis <- vis+1
i <- temp
Enquanto (vis < n) faça //quando todos os vertices forem visitados
Fim-Enquanto
Retorne cv;
Inicio
Fim
Procedimento auxiliar: verifica se o "j" pertence ao vetor "cv"
visitado(inteiro: j, cv, vis)
Inteiro k <- 1
Retorne Verdadeiro
Se (cv[k] = j) então
Enquanto (k < vis) faça
Inicio
Caixeiro Viajante
segunda-feira, 19 de abril de 2010
10:08
 Página 23 de P.A.A. 
Retorne Verdadeiro
Fim-Se
k <- k+1
Fim-Enquanto
Retorne Falso
Fim
Exemplo:
OBS: vértices não adjacentes também terão seus pesos representados por ∞
De - Para 1 2 3 4
1 ∞ 2 10 3
2 20 ∞ 3 2
3 2 5 ∞ 15
4 7 1 4 ∞
n i j temp vis cv
4 1 1 1 1 [1][][][]
2 2
3
4
5 2 [1][2][][]
2 1
2
3 3
4 4
5 3 [1][2][4][]
4 1
2
3 3
4
5 4 [1][2][4][3]
3
Tempo de Execução Polinomial: n2
Programação Dinâmica:
Vértice inicial: 1
Grafo: G(V, A)
Seja f(i, C), o custo do caminho mínimo do vértice i até o vértice 1, e que visita todos os vértices do 
conjunto C:
f(1, V - {1}) = min (C1k + f(k, V-{1, K})), 2 <= k <= n) (1)
Cik, peso da aresta (i, k)
Se conhecermos os valores de f(k, V-{1, k}), (para todo k)(2 <= k <= n), então por (1), resolve-se o 
PCV.
Pode-se generalizar (1):
f(i, C) = min (Cij + f(j, C-{j})), j pertence a C (2)
 Página 24 de P.A.A. 
f(i, C) = min (Cij + f(j, C-{j})), j pertence a C (2)
Os valores de f necessários em (1) para resolver o PCV podem ser obtidos de (2) de uma forma 
iterativa ascendente:
1. Para |C|=0 , f(i, 0)=Cij , para 1 < i ≤ n
2. Para |C|=1 , f(i, {j})= Cij + f(j, 0) = Cij + Cj1 , para 1 < i,j ≤ n e i diferente de j
3. Para |C|= 2, 3, ..., n-2, determinam-se os valores de f(i, C) através de (2) utilizando-se os valores 
de f calculados nas iterações anteriores. Deve-se considerar 1 < i ≤ n e conjuntos C tais que C ∩{1, i} 
é vazio
Exemplo de Terada (1991):
. 1 2 3 4
1 0 2 10 7
2 20 0 20 1
3 1 5 0 15
4 7 12 3 0
f(2, {3}) = C23 + C31 = 20+1 = 21
f(2, {4}) = C24 + C41 = 1+7 = 8
f(3, {2}) = C32 + C21 = 5+20 = 25
f(3, {4}) = C34 + C41 =15+7 = 22
f(4, {2}) = C42 + C21 = 12+20 = 32
f(4, {3}) = C43 + C31 = 3+1 = 4 
f(2, {3,4}) = min(C23 + f(2, {4}), C24 + f(4, {3})) = min(20+22, 1+4) = 5 (2->4->3->1)
f(3, {2,4}) = min(C32 + f(2, {4}), C34 + f(4, {2})) = min(5+8, 15+32) = 13 (2->3->4->1)
f(4, {2,3}) = min(C42 + f(2, {3}), C43 + f(3, {2})) = min(12+21 , 3+25) = 28
f(1, {2,3,4}) = min(C12 + f(2, {3,4})), C13 + f(3, {2,4}), C14 + f(4, {2,3}) = min(2+5, 10+13, 7+28) = 7
O menor caminho é 1->2->4->3->1
Tempo de Execução: (n22n)
 Página 25 de P.A.A. 
vo pertence a V, vo vértice "fonte", G(V, A)
Grafo: não orientado, com custos não negativos
Cvw = 0 se v=w e custo ∞ quando (v, w) não pertence a A
Matriz de adjacência
Entrada:
(dist) é um vetor, onde dist(v) é a distância mínima de v para cada v petencente a V
Saída:
C <- {vo} ; dist(vo) <- 0
Dist(v) <- custo(vo, v)
Para cada v pertencente a V-{vo} faça
Fim-para
Escolhe w pertence a V-C | Dist(w) seja mínimo
Insere(w, C)
Dist(v) <- min(Dist(v) , Dist(w)+Custo(v, w))
Para cada w pertencente a V-C faça
Fim-Para
Enquanto c é diferente de V faça
Fim-Enquanto
Retorne Dist
Início
Fim
Exemplo:
v0 v1 v2 v3 v4
v0 0 3 ∞ ∞ 11
v1 ∞ 0 3 2 7
v2 ∞ ∞ 0 ∞ 2
v3 ∞ ∞ 5 0 ∞
v4 ∞ ∞ ∞ 6 0
Iteração C w Escolhido Dist
w v1 v2 v3 v4
- v0 - - 3 ∞ ∞ 11
1 v0, v1 v1 3 3 6 5 10
2 v0, v1, v3 v3 5 3 6 5 10
3 V-{v4} v2 6 3 6 5 8
4 V v4 8 3 6 5 8
Desempenho máximo: n2 .
Dijkstra
segunda-feira, 26 de abril de 2010
10:50
 Página 26 de P.A.A. 
Vértice "fonte" v-
G(V, E) grafo orientado, conexo, ponderado, n=|V| representado por matriz de adjacências M-
Entradas:
Dist[n]-
Rota[n]-
Saída:
Dist[v] <- 0
Rota[v] <- 0
Dist[c] <- ∞
Rota[c] <- 0
Para c<-1 até n, onde c ≠ v, faça
Fim-Para
Alterado <- verdadeiro
c <- 1
Alterado <- falso
Dist[i] <- Dist[j]+M[j][i]
Rota[i] <- j
Alterado <- verdadeiro
Se (Dist[i] > Dist[j]+M[j][i]) então
Fim-Se
Para cada aresta (j, i) pertencente a E e i≠v faça
Fim-Para
c <- c+1
Enquanto (alterado e c ≤ n) faça
Fim-Enquanto
retorne "ciclo negativo"
Se (alterado e c>n) então
retorne (dist, rota)
Senão
Fim-Se
Início
Fim
Exemplo:
1 2 3 4 5
1 0 1 ∞ 3 1
2 ∞ 0 1 2 ∞
3 ∞ ∞ 0 4 2
4 ∞ ∞ ∞ 0 ∞
5 2 ∞ ∞ 1 0
Lista de Arestas:
(j,i) : (1,2) - (1,5) - (1,4) - (2,3) - (2,4) - (3,4) - (3,5) - (5,1) - (5,4)
 
Dist / Rota
1 2 3 4 5 Alterado c j i
0/0 ∞/0 ∞/0 ∞/0 ∞/0 F 1 1
1/1 V 2
Bellman Ford
quarta-feira, 28 de abril de 2010
08:09
 Página 27 de P.A.A. 
1/1 V 2
1/1 V 5
3/1 V 4
2/2 V 2 3
(s/alt) 4
(s/alt) 3
(s/alt) 5
(ñ exec.) 5 1
2/5 4
F 2 1
(s/ alt) 2
(s/ alt) 5
(s/ alt) 4
(s/ alt) 2 3
(s/ alt) 4
(s/ alt) 3
(s/ alt) 5
(s/ alt) 5 4
3
No pior caso: n3
 Página 28 de P.A.A. 
Tipos de Algortimos
Classe P: são resolvidos com tempo de execução polinomial por algortimos determinístico.○
Algoritmos Eficientes: resolvidos com tempo de execução polinomial-
Classe NP: são verificados com tempo de execução polinomial (ver "Instâncias") e resolvidos com tempo de execução polinomial não-
determinístico.
○
Outros Algoritmos: não se conhece algoritmo que o resolva e não foi provado nenhum algoritmo polinomial.-
Intratáveis: são os problemas demonstrados que não têm solução por algoritmo polinomial. São resolvidos com tempo de execução exponencial.-
NP Completude
NP-Difícil: problema que foram gerados a partir da redutibilidade de problemas da classe NP. Esses problemas são, pelo menos, tão difíceis 
quanto os problemas da classe NP. 
-
Teorema de Cook: SAT pertence à classe NP Completo○
NP-Completo: são problemas que pertencem á classe NP e à classe NP-Difícil.-
SAT
SAT Conjuntiva: (a + b) . (c + d) . (... +...)○
SAT Disjuntiva: (a . b) + (c . d) + (... . ...)○
Pertence à classe NP-Difícil porque todo problema da classe NP pode ser reduzido para SAT, portanto SAT é pelo menos tão difícil quanto 
os problemas NP.
○
Problema da Satisfabilidade: encontrar os valores lógicos para todas as "n" variáveis para que a expressão seja verdadeira.-
Otimização: Qual o menor caminho no grafo?
Decisão: Existe um caminho no grafo menor que 5? E menor que 3?
Otimização e Decisão: problema de otimização podem ser convertidos para problemas de decisão através da verificação de instâncias para 
o problema.
○
O fato de um problema ser verificado em tempo polinomial, não implica que a busca da melhor solução também é executada em tempo 
polinomial . (Problemas NP)
○
Instância: um conjunto de dados específico a ser utilizado como entrada de um algoritmo.-
Ex:○
 
Se reduz "A" para "B", então "B" é pelo menos tão dificil quanto "A".
Se "B" pode ser resolvido em tempo polinomial, logo "A" também pode porque os elementos de "A" tem correspondentes em "B" 
Se "A" não pode resolvido em tempo polinomial, logo "B" também não pode, porque há elementos de "A" em "B".
Todo elemento de "A" deve constar em "B", o contrário não precisa acontecer.
Teorema de Cook: Qualquer problema pode ser reduzido para o problema SAT.○
Redução Polinomial:-
NP-Completude
segunda-feira, 24 de maio de 2010
10:26
 Página 29 de P.A.A. 
Clique: usa um grafo ~G com (|V|-k ) vértices-
Cobertura de Vértices: usa um grafo G com (V) vértices-
Problemas NP
quarta-feira, 16 de junho de 2010
08:35
 Página 30 de P.A.A.

Outros materiais