A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Ordenação: Radixsort Algoritmos e Estruturas de Dados II."— Transcrição da apresentação:

1 Ordenação: Radixsort Algoritmos e Estruturas de Dados II

2 Introdução 2 Até agora vimos métodos de ordenação que comparam chaves Esta é uma abordagem geral que funciona para qualquer tipo de chave Uma abordagem alternativa para ordenação é processar as chaves por partes Por exemplo, começamos pelas primeiras letras do nome quando procuramos um nome num catálogo Não precisamos comparar chaves

3 Ideia 3 Quebrar uma chave em vários pedaços Dígitos de um número em uma dada base (radix) 312 tem os dígitos 3, 1 e 2 na base 10 312 tem os dígitos 100111000 na base 2 exemplo tem 6 caracteres (base 256) Ordenar de acordo com o primeiro pedaço Números cujo dígito mais à esquerda começa com 0 vêm antes de números cujo dígito mais à esquerda é 1 Podemos ordenar repetindo esse processo para todos os pedaços

4 Radixsort – Ordenando um dígito 4 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 DigitoContador 00 10 20 30 40 50 60 70 80 90

5 Radixsort – Ordenando um dígito 5 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 DigitoContador 00 10 22 33 41 50 60 71 80 90

6 Radixsort – Ordenando um dígito 6 Depois calcular a posição deles no vetor ordenado 123142087263233014132 DigCPosicao 000 100 220 332 415 500 600 716 800 900

7 Radixsort – Ordenando um dígito 7 E finalmente colocar os elementos em suas posições 123142087263233014132 123 DigCPosicao 000 100 220 333 415 500 600 716 800 900

8 Radixsort – Ordenando um dígito 8 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142123 DigCPosicao 000 100 221 333 415 500 600 716 800 900

9 Radixsort – Ordenando um dígito 9 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142123087 DigCPosicao 000 100 221 333 415 500 600 717 800 900

10 Radixsort – Ordenando um dígito 10 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142123263087 DigCPosicao 000 100 221 334 415 500 600 717 800 900

11 Radixsort – Ordenando um dígito 11 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142123263233087 DigCPosicao 000 100 221 335 415 500 600 717 800 900

12 Radixsort – Ordenando um dígito 12 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142123263233014087 DigCPosicao 000 100 221 335 416 500 600 717 800 900

13 Radixsort – Ordenando um dígito 13 Para isso iremos contar quantos elementos existem de cada valor 123142087263233014132 142132123263233014087 DigCPosicao 000 100 221 335 416 500 600 717 800 900

14 Radixsort – Ordenando o vetor 14 Repetimos o mesmo processo para o próximo dígito Funciona por que o método do contador que usamos anteriormente é estável! 123142087263233014132 142142132132123123263263233233014014087087 014014123123132132233233142142263263087087

15 Radixsort – Ordenando o vetor 15 Repetimos o mesmo processo para o próximo dígito Funciona por que o método do contador que usamos anteriormente é estável! 123142087263233014132 142142132132123123263263233233014014087087 014123132233142263087 014087123132142233263

16 Radixsort 16 void radix(int *v, int n, int base, int num_digitos) { int i, j, w, count[base], d, idx; int *aux = (int *) malloc(n * sizeof(int)); for(w = 0; w < num_digitos; w++) { for(j = 0; j < base; j++) count[j] = 0; // zera contador for(i = 0; i < n; i++) { // conta dígitos d = digito(v[i], w, base); count[d]++; } // até onde vão os elementos de cada dígito? for(j = 1; j < base; j++) count[j] += count[j-1]; for(i = 0; i < n; i++) { // adiciona nas posições d = digito(v[i], w, base); aux[ count[d-1] ] = v[i]; count[d-1]++; } for(i = 0; i < n; i++) v[i] = aux[i]; // retorna p/ v }

17 Radixsort – Análise 17 Nenhuma comparação Inspeções de dígitos: 2*n*num_digitos Se num_digitos for pequeno ou constante, então radixsort tem custo linear O( n ) Trocas: n*num_digitos Número de trocas também é O( n )

18 Vantagens e desvantagens 18 Vantagens: Estável Não compara as chaves Desvantagens: Nem sempre é fácil otimizar a inspeção de dígitos Depende do hardware Só é bom se o número de dígitos for pequeno Não funciona em qualquer tipo de chave Ex: números romanos

19 Exercícios 19 1. Por que não usar o algoritmo de ordenação por seleção para identificar o k-ésimo menor elemento do vetor? 2. Mesmo com o uso da estratégia da mediana, mostre um vetor de entrada que cai no pior caso do quicksort. 3. Um vetor com elementos em ordem reversa é um heap? 4. Mostre que o heapsort não é estável. 5. Como seria a implementação do radixsort utilizando o TAD fila?

20 Radixsort – Análise 20 Nenhuma comparação Inspeções de dígitos: 2*n*num_digitos Se num_digitos for pequeno ou constante, então radixsort tem custo linear O( n ) Trocas: n*num_digitos Número de trocas também é O( n ) Quicksort é comparável ao radixsort porque o número de dígitos é da ordem de lg( n ) na base 2 e log 10 (n) na base 10


Carregar ppt "Ordenação: Radixsort Algoritmos e Estruturas de Dados II."

Apresentações semelhantes


Anúncios Google