Universidade Federal de Alfenas

Documentos relacionados
Projeto e Análise de Algoritmos Projeto de Algoritmos Introdução. Prof. Humberto Brandão humberto@dcc.ufmg.br

Complexidade de Algoritmos. Edson Prestes

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho

Pesquisa Sequencial e Binária. Introdução à Programação SI2

Universidade Federal de Mato Grosso do Sul Faculdade de Computação Disciplina de Verão: Algoritmos e Programação II

Sobre o Professor Dr. Sylvio Barbon Junior

Aula 03 Custos de um algoritmo e funções de complexidade

ENGENHARIA DE SOFTWARE I

Organização de Computadores

Arquitetura de Computadores. Sistemas Operacionais IV

Web site. Objetivos gerais. Introdução. Profa. Patrícia Dockhorn Costa

Pesquisa Sequencial e Binária

Gerenciamento de Incidentes - ITIL. Prof. Rafael Marciano

Fundamentos de Sistemas Operacionais

PLANO DE ENSINO. Período/ Fase: 1º Semestre: 1º Ano: 2011 Disciplina: Programação de Computadores I (PGC21) Carga Horária: 72 horas/aula

Universidade Federal do Vale do São Francisco. Estruturas de Dados. Professor: Marcelo Santos Linder

)HUUDPHQWDV &RPSXWDFLRQDLV SDUD 6LPXODomR

6 Construção de Cenários

Prof.: Roberto Franciscatto. Capítulo 1.2 Aspectos Gerais

Sistemas Operacionais

SAD orientado a MODELO

Sistemas Operacionais

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Modelagem e Simulação Material 02 Projeto de Simulação

Projeto e Análise de Algoritmos Projeto de Algoritmos Tentativa e Erro. Prof. Humberto Brandão humberto@bcc.unifal-mg.edu.br

Teoria de Filas. Prof. Gustavo Leitão. Campus Natal Central. Planejamento de Capacidade de Sistemas

Processos de Desenvolvimento de Software

CI165 Introdução. André Vignatti. 31 de julho de 2014

BCC202 - Estrutura de Dados I

Processos e Threads (partes I e II)

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

1.1. Organização de um Sistema Computacional

Arquiteturas RISC. (Reduced Instructions Set Computers)

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

De uma forma ampla, o profissional egresso deverá ser capaz de desempenhar as seguintes funções:

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Sistemas Operacionais Processos e Threads

5COP096 TeoriadaComputação

Introdução à Computação

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Sistema de Computação

Arquitetura e Organização de Computadores Aula 5 Consolidando Conhecimentos de Desempenho e Resumindo Prof. Julio Saraçol

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

Sistemas Operacionais

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert:

Cálculo Aproximado do número PI utilizando Programação Paralela

Gerência de Processador

Sistema Operacional Correção - Exercício de Revisão

Memórias Prof. Galvez Gonçalves

Jorge Figueiredo, DSC/UFCG. Análise e Técnicas de Algoritmos Jorge Figueiredo, DSC/UFCG. Análise e Técnicas de Algoritmos 2005.

Análise de complexidade

UNIVERSIDADE DE SÃO PAULO E S C O L A D E A R T E S, C I Ê N C I A S E H U M A N I D A D E

3. O NIVEL DA LINGUAGEM DE MONTAGEM

Introdução. Uso do disco Vantagens Desvantagens Baixo custo, facilidade de manutenção do software e do hardware, simetria e flexibilidade

Projeto e Análise de Algoritmos. Profa. Juliana Kaizer Vizzotto. Projeto e Análise de Algoritmos - Aula 1

Sistemas Operacionais. Prof. André Y. Kusumoto

Máquina de estados UNIX O

Máquina de estados UNIX O. Sistemas Operacionais 2008/1Profa. Patricia S.O. computação: recursos D. S.O S.O. controla eventos no sistema de

Introdução à Programação de Computadores

Escalonamento no Linux e no Windows NT/2000/XP

SAV Sistema de Aluguel de Veículos I - DOCUMENTO DE REQUISITOS Versão 1.00

Universidade Federal do Vale do São Francisco - UNIVASF Colegiado de Engenharia de Computação CECOMP

Introdução aos Sistemas Operativos

Projeto de Sistemas I

Podemos encontrar uma figura interessante no PMBOK (Capítulo 7) sobre a necessidade de organizarmos o fluxo de caixa em um projeto.

Organização e Arquitetura de Computadores I. de Computadores

Engenharia de Software: conceitos e aplicações. Prof. Tiago Eugenio de Melo, MSc tiagodemelo@gmail.com

Algoritmos e Programação de Computadores I. Prof. Eduardo

Sistema Operacional. Prof. Leonardo Barreto Campos 1

AULA 13 - Gerência de Memória

WHITEPAPER. Guia de compra para câmeras IP: tudo o que você precisa saber antes de adquirir a sua solução digital

ENIAC. Introdução aos Computadores e à Programação (Noções Básicas)

Comparativo de desempenho do Pervasive PSQL v11

SISTEMAS OPERACIONAIS 2007

Gerenciamento de Níveis de Serviço

DESENVOLVIMENTO DE UM SOFTWARE NA LINGUAGEM R PARA CÁLCULO DE TAMANHOS DE AMOSTRAS NA ÁREA DE SAÚDE

Tecnologia de Redes de Computadores - aula 5

Introdução aos Computadores

Programação Concorrente Introdução

BANCO DE AULAS E PROJETOS MANUAL DO APLICATIVO

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

ESTUDO EXPERIMENTAL DOS EQUILÍBRIOS ENTRE FASES COM APLICAÇÃO COMPUTACIONAL PARA O ENSINO DE TERMODINÂMICA PARA ENGENHARIA

Processamento de Dados

Tecnologia em Gestão Pública Desenvolvimento de Projetos - Aula 9 Prof. Rafael Roesler

Introdução à Engenharia de Computação

As fases na resolução de um problema real podem, de modo geral, ser colocadas na seguinte ordem:

Avaliação de Processos Produtivos - APP

Bacharelado em Ciência e Tecnologia Bacharelado em Ciências e Humanidades. Representação Gráfica de Funções

MÓDULO 6 INTRODUÇÃO À PROBABILIDADE

BPMN Business Process Modeling Notation

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Engenharia de Software I

4 Implementação e Resultados Experimentais


Gerenciamento de Memória

Transcrição:

Universidade Federal de Alfenas Projeto e Análise de Algoritmos Aula 04 Introdução a Análise de Algoritmos humberto@bcc.unifal-mg.edu.br

Última aula Fundamentos de Matemática Exercícios: Somatórios; Logaritmos e Expoentes; Limites.

Análise de Algoritmos O que é analisar um algoritmo?

Análise de Algoritmos O que é analisar um algoritmo? Analisar significa prever os recursos que um algoritmo necessitará.

Análise de Algoritmos O que é analisar um algoritmo? Analisar significa prever os recursos que um algoritmo necessitará. O que a análise nos fornece?

Análise de Algoritmos O que é analisar um algoritmo? Analisar significa prever os recursos que um algoritmo necessitará. O que a análise nos fornece? Condições de: Determinar se o algoritmo é viável para a sua aplicação; Comparar diversos para o mesmo problema.

Análise de Algoritmos O que é analisar um algoritmo? Analisar significa prever os recursos que um algoritmo necessitará. O que a análise nos fornece? Condições de: Determinar se o algoritmo é viável para a sua aplicação; Comparar diversos para o mesmo problema. Quais são as técnicas de análises?

Análise de Algoritmos O que é analisar um algoritmo? Analisar significa prever os recursos que um algoritmo necessitará. O que a análise nos fornece? Condições de: Determinar se o algoritmo é viável para a aplicação; Comparar diversos para o mesmo problema. Quais são as técnicas de análises? Experimentação; Análise assintótica; Dentre outras

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do:

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do: tempo de execução de ;

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do: tempo de execução de ; Consumo de memória.

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do: tempo de execução de ; Consumo de memória. O tempo de execução é uma medida básica, pois tempo é um recurso precioso. Os usuários finais muitas vezes medem a qualidade dos programas comerciais em função do tempo de execução dos mesmos.

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do: tempo de execução de ; Consumo de memória. O tempo de execução é uma medida básica, pois tempo é um recurso precioso. Os usuários finais muitas vezes medem a qualidade dos programas comerciais em função do tempo de execução dos mesmos. Atualmente, poucos sistemas se preocupam com o consumo de memória, se compararmos com o passado recente (década de 80).

Análise de Algoritmos O ferramental básico de análise que utilizaremos ao longo da disciplina envolve a caracterização do: tempo de execução de ; Consumo de memória. O tempo de execução é uma medida básica, pois tempo é um recurso precioso. Os usuários finais muitas vezes medem a qualidade dos programas comerciais em função do tempo de execução dos mesmos. Atualmente, poucos sistemas se preocupam com o consumo de memória, se compararmos com o passado recente (década de 80). Mas... Muitos sistemas atuais precisam de muita memória.

O tempo de execução de um algoritmo ou uma operação sobre uma estrutura de dados depende de uma série de fatores... Citem tais fatores...

O tempo depende, por exemplo do(a): Considerando o Hardware:

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado;

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis;

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis; Freqüência do processador;

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis; Freqüência do processador; Ciclos por instrução;

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis; Freqüência do processador; Ciclos por instrução; Disco;

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis; Freqüência do processador; Ciclos por instrução; Disco; Memória (Primária, Secundária);

O tempo depende, por exemplo do(a): Considerando o Hardware: Processador utilizado; Da quantidade de processadores disponíveis; Freqüência do processador; Ciclos por instrução; Disco; Memória (Primária, Secundária); Dentre outros fatores!!!

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária???

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo?

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto.

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto. Da linguagem utilizada pelo programador;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto. Da linguagem utilizada pelo programador; Do compilador utilizado pelo programador: Com otimização, sem otimização...

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto. Da linguagem utilizada pelo programador; Do compilador utilizado pelo programador: Com otimização, sem otimização... Da habilidade do programador em utilizar chamadas mais rápidas (ou não);

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto. Da linguagem utilizada pelo programador; Do compilador utilizado pelo programador: Com otimização, sem otimização... Da habilidade do programador em utilizar chamadas mais rápidas (ou não); Da máquina virtual que executa o programa;

Dependência a nível de Software: Sistema operacional Qual é o kernel do S.O.; Quantidade de processos na fila de espera do algoritmo de escalonamento; Do próprio algoritmo de escalonamento; Da prioridade de cada processo; O processo (ou parte dele) está em memória primária ou secundária??? Qual é o quantum dado ao processo? Troca de contexto. Da linguagem utilizada pelo programador; Do compilador utilizado pelo programador: Com otimização, sem otimização... Da habilidade do programador em utilizar chamadas mais rápidas (ou não); Da máquina virtual que executa o programa; Etc... Etc... Etc... Etc... Etc... Etc... Etc... Etc... Etc... Etc...

Dependência considerando a entrada de dados: Depende da natureza do problema...

Considerando esta grande variedade de fatores que influenciam o tempo de um algoritmo, qual seria a maneira mais adequada de medi-lo?

Considerando esta grande variedade de fatores que influenciam o tempo de um algoritmo, qual seria a maneira mais adequada de medi-lo? Se tal algoritmo foi implementado, podemos estudar o tempo gasto por ele executando-o com vários dados de entrada e registrando o tempo gasto por cada execução;

Considerando esta grande variedade de fatores que influenciam o tempo de um algoritmo, qual seria a maneira mais adequada de medi-lo? Se tal algoritmo foi implementado, podemos estudar o tempo gasto por ele executando-o com vários dados de entrada e registrando o tempo gasto por cada execução; Em geral, estamos interessados em determinar a dependência do tempo de execução com respeito ao tamanho/distribuição da entrada fornecida ao algoritmo.

Considerando esta grande variedade de fatores que influenciam o tempo de um algoritmo, qual seria a maneira mais adequada de medi-lo? Se tal algoritmo foi implementado, podemos estudar o tempo gasto por ele executando-o com vários dados de entrada e registrando o tempo gasto por cada execução; Em geral, estamos interessados em determinar a dependência do tempo de execução com respeito ao tamanho/distribuição da entrada fornecida ao algoritmo. Citem exemplos de entradas de...

Considerando o algoritmo escalonador de processos: A entrada é o conjunto de processos prontos para execução no S.O., por exemplo...

Considerando um algoritmo de ordenação... A entrada é o conjunto de elementos a serem ordenados...

Considerando o tamanho da entrada, então podemos medir o tempo gasto pelo algoritmo executando-o diversas vezes, com diversas entradas... Entrada 1: Entrada 2: Entrada 3: Entrada 4: Entrada 5: Entrada 6: Entrada 7: Etc...

Tempo de execução (ms) Metodologias para análise de Podemos então visualizar os resultados desse experimento plotando o desempenho de cada execução do algoritmo como um ponto com coordenada x igual ao tamanho da entrada e coordenada y igual ao tempo de execução, ou igual a quantidade de memória utilizada. 45 40 35 30 25 20 15 10 5 0 0 5 10 15 20 Tamanho do problema (n)

Tempo de execução (ms) Tempo de execução (ms) Metodologias para análise de 45 Exemplo do mesmo experimento em máquinas distintas... 40 35 30 25 20 Pentium 4 3.0 GHz 2 GB RAM 15 10 5 0 0 5 10 15 20 45 Tamanho do problema (n) 40 Core2Quad 2.0 GHz 3 GB RAM 35 30 25 20 15 10 5 0 Tamanho do problema (n) 0 5 10 15 20

45 40 35 30 25 20 Análise por tempo de execução: 15 10 5 0 0 5 10 15 20 Esta análise e exige:

45 40 35 30 25 20 Análise por tempo de execução: 15 10 5 0 0 5 10 15 20 Esta análise e exige: a escolha de um bom conjunto de entradas;

45 40 35 30 25 20 Análise por tempo de execução: 15 10 5 0 0 5 10 15 20 Esta análise e exige: a escolha de um bom conjunto de entradas; Que um número de testes suficientes devem ser executados para que possam ser feitas afirmações válidas sob um ponto de vista estatístico; Pois muita coisa vai influenciar em cada execução... Por exemplo...

45 40 35 30 25 20 Análise por tempo de execução: 15 10 5 0 0 5 10 15 20 Esta análise e exige: a escolha de um bom conjunto de entradas; Que um número de testes suficientes devem ser executados para que possam ser feitas afirmações válidas sob um ponto de vista estatístico; Pois muita coisa vai influenciar em cada execução... Por exemplo... Ambos pontos são sempre questionáveis, de acordo com o ponto de vista do analista.

Estudos experimentais dos tempos de execução são úteis, mas eles possuem algumas limitações e/ou dificuldades:

Estudos experimentais dos tempos de execução são úteis, mas eles possuem algumas limitações e/ou dificuldades: Experimentos podem ser feitos apenas em um número limitado de entradas de teste para a grande maioria dos problemas; Geralmente a quantidade de entradas possíveis é exponencial em função do tamanho da entrada do problema;

Estudos experimentais dos tempos de execução são úteis, mas eles possuem algumas limitações e/ou dificuldades: Experimentos podem ser feitos apenas em um número limitado de entradas de teste para a grande maioria dos problemas; Geralmente a quantidade de entradas possíveis é exponencial em função do tamanho da entrada do problema; O conjunto de teste deve ser representativo; (como garantir???)

Estudos experimentais dos tempos de execução são úteis, mas eles possuem algumas limitações e/ou dificuldades: Experimentos podem ser feitos apenas em um número limitado de entradas de teste para a grande maioria dos problemas; Geralmente a quantidade de entradas possíveis é exponencial em função do tamanho da entrada do problema; O conjunto de teste deve ser representativo; (como garantir???) É difícil comparar a eficiência de dois a não ser que os experimentos para a obtenção de seus tempos de execução tenham sido feitos com o mesmo hardware e software; //além disso o S.O. é dinâmico...

Estudos experimentais dos tempos de execução são úteis, mas eles possuem algumas limitações e/ou dificuldades: Experimentos podem ser feitos apenas em um número limitado de entradas de teste para a grande maioria dos problemas; Geralmente a quantidade de entradas possíveis é exponencial em função do tamanho da entrada do problema; O conjunto de teste deve ser representativo; (como garantir???) É difícil comparar a eficiência de dois a não ser que os experimentos para a obtenção de seus tempos de execução tenham sido feitos com o mesmo hardware e software; //além disso o S.O. é dinâmico... É necessário implementar e executar um algoritmo para poder estudar seu tempo de execução experimentalmente.

Assim, a experimentação possui um papel importante na análise de, mas ela sozinha não é suficiente. Portanto, desejamos uma metodologia analítica que:

Assim, a experimentação possui um papel importante na análise de, mas ela sozinha não é suficiente. Portanto, desejamos uma metodologia analítica que: Leve em conta TODAS as entradas possíveis;

Assim, a experimentação possui um papel importante na análise de, mas ela sozinha não é suficiente. Portanto, desejamos uma metodologia analítica que: Leve em conta TODAS as entradas possíveis; Permita-nos avaliar a eficiência relativa de dois de uma forma independente do hardware e do software onde eles são executados;

Assim, a experimentação possui um papel importante na análise de, mas ela sozinha não é suficiente. Portanto, desejamos uma metodologia analítica que: Leve em conta TODAS as entradas possíveis; Permita-nos avaliar a eficiência relativa de dois de uma forma independente do hardware e do software onde eles são executados; Possa ser feita através do estudo de uma descrição em alto nível do algoritmo sem que seja necessário implementá-lo ou executálo.

Esta metodologia simplificada associa uma função f(n) a cada algoritmo para descrever o crescimento do tempo de execução f em função do tamanho da entrada n.

Esta metodologia simplificada associa uma função f(n) a cada algoritmo para descrever o crescimento do tempo de execução f em função do tamanho da entrada n. Exemplo: A função pode ser um polinômio de primeiro grau: f(n) = c 1.n+c 2 O que pode determinar na prática os valores de c 1 e c 2?

Funções típicas que serão encontradas incluem n e n 2. 30 Por exemplo: O algoritmo A é executado em tempo proporcional a n. 25 20 Isso quer dizer que se fossemos realizar experimentos, constataríamos que o tempo de execução do algoritmo A para qualquer entrada de tamanho n nunca excede cn, onde c é uma constante que depende do hardware e do software usados no experimento. 15 10 5 0 0 5 10 15 20

Dados dois : A: o tempo de execução cresce em função de n; B: o tempo de execução cresce em função de n 2. 10 9 8 7 6 5 4 3 2 1 0 0 0,5 1 1,5 2 2,5 3

Dados dois : A: o tempo de execução cresce em função de n; B: o tempo de execução cresce em função de n 2. 10 9 8 7 6 5 4 3 2 1 0 0 0,5 1 1,5 2 2,5 3 Preferimos o algoritmo A ao algoritmo B, uma vez que a função n cresce mais lentamente que a função n 2.

Próxima aula Uma linguagem para descrição de ; Um modelo computacional para execução de ; Uma métrica para medir o tempo de execução de ; Notação assintótica. Leitura: Livro do Nivio Ziviani: Projeto de Algoritmos 1 Introdução 1.1 Algoritmos, Estruturas de Dados e Programas; 1.2 Tipos de Dados e Tipos Abstrato de Dados; 1.3 Medida de Tempo de Execução de um Programa; 1.3.1 Comportamento Assintótico de Funções; 1.3.2 Classes de Comportamento Assintótico 1.4 Técnicas de Análise de Algoritmos

Bibliografia CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L.; (2002). Algoritmos Teoria e Prática. Tradução da 2ª edição americana. Rio de Janeiro. Editora Campus. TAMASSIA, ROBERTO; GOODRICH, MICHAEL T. (2004). Projeto de Algoritmos - Fundamentos, Análise e Exemplos da Internet. ZIVIANI, N. (2007). Projeto e Algoritmos com implementações em Java e C++. São Paulo. Editora Thomson;