Ministério da Educação Instituto Federal de Educação, Ciência e Tecnologia Sudeste de Minas Gerais - Campus Rio Pomba Ciência da Computação Análise e Projeto de Algoritmos (Lista 1) Prof. Alex F. V. Machado 1) Dois algoritmos A e B possuem complexidade n3 e 2n, respectivamente. Existe uma situação que o algoritmo B poderia ser melhor que o A. Explique. 2) Determine a função de complexidade e a ordem de complexidade (no melhor, pior e caso médio) do algoritmo abaixo (considere a operação básica cada chamada do vetor v): MaxMin(vetor v) max=v[1]; min=v[1]; para i=2 até n faça se v[i]> max então max=v[i]; fimse se v[i]< min então min=v[i]; fimse fimpara; fim. 3) Qual é a ordem de complexidade das seguintes funções (utilize as 5 notações). a) f(n) = n2 + 2 d) g(n) = 10. 2n b) g(n) = 503 e) f(n) = n log n + log n c) g(n) = 2 log n + n 4) Escrever um algoritmo que determine se uma matriz quadrada de n (n<100) linhas e colunas é uma matriz permutação. Definir sua função de complexidade e suas ordems de complexidade (considere a operação primitiva a leitura a esta matriz quadrada). Uma matriz quadrada é chamada de matriz permutação se seus elementos são apenas 0’s e 1’s e se em cada linha e coluna da matriz existe apenas um único valor 1. Por exemplo, a seguinte matriz é de permutação: 1 0 0 0 0 1 0 1 0 5) Considere o algoritmo (o vetor array está em ordem crescente e N é o tamanho deste array): bool programaTeste ( int *array, int chave , int N) { int inf = 0; int sup = N-1; int meio; while (inf <= sup) { meio = (inf+sup)/2; if (chave == array[meio]) return true; else if (chave < array[meio]) sup = meio-1; else inf = meio+1; } return false; } a) Defina o que este algoritmo implementado em C faz. b) Defina sua função e ordem de complexidade nos três casos. c) Implemente um algoritmo com mesmo objetivo que o realize em O(n). 6) Considere os seguintes algoritmos: Algoritmo 1 //primeira parte----------------------------------------scanf("%d", &n); k = -1; for (i = 0; i < n; i = i + 1) { achou = FALSE; j = 0; while (j <= k) { if (numero[j] == elemento[i]) { achou = TRUE; freq[j] = freq[j] + 1; } j = j + 1; } if (!achou) { k = k + 1; numero[k] = elemento[i]; freq[k] = 1; } } //segunda parte----------------------------------------printf(" Resultado:\n"); for (j = 0; j <= k; j = j + 1) { printf("%d", numero[j]); printf("%d\n", freq[j]); } Algoritmo 2 //primeira parte----------------------------------------scanf("%d", &n); maior = 0; for (i = 0; i < n; i = i + 1) { indice = elemento[i]; freq[indice] = freq[indice] + 1; if ( indice > maior ){ maior = indice; } } //segunda parte----------------------------------------printf(" Resultado:\n"); for (j = 0; j <= maior; j = j + 1) { if( freq[j] != 0 ){ printf("%d", j); printf("%d\n", freq[j]); } } a) Sabendo que ambos têm o mesmo objetivo, defina-o. b) Defina a função de complexidade assintótica (considere a operação primitiva cada iteração do algoritmo e analise somente a primeira parte de cada algoritmo), as ordens de complexidade nos três casos para os dois algoritmos e aponte o melhor. c) Altere UMA LINHA do Algoritmo 1 para melhorar sua complexidade. Defina sua nova ordem de complexidade do pior caso. d) Dependendo da análise de complexidade feita o julgamento de melhor algoritmo (entre estes dois) poderia ser invertida. Defina-a.