Análise e Complexidade de Algoritmos

Documentos relacionados
ALGORITMOS DE ORDENAÇÃO

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

ESTRUTURA DE DADOS ORDENANDO LISTAS

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Comportamento Assintótico. Algoritmos e Estruturas de Dados Flavio Figueiredo (

ESTRUTURA DE DADOS ORDENANDO LISTAS

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

MC102 - Algoritmos e programação de computadores. Aula 16: Busca e Ordenação em vetores

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

Algoritmos de Ordenação

Entrada: M ind

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

Classificação por Seleção - selection sort

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

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

Preliminares. Profa. Sheila Morais de Almeida. agosto

Programação de Computadores Ordenação de Arranjos

Comportamento assintótico

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

Algoritmos de Ordena??o e Busca

Aula 10: Introdução a Vetores e Matrizes

Introdução a Algoritmos Parte 09

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

Linguagem C vetores multidimensionais

TCC 00308: Programação de Computadores I Introdução

Algoritmos e Estrutura de Dados

CURSO BÁSICO DE PROGRAMAÇÃO AULA 16. Ordenação Revisão para a prova

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

ESTRUTURA DE DADOS LISTAS LINEARES

Métodos de Ordenação

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

Programação Estruturada. Arrays

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

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

Ordenação em Tempo Linear

Aula 12 Métodos de Classificação: - Classificação por Inserção Direta - Classificação por Seleção Direta

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI1

Heapsort é um método de ordenação cujo princípio de funcionamento é o mesmo utilizado para a ordenação por seleção.

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

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

Conteúdo. Busca Seqüencial. Busca Binária. Algoritmos de Ordenação e Busca e sua Análise de Complexidade. Alneu de Andrade Lopes Rosane Minghim

CI208 - Programação de Computadores. Aula 24: Arrays. Prof. MSc. Diego Roberto Antunes

Complexidade de Tempo e Espaço

Programação Estruturada

2. Ordenação por Seleção

O mais leve e o mais pesado Algoritmos de Ordenação

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

Classificação por Particionamento

Universidade Veiga de Almeida Algoritmos e Linguagem I

BCC202 - Estrutura de Dados I

Árvores Binárias de Busca (ABB) 18/11

ESTRUTURA DE DADOS VETORES E LISTAS LINEARES

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Análise e Complexidade de Algoritmos

Projeto e Análise de Algoritmos Análise de Complexidade. Prof. Luiz Chaimowicz

Método de ordenação - objetivos:

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

MÉTODOS DE CLASSIFICAÇÃO EM MEMÓRIA PRIMÁRIA. George Gomes Cabral

Listas e Tuplas. Vanessa Braganholo

Exercícios Aula Prática VII

Árvores Binárias de Busca (ABB) 18/11

Introdução Métodos de Busca Parte 1

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

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO EM TEMPO LINEAR

<identificador>[<tamanho>]: <tipo>;

Vetores. Vanessa Braganholo

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

INF 1010 Estruturas de Dados Avançadas

Prof. Marcelo França

Análise do desempenho computacional dos métodos Inserção Direta, Bolha, ShellSort e ComboSort

Programação II Aula 07

Variáveis Compostas. Vanessa Braganholo

Algoritmos de Ordenação

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

Enunciado do problema: Calcule o valor de e, base dos logaritmos neplerianos, usando a série infinita abaixo

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Métodos de Classificação

Lista de Exercícios 04

Filas de Prioridade & Heaps

AULA 20. Algoritmos p.725/759

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

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Técnicas Inteligência Artificial

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

INE5408 Estruturas de Dados

Programação II. Tópicos Extras Ordenação (sort) Bruno Feijó Dept. de Informática, PUC-Rio

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

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

Linguagem de Programação I. Aula 08 Linguagem C: Arrays

Métodos de Busca Parte 1

Estruturas de Dados Estruturas de Dados Fundamentais

Algoritmos de Ordenação

Algoritmos de Ordenação: Tempo Linear

5. Algoritmos de Ordenação

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Transcrição:

Análise e Complexidade de Algoritmos Professor Ariel da Silva Dias Insertion Sort

Introdução Existem modos diferentes para realizar uma ordenação e, nas próximas aulas, continuaremos estudando cada uma delas O segundo algoritmo que estudaremos é o

Imagine o seguinte caso: você está jogando baralho e as cartas estão ordenadas

Imagine o seguinte caso: você está jogando baralho e as cartas estão ordenadas Você recebe uma nova carta e você deve coloca-la na posição correta, de forma que as cartas continuem ordenadas A nova carta pode ser menor que alguma das cartas que você está segurando

Sua ação para inseri-la ao meio de suas cartas: Você examina as cartas que já possui, comparando a nova carta com todas que estão em sua mão, até encontrar uma posição para coloca-la

Sua ação para inseri-la ao meio de suas cartas: Você examina as cartas que já possui, comparando a nova carta com todas que estão em sua mão, até encontrar uma posição para coloca-la

Sua ação para inseri-la ao meio de suas cartas: Você examina as cartas que já possui, comparando a nova carta com todas que estão em sua mão, até encontrar uma posição para coloca-la

Você insere a nova carta na posição correta e, novamente, sua mão é composta por cartas totalmente ordenadas E quando você receber outra carta você repetirá o mesmo procedimento...

Este é o funcionamento do algoritmo Percorre o array começando com índice 1 Cada nova posição é como a nova carta que você recebeu Você pode inseri-la no lugar correto no subarray, ordenando à esquerda daquela posição

0 1 2 3 4

Inspeciona a carta do índice 1 e armazena em um local temporário 0 1 2 3 4

Move a carta para a direita para abrir espaço à carta armazenada 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Inspeciona a carta no índice 2 0 1 2 3 4

Como esta carta é menor que as demais, armazena ela em um local temporário e desloca as cartas da esquerda para a direita 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Inspeciona a carta no índice 3 0 1 2 3 4

Como esta carta é menor que as demais, armazena ela em um local temporário e desloca as cartas da esquerda para a direita 0 1 2 3 4

Como esta carta é menor que as demais, armazena ela em um local temporário e desloca as cartas da esquerda para a direita 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Inspeciona a carta no índice 4 0 1 2 3 4

Move as cartas a direita para abrir espaço correto para a carta armazenada 0 1 2 3 4

Move as cartas a direita para abrir espaço correto para a carta armazenada 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Coloca a carta armazenada no local final correto 0 1 2 3 4

Imagine que o array do índice 0 ao 5 já está ordenado, e queremos inserir um novo elemento neste array, de forma que ele fique ordenado 0 1 2 3 4 5 50 56 59 62 64 52 Para isso, temos que comparar o elemento do índice 5 (número 52) com todos os elementos a esquerda, indo da direita para a esquerda

Vamos a partir de agora chamar o elemento na posição 5 de chave Sempre que descobrirmos que a chave é menor que um elemento à sua esquerda, descolamos esse elemento para a posição a direita, uma vez que a chave deve ficar a esquerda deste elemento Precisamos fazer 2 coisas: precisamos de uma operação de deslocamento que mova um elemento uma posição para a direita; precisamos salvar o valor da chave em uma posição separada, evitando que ela seja sobrescrita 0 1 2 3 4 5 50 56 59 62 64 52

No nosso exemplo, vamos armazenar o valor do índice 5 em uma variável chamada key KEY 52 0 1 2 3 4 5 50 56 59 62 64 52

Vamos agora comparar key com o elemento no índice 4 key é menor que o valor do elemento no índice 4 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 4 para o índice 5 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 62 64 52

Vamos agora comparar key com o elemento no índice 4 key é menor que o valor do elemento no índice 4 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 4 para o índice 5 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 62 64 64

Vamos agora comparar key com o elemento no índice 3 key é menor que o valor do elemento no índice 3 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 4 para o índice 5 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 62 64 64

Vamos agora comparar key com o elemento no índice 3 key é menor que o valor do elemento no índice 3 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 3 para o índice 4 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 62 62 64

Vamos agora comparar key com o elemento no índice 2 key é menor que o valor do elemento no índice 2 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 2 para o índice 3 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 62 62 64

Vamos agora comparar key com o elemento no índice 2 key é menor que o valor do elemento no índice 2 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 2 para o índice 3 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 59 62 64

Vamos agora comparar key com o elemento no índice 1 key é menor que o valor do elemento no índice 1 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 1 para o índice 2 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 59 59 62 64

Vamos agora comparar key com o elemento no índice 1 key é menor que o valor do elemento no índice 1 então vamos deslocar este elemento para a direita note que esta operação simplesmente copia o valor do índice 1 para o índice 2 (uma posição para a direita) KEY 52 0 1 2 3 4 5 50 56 56 59 62 64

Vamos agora comparar key com o elemento no índice 0 key é maior que o valor do elemento no índice 0 agora não teremos deslocamento agora vamos colocar o valor de key imediatamente na posição a direita deste elemento KEY 52 0 1 2 3 4 5 50 56 56 59 62 64

Vamos agora comparar key com o elemento no índice 0 key é maior que o valor do elemento no índice 0 agora não teremos deslocamento agora vamos colocar o valor de key imediatamente na posição a direita deste elemento KEY 52 0 1 2 3 4 5 50 52 56 59 62 64

O resultado agora é um array ordenado 0 1 2 3 4 5 50 52 56 59 62 64

Quando a chave sendo inserida for menor que todos os elementos à sua esquerda todos os elementos no array à esquerda da chave se deslocam uma posição para a direita devemos parar quando chegarmos à extremidade esquerda do array

Quando a chave é maior ou igual a todos os elementos à sua esquerda na primeira comparação já descobrimos que a chave está na sua posição correta em relação a todos os elementos à sua esquerda nenhum elemento é deslocado e a chave retorna à posição que começou

- pseudocódigo para i até 4 faça inicio chave vetor[i] j i 1 enquanto(j >= 0 E vetor[j] > chave) inicio vetor[j+1] x[j] j j-1 fim vetor[j+1] chave fim

L Código Custo Vezes 1 para i até 4 faça C1 n 2 inicio 0 0 3 chave vetor[i] C2 n-1 4 j i 1 C3 n-1 5 enquanto(j >= 0 E vetor[j] > chave) C4 n tj j=2 6 inicio 0 7 vetor[j+1] x[j] C5 8 j j-1 C6 n tj 1 j=2 n tj 1 9 fim 0 0 10 vetor[j+1] chave C7 n-1 11 fim j=2

Análise da Complexidade Como vimos com no Bubble Sort, o tempo de execução do algoritmo é a soma dos tempos de execução para cada instrução executada; Uma instrução que demanda ci passos para ser executada e é executada n vezes, contribuirá com ci.n para o tempo de execução total; No teremos o melhor e pior caso, calcularemos primeiro o melhor caso, ou seja, quando o vetor estiver 100% ordenado

Análise da Complexidade (Melhor Caso) T n = c1 n + c2 n 1 + c3 n 1 + c7 (n 1) T n = c1 n + c2 n c2 + c3 n c3 + c7 n c3 T n = c1 + c2 + c3 + c7 n c2 + c3 + c7 T n = an b Podemos dizer que, no melhor caso, a função custo de complexidade do algoritmo é f(n)=an-b, ou O(n)

Análise da Complexidade Se o vetor estiver ordenado de forma decrescente, teremos o pior caso Devemos comparar cada elemento do vetor, com cada elemento do subvetor ordenado inteiro A seguir é apresentado o cálculo da complexidade

Análise da Complexidade (Pior Caso) T n = c1 n + c2 n 1 + c3 n 1 + c7 n 1 + c4 n n 1 2 + c7 n 1 = T n = c1 n + c2 n c2 + c3 n c3 + c7 n c3 + c4 n2 n T n = c4+c5+c6 2 n 2 + c1+c2+c3+c7+c4+c5+c6 2 n n 1 n (c2 + c3 + c4 + c5 + c6)= 2 2 1 + c5 1 + c5 n2 n 2 n n 1 2 + c6 + c6 n2 n 2 = T n = an 2 + bn + c Podemos dizer que, no pior caso, a função custo de complexidade do algoritmo é f(n)=an²+bn-c, ou O(n²)