Aula 14.

Slides:



Advertisements
Apresentações semelhantes
Projeto de Programação PD-I
Advertisements

Árvores CC/EC/Mestrado Teoria dos Grafos ‏ 1.
UFSC-CTC-INE INE Estruturas de Dados
Aula T-09 – BCC202 Listas (Parte 1) Túlio Toffolo www. decom. ufop
Geometria Computacional Fecho Convexo II
Inteligência Artificial
Complexidade de Algoritmos
Linguagem de Programação IX Métodos de Ordenação
Solved Exercises 1. Finding the Peak. Let A= a1,…,an be a sequence of n numbers with the following property: there is p in {1,…,n} for which (i) the.
05/08/2011 Professor Leomir J. Borba- –
TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS ESTRUTURAS DE DADOS AVANÇADAS Aula /08/2011 Professor Leomir J. Borba-
Algoritmos de Ordenação
Sinais e Sistemas – Capítulo 3
PERCEPTRON (CONTINUAÇÃO)
Análise Projeto de Algoritmos
Inteligência Artificial
Instituto de Computação - UFF Detecção de Terminação Algoritmos Distribuídos Professora: Lúcia Drummond.
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
Medida do Tempo de Execução de um Programa
David Menotti Estruturas de Dados I DECOM – UFOP
Computação Evolutiva: Programação Genética
Computação Evolutiva: Estratégias Evolutivas
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
NÃO DETERMINISMO Marcus Eduardo Cabral Seabra
Carolina Fonseca Neumar Ribeiro
Método de Ordenação: InsertionSort
Dividir-e-Conquistar
Recorrências.
Divisão e Conquista Análise de algoritmos UNISUL Ciência da Computação
INF 1771 – Inteligência Artificial
Ordenação de Dados.
Meta - heurísticas Prof. Aurora
Algoritmos de Ordenação 4
Algoritmos de Busca Parte II
ICC2 Aula 7 Fábio Nakano.
Informática Teórica Engenharia da Computação
Cálculo Numérico / Métodos Numéricos
Divisão (semana 6).
Complexidade de algoritmos e Classificação (Ordenação) de dados
Aula 13. Lembra... F(n)=F(n/2)+3 com F(1)=5 Obrigamos n a ser potência de 2, geralmente isso não agrada muito, pois os valores de n ficam muito restritos.
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Aulas 9,10 Fábio Nakano.
Busca com informação e exploração
Aula T06 – BCC202 Análise de Algoritmos (Parte 4) Túlio Toffolo
Introdução e Busca Cega
Introdução aos Agentes Inteligentes Busca Cega (Exaustiva)
Mergesort Katia Guimarães.
Algoritmos de Busca Local
Tópicos Avançados em Inteligência Artificial
Ceça Moraes – Introdução à Programação SI1
1 A COMPUTAÇÃO MODERNA Valdemar W. Setzer Depto. de Ciência da Computação da USP
O Processo de KDD Data Mining SUMÁRIO - AULA1 O processo de KDD
QuickSort Dividir: A[p…r] é particionado (reorganizado) em dois subvetores não vazios A[p…q] e A[q+1…r] tal que cada elemento de A[p…q] é menor ou igual.
Introdução à complexidade de algoritmos Luiz Gonzaga da Silveira Junior.
Aula 10 Algoritmos de Busca
Como analisar um algoritmo

Problemas NP-completos e Programação Dinâmica
DCC 001 Programação de Computadores 2º Semestre de 2011
Números Primos – algoritmos e aplicações
Análise e Síntese de Algoritmos
ATAL – Prof. Jorge Figueiredo Ordenação AT AL Análise e Técnicas de Algoritmos Análise de Algoritmos de Ordenação.
Análise e Síntese de Algoritmos Algoritmos GreedyCLRS, Cap. 16.
Computação Evolutiva Nome dado ao estudo de algoritmos cuja inspiração é o processo de evolução natural das espécies. Origem: trabalho de um pesquisador.
Berilhes Borges Garcia Algoritmos Uma ferramenta para resolver um problema de computação bem- especificado (O espírito da computação) Exemplo: ordenação.
Ordenação Professor Paulo Gomide 27 de outubro de 2015.
Ordenação (Sorting) Ordenar é dispor os elementos de um conjunto numa ordem ascendente ou descendente. Problema: Dados n números, arranjá-los em ordem.
Busca Heurística Prof. Valmir Macário Filho. 2 Busca com informação e exploração Capítulo 4 – Russell & Norvig Seção 4.1 Estratégias de Busca Exaustiva.
Comportamento Assintótico
Transcrição da apresentação:

Aula 14

Estratégias para resolução de problemas Um problema pode ser resolvido de várias formas, por exemplo, ordenar um conjunto de cartas pode ser feito por bogosort, por insertionsort, por bubblesort, por mergesort,... O trabalho (tempo computacional) que dá cada solução varia.

A escolha é nossa! bogosort usa uma estratégia PIOR que tentativa e erro (embora o caso médio seja igual ao de tentativa e erro). Fazer todas as combinações distintas de cartas e testar se cada combinação está ordenada é a solução pela estratégia de tentativa e erro) insertionsort e bubblesort usam a definição de “ordem” e uma estratégia tipo “força bruta”. mergesort usa a estratégia de divisão e conquista.

Tentativa e erro A maneira mais ingênua de resolver um problema – Experimentar todas as configurações possíveis e ver qual serve.

Tentativa e erro fora da computação Paradigma evolutivo – mutação aleatória e seleção natural. Em aprendizado e neurociência No desenvolvimento do sistema imune.

Supondo que o problema tenha solução e que o algoritmo está correto... COMPLEXIDADE!!

Numa realização O cavalo chega a uma posição e tem sete outras para explorar. Cada uma das sete dará origem a um novo ramo na árvore de resultados em cada um há uma casa a menos para vistar. Recorrência t(i)= c + b*t(i-1) onde i é o número de casas que estão para ser visitadas, b é a quantidade de ramos possíveis. t(0)=c

Quantos movimentos são possíveis? 2 3 4 6 8 2 3 4 6 8

Complexidade de tempo Recorrência t(i)= c + b*t(i-1) onde i é o número de casas que estão para ser visitadas, b é a quantidade de ramos de computação disparados. Durante uma execução, b varia, pode ir de zero a 8. Numa execução bem sucedida, b vale pelo menos 1. Na maioria dos casos vale mais que 1 e somente quando terminar, b=zero. A solução para a recorrência, para b cte é c*S(b^i)=c*(1-b^n)/(1-b), que é O(b^n) Como b>1, então a complexidade de tempo do algoritmo é exponencial.

Resolver o problema da mochila binária usando a estratégia de tentativa e erro. Uma mochila consegue carregar objetos até um certo peso. Temos diversos objetos com pesos também diversos. Os objetos não podem ser fracionados. Queremos levar o maior número de objetos possível.

Divisão e conquista Consiste em dividir o problema em partes menores, encontrar soluções para as partes, e combiná-las em uma solução global. Já conhecemos alguns busca binária Mergesort (ordenação por intercalação)

Busca binária

Ressalva 2: já vimos qual a recorrência e sua resolução tanto por prova por indução quanto pelo Teorema Mestre.

Mergesort (CLR) Merge-Sort (A, p, r) Merge(A,p,q,r) if (p<r) then q = (p+r)/2 Merge-Sort (A, p,q) Merge-Sort (A, q+1, r) Merge (A, p,q,r) Merge(A,p,q,r) p1=p p2=q+1 i=0; while ((p1<=q) and (p2<=r)) if (A(p1)<A(p2)) then B(i)=A(p1);p1++; else B(i)=A(p2);p2++; i++ while (p1<=q) B(i)=A(p1); i++;p1++ while (p2<=r) B(i)=A(p2); i++;p2++ for ( k=p to r) A(k)=B(i)

Merge-Sort

Merge

Complexidade de tempo - Recorrência T(n)  =  2 T(n/2) + c1*n+c2 Já resolvemos esta recorrência T(n)  =  2 T(n/2) + (n) E também já aplicamos o Teorema Mestre e dá T(n)= (n*log(n))

Fonte Java public class Merge { int[] merge(int[] a, int[] b) { int posa = 0, posb = 0, posc = 0; int[] c = new int[a.length + b.length]; // Enquanto nenhuma das seqüências está vazia... while (posa < a.length && posb < b.length) { // Pega o menor elemento das duas seqüências if (b[posb] <= a[posa]) { c[posc] = b[posb]; posb++; } else { c[posc] = a[posa]; posa++; } posc++; // Completa com a seqüência que ainda não acabou while (posa < a.length) { while (posb < b.length) { return c; // retorna o valor resultado da intercalação Menores menoresVetores(int[][] conjunto, int n) { int primeiro, segundo; if (conjunto[0].length < conjunto[1].length) { primeiro = 0; segundo = 1; primeiro = 1; segundo = 0; for (int i = 2; i < conjunto.length; i++) { if (conjunto[primeiro].length > conjunto[i].length) { segundo = primeiro; primeiro = i; } else if (conjunto[segundo].length > conjunto[i].length) { segundo = i; return new Menores(primeiro, segundo); int[][] removeVetores(int[][] conjunto, Menores menores) { int pos = 0; int[][] novo = new int[conjunto.length - 1][]; for (int i = 0; i < conjunto.length; i++) { if (i != menores.getPrimeiro() && i != menores.getSegundo()) { novo[pos++] = conjunto[i]; return novo; int[] merge(int[][] conjunto) { int tam = conjunto.length; int numCmp = 0; do { /* escolhe os dois menores vetores A e B (seleção gulosa) */ Menores menores = menoresVetores(conjunto, tam); int prim = menores.getPrimeiro(); int seg = menores.getSegundo(); int[] A = conjunto[prim]; int[] B = conjunto[seg]; /* V = V - { A, B }; */ conjunto = removeVetores(conjunto, menores); /* C = Intercala(A, B); */ int[] C = merge(A, B); /* V = V + { C } */ conjunto[tam - 2] = C; numCmp = numCmp + A.length + B.length - 1; tam = tam - 1; } while (tam > 1); System.out.println("Foram feitas " + numCmp + " Comparações"); return conjunto[0]; public static void main(String[] args) { int[][] conjunto = new int[][] { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, { 1, 2, 3, 4, 5 } }; Merge merge = new Merge(); int[] merged = merge.merge(conjunto); for (int i = 0; i < merged.length; i++) { System.out.print(merged[i] + " "); System.out.println(); class Menores { private int primeiro; private int segundo; public Menores(int primeiro, int segundo) { this.primeiro = primeiro; this.segundo = segundo; public int getPrimeiro() { return primeiro; public int getSegundo() { return segundo;