97
AULA 19

redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

AULA 19

Page 3: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ordenação em tempo linear

Key-indexed counting

Referência: String sorts (SW);

Page 4: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ordenação por contagemRecebe um vetor a[0 . . n−1] e ordena seuselementos.

Cada a[i] está em 0, . . . , R−1.

Entra:0 1 2 3 4 5 6 7 8 9

a 2 5 3 0 2 3 0 5 3 0

Sai: 0 1 2 3 4 5 6 7 8 9a 0 0 0 2 2 3 3 3 5 5

Page 5: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ordenação por contagemRecebe um vetor a[0 . . n−1] e ordena seuselementos.

Cada a[i] está em 0, . . . , R−1.

Entra:0 1 2 3 4 5 6 7 8 9

a 2 5 3 0 2 3 0 5 3 0

Sai: 0 1 2 3 4 5 6 7 8 9a 0 0 0 2 2 3 3 3 5 5

Page 6: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

0 1 2 3 4 5 6 7 8 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

Page 7: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

0 1 2 3 4 5 6 7 8 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count

Page 8: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

0 1 2 3 4 5 6 7 8 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 0 0 0 0 0 0

Page 9: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 0 0 1 0 0 0

Page 10: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 0 0 1 0 0 1

Page 11: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 0 0 1 1 0 1

Page 12: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 1 0 1 1 0 1

Page 13: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 1 0 2 1 0 1

Page 14: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 1 0 2 2 0 1

Page 15: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 2 0 2 2 0 1

Page 16: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 2 0 2 2 0 2

Page 17: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 2 0 2 3 0 2

Page 18: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 1: calcula frequênciasCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 0 2 3 0 2

Page 19: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 0 2 3 0 2

Page 20: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 2 3 0 2

Page 21: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 5 3 0 2

Page 22: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 5 8 0 2

Page 23: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 5 8 8 2

Page 24: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 2: transforma frequências em índicesCada a[i] está em 0, . . . , 5.

0 9a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 5 8 8 10

Page 25: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux

0 1 2 3 4 5 6count 0 3 3 5 8 8 10

Page 26: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 2

0 1 2 3 4 5 6count 0 3 4 5 8 8 10

Page 27: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 2 5

0 1 2 3 4 5 6count 0 3 4 5 8 9 10

Page 28: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 2 3 5

0 1 2 3 4 5 6count 0 3 4 6 8 9 10

Page 29: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 2 3 5

0 1 2 3 4 5 6count 1 3 4 6 8 9 10

Page 30: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 2 2 3 5

0 1 2 3 4 5 6count 1 3 5 6 8 9 10

Page 31: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 2 2 3 3 5

0 1 2 3 4 5 6count 1 3 5 7 8 9 10

Page 32: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 2 2 3 3 5

0 1 2 3 4 5 6count 2 3 5 7 8 9 10

Page 33: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 2 2 3 3 5 5

0 1 2 3 4 5 6count 2 3 5 7 8 10 10

Page 34: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

ia 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 2 2 3 3 3 5 5

0 1 2 3 4 5 6count 2 3 5 8 8 10 10

Page 35: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 3: distribuição das chavesCada a[i] está em 0, . . . , 5.

a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 0 2 2 3 3 3 5 5

0 1 2 3 4 5 6count 3 3 5 8 8 10 10

Page 36: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 4: copia chaves ordenadas para a

Cada a[i] está em 0, . . . , 5.

a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 0 2 2 3 3 3 5 5

0 1 2 3 4 5 6count 3 3 5 8 8 10 10

Page 37: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Passo 4: copia chaves ordenadas para a

Cada a[i] está em 0, . . . , 5.

a 0 0 0 2 2 3 3 3 5 5

0 1 2 3 4 5 6 7 8 9aux 0 0 0 2 2 3 3 3 5 5

0 1 2 3 4 5 6count 3 3 5 8 8 10 10

Page 38: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ilustração da fase de distribuição

Fonte: algs4

Page 39: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ordenação por contagem

int n = a.length;int[] count = new int[R+1];

1 for (int i = 0; i < n; i++)2 count[a[i]+1]++;3 for (int r = 0; r < R; r++)4 count[r+1] += count[r];

// fase de distribuição5 for (int i = 0; i < n; i++)6 aux[count[a[i]]++] = a[i];7 for (int i = 0; i < n; i++)8 a[i] = aux[i];

Obs: não são feitas comparações entre chaves.

Page 40: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Consumo de tempo

linha consumo na linha

1−2 Θ(n)3−4 Θ(R)5−6 Θ(n)7−9 Θ(n)

Consumo total: Θ(n + R)

Page 41: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Conclusões

O consumo de tempo da ordenação porcontagem é Θ(n + R).

I se R ≤ n então consumo é Θ(n)I se R ≤ 10n então consumo é Θ(n)I se R = O(n) então consumo é Θ(n)I se R ≥ n2 então consumo é Θ(R)I se R = Ω(n) então consumo é Θ(R)

Page 42: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Estabilidade

A propósito: ordenação por contagem é estável:na saída, chaves com mesmo valor estãona mesma ordem que apareciam naentrada.

a 2 5 3 0 2 3 0 5 3 0

0 1 2 3 4 5 6 7 8 9aux 0 0 0 2 2 3 3 3 5 5

Page 43: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Características

I Supõe que as chaves (=key) são inteiros entre0 e R-1.

I Usado como subrotina em algoritmos deordenação.

I Conta frequência usado “key” como índice.I Transforma as frequências em destino dosvalores.

I Supera o limite inferior de ordenação pois evitacomparações entre chaves (não hácompareTo()).

Page 45: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Raiz (radix)

Raiz (=radix) é um outro termo para base.

A raiz nos diz o número R de dígitos ou símbolos oucaracteres ou bits ou . . . que usamos pararepresentar número ou string.

R é também dito o tamanho do alfabeto.

Page 46: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ordenação digital (radix sorting)

Ordenação digital (=radix sorting) ordena chaves(sobre um alfabeto) agrupando-as conforme ossímbolos (do alfabeto) em determinadas posições,frequentemente usando ordenação por contagemcomo subrotina para implementar a ordenação.

Se as chaves são inteiros os símbolos podem serseus bytes.

Se as chaves são strings os símbolos podem ser seuscaracteres.

Page 47: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD e MSDA ordenação digital aparece frequentemente em doissabores:

I Least significant digit (LSD): trabalhaexaminado as chaves, representadas porinteiros, começando do dígito menossignificativo e prosseguindo até o dígito maissignificativo. A implementação é usualmenteiterativa e usa ordenação por contagem.

I Most significant digit (MSD): trabalhaexaminado as chaves, representadas porinteiros, começando do dígito mais significativoe prosseguindo até o dígito menos significativo.A implementação é usualmente recursiva e usaordenação por contagem.

Page 48: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD e MSD

Fonte: Radiz sort in C

Page 49: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Least-Significant-Digit

Fonte: The first modern images of a human brain onLSD

Page 50: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD ideiaExemplo:

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

Cada a[j] têm d dígitos decimais:a[j] = ad 10d−1 + · · ·+ a2 101 + a1 100

Exemplo com d = 3: 3 · 102 + 2 · 10 + 9

Page 51: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD ideiaExemplo:

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

Cada a[j] têm d dígitos decimais:a[j] = ad 10d−1 + · · ·+ a2 101 + a1 100

Exemplo com d = 3: 3 · 102 + 2 · 10 + 9

Page 52: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD ideiaExemplo:

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

Cada a[j] têm d dígitos decimais:a[j] = ad 10d−1 + · · ·+ a2 101 + a1 100

Exemplo com d = 3: 3 · 102 + 2 · 10 + 9

Page 53: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD ideiaExemplo:

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

Cada a[j] têm d dígitos decimais:a[j] = ad 10d−1 + · · ·+ a2 101 + a1 100

Exemplo com d = 3: 3 · 102 + 2 · 10 + 9

Page 54: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD ideiaExemplo:

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

Cada a[j] têm d dígitos decimais:a[j] = ad 10d−1 + · · ·+ a2 101 + a1 100

Exemplo com d = 3: 3 · 102 + 2 · 10 + 9

Page 55: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD candidato

Fonte: algs4

Page 56: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD

public class LSD public static void sort(String[] a,

int W)int R = 256; // extended ASCIIint n = a.length;String[] aux = new String[n];

Page 57: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD

for(int d = W-1; d >= 0; d--)int[] count = new int[R+1];for (int i = 0; i < n; i++)

count[a[i].charAt(d)+1]++;for (int r = 0; r < R; r++)

count[r+1] += count[r];for (int i = 0; i < n; i++)

aux[count[a[i].charAt(d)]++]=a[i];for (int i = 0; i < n; i++)

a[i] = aux[i];

Page 58: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Exemplos

I dígitos decimais: Θ(Wn)I dígitos em 0 . . R−1: Θ(W (n + R)).

Exemplo com d = 5 e R = 128:

a[4]1284 + a[3]1283 + a[2]1282 + a[1]128 + a[0]

sendo 0 ≤ a[i] ≤ 127

Page 59: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

ConclusãoDados n números com b bits e um inteiro

r ≤ b, LSD ordena esses números em tempo

Θ(b

r(n + 2r)

).

Prova: Considere cada chave com d = db/re dígitoscom r bits cada.Use ordenação por contagem com R = 2r − 1.Cada passada do ordenação por contagem:Θ(n + R) = Θ(n + 2r).Tempo total: Θ(d(n + 2r)) = Θ

(br(n + 2r)

).

Page 60: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD simulação

Fonte: algs4

Page 61: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD com baralho

Fonte: algs4

Page 62: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

LSD características

I Exige strings de comprimento fixo; isso podeser contornado com uma espécie de padding.

I Considera caracteres da direita para a esquerda.I Algoritmo utilizado para ordenar o caractere ddas strings deve ser estável.

I Faz cerca de Wn chamadas de charAt().I Utiliza espaço extra proporcional a n + R.

Page 63: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Most-Significant-Digit

Fonte: Complement Number System

Page 64: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD ideia

Fonte: algs4

Page 65: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD candidato

Fonte: algs4

Page 66: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD recursão

Fonte: algs4

Page 67: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD

public class MSD private static final int R= 256;// corte para usar inserçãoprivate static final int M = 15;public static void sort(String[] a)

int n = a.length;String[] aux= new String[n];sort(a, 0, n-1, 0, aux);

Page 68: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSDprivate static int charAt(String s,

int d) if (d == s.length()) return -1;return s.charAt(d);

private static void sort(String[] a,int lo int hi, int d,String[] aux)

if (hi <= lo+ M) insertion(a, lo, hi, d);return;

int[] count = new int[R+2];

Page 69: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSDfor (int i = lo; i<= hi; i++)

int c = charAt(a[i], d);count[c+2]++;

for (int r = 0; r < R+1; r++)count[r+1] += count[r];

for (int i = lo; i <= hi; i++) int c = charAt(a[i], d);aux[count[c+1]++] = a[i];

for (int i = lo; i <= hi; i++)a[i] = aux[i - lo];

for (int r = 0; r < R; r++)sort(a, lo+count[r],

lo+count[r+1]-1, d+1, aux);

Page 70: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD caracteres examinados

Fonte: algs4

Page 71: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD

Fonte: algs4

Page 72: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD em ação

Fonte: algs4

Page 73: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD

Fonte: algs4

Page 74: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD com baralho

Fonte: algs4

Page 75: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD

Fonte: algs4

Page 76: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD características

I Particiona o vetor em R segundo o caracteresendo examinado.

I Recursivamente ordena todos as stringsagrupadas segundo os d caracteres examinados.

I Strings de tamanho variado: trata as stringscomo se tivessem ao final um caractere menorque todos do alfabeto.

I no pior caso usa espaço n + R× W (W= maiorcomprimento de uma string).

I na média examina cerca de n logR n caracteres.

Page 77: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD característicasProblemas de desempenho:

I Lento para subvetores pequenos; cada chamadatem o seu vetor count[];

I número grande de subvetores por causa darecursão.

Solução:I usar ordenação por inserção para subvetores

pequenos;I ordenação por inserção começa após dcaracteres;

I ordenação por inserção compara a partir docaractere d.

Page 78: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD versus quicksort para strings

Desvantagens do MSD:I Espaço extra para aux[] devido a ordenaçãopor contagem.

I Espaço extra para count[] devido a ordenaçãopor contagem.

I Laço interno com muitas instruções devido aordenação por contagem.

I acesso aleatório da memória faz com que sejacache ineficient.

Page 79: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

MSD versus quicksort para strings

Desvantagens de usar quicksort para strings:I número de comparações entre strings é

O(n log n) e não linear.I deve examinar várias vezes os mesmoscaracteres de chaves com longos prefixos iguais.

Page 80: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

3-way string quicksort: ideia

Fonte: algs4

Page 81: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

3-way string quicksort: candidato

Fonte: algs4

Page 82: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Quick3string

public class Quick3stringprivate static final int M = 15;

public static void sort(String[] a) sort(a, 0, a.length-1, 0);

private static int charAt(String s,

int d) if (d == s.length()) return -1;return s.charAt(d);

Page 83: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Quick3string

// 3-way string quicksort a[lo..hi]// começando no caractere dprivate static void sort(String[] a,

int lo, int hi, int d) if (hi <= lo + M)

insertion(a, lo, hi, d);return;

Page 84: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Quick3string

int lt = lo, gt = hi;int v = charAt(a[lo], d);int i = lo + 1;while (i<= gt)

int t = charAt(a[i], d);if (t < v) exch(a, lt++, i++);else if (t > v) exch(a,i,gt--);else i++;

sort(a, lo, lt-1, d);if (v >= 0) sort(a, lt, gt, d+1);sort(a, gt+1, hi, d);

Page 85: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

3-way string quicksort simulação

Fonte: algs4

Page 86: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

3-way string quicksort características

I Faz 3-way partition segundo o d-ésimocaractere.

I Menos pesada que a R-way partition doMSD.

I Não reexamina os caracteres iguais aocaractere pivô; mas reexamina os caracteresdiferentes do pivô.

I quicksort padrão faz na médiaaproximadamente 2n ln n comparações entrechaves: caro para chaves com prefixos comunslongos.

Page 87: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Resumo

Fonte: algs4

Page 88: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Suffix array

Page 89: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Suffix array

Page 90: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Suffix array

Fonte: Brief Introduction to Suffix Array

Page 91: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Suffix array

Fonte: Brief Introduction to Suffix Array

Page 92: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Suffix array

Fonte: Brief Introduction to Suffix Array

Page 93: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Aplicação: Longest Repeated Substring

Fonte: algs4

Page 94: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Aplicação: Longest Repeated Substring

Fonte: algs4

Page 95: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Manber e MeyersOrdenação dos sufixos de uma string em tempoO(n log n).Algoritmo é iterativo:Cada iteração começa com o vetor dos sufixosordenados de acordo com os 2d primeiros caracteres.No início da primeira iteração temos o vetor dossufixos ordenados de acordo com o primeirocaractere. Esse vetor é obtida através de ordenaçãopor contagem como o MSD.Cada iteração consiste em construir o vetor dossufixos ordenados de acordo com os 2d+1 primeiroscaracteres.

Page 96: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Manber e Meyers

Manber e Meyers mostraram como cada iteraçãopode ser realizada em tempo linear.

Como o número de iterações é lg n o consumo detempo do algoritmo é proporcional a n lg n.

Page 97: redMAC00323 Algoritmos e Estruturas de Dados IIcoelho/mac0323-2018/aulas/aula19/...Ordenaçãodestrings Fonte: CountingSort and RadixSort Referências:Stringsorts(SW);slides(SW);LSD,video(SW);

Ideia de Manber e Meyers

Fonte: algs4