Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Documentos relacionados
PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos

PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos

BCC202 - Estrutura de Dados I

Projeto e Análise de Algoritmos

INF111 Programação II Aulas 11, 12, 13 Ordenação

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Ordenação por Intercalação Métodos de Ordenação Parte 4

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

Complexidade de algoritmos Notação Big-O

Projeto e Análise de Algoritmos

Métodos de Ordenação Parte 4

Métodos de ordenação. Bubble sort:

SCC-601 Introdução à Ciência da Computação II. Ordenação e Complexidade Parte 3. Lucas Antiqueira

Projeto e Análise de Algoritmos

Algoritmos de Ordenação

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Método BubbleSort. Estrutura de Dados II Prof Jairo Francisco de Souza

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Complexidade de Tempo e Espaço

Algoritmos e Estrutura de Dados

Limite assintótico para a ordenação, Ordenação em tempo linear

Elementos de Análise Assintótica

Aula 18 Algoritmos básicos de busca e classificação

AED2 - Aula 11 Problema da separação e quicksort

Projeto e Análise de Algoritmos

MÉTODOS DE ORDENAÇÃO DE DADOS EM MEMÓRIA PRIMÁRIA. Material da Prof. Ana Eliza

Algoritmos e Estrutura de Dados. Aula 01 Apresentação da Disciplina e Introdução aos Algoritmos Prof. Tiago A. E. Ferreira

PLANO DE DISCIPLINA DISCIPLINA: Estrutura de Dados 2

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Métodos de Classificação

Métodos de Classificação

INF 1010 Estruturas de Dados Avançadas

Introdução à Programação

Ordenação em Tempo Linear. Leitura: Cormen Capítulo 8

ALGORITMOS DE ORDENAÇÃO

Complexidade de Algoritmos

Preliminares. Profa. Sheila Morais de Almeida. agosto

O Problema da Ordenação Métodos de Ordenação Parte 1

Teoria da Computação Aula 9 Noções de Complexidade

Complexidade de Algoritmos

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Algoritmos de Ordenação: QuickSort

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

USP - ICMC - SSC SSC o. Semestre Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

Linguagem C: Algoritmos de Ordenação

Análise e Complexidade de Algoritmos

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

Paradigmas de programação

PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação

ORDENAÇÃO DE ARQUIVOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Estrutura de Dados. Plano de Ensino. Vilson Heck Junior. Campus Lages. Instituto Federal de Santa Catarina

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Ordenação por Seleção Métodos de Ordenação Parte 3

Métodos de Ordenação

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

MCTA028 Programação Estruturada Aula 19 Custos de um algoritmo e funções de complexidade

Análise de Algoritmos Estrutura de Dados II

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: ClaudioQuick F. M.

PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação

Análise e Complexidade de Algoritmos

Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins

Análise de Complexidade para algoritmos iterativos e recursivos

Análise empírica de algoritmos de ordenação

Recursividade. Objetivos do módulo. O que é recursividade

Algoritmos de Ordenação

Ordenação. Prof. Túlio A. M. Toffolo Prof. Marco Antonio M. Carvalho BCC402 Aula 04 Algoritmos e Programação Avançada

BCC202 - Estrutura de Dados I

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Bubble Sort. Tempo total O(n 2 )

Estruturas de Dados 2

Análise de Algoritmos Algoritmos de Ordenação

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

1 a Lista de Exercícios

Teoria dos Grafos Aula 7

Universidade Federal de Alfenas

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Aula 19: Métodos eficientes de ordenação

Complexidade de Algoritmos

Algoritmos de Ordenação

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - I

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

BCC202 - Estrutura de Dados I

Técnicas de Programação II

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

Transcrição:

Introdução à Análise de Algoritmos Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

Aula de hoje Nesta aula veremos: Sobre a disciplina Exemplo: ordenação

Sobre a disciplina Livros Introduction to Algorithms (CLRS) Pseudo-código e teoria de complexidade: limitantes assintóticos Algorithms (Sedgewick e Wayne) Mais didático e códigos An Introduction to the Analysis of Algorithms (Sedgewick e Frajolet) Análise: resolução de recorrências e casos médios

Sobre a disciplina: conteúdo Capítulos do CLRS: 1-8, 10-13, 15-18, 21-25, 34, 35 Análise: empírica, matemática, probabiĺıstica, amortizada e assintótica Técnicas de projeto: divisão e conquista, programação dinâmica e algoritmos gulosos Ordenação: merge sort, quick sort, count sort Estruturas de dados: árvores balanceadas, heaps e tabelas hash Grafos: estruturas básicas e algoritmos diversos Problemas NP-completos: algoritmos de aproximação

Sobre a disciplina: motivações e objetivos Motivações Corretude Estimação de custos Comparações de algoritmos Objetivo Desenvolver habilidades de compreensão, projeto e análise de algoritmos

Sobre a disciplina: recursos e datas http://www.facom.ufu.br/~albertini/ada Avaliações: 3 provas (25+25+30) e 2 trabalhos (10+10) Datas: a combinar

Definição de um problema Exemplo: problema de ordenação crescente Entrada: uma sequência de n números a 1,a 2,a 3,...,a n Saída: uma reordenação b 1,b 2,...,b n, tal que b i < b j se i < j A solução: um algoritmo correto: se para cada instância de entrada, o algoritmo para com a saída correta se o é algoritmo é correto então ele resolve o problema Instância e tamanho da entrada de um problema Uma instância é uma materialização do problema: 3,1,2,4,1,5 Tamanho da entrada N varia de acordo com a instância

Análise de algoritmos Custos Quanto espaço de memória o algoritmo vai consumir? Quanto tempo levar o algoritmo? Quantos acessos a disco o algoritmo fará? Qual é o consumo de energia? Quantas requisições serão feitas a um banco de dados? Como responder essas perguntas de acordo com a variável do tamanho do problema N?

Análise do Problema de ordenação Como ordenar cartas de baralho? Como ordenar depósitos em um banco? Como estimar a duração? Como extrapolar o resultado? Qual é o modelo de aumento de custo com o aumento de entradas? Qual tipo de instância maximiza custos para um dado N?

Revisão para implementar ordenação Conceitos Vetor: int vetor[] = {5, 1, 7, 3, 0};

Revisão para implementar ordenação Conceitos Vetor: int vetor[] = {5, 1, 7, 3, 0}; Variável índice: posição para acesso de elemento

Revisão para implementar ordenação Conceitos Vetor: int vetor[] = {5, 1, 7, 3, 0}; Variável índice: posição para acesso de elemento Variável auxiliar: armazenamento temporário

Revisão para implementar ordenação Conceitos Vetor: int vetor[] = {5, 1, 7, 3, 0}; Variável índice: posição para acesso de elemento Variável auxiliar: armazenamento temporário útil para troca de posição de elementos do vetor

Ordenação interna ordenar em memória Pré-condições: vetor em memória principal, inicializado com elementos

Ordenação interna ordenar em memória Pré-condições: vetor em memória principal, inicializado com elementos Pós-condições: vetor com elementos em ordem crescente (ou decrescente) Ordenado:

Vetores e Ordenação: exemplos Exemplos: Números inteiros ou ponto flutuante

Vetores e Ordenação: exemplos Exemplos: Números inteiros ou ponto flutuante Vetor de strings

Vetores e Ordenação: exemplos Exemplos: Números inteiros ou ponto flutuante Vetor de strings Tipos compostos: necessário definir função para comparar

Vetores e Ordenação: exemplos Exemplos: Exemplo Números inteiros ou ponto flutuante Vetor de strings Tipos compostos: necessário definir função para comparar int compare(item item1, ITEM item2); 1 int compare(aluno a) { 2 if ( this. media > a. media) 3 return 1; 4 else if ( this. media == a. media) 5 return 1; 6 else 7 return 0; 8 }

Algoritmo de ordenação Definição de ordenação Sequência de comparações e trocas de posição entre elementos para obter vetor ordenado.

Algoritmo de ordenação Definição de ordenação Sequência de comparações e trocas de posição entre elementos para obter vetor ordenado. Complexidade Quantas trocas, comparações (complexidade de tempo) e variáveis auxiliares (de espaço) são necessárias?

Bubble sort - ordenação em bolhas Como programar um algoritmo de ordenação simples? Ideia Comparar pares consecutivos de elementos e trocá-los de posição caso o primeiro seja maior que o segundo. 1 void troca ( int vetor [], int i, int j ) { 2 int aux = vetor [ i ]; 3 vetor [ i ] = vetor [ j ]; 4 vetor [ j ] = aux ; 5 }

Primeira iteração

Primeira iteração

Primeira iteração

Primeira iteração

Primeira iteração

Primeira iteração Maior elemento sempre está na sua posição ordenada na primeira iteração.

Algoritmo Bubblesort: versão simplificada 1 void bubblesort ( int vetor []) {

Algoritmo Bubblesort: versão simplificada 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++)

Algoritmo Bubblesort: versão simplificada 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++)

Algoritmo Bubblesort: versão simplificada 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++) 7 if ( vetor [ i ] > vetor [ i +1])

Algoritmo Bubblesort: versão simplificada 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++) 7 if ( vetor [ i ] > vetor [ i +1]) 8 troca (vetor, i, i+1); / devemos trocar / 9 } Termina com vetor ordenado de modo crescente.

Outras iterações

Exemplo sobre complexidade de ordenação Problema Um banco tem 10 milhões clientes que fazem, em média, 4 transações diárias. O Banco Central pede um relatório diário com as transações ordenadas por valor. Suponha que o computador do banco resolve operações simples na taxa de 2 30 ( 1 bilhão) operações por segundo. Se o algoritmo disponível for o Bubblesort, o banco:

Exemplo sobre complexidade de ordenação Problema Um banco tem 10 milhões clientes que fazem, em média, 4 transações diárias. O Banco Central pede um relatório diário com as transações ordenadas por valor. Suponha que o computador do banco resolve operações simples na taxa de 2 30 ( 1 bilhão) operações por segundo. Se o algoritmo disponível for o Bubblesort, o banco: a) conseguirá tranquilamente fazer o relatório a tempo;

Exemplo sobre complexidade de ordenação Problema Um banco tem 10 milhões clientes que fazem, em média, 4 transações diárias. O Banco Central pede um relatório diário com as transações ordenadas por valor. Suponha que o computador do banco resolve operações simples na taxa de 2 30 ( 1 bilhão) operações por segundo. Se o algoritmo disponível for o Bubblesort, o banco: a) conseguirá tranquilamente fazer o relatório a tempo; b) deverá comprar um computador melhor;

Exemplo sobre complexidade de ordenação Problema Um banco tem 10 milhões clientes que fazem, em média, 4 transações diárias. O Banco Central pede um relatório diário com as transações ordenadas por valor. Suponha que o computador do banco resolve operações simples na taxa de 2 30 ( 1 bilhão) operações por segundo. Se o algoritmo disponível for o Bubblesort, o banco: a) conseguirá tranquilamente fazer o relatório a tempo; b) deverá comprar um computador melhor; c) deverá contratar um programador melhor.

Quantas comparações o Bubblesort faz? 1 void bubblesort ( int vetor []) {

Quantas comparações o Bubblesort faz? 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++)

Quantas comparações o Bubblesort faz? 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++)

Quantas comparações o Bubblesort faz? 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++) 7 if ( vetor [ i ] > vetor [ i +1])

Quantas comparações o Bubblesort faz? 1 void bubblesort ( int vetor []) { 2 int N = vetor. length ; 3 / controle do número de itera ções / 4 for ( int iteracao = 0; iteracao < N 1; iteracao++) 5 / repeticao interna : compara e troca números / 6 for ( int i = 0; i < N 1; i++) 7 if ( vetor [ i ] > vetor [ i +1]) 8 troca (vetor, i, i+1); / devemos trocar / 9 } Termina com vetor ordenado de modo crescente.

Exemplo sobre complexidade Análise: Custo de comparações do Bubblesort é g(n) = (n 1) 2

Exemplo sobre complexidade Análise: Custo de comparações do Bubblesort é g(n) = (n 1) 2 Elementos a ordenar: número de transações n = 4 10 7

Exemplo sobre complexidade Análise: Custo de comparações do Bubblesort é g(n) = (n 1) 2 Elementos a ordenar: número de transações n = 4 10 7 Comparações necessárias: (4 10 7 ) 2

Exemplo sobre complexidade Análise: Custo de comparações do Bubblesort é g(n) = (n 1) 2 Elementos a ordenar: número de transações n = 4 10 7 Comparações necessárias: (4 10 7 ) 2 Capacidade do computador: 2 30 operações por segundo Tempo necessário em segundos: (4 10 7 ) 2 /2 30

Exemplo sobre complexidade Análise: Custo de comparações do Bubblesort é g(n) = (n 1) 2 Elementos a ordenar: número de transações n = 4 10 7 Comparações necessárias: (4 10 7 ) 2 Capacidade do computador: 2 30 operações por segundo Tempo necessário em segundos: (4 10 7 ) 2 /2 30 17 dias, 5 horas e 55 minutos

Counting sort Ideia: ordenação de números inteiros Cada elemento é representado por uma posição em um vetor. Conta-se as repetições de cada número.

Counting sort Ideia: ordenação de números inteiros Cada elemento é representado por uma posição em um vetor. Conta-se as repetições de cada número. 1 void countingsort( int [] vetor, int max) { 2 long [] count = new long [max+1];

Counting sort Ideia: ordenação de números inteiros Cada elemento é representado por uma posição em um vetor. Conta-se as repetições de cada número. 1 void countingsort( int [] vetor, int max) { 2 long [] count = new long [max+1]; 3 for ( int i = 0; i < vetor. length ; i++) 4 count [ vetor [ i ]]++;// conta repeti ções 5 6

Counting sort Ideia: ordenação de números inteiros Cada elemento é representado por uma posição em um vetor. Conta-se as repetições de cada número. 1 void countingsort( int [] vetor, int max) { 2 long [] count = new long [max+1]; 3 for ( int i = 0; i < vetor. length ; i++) 4 count [ vetor [ i ]]++;// conta repeti ções 5 6 for ( int j = 0, i = 0; i < vetor. length ; j++) 7 while (count [ j] > 0) // tira em ordem 8 vetor [ i++] = j ; 9 }

Complexidade de espaço do Counting sort Problema do banco: ordenação de 40 milhões de números Se 1% das transações forem de mais de 1 milhão de reais, então é possível usar 2 algoritmos de ordenação:

Complexidade de espaço do Counting sort Problema do banco: ordenação de 40 milhões de números Se 1% das transações forem de mais de 1 milhão de reais, então é possível usar 2 algoritmos de ordenação: Para transações de até 1 milhão, usar o Counting sort: 0.672 segundos. Para transações de mais de 1 milhão, usar o Bubble sort: 2.5 minutos.

Complexidade de espaço do Counting sort Problema do banco: ordenação de 40 milhões de números Se 1% das transações forem de mais de 1 milhão de reais, então é possível usar 2 algoritmos de ordenação: Para transações de até 1 milhão, usar o Counting sort: 0.672 segundos. Para transações de mais de 1 milhão, usar o Bubble sort: 2.5 minutos. Balanceamento de complexidades Bubble sort: complexidade de tempo alta e complexidade de espaço baixa Counting sort: complexidade de tempo baixa e complexidade de espaço muito alta

Limite assintótico de complexidade Limite assintótico superior O(g(n)) Objetivo: encontrar função limitante superior g(n) para representar o teto do custo do algoritmo.

Limite assintótico de complexidade Limite assintótico superior O(g(n)) Objetivo: encontrar função limitante superior g(n) para representar o teto do custo do algoritmo. Bubble sort simplificado Para n elementos, faz-se n 1 iterações e n 1 comparações em cada iteração: g(n) = (n 1) 2. Então a complexidade de tempo é O(n 2 ).

Complexidades assintóticas Complexidade de tempo Como cada número é avaliado apenas uma vez, o Counting sort tem complexidade de tempo O(n). Devido ao for aninhado, o Bubble sort tem complexidade de tempo O(n 2 ).

Complexidades assintóticas Complexidade de tempo Como cada número é avaliado apenas uma vez, o Counting sort tem complexidade de tempo O(n). Devido ao for aninhado, o Bubble sort tem complexidade de tempo O(n 2 ). Complexidade de espaço Tamanho do vetor de contagens cresce de acordo com a faixa de valores na entrada. Complexidade de espaço é O(max), sendo max o maior número no vetor de entrada. Se max for um dos maiores números armazenados em n bits então, espaço é O(max) = O(2 n ), Devido ao uso de um número constante variáveis auxiliares para trocas, o Bubble sort tem complexidade de espaço O(1).