Beruflich Dokumente
Kultur Dokumente
O projeto de algoritmos fortemente influenciado pelo estudo de seus comportamentos. Depois que um problema analisado e decises de projeto so finalizadas, necessrio estudar as vrias opes de algoritmos a serem utilizados, considerando os aspectos de tempo de execuo e espao ocupado. Muitos desses algoritmos so encontrados em reas como pesquisa operacional, otimizao, teoria dos grafos, estatstica, probabilidades, entre outras.
Algoritmos e Estrutura de Dados I
David Menotti
Anlise de um algoritmo particular. Qual o custo de usar um dado algoritmo para resolver um problema especfico?
David Menotti
Anlise de um algoritmo particular. Qual o custo de usar um dado algoritmo para resolver um problema especfico? Caractersticas que devem ser investigadas:
anlise do nmero de vezes que cada parte do algoritmo deve ser executada, estudo da quantidade de memria necessria
David Menotti
Anlise de um algoritmo particular. Qual o custo de usar um dado algoritmo para resolver um problema especfico? Caractersticas que devem ser investigadas:
anlise do nmero de vezes que cada parte do algoritmo deve ser executada, estudo da quantidade de memria necessria.
Anlise de uma classe de algoritmos. Qual o algoritmo de menor custo possvel para resolver um problema particular? Toda uma famlia de algoritmos investigada. Procura-se identificar um que seja o melhor possvel. Coloca-se limites para a complexidade computacional dos algoritmos pertencentes classe.
Algoritmos e Estrutura de Dados I
David Menotti
Custo de um Algoritmo
Determinando o menor custo possvel para resolver problemas de uma dada classe, temos a medida da dificuldade inerente para resolver o problema. Quando o custo de um algoritmo igual ao menor custo possvel, o algoritmo timo para a medida de custo considerada. Podem existir vrios algoritmos para resolver o mesmo problema. Se a mesma medida de custo aplicada a diferentes algoritmos, ento possvel compar-los e escolher o mais adequado.
David Menotti
David Menotti
Usa um modelo matemtico baseado em um computador idealizado. Deve ser especificado o conjunto de operaes e seus custos de execues. mais usual ignorar o custo de algumas das operaes e considerar apenas as operaes mais significativas. Ex.: algoritmos de ordenao. Consideramos o nmero de comparaes entre os elementos do conjunto a ser ordenado e ignoramos as operaes aritmticas, de atribuio e manipulaes de ndices, caso existam.
David Menotti
Funo de Complexidade
Para medir o custo de execuo de um algoritmo comum definir uma funo de custo ou funo de complexidade f. f(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n. Funo de complexidade de tempo: f(n) mede o tempo necessrio para executar um algoritmo em um problema de tamanho n. Funo de complexidade de espao: f(n) mede a memria necessria para executar um algoritmo em um problema de tamanho n. Utilizaremos f para denotar uma funo de complexidade de tempo daqui para a frente. A complexidade de tempo na realidade no representa tempo diretamente, mas o nmero de vezes que determinada operao considerada relevante executada.
Algoritmos e Estrutura de Dados I
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de A, se A contiver n elementos. Qual a funo f(n)?
Algoritmos e Estrutura de Dados I
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de A, se A contiver n elementos. Logo f(n) = n -1
Algoritmos e Estrutura de Dados I
David Menotti
Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n u 1, faz pelo menos n - 1 comparaes.
David Menotti
Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n u 1, faz pelo menos n - 1 comparaes. Prova: Cada um dos n - 1 elementos tem de ser investigado por meio de comparaes, que menor do que algum outro elemento.
David Menotti
Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n u 1, faz pelo menos n -1 comparaes. Prova: Cada um dos n - 1 elementos tem de ser investigado por meio de comparaes, que menor do que algum outro elemento. Logo, n-1 comparaes so necessrias
David Menotti
Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n u 1, faz pelo menos n -1 comparaes. Prova: Cada um dos n - 1 elementos tem de ser investigado por meio de comparaes, que menor do que algum outro elemento. Logo, n-1 comparaes so necessrias O teorema acima nos diz que, se o nmero de comparaes for utilizado como medida de custo, ento a funo Max do programa anterior tima.
David Menotti
A medida do custo de execuo de um algoritmo depende principalmente do tamanho da entrada dos dados. comum considerar o tempo de execuo de um programa como uma funo do tamanho da entrada. Para alguns algoritmos, o custo de execuo uma funo da entrada particular dos dados, no apenas do tamanho da entrada. No caso da funo Max do programa do exemplo, o custo uniforme sobre todos os problemas de tamanho n. J para um algoritmo de ordenao isso no ocorre: se os dados de entrada j estiverem quase ordenados, ento o algoritmo pode ter que trabalhar menos.
Algoritmos e Estrutura de Dados I
David Menotti
Melhor caso: menor tempo de execuo sobre todas as entradas de tamanho n. Pior caso: maior tempo de execuo sobre todas as entradas de tamanho n.
Se f uma funo de complexidade baseada na anlise de pior caso, o custo de aplicar o algoritmo nunca maior do que f(n).
Caso mdio (ou caso esperado): mdia dos tempos de execuo de todas as entradas de tamanho n.
David Menotti
Na anlise do caso mdio esperado, supe-se uma distribuio de probabilidades sobre o conjunto de entradas de tamanho n e o custo mdio obtido com base nessa distribuio.
A anlise do caso mdio geralmente muito mais difcil de obter do que as anlises do melhor e do pior caso.
comum supor uma distribuio de probabilidades em que todas as entradas possveis so igualmente provveis.
David Menotti
Considere o problema de acessar os registros de um arquivo. Cada registro contm uma chave nica que utilizada para recuperar registros do arquivo. O problema: dada uma chave qualquer, localize o registro que contenha esta chave. O algoritmo de pesquisa mais simples o que faz a pesquisa seqencial.
Algoritmos e Estrutura de Dados I
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
pior caso:
caso mdio:
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
caso mdio:
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
caso mdio:
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
No estudo do caso mdio, vamos considerar que toda pesquisa recupera um registro. Se pi for a probabilidade de que o i-simo registro seja procurado, e considerando que para recuperar o i-simo registro so necessrias i comparaes, ento:
f(n) = 1 x p1 + 2 x p2 + 3 x p3 + ... + n x pn
David Menotti
Para calcular f(n) basta conhecer a distribuio de probabilidades pi. Se cada registro tiver a mesma probabilidade de ser acessado que todos os outros, ento
pi = 1/n, 1 i n
David Menotti
Para calcular f(n) basta conhecer a distribuio de probabilidades pi. Se cada registro tiver a mesma probabilidade de ser acessado que todos os outros, ento
pi = 1/n, 1 i n
Nesse caso:
A anlise do caso esperado revela que uma pesquisa com sucesso examina aproximadamente metade dos registros.
Algoritmos e Estrutura de Dados I
David Menotti
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo (nmero de vezes que a chave de consulta comparada com a chave de cada registro).
melhor caso:
f(n) = (n + 1)/2.
David Menotti Algoritmos e Estrutura de Dados I
Considere o problema de encontrar o maior e o menor elemento de um vetor de inteiros A[n]; n u 1. Um algoritmo simples pode ser derivado do algoritmo apresentado no programa para achar o maior elemento.
void MaxMin1(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; if (A[i] < Min) Min = A[i]; } }
David Menotti
2*(n-1)
David Menotti
Seja f(n) o nmero de comparaes entre os elementos de A, se A contiver n elementos. Logo f(n) = 2(n-1) para n > 0, para o melhor caso, pior caso e caso mdio.
Algoritmos e Estrutura de Dados I
David Menotti
MaxMin1 pode ser facilmente melhorado: a comparao A[i] < Min s necessria quando a comparao A[i] > Max d falso.
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
David Menotti
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente;
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
Pior caso:
quando os elementos esto em ordem decrescente;
Caso mdio:
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
Pior caso:
quando os elementos esto em ordem decrescente; f(n) = 2(n 1)
Caso mdio:
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
Pior caso:
quando os elementos esto em ordem decrescente; f(n) = 2(n 1)
Caso mdio:
No caso mdio, A[i] maior do que Max a metade das vezes.
Algoritmos e Estrutura de Dados I
David Menotti
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
Pior caso:
quando os elementos esto em ordem decrescente; f(n) = 2(n 1)
Caso mdio:
No caso mdio, A[i] maior do que Max a metade das vezes. f(n) = n 1 + (n 1)/2 = 3n/2 3/2
David Menotti Algoritmos e Estrutura de Dados I
void MaxMin2(int A[n], int &Max, int &Min) { int i; Max = A[0]; Min = A[0]; for (i = 1; i < n; i++) { if (A[i] > Max) Max = A[i]; else if (A[i] < Min) Min = A[i]; } }
Melhor caso:
quando os elementos esto em ordem crescente; f(n) = n 1
Pior caso:
quando os elementos esto em ordem decrescente; f(n) = 2(n 1)
Caso mdio:
No caso mdio, A[i] maior do que Max a metade das vezes. f(n) = 3n/2 3/2
David Menotti Algoritmos e Estrutura de Dados I
Considerando o nmero de comparaes realizadas, existe a possibilidade de obter um algoritmo mais eficiente:
1.
Compare os elementos de A aos pares, separando-os em dois subconjuntos (maiores em um e menores em outro), a um custo de n/2 comparaes. O mximo obtido do subconjunto que contm os maiores elementos, a um custo de n/2 -1 comparaes O mnimo obtido do subconjunto que contm os menores elementos, a um custo de n/2 -1 comparaes
2.
3.
David Menotti
Considerando o nmero de comparaes realizadas, existe a possibilidade de obter um algoritmo mais eficiente:
1.
Compare os elementos de A aos pares, separando-os em dois subconjuntos (maiores em um e menores em outro), a um custo de n/2 comparaes. O mximo obtido do subconjunto que contm os maiores elementos, a um custo de n/2 -1 comparaes O mnimo obtido do subconjunto que contm os menores elementos, a um custo de n/2 -1 comparaes
2.
3.
David Menotti
Os elementos de A so comparados dois a dois. Os elementos maiores so comparados com Max e os elementos menores so comparados com Min. Quando n mpar, o elemento que est na posio A[n-1] duplicado na posio A[n] para evitar um tratamento de exceo. Para esta implementao:
David Menotti
Quantas comparaes so feitas em MaxMin3? 1. comparao feita 1 vez 2. comparao feita n/2 1 vezes 3. e 4. comparaes feitas n/2 1 vezes
David Menotti
Quantas comparaes so feitas em MaxMin3? 1. comparao feita 1 vez 2. comparao feita n/2 - 1 vezes 3. e 4. comparaes feitas n/2 1 vezes f(n) = 1 + n/2 1 + 2 * (n/2 1) f(n) = (3n 6)/2 + 1 f(n) = 3n/2 3 + 1 = 3n/2 - 2
David Menotti
A tabela apresenta uma comparao entre os algoritmos dos programas MaxMin1, MaxMin2 e MaxMin3, considerando o nmero de comparaes como medida de complexidade. Os algoritmos MaxMin2 e MaxMin3 so superiores ao algoritmo MaxMin1 de forma geral. O algoritmo MaxMin3 superior ao algoritmo MaxMin2 com relao ao pior caso e bastante prximo quanto ao caso mdio.
David Menotti
void exercicio2 (int n) { int i,j,a; a=0; for (i=0; i<n; i++) for (j=0; j<i; j++) a+=i+j; }
David Menotti