UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação Técnicas de Projeto de Algoritmos Material disponível para download em: www.profvaniacristina.com Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Técnicas de Projeto de Algoritmos Para resolver um determinado problema podemos encontrar e/ou desenvolver vários algoritmos. Cada um com suas características e diferenças considerando alguns aspectos, a saber: Como o problema será resolvido; Quanto tempo ou quanto de memória será necessário; e O resultado alcançado, podendo ser exato, aproximado ou uma probabilidade de acerto. Utilizando conceitos de Estruturas de Dados, técnicas simples de Análise Estruturada ou de Análise Orientada a Objetos juntamente com bom senso e raciocínio lógico, é possível criar algoritmos que resolvem a grande maioria dos problemas. Entretanto, alguns outros problemas requerem a aplicação de Técnicas de Projeto de Algoritmos, que são algoritmos mais elaborados compreendendo métodos de codificação que evidenciam sua complexidade, considerando a forma de se alcançar a solução desejada. Veremos a seguir as seguintes técnicas: Divisão e Conquista, Gulosa e Backtracking Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Algoritmo de Divisão e Conquista 3 A técnica de desenvolvimento de algoritmos por divisão e conquista reflete a estratégia militar de dividir o território adversário para vencer cada uma das partes facilmente e depois juntar todos para formar uma grande nação. Alguns algoritmos tradicionais de ordenação fazem uso deste método que tem os seguintes passos: a entrada de dado problema é dividida em duas partes menores,; cada parte menor é resolvida recursivamente ou não; e as soluções das partes menores são combinadas gerando a solução do problema original. O método de ordenação Quicksort é um claro exemplo de utilização da divisão e conquista. Vamos relembrar como funciona: Definir um elemento do vetor identificado como pivô. Dividir o vetor em duas partições: na primeira ficam os elementos menores que o pivô e na segunda partição ficam todos os elementos maiores que o pivô. Conquistar ordenando as duas partições recursivamente. Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Algoritmo Guloso Problemas de Otimização Como uma empresa de mudança deve alocar os móveis em um caminhão baú Como uma companhia telefônica deve rotear chamadas de modo a fazer um melhor uso de suas linhas e conexões Como encontrar o menor caminho entre dois vértices em um grafo Como calcular o troco utilizando o mínimo de moedas possível Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Algoritmo Guloso A técnica de desenvolvimento de algoritmos conhecida como Algoritmo Guloso é utilizada quando necessitamos encontrar soluções ótimas com base em valores mínimos ou máximos para otimizar problemas, pois além de ser implementada facilmente e executada rapidamente, na maioria das vezes é um algoritmo simples e eficiente. Entretanto o algoritmo guloso, por tomar decisões baseado apenas na informação disponível, pode não atingir o resultado correto, pois nunca reconsidera as decisões tomadas. O algoritmo que calcula o melhor trajeto para se chegar a uma cidade pagando o menor valor de pedágio e o que calcula o troco com a menor quantidade de moedas são um exemplos clássicos desta técnica. Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Algoritmo Guloso Origem 3 7 9 7 Trajeto guloso Destino Origem 3 7 9 7 Trajeto ótimo Destino Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Algoritmo Guloso 7 Ao efetuar o trajeto o algoritmo guloso levou em consideração apenas o valor do pedágio e a partir da cidade de origem fez a escolha da menor tarifa entre duas cidades adjacentes, não se importando com outros custos e outras cidades. Esta não foi uma opção ótima, pois ao chegar à cidade de destino, foram gastos R$ 0,00. Trajeto guloso Origem 7 3 9 7 Destino No trajeto a seguir, a solução ótima foi encontrada e o custo final foi de R$,00. Trajeto ótimo Origem 7 3 9 7 Destino Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Este algoritmo calcula o menor número de moedas a serem utilizadas para um troco de R$ 0., funcionará sem problemas graças ao nosso sistema monetário e sempre será uma solução ótima, resultando em x 0,0, x 0.0 e x 0.0, num total de 3 moedas. Entretanto se moedas[] = {.0, 0.0, 0., 0., 0.0, 0.0} o resultado seria x 0.0, x 0. e x 0.0, num total de moedas, quando a solução ótima indica x 0.0 e 3 x 0,0, num total de moedas. algoritmo troco_guloso função faz_troco ( n ) : real var i : inteiro var x, moedas [ ] : real soma : real var y, troco [ ] : inteiro i = soma = 0 inicio enquanto ( i < =.e. soma < > n ) faça moedas [ ] = {.0, 0.0, 0., 0.0, 0.0, 0.0 } se ( soma + moedas [ i ] ) < = n então troco [ ] = { 0, 0, 0, 0, 0, 0 } troco [ i ] = troco [ i ] + x = faz_troco ( 0. ) soma = soma + moedas [ i ] para ( y de até ) faça senão se troco [ y ] < > 0 então i = i + escreva ( troco [ y ], x, moeda [ y ] fim_se fim_se fim_enquanto fim_para faz_troco = soma fim. fim_função Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Algoritmo Backtracking 9 A técnica de desenvolvimento de algoritmos por Backtracking utiliza um caminho metódico de tentativas de decisões para encontrar uma que resolva problema proposto, sem considerar o esforço para alcançar a solução. A partir de várias possibilidades de solução, sem informações suficientes para saber qual a ideal, as decisões vão sendo tomadas. Cada decisão abre um leque de novas escolhas, onde alguma ou algumas podem ser a solução esperada para o problema. Esta técnica é recomendada quando não se conhece uma regra fixa de computação para o problema, pois não se sabe o caminho exato a ser seguido para encontrar a solução. O algoritmo que utiliza a técnica do backtracking é recursivo, pois se durante a busca a solução não for encontrada o algoritmo retorna para a alternativa anterior (backtrack) a fim de fazer uma nova tentativa. Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Algoritmo Backtracking 0 Começo Êxito Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Algoritmo Backtracking Regiões: A, B, C, D, E, F, G Cores: vermelho, verde, azul Restrições: regiões vizinhas devem ter cores diferentes B C B C A D E A D E F F G G Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Algoritmo Backtracking Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Notação e Análise Assintótica de pior e melhor caso 3 Quando precisamos determinar qual o custo de um algoritmo para resolver um problema específico utilizamos a análise de algoritmos para calcular a sua complexidade em função do número de operações efetuadas (complexidade temporal) ou a quantidade de memória necessária (complexidade espacial). A partir da análise das operações, é gerada uma expressão matemática que determinará o tempo consumido pelo algoritmo. A complexidade temporal pode ser obtida por meio de um modelo matemático, que não depende da forma que o algoritmo foi implementado nem de um computador específico, pois o que será analisado será o custo das operações mais significativas, desprezando algumas operações, com base na quantidade dos dados de entrada. Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Notação e Análise Assintótica de pior e melhor caso Para analisar o custo de um algoritmo a partir de uma expressão, como por exemplo, n + ou n +, normalmente pensamos em valores pequenos para n e isto não afeta o tempo de execução, mesmo sendo um algoritmo ineficiente. Quando analisamos algoritmos para grandes valores de n as funções n + 00n, n, n /000, 3/n, o crescimento custo de tempo de todas é equivalente. Analisar o custo de um algoritmo baseado em n de tamanho grande é chamado de Análise Assintótica. Notação assintótica é a classificação das funções em ordens que determinam as suas equivalências. As três principais ordens são: Ordem Omicron (O), Ordem Omega (Ω) e Ordem Theta (Θ). Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Notação e Análise Assintótica de pior e melhor caso A ordem O (Omicron, lê-se big-oh, big-o) é a mais comum e mais utilizada, pois analisa o limite superior de entrada, ou seja, o pior caso, testando o processamento máximo utilizado. A Ordem Ômega (Ω) analisa o limite inferior de entrada, ou seja, o melhor caso, testando o processamento mínimo utilizado. A Ordem Theta (Θ), analisa valores médios de entrada, ou seja, o caso médio, utiliza bases estatísticas de dados e requer melhor conhecimento das entradas. Dependendo do conjunto de dados um algoritmo pode rodar mais rápido ou não. Geralmente os algoritmos são medidos pela complexidade de tempo do pior caso, e encontrar um caso médio pode ser muito difícil. Para determinadas áreas de aplicação (controle de tráfego aérea, cirurgias, etc.), a análise da complexidade do pior caso é fundamental. Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Notação e Análise Assintótica de pior e melhor caso Por meio da observação e comparação das taxas de crescimento do tempo, a análise assintótica estabelece uma ordem relativa entre funções. As principais taxas de crescimento são: Para termos uma noção da ordem de crescimento do custo de tempo dos algoritmos a tabela a seguir apresenta alguns exemplos comparativos. n Nome Função Constante Logarítmica Linear Linear Logarítmica log n n n log n Quadrática n Cúbica n 3 Exponencial n Fatorial n! Alg. Alg. Alg. 3 Alg. Alg. Alg. log n n n log n n n 3 n 0 0 0 3,3 0 33 00.000 0 00, 00 0.000.000.000,7 * 0 30.000 9,97.000 9.9.000.000 0 9,07 * 0 30 Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC
Notação e Análise Assintótica de pior e melhor caso 7 Como exemplo, considere o número de operações de cada um dos dois algoritmos que resolvem o mesmo problema, como função de n. Algoritmo : f(n) = n + n operações Algoritmo : f(n) = 00n + 000 operações Dependendo do valor de n, o Algoritmo pode requerer mais ou menos operações que o Algoritmo. Operações n 0 00.000 0.000 00.000 n + n 0 0.00.00.000 00.00.000 0.000.00.000 00n + 000 9.000.000 0.000.00.000 0.00.000 Podemos observar que termos inferiores contribuem pouco na comparação e podem ser descartados. Operações n 0 00.000 0.000 00.000 n 00 0.000.000.000 00.000.000 0.000.000.000 00n.000 0.000 00.000.000.000 0.000.000 Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC Notação e Análise Assintótica de pior e melhor caso Uma unidade de tempo (UT) é medida em milissegundos. Podemos ter uma aproximação do tamanho de problemas que podem ser resolvidos a partir de uma entrada n e uma UT. Veja um exemplo na tabela a seguir, com cinco algoritmos com complexidades distintas. Algoritmo Complexidade de tempo segundo minuto hora A n.000 0.000 3.00.000 A n log n 0.9 0.000 A3 n 3,,9.97, A n 3 0 39, 3,3 A n 9 Profa. Vânia Cristina de Souza Pereira 03 _ Material de Apoio Notas de Aula Pesquisa e Ordenação CC