MCTA028 – Programação Estruturada Aula 02: Custos de um algoritmo e funções de complexidade Prof. Jesús P. Mena-Chalco [email protected] 3Q-20106 1 Linguagem C: Tipos de dados 2 Linguagem C: Tipos de dados Tipos de dados primários. Tipos de dados derivados. Tipos definidos pelo usuário. (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 3 Linguagem C char tem 8 bits (não é 16 bits como em Java) não existe tipo booleano (usar int ou char): 0 falso ≠ 0 verdadeiro Na verdade C99 permite o uso de palavras true/false nos programas (mas o compilador os trata como os valores 1 e 0 de qualquer forma) tipos inteiros podem ser signed ou unsigned não tem tipo string: usa-se vetor de char 4 Linguagem C: Números inteiros (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 5 Linguagem C: Números reais (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 6 Linguagem C: Caracteres (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 7 Linguagem C: void (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 8 Tipos de dados (tipos.c) Size of char is 1 bytes Size of short is 2 bytes Size of int is 4 bytes Size of long is 8 bytes Size of float is 4 bytes Size of double is 8 bytes Size of long double is 16 bytes $ uname ­a Linux xxxxxxxxx 4.2.0­c9 #1 SMP x86_64 x86_64 x86_64 GNU/Linux 9 Executando um programa 10 $ gcc hello­c­world.c $ ./a.out $ gcc hello­c­world.c ­o hello­c­world.exe $ ./hello­c­world.exe $ echo $? 11 12 Especificadores de formato %c %s char string %i ou %d %f ou %lf inteiro float (promoção para double) Exemplo: printf("%3.2f\n", 1.234); printf("%.2f\n", 1234.678); → 1.23 → 1234.68 13 Especificadores de formato The color: blue First number: 12345 Second number: 0025 Third number: 1234 Float number: 3.14 Hexadecimal: ff Octal: 377 Unsigned value: 150 Just print the percentage sign % 14 Especificadores de formato P = blue Q = 1234 R = 3.141590 15 Custo de um algoritmo e funções de complexidade Introdução baseada nas aulas do Prof. Antonio A. F. Loureiro (UFMG) 16 1995 2015 17 Medida do tempo de execução de um programa Algoritmos são encontrados em todas as áreas de Computação. O projeto de algoritmos é influenciado pelo estudo de seus comportamentos. Análise de algoritmos? 18 (1) Análise de um algoritmo particular Qual é o custo de usar um dado algoritmo para resolver um problema específico? Características que devem ser investigadas: Tempo de execução. Quantidade de memória. 19 (2) Análise de uma classe de algoritmos Qual é o algoritmo de menos custo possível para resolver um problema particular? Toda uma familia de algoritmos é investigada. Procura-se identificar um que seja o melhor possível. Colocam-se limites para a complexidade computacional dos algoritmos pertencentes à classe. 20 21 Custo de um algoritmo Se conseguirmos determinar o menor custo possível para resolver problemas de uma dada classe, então teremos a medida da dificuldade inerente para resolver o problema. Quando um algoritmo é igual ao menor custo possível, o algoritmo é ótimo para a medida de custo considerada. Podem existir vários algoritmos para resolver um mesmo problema. → Se a mesma medida de custo é aplicada a diferentes algoritmos então é possível compará-los e escolher o mais adequado. 22 Fonte: http://hqwallbase.com/images/big/stairways-1514922.jpg 23 Medida de custo pela execução de um programa em uma plataforma real 24 (1) Medida de custo pela execução de um programa em uma plataforma real Tais medidas são bastante inadequadas e os resultados jamais devem ser generalizados: Os resultados são dependentes do compilador que pode favorecer algumas construções em detrimento de outras; Os resultados dependem de hardware; Quanto grandes quantidades de memória são utilizadas, as medidas de tempo podem depender deste aspecto. 25 (1) Medida de custo pela execução de um programa em uma plataforma real Tais medidas são bastante inadequadas e os resultados jamais devem ser generalizados: Os resultados são dependentes do compilador que pode favorecer algumas construções em detrimento de outras; Os resultados dependem de hardware; Quanto grandes quantidades de memória são utilizadas, as medidas de tempo podem depender deste aspecto. Apesar disso, há argumentos a favor de se obterem medidas reais de tempo: Exemplo: Quando há vários algoritmos distintos para resolver o problema; Assim, são considerados tanto os custos reais das operações como os custos não aparentes, tais como alocação de memória, indexação, carga, dentre outros. 26 Medida de custo por meio de um modelo matemático 27 28 (2) Medida de custo por meio de um modelo matemático 29 (2) Medida de custo por meio de um modelo matemático Usa um modelo matemático baseado em um computador idealizado. Deve ser especificado o conjunto de operações e seus custos de execuções. É mais usual ignorar o custo de algumas das operações e considerar apenas as mais significantes. Em algoritmos de ordenação: Consideramos o conjunto de comparações entre os elementos do conjunto a ser ordenado e ignoramos as operações aritméticas, de atribuição e manipulação de índices, caso existam. 30 Função de complexidade 31 Função de complexidade Para medir o custo de execução de um algoritmo, é comum definir uma função de custo ou função de complexidade f. Função de complexidade de tempo: mede o tempo necessário para executar um algoritmo para um problema de tamanho n. Função de complexidade de espaço: mede a memória necessária para executar um algoritmo para um problema de tamanho n. 32 Função de complexidade Para medir o custo de execução de um algoritmo, é comum definir uma função de custo ou função de complexidade f. Função de complexidade de tempo: mede o tempo necessário para executar um algoritmo para um problema de tamanho n. Função de complexidade de espaço: mede a memória necessária para executar um algoritmo para um problema de tamanho n. Utilizaremos f para denotar uma função de complexidade de tempo daqui para frente. Na realidade, f não representa tempo diretamente, mas o número de vezes que determinada operação (considerada relevante) é realizada. 33 Exemplo: Maior elemento Considere o algoritmo para encontrar o maior elemento de um vetor de inteiros A[0...n-1], para n>=1 34 Exemplo: Maior elemento Seja f uma função de complexidade tal que de comparações entre os elementos de A. é o número Logo: 35 Exemplo: Maior elemento 36 Tamanho da entrada de dados A medida do custo de execução de um algoritmo depende principalmente do tamanho de entrada dos dados. É comum considerar o tempo de execução de um programa como uma função do tamanho de entrada. 37 Tamanho da entrada de dados A medida do custo de execução de um algoritmo depende principalmente do tamanho de entrada dos dados. É comum considerar o tempo de execução de um programa como uma função do tamanho de entrada. → No caso da função para determinar o máximo, o custo é unifome (n-1) sobre todos os problemas de tamanho n. → Já para um algoritmos de ordenação isso não ocorre: se os dados de entrada estiverem quase ordenados, então o algoritmo pode ter que trabalhar menos. 38 Melhor caso, pior caso e caso médio Melhor caso: Menor tempo de execução sobre todas as entradas de tamanho n. Pior caso: Maior tempo de execução sobre todas as entradas de tamanho n. Caso médio (caso esperado): Média dos tempos de execução de todas as entradas de tamanho n. Aqui supoe-se uma distribuição de probabilidades sobre o conjunto de entradas de tamanho n. Introdução baseada nas aulas do Prof. Antonio A. F. Loureiro (UFMG) 39 Exemplo: Busca de um registro Considere o problema de acessar os registros de um arquivo (cada registro tem chave única). O problema: Dada uma chave qualquer, localize o registro que contenha esta chave → Considere o algoritmo de busca sequencial. 40 Exemplo: Busca de um registro 41 Exemplo: Busca de um registro 42 Exemplo: Busca de um registro Seja f uma função de complexidade tal que f(n) é o número de registros consultados. Melhor caso: Quando o elemento procurado é o primeiro consultado 43 Exemplo: Busca de um registro Seja f uma função de complexidade tal que f(n) é o número de registros consultados. Melhor caso: Pior caso: Quando o elemento procurado é o primeiro consultado Quando o elemento procurado é o último consultado 44 Exemplo: Busca de um registro Seja f uma função de complexidade tal que f(n) é o número de registros consultados. Melhor caso: Quando o elemento procurado é o primeiro consultado Pior caso: Quando o elemento procurado é o último consultado Caso médio: 45 Exemplo: Busca de um registro (caso médio) Consideremos que toda pesquisa recupera um elemento. Para recuperar o i-ésimo elemento são necessárias i comparações. 46 Exemplo: Busca de um registro (caso médio) Consideremos que toda pesquisa recupera um elemento. Para recuperar o i-ésimo elemento são necessárias i comparações. Seja a probabilidade de que o i-ésimo elemento seja procurado: Se cada elemento tiver a mesma probabilidade de ser escolhido que todos os outros, então Uma pesquisa examina aproximadamente metade dos elementos 47 Comparando programas 48 Comparação de programas Exemplo: O programa1 leva O programa2 leva vezes para ser executado. vezes para ser executa. Qual dos dois é o melhor? 49 Comparação de programas Exemplo: O programa1 leva O programa2 leva vezes para ser executado. vezes para ser executa. Qual dos dois é o melhor? Depende do tamanho do problema. Para n<50, o programa 2 é melhor Para n>50, o programa 1 é melhor 50 Comparação de programas 51 Comparação de funções de complexidade Introdução baseada nas aulas do Prof. Antonio A. F. Loureiro (UFMG) 52 (*) Fonte: http://algs4.cs.princeton.edu/14analysis/ 53 Atividade em aula 54 Atividade em aula 2 3 3.46 x 120 128.456000 55 Atividade em aula 56 Atividade em aula 6.00E+47 5.00E+47 4.00E+47 3.00E+47 2.00E+47 f1 f2 f3 f4 f5 1.00E+47 0 57 Atividade em aula 1.00E+50 1.00E+45 1.00E+40 1.00E+35 1.00E+30 1.00E+25 1.00E+20 1000000000000000 f1 f2 f3 f4 f5 10000000000 100000 1 58