O documento discute conceitos sobre algoritmos e complexidade algorítmica. Aborda o que é um algoritmo, análise de algoritmos, complexidade de algoritmos e critérios para escolha de algoritmos, enfatizando a importância da eficiência.
• Algoritmo: uma sequência finita (lógica) de operações que a
partir de um conjunto de variáveis como entrada produz uma saída
desejada.
• Um algoritmo é uma sequência não ambígua de instruções que é
executada até que determinada condição se verifique. Mais
especificamente, em matemática, constitui o conjunto de
processos (e símbolos que os representam) para efetuar um
cálculo.
5.
• A análise de algoritmos é uma atividade que contribui para o entendimento fundamental
da Ciência da Computação. A construção de um algoritmo deve visar não apenas à solução
de um determinado problema, mas à construção de um algoritmo bom, ou seja, que
solucione o problema e seja eficiente. Conhecer a complexidade de um algoritmo é
importante para poder decidir se a implementação do algoritmo é viável.
• A complexidade de algoritmos consiste na quantidade de trabalho necessária para a sua
execução, expressa em função das operações fundamentais, as quais variam de acordo
com o algoritmo, e em função do volume de dados.
• Uma das mais importantes medidas de complexidade de algoritmos é a medida de tempo.
Isto se justifica em razão de boa parte da pesquisa em Ciência da Computação consistir do
projeto e análise de algoritmos em relação à eficiência, ou seja, projetar algoritmos que
forneçam a solução do problema em tempo aceitável.
• Quando existe mais de um algoritmo para a resolução de um mesmo problema é necessário que
o analista possa identificar qual dos algoritmos é o mais indicado, seja em termos de precisão ou
tempo de execução Neste momento uma metodologia que auxilie no processo de análise seria o
mais indicado para que o analista pudesse fazer, com boa margem de segurança, a melhor
escolha.
6.
Análise de algoritmos
• O que significa?
• Prever os recursos que o algoritmo necessitará
•Tempo, memória, largura de banda, hardware...
• O Tempo
• Número de operações primitivas ou etapas executadas
• Depende do tamanho da entrada
• Formas de analisar
• Contar todas as instruções – custo exacto.
• Contar as instruções mais importantes (mais executadas, mais caras) – custo
aproximado.
7.
Análise de algoritmos
• Da mesma forma que distinguimos um algoritmo de sua aplicação a
uma particular “entrada”, convém distinguir problemas de suas
instâncias. Todo problema computacional é uma colecção de
instâncias.
• Cada instância do problema é definida por um particular conjunto de
dados. O tamanho de uma instância de um problema é a quantidade de
dados necessária para descrever a instância. O tamanho de uma
instância é descrito, em geral, por um só número natural, mas às vezes é
conveniente usar dois ou até mais números. A ideia de tamanho
permite dizer que uma instância é menor ou maior que outra.
• A palavra instância é um neologismo importado do inglês. Ela está sendo empregada aqui no sentido de exemplo, espécime, amostra, ilustração.
Características dos Algoritmos
• Independente: Não depende de linguagem de programação ou de maquina
(computador).
• Definido: Algoritmo deve ter passos claros e concretos.
• Finito: Um algoritmo começa e precisa que seja terminado (tenha fim)
• Preciso: Cada passo precisa um calculo correcto.
• Capacidade de receber dado(s) de entrada do mundo exterior;
• Poder gerar informações de saída para o mundo externo ao do ambiente do
algoritmo;
• Ser efetivo (todas as etapas especificadas no algoritmo devem ser alcançáveis em
um tempo finito).
• Não dar margem à dupla interpretação (não ambíguo)
11.
Qualidades de um Algoritmo
Abaixo algumas das qualidades dos algoritmos :
• Geral : E desejável que o algoritmo seja capaz de resolver uma classe de problemas o mais
amplo possível.
• Eficiente: Um algoritmo é eficiente quanto menos recursos em tempo, espaço (de
memória) e processadores consumir.
• Corretude (Correto) : Para qualquer algoritmo, nós devemos provar que ele sempre retorna
a saída desejada para todas as instâncias válidas do problema.
• Levando em consideração que um problema pode ter mas de uma vida de solução, temos
que ser capazes de decidir qual é o algoritmo mais eficiente, o que menos tempo demore
em resolver o problema, o que menos recursos utilize.
• De modo geral é difícil encontrar um algoritmo que reúna todas as qualidades, mas o que
devemos procurar é um algoritmo que satisfaça melhor os requisitos de um dado
problema.
Tempo de execução, recursos de sistema usados,
portabilidade e fiabilidade. Ou seja, seu algoritmo pode
ser portado para qualquer aplicativo que necessite
daquele processamento para o qual seu algoritmo foi
criado. Isso é importante quando se trabalha em escala,
fazendo mais de um software.
Seu algoritmo é capaz de lidar com todos os possíveis
erros que possam ser introduzidos em dados ou pelo
usuário?
14.
•Porque analisar a eficiência de um algoritmo se os
computadores estão cada dia mais rápidos ?
Complexidade
•A Complexidade de um algoritmo consiste na
quantidade de " trabalho " necessária para a sua
execução, expressa em função das operações
fundamentais, as quais variam de acordo com o
algoritmo, e em função do volume de dados.
17.
Complexidade
• Complexidade: Visa definir a expressão matemática que expressa a
quantidade de passos gastos por um algoritmo para resolver um certo
problema em relação ao tamanho da entrada.
• A complexidade mede o tempo relativo de execução e/ou uso da memória. Uma
análise da complexidade de um algoritmo pode-se focar em uma série de
especificações quanto sua execução e/ou uso da memória, como o melhor caso
possível, o que, em até mesmo o caso médio. Da mesma maneira pode-se desejar a
complexidade total (ou real) apenas a complexidade assintótica.
18.
Complexidade
• Muitas vezes as pessoas quando começam a estudar algoritmos
perguntam-se qual a necessidade de desenvolver novos algoritmos para
problemas que já têm solução. A performance é extremamente
importante na informática pelo que existe uma necessidade constante
de melhorar os algoritmos. Apesar de parecer contraditório, com o
aumento da velocidade dos computadores, torna-se cada vez mais
importante desenvolver algoritmos mais eficientes, devido ao aumento
constante do "tamanho" do problemas a serem resolvidos.
• Devido a este factor surge a Complexidade Computacional, pois e
através dela que se torna possível determinar se a implementação de
determinado algoritmo é viável.
Complexidade
• O tempo de execução não depende somente do
algoritmo, mas do conjunto de instruções do
computador, a qualidade do compilador, e a
habilidade do programador?
• O tempo de execução de um algoritmo para uma
determinada entrada pode ser medido pelo número
de operações primitivas que ele executa.
Análise Assintótica.
• Sabemos que dentro da área de informática as disciplinas mais complexas e
com maior índice de reprovação nos cursos superiores são algoritmos e
estrutura de dados e, na maioria das vezes, um bom conhecimento de
análise assintótica resolveria o problema ou facilitaria a compreensão de
temas mais avançados.
• Fazer uma análise assintótica é se preocupar com valores grandes de
entrada para o processamento do algoritmo, com o intuito de calcular o
tempo total de processamento e viabilidade para determinados casos.
Muitas vezes com isso podemos ser capazes de saber se é necessária a
utilização de outra metodologia ou ferramenta para a realização de uma
tarefa.
24.
Análise Assintótica.
• Junto com o estudo de análise assintótica, temos o conceito de notação
assintótica, que é a representação matemática criada por Paul Bachmann
no século XIX. Nela, temos três notações comuns para classificar as ordens
das funções, essas ordens determinam a equivalência das funções, ou seja
podemos ter uma função que seja do tipo n², essa função é equivalente à
função 400n². São equivalentes assintoticamente falando, lembrando que
sempre nos preocupamos com valores de entrada grandes para n. As três
principais classificações de ordem são: Ordem O. “Ordem Ômega e
Ordem Theta. Pesquisar : The Art of Computer Programming (de Knuth). “