Estruturas de Dados 2

Documentos relacionados
Algoritmos de Ordenação: Tempo Linear

Projeto e Análise de Algoritmos

Ordenação em Tempo Linear

Ordenação em tempo linear

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

Estruturas de Dados 2

Análise de Algoritmos Algoritmos de Ordenação

Análise de algoritmos

Tópico 5 Algoritmos de Ordenação. Parte II - métodos de ordenação: counting sort, radix sort e bucket sort.

Quão rápido podemos ordenar? Aula07-LimiteInferiorpara Ordenação. Quão rápido podemos ordenar? Árvore de Decisão- Exemplo. Ordenação em Tempo Linear

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

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

Projeto e Análise de Algoritmos

Algoritmos de Ordenação: QuickSort

Ordenação. Prof. Jonas Potros

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

Ordenação de Dados. Ordenação de Dados

Algoritmos de ordenação: Bucketsort, Radixsort e Seleção

Algoritmos de Ordenação: Cota Inferior

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

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

BCC202 - Estrutura de Dados I

AULA 13. Algoritmos p.526/582

Estruturas de Dados 2

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

Lista 1. 8 de abril de Algorithms: Capítulo 0, exercícios 1 e 2. Tardos: Todos exercícios do cap 2 do livro texto, exceto 7 e 8 letra b.

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

Algoritmos de Ordenação

Estruturas de Dados 2

Ordenação de Dados (III) HeapSort

Algoritmos de Ordenação

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

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 7-10

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

Pedro Ribeiro 2014/2015

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

void subdivide (LISTA_ENC *pl, LISTA_ENC *pl1, LISTA_ENC *pl2) { int cont, k=1; for (cont=tam(*pl)/2;cont;cont--) {

Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

Algoritmos de Ordenação: HeapSort

Radix Sorting. Várias aplicações têm chaves que são inteiros, definidos dentro de um intervalo

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

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

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Algoritmos de ordenação Quicksort

PCC104 - Projeto e Análise de Algoritmos

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;

Análise de algoritmos

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

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

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

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

5. Algoritmos de Ordenação

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

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

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

Análise de Algoritmos

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

Métodos de Ordenação Parte I

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

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Estruturas de Dados 2

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

Projeto e Análise de Algoritmos

Hashing Endereçamento Direto Tabelas Hash

Análise de algoritmos

Métodos de Classificação

Ordenação em Memória Primária Estrutura de Dados II

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Complexidade de Algoritmos

Extra- Algoritmos de Ordenação

Introdução à Ciência da Computação II

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Algoritmos de Ordenação

Técnicas de projeto de algoritmos: Indução

Transcrição:

Estruturas de Dados 2 Algoritmos de Ordenação em Tempo Linear IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 1/38

Algoritmos de Ordenação em Tempo Linear Limite Assintótico para Algoritmos de Ordenação baseados em Comparação Ordenação em Tempo Linear: Counting Sort Algoritmos in-place e algoritmos estáveis Ordenação em Tempo Linear: Radix Sort Ordenação em Tempo Linear: Bucket Sort Resumo IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 2/38

Limite assintótico para Algoritmos de Ordenação baseados em Comparação Qual será o limite matemático para a eficiência de algoritmos de ordenação (menor x tal que possa existir um algoritmo O(x)?) Para tentar responder a esta questão, vamos utilizar árvores de decisão para analisar os algoritmos de ordenação estudados até agora (observe que são todos baseados em comparação de valores do vetor...será que existe outra forma?) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 3/38

Limite assintótico para Algoritmos de Ordenação baseados em Comparação Supondo (sem perda de generalidade) que os valores a serem ordenados são sempre distintos entre si. Construindo uma árvore de decisão em que cada nodo é associado à uma comparação entre dois nodos que possuem os elementos x i and x j ; Cada nodo folha acaba sendo associado à uma permutação dos elementos do vetor ( chegando ao total de n! permutações, para um vetor de tamanho n) Qualquer algoritmo que deseje ordenar um determinado vetor corresponde à percorrer um caminho desta árvore, da raiz até a folha que corresponde ao vetor ordenado. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 4/38

Limite inferior para Algoritmos de Ordenação baseados em Comparação N=3 (3!=6 nodos folhas) Número de Folhas da Árvore de Decisão = n! IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 5/38

Limite inferior para Algoritmos de Ordenação baseados em Comparação Lemma: Seja L o número de folhas de uma árvore binária, e h sua altura. Então L <= 2h, and h >= lg L Para um dado número n, L = n!, a árvore de decisão para qualquer algoritmo que ordena por comparação de valores tem altura de pelo penos lg n!. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 6/38

Limite inferior para Algoritmos de Ordenação baseados em Comparação Teorema: Qualquer algoritmo que ordene n elementos por comparação precisa fazer ao menos lg n!, ou seja, aproximadamente n lg n 1.443 n, comparações no pior caso. Teorema: Qualquer algoritmo que ordene n elementos por comparação precisa fazer, na média lg n!, ou seja, aproximadamente n lg n 1.443 n, comparações. A única diferença é que no pior caso há arredondamento para cima... A média não precisa ser um inteiro, mas o pior caso precisa. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 7/38

Limite inferior para Algoritmos de Ordenação baseados em Comparação Desta forma, fica provado que os algoritmos estudados até agora (O(nlgn)) são os melhores possíveis, portanto não há mais porque se preocupar com isto...(certo???) Não necessariamente... Mudando nossas premissas, podemos chegar a conclusões inusitadas!!!! Esta prova apenas garante que não existe algoritmo baseado em comparações melhor que este limite... Então, passemos aos algoritmos que NÃO SÃO baseados em comparações...(mas exigem algum outro tipo de conhecimento sobre os dados a serem ordenados, portanto não são tão genéricos como os vistos até agora!!!) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 8/38

Os seguintes algoritmos de ordenação têm complexidade O(n), onde n é o tamanho do vetor A a ser ordenado: Counting Sort: Os elementos a serem ordenados são números inteiros pequenos", isto é, inteiros x onde x O(n). Radix Sort: Os elementos a serem ordenados são números inteiros de comprimento máximo constante, isto é, independente de n. Bucket Sort: Os elementos são números reais uniformemente distribuídos no intervalo [0::1). IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 9/38

Ordenação em Tempo Linear: Counting Sort Suponha que um vetor A a ser ordenado contenha n números inteiros, todos menores ou iguais a k, ( k O(n) ). O algoritmo Counting Sort ordena estes n números em tempo O(n + k) (equivalente a O(n) ). O algoritmo usa dois vetores auxiliares: 1 - C de tamanho k que guarda em C[i] o número de ocorrências de elementos i em A. 2 - B de tamanho n onde se constrói o vetor ordenado IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 10/38

Ordenação em Tempo Linear: Counting Sort CountingSort(A, k) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 11/38

Ordenação em Tempo Linear: Counting Sort O algoritmo não faz comparações entre elementos de A. Sua complexidade deve ser medida com base nas outras operações (aritméticas, atribuições, etc.) Claramente, o número de tais operações é uma função em O(n + k), já que temos dois loops simples com n iterações e dois com k iterações. Assim, quando k O(n), este algoritmo tem complexidade O(n). Algo de errado com o limite assintótico de (n log n) para ordenação? Simples: este limite (mínimo) só é válido se o algoritmo é baseado em comparações, coisa que o Couting não é!!! IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 12/38

Algoritmos in-place e algoritmos estáveis Algoritmos de ordenação podem ou não ser in-place ou estáveis. In-place: se usa apenas uma quantidade fixa de memória adicional (além da memória necessária para armazenar o vetor a ser ordenado). Exemplos: o Quicksort e o Heapsort são métodos de ordenação in-place, já o Mergesort e o Counting Sort não. Estável: se a posição relativa de elementos iguais que ocorrem no vetor ordenado permanecem na mesma ordem em que aparecem na entrada (pode ser relevante...). Exemplos: o Counting Sort e o Quicksort são exemplos de métodos estáveis (desde que certos cuidados sejam tomados na implementação). O Heapsort não é. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 13/38

Ordenação em Tempo Linear: Radix Sort O algoritmo Radix Sort ordena um vetor A de n números inteiros com um número constante d de dígitos, através de ordenações parciais dígito a dígito. Esse algoritmo surgiu no contexto de ordenação de cartões perfurados; a máquina ordenadora so era capaz de ordenar os cartões segundo um de seus dígitos. Poderamos então ordenar os números iniciando a ordenação a partir do dígito mais significativo i, mas, para prosseguir assim, teríamos que separar os elementos da entrada em subconjuntos com o mesmo valor no dígito i. Podemos também ordenar os números ordenando-os segundo cada um de seus dígitos, começando pelo menos significativo. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 14/38

Ordenação em Tempo Linear: Radix Sort Ordenar um vetor A contendo inteiros de no máximo d dígitos! RadixSort (A, d) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 15/38

Ordenação em Tempo Linear: Radix Sort (Exemplo) 329 457 657 839 436 720 355 ^ IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 16/38

Ordenação em Tempo Linear: Radix Sort (Exemplo) 329 720 457 355 657 436 839 -> 457 436 657 720 329 355 839 ^ IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 17/38

Ordenação em Tempo Linear: Radix Sort (Exemplo) 329 720 720 457 355 329 657 436 436 839 -> 457 -> 839 436 657 657 720 329 457 355 839 657 ^ IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 18/38

Ordenação em Tempo Linear: Radix Sort (Exemplo) 329 720 720 329 457 355 329 355 657 436 436 436 839 -> 457 -> 839 -> 457 436 657 657 657 720 329 457 720 355 839 657 839 Ordenado! IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 19/38

Radix Sort (Corretude) O seguinte argumento indutivo garante a corretude do algoritmo: Por hipótese de indução, assumimos que os números estão ordenados com relação aos i - 1 dígitos menos significativos. Ordenando os números com relação ao i-ésimo dígito, com um algoritmo estável, teremos então os números ordenados com relação aos i dígitos menos significativos, pois: para dois números com o i-ésimo dígito distintos, o de menor valor no dígito estará antes do de maior valor; e se ambos possuem o i -ésimo dígito igual, então a ordem dos dois também estará correta pois utilizamos um método de ordenação estável e, por hipótese de indução, os dois elementos já estavam ordenados segundo os i-1dígitos menos significativos. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 20/38

Radix Sort (Complexidade) A complexidade do Radix Sort depende da complexidade do algoritmo estável usado para ordenar cada dígito dos elementos. Se essa complexidade estiver em Θ(f(n)), obtemos uma complexidade total de Θ(d f(n)) para o Radix Sort. Como supomos d constante, a complexidade reduz-se para Θ(f(n)). Se o algoritmo estável for, por exemplo, o Counting Sort, obtemos a complexidade Θ(n + k). Supondo k O(n), resulta numa complexidade linear em n. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 21/38

Radix Sort (Complexidade) Em contraste, um algoritmo por comparação como o MergeSort teria complexidade n log n. Assim, o Radix Sort é mais vantajoso que o MergeSort quando d < log n, ou seja, o número de dígitos for menor que log n. Se considerarmos que n também é um limite superior para o maior valor a ser ordenado, então O(log n) é uma estimativa para o tamanho, em dígitos, desse número. Isso significa que não há diferença significativa entre o desempenho do MergeSort e do Radix Sort? IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 22/38

Radix Sort (Complexidade) Mas qual a vantagem de se usar o Radix Sort???? Tomemos o seguinte exemplo: suponha que desejemos ordenar um conjunto de 2 20 números de 64 bits. Então, o MergeSort faria cerca de 20 x 2 20 comparações e usaria um vetor auxiliar de tamanho 2 20. Se interpretarmos cada número do conjunto como tendo 4 dígitos em base 2 16, e usarmos o Radix Sort com o Counting Sort como método estável, a complexidade de tempo seria da ordem de 4 x (2 20 + 2 16 ) operações, uma redução substancial. Mas, note que utilizamos dois vetores auxiliares, um de tamanho 2 16 e outro de tamanho 2 20 IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 23/38

Radix Sort (Complexidade) Tomemos o seguinte exemplo: suponha que desejemos ordenar um conjunto de 10.000 números de 5 dígitos. Então, o MergeSort faria cerca de 10.000 x log 10.000 = 10.000 x 4 = 40.000 comparações e usaria um vetor auxiliar de tamanho 10.000. Usando o Radix Sort com o Counting Sort como método estável, a complexidade de tempo seria O(n+k), com n+k= 10.000 + 99.999 =~100.000, totalizando então 5 x 100.000 operações...(pior!!!!) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 24/38

Radix Sort (Complexidade) O nome Radix Sort vêm da base (em inglês radix) em que interpretamos os dígitos. Veja que se o uso de memória auxiliar for muito limitado, então o melhor mesmo é usar um algoritmo de ordenação por comparação in-place. Note que e possível usar o Radix Sort para ordenar outros tipos de elementos, como datas, palavras em ordem lexicográfica e qualquer outro tipo que possa ser visto como uma tupla ordenada de itens comparáveis. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 25/38

Ordenação em Tempo Linear: Bucket Sort O algoritmo Bucket Sort possui tempo linear, desde que os valores a serem ordenados sejam distribuídos uniformemente sobre o intervalo [0, 1). O Bucket Sort (Ordenação por Balde?) divide o intervalo [0, 1) em n sub-intervalos iguais, denominados buckets (baldes), e então distribui os n números reais nos n buckets. Como a entrada é composta por dados distribuídos uniformemente, espera-se que cada balde possua, ao final deste processo, um número equivalente de elementos (usualmente 1). IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 26/38

Ordenação em Tempo Linear: Bucket Sort Para obter o resultado, basta ordenar os elementos em cada bucket e então apresentá-los em ordem. O pseudo-código assume que a entrada é um vetor A de n elementos, onde cada elemento A[i] satisfaz 0 A[i] < 1. É utilizado um vetor auxiliar B[0 n] de listas encadeadas alocadas dinamicamente, que são utilizadas pelo algoritmo InsertionSort para criar os buckets de forma mais eficiente. O resultado é a concatenação das listas, na ordem dos buckets. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 27/38

Ordenação em Tempo Linear: Bucket Sort BucketSort(A) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 28/38

Ordenação em Tempo Linear: Bucket Sort BucketSort Exemplos (Wikipedia) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 29/38

Ordenação em Tempo Linear: Bucket Sort BucketSort Exemplos (Cormen) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 30/38

Ordenação em Tempo Linear: Bucket Sort BucketSort Corretude Considere 2 elementos A[i] e A[j]. Assuma (sem perda de generalidade) que A[i] A[j]. Como n A[i] n A[j], o elemento A[i] está ou no mesmo bucket que A[j], ou em um Bucket de menor índice Se A[i] e A[j] estão no mesmo Bucket, o loop nas linha 4-5 os coloca na ordem correta. Se A[i] e A[j] estão em Buckets diferentes, a linha 6 os coloca na ordem correta. Portanto, Bucket Sort funciona! IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 31/38

Resumo O Limite Assintótico Superior para Algoritmos de Ordenação baseados em Comparações é O(n lg n) IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 32/38

Resumo O Limite Assintótico Superior para Algoritmos de Ordenação baseados em Comparações é O(n lg n) Mas existem algoritmos de ordenação em tempo linear: IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 33/38

Resumo O Limite Assintótico Superior para Algoritmos de Ordenação baseados em Comparações é O(n lg n) Mas existem algoritmos de ordenação em tempo linear: Counting Sort: O(n+k), onde se os elementos a serem ordenados são números inteiros pequenos", sendo k o maior inteiro presente na entrada. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 34/38

Resumo O Limite Assintótico Superior para Algoritmos de Ordenação baseados em Comparações é O(n lg n) Mas existem algoritmos de ordenação em tempo linear: Counting Sort: O(n+k), onde se os elementos a serem ordenados são números inteiros pequenos", sendo k o maior inteiro presente na entrada. Radix Sort: Ordena um vetor de n números de d dígitos em tempo linear, usando ordenação estável. Se usar CountingSort, também é O(n+k). IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 35/38

Resumo O Limite Assintótico Superior para Algoritmos de Ordenação baseados em Comparações é O(n lg n) Mas existem algoritmos de ordenação em tempo linear: Counting Sort: O(n+k), onde se os elementos a serem ordenados são números inteiros pequenos", sendo k o maior inteiro presente na entrada. Radix Sort: Ordena um vetor de n números de d dígitos em tempo linear, usando ordenação estável. Se usar CountingSort, também é O(n+k). Bucket Sort: : Ordena n números uniformemente distribuídos na faixa [0-1) em tempo médio O(n). IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 36/38

- Agradecimentos Estes slides são baseados no material disponibilizado pelos profs. Cid Carvalho de Souza e Cândida Nunes da Silva, da UNICAMP. Qualquer incorretude é, entretanto, de inteira responsabilidade do prof. João Alberto Fabro, da UTFPR. IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 37/38

- Exercícios Implementar os algoritmos Counting Sort, Radix Sort e Bucket Sort, realizando experimentos que avaliem a quantidade de operações (comparações) e o tempo de execução para: 10 vetores com 1.000, 10.000, 100.000 e um milhão de números inteiros entre 0 e 99.999 (totalizando 40 execuções) Comparar estes algoritmos com o QuickSort para os mesmos vetores IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 38/38