![Page 1: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/1.jpg)
Aplicações de recursividade
Prof. Dr. Silvio do Lago PereiraDepartamento de Tecnologia da Informação
Faculdade de Tecnologia de São Paulo
![Page 2: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/2.jpg)
Aplicações de recursividade
Nesta aula, veremos algumas
aplicações de recursividade em:
Ordenação de dados
Ordenação topológica
Árvores de busca binária
72 51 65 88 90 46 29 15 37
72 65 90 29 37 51 88 46 15
72 90 37 65 29 51 46 88 15
72 37 90 65 29 51 46 88 15
72 37
37 72
46 51 15 88
72 37
90 65 29 51 46 88 15
29 6537 72 90
lg n
n
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 2
Código de Huffman46 51 15 88
15 46 51 88
15 29 37 46 51 65 72 88 90
29 6537 72 90
29 37 65 72 90
1 2 3
4 5 6
7 8 9
62
1 3 5 7
4
1
DDDD
1
EEEE
1
LLLL
1
RRRR
2
MMMM
3
AAAA
2 2 5
4
90
0
0 0 0
1
1
1 11
![Page 3: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/3.jpg)
Ordenação de dados
ordenação por geração e testeordenação por trocas
ordenação por inserçãoordenação por intercalação
ordenação por partição
![Page 4: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/4.jpg)
Ordenação por geração e teste (permutation sort)
A operação de geração (ou permutação)A operação de geração (ou permutação)
Constrói uma permutação PPPP de uma lista LLLL.Constrói uma permutação PPPP de uma lista LLLL.
A operação de testeA operação de teste
Verifica se uma permutação PPPP está ordenada.Verifica se uma permutação PPPP está ordenada.
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 4
Para ordenar LLLL por tentativa e erro:
Gere uma permutação PPPP de LLLL.
Teste se PPPP está ordenada.
Complexidade de tempo: O(n.n!)
Muito ineficiente para ser usada em aplicações práticas!
3 1 2L :
3 1 2P1 :
3 2 1
1 3 2
1 2 3
P2 :
P3 :
P4 :
![Page 5: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/5.jpg)
Ordenação por geração e teste: implementação
Exemplo 1. Ordenação por geração e testeExemplo 1. Ordenação por geração e teste
pspspsps(L,P) :(L,P) :(L,P) :(L,P) :---- permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).
permutapermutapermutapermuta([],[]).([],[]).([],[]).([],[]).
permutapermutapermutapermuta(L,[(L,[(L,[(L,[X|PX|PX|PX|P]) :]) :]) :]) :---- exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).
excluiexcluiexcluiexclui(X,L,R) :(X,L,R) :(X,L,R) :(X,L,R) :---- concatena(A,[concatena(A,[concatena(A,[concatena(A,[X|BX|BX|BX|B],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
pspspsps(L,P) :(L,P) :(L,P) :(L,P) :---- permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).permuta(L,P), ordenada(P).
permutapermutapermutapermuta([],[]).([],[]).([],[]).([],[]).
permutapermutapermutapermuta(L,[(L,[(L,[(L,[X|PX|PX|PX|P]) :]) :]) :]) :---- exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).exclui(X,L,R), permuta(R,P).
excluiexcluiexcluiexclui(X,L,R) :(X,L,R) :(X,L,R) :(X,L,R) :---- concatena(A,[concatena(A,[concatena(A,[concatena(A,[X|BX|BX|BX|B],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).],L), concatena(A,B,R).
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 5
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).
ordenadaordenadaordenadaordenada([]).([]).([]).([]).
ordenadaordenadaordenadaordenada([_]).([_]).([_]).([_]).
ordenadaordenadaordenadaordenada([X,([X,([X,([X,Y|RY|RY|RY|R]) :]) :]) :]) :---- X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([Y|RY|RY|RY|R]). ]). ]). ]).
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).
ordenadaordenadaordenadaordenada([]).([]).([]).([]).
ordenadaordenadaordenadaordenada([_]).([_]).([_]).([_]).
ordenadaordenadaordenadaordenada([X,([X,([X,([X,Y|RY|RY|RY|R]) :]) :]) :]) :---- X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([X=<Y, ordenada([Y|RY|RY|RY|R]). ]). ]). ]).
Exercício 1. Ordenação por geração e testeExercício 1. Ordenação por geração e teste
Digite e teste os predicados definidos no Exemplo 1.Digite e teste os predicados definidos no Exemplo 1.
![Page 6: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/6.jpg)
Ordenação por trocas (bubble sort)
A operação de trocaA operação de troca
Troca as posições de dois elementos consecutivos que estejam fora de ordem.Troca as posições de dois elementos consecutivos que estejam fora de ordem.
Para ordenar recursivamente uma lista LLLL usando trocas:
Encontre um par de elementos 46 51 39 17 25L :
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 6
Encontre um par de elementos consecutivos XXXX e YYYY em LLLL que estejam fora de ordem.
Construa uma nova lista NNNN, idêntica a LLLL, exceto pelo fato de que em NNNN o elemento YYYY ocorre antes de XXXX.
Ordene recursivamente a lista NNNN, obtendo a lista ordenada LoLoLoLo.
46 51 39 17 25
46 39 51 17 25
17 25 39 46 51
toque
ordene
N :
Lo :
![Page 7: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/7.jpg)
Ordenação por trocas: funcionamento/complexidade
46 17 51 39 25
17 46 51 39 25
toque
17 46 39 51 25
toque
toque
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 7
17 39 46 51 25
17 39 46 25 51
toque
17 39 25 46 51
toque
17 25 39 46 51
toque
O(n2)
![Page 8: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/8.jpg)
Ordenação por trocas: implementação
Exemplo 2. Ordenação por trocasExemplo 2. Ordenação por trocas
bsbsbsbs(L,(L,(L,(L,LoLoLoLo) :) :) :) :----
concatena(A,[X,concatena(A,[X,concatena(A,[X,concatena(A,[X,Y|BY|BY|BY|B],L),],L),],L),],L),
X>Y, !,X>Y, !,X>Y, !,X>Y, !,
concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,X|BX|BX|BX|B],N),],N),],N),],N),
bsbsbsbs(N,(N,(N,(N,LoLoLoLo).).).).
bsbsbsbs(L,L).(L,L).(L,L).(L,L).
bsbsbsbs(L,(L,(L,(L,LoLoLoLo) :) :) :) :----
concatena(A,[X,concatena(A,[X,concatena(A,[X,concatena(A,[X,Y|BY|BY|BY|B],L),],L),],L),],L),
X>Y, !,X>Y, !,X>Y, !,X>Y, !,
concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,concatena(A,[Y,X|BX|BX|BX|B],N),],N),],N),],N),
bsbsbsbs(N,(N,(N,(N,LoLoLoLo).).).).
bsbsbsbs(L,L).(L,L).(L,L).(L,L).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 8
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).
concatenaconcatenaconcatenaconcatena([],B,B).([],B,B).([],B,B).([],B,B).
concatenaconcatenaconcatenaconcatena([([([([X|AX|AX|AX|A],B,[],B,[],B,[],B,[X|CX|CX|CX|C]) :]) :]) :]) :---- concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).concatena(A,B,C).
Exercício 2. Ordenação por trocasExercício 2. Ordenação por trocas
Digite e teste os predicados definidos no Exemplo 2.
Modifique o predicado bs/2bs/2bs/2bs/2 para que os estados da lista sejam exibidos no vídeo.
Digite e teste os predicados definidos no Exemplo 2.
Modifique o predicado bs/2bs/2bs/2bs/2 para que os estados da lista sejam exibidos no vídeo.
![Page 9: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/9.jpg)
Ordenação por inserção (insertion sort)
A operação de inserçãoA operação de inserção
Insere um elemento XXXX numa lista ordenada LLLL, obtendo uma nova lista ordenada NNNN.Insere um elemento XXXX numa lista ordenada LLLL, obtendo uma nova lista ordenada NNNN.
Para ordenar recursivamente uma lista LLLL usando inserção:
Comece com uma lista auxiliar AAAA
46 51 39 17 25
insere
L : A :
4651 39 17 25L : A :
insere
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 9
Comece com uma lista auxiliar AAAAvazia.Insira o primeiro elemento de LLLLem AAAA, obtendo uma nova lista NNNN.Insira recursivamente os demais elementos de LLLL em NNNN, obtendo a lista ordenada LoLoLoLo.
Complexidade: O(n2)
insere
46 5139 17 25L : A :
insere
46 513917 25L : A :
insere
46 51391725L : A :
insere
46 513917 25L : A :
![Page 10: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/10.jpg)
Ordenação por inserção: implementação
Exemplo 3. Ordenação por inserçãoExemplo 3. Ordenação por inserção
isisisis([],A,A).([],A,A).([],A,A).([],A,A).
isisisis([([([([X|RX|RX|RX|R],A,],A,],A,],A,LoLoLoLo) :) :) :) :---- insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,LoLoLoLo).).).).
insereinsereinsereinsere(X,[],[X]).(X,[],[X]).(X,[],[X]).(X,[],[X]).
insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[X,],[X,],[X,],[X,Y|AY|AY|AY|A]) :]) :]) :]) :---- X=<Y, !.X=<Y, !.X=<Y, !.X=<Y, !.
insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[],[],[],[Y|BY|BY|BY|B]) :]) :]) :]) :---- insere(X,A,B).insere(X,A,B).insere(X,A,B).insere(X,A,B).
isisisis([],A,A).([],A,A).([],A,A).([],A,A).
isisisis([([([([X|RX|RX|RX|R],A,],A,],A,],A,LoLoLoLo) :) :) :) :---- insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,insere(X,A,N), is(R,N,LoLoLoLo).).).).
insereinsereinsereinsere(X,[],[X]).(X,[],[X]).(X,[],[X]).(X,[],[X]).
insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[X,],[X,],[X,],[X,Y|AY|AY|AY|A]) :]) :]) :]) :---- X=<Y, !.X=<Y, !.X=<Y, !.X=<Y, !.
insereinsereinsereinsere(X,[(X,[(X,[(X,[Y|AY|AY|AY|A],[],[],[],[Y|BY|BY|BY|B]) :]) :]) :]) :---- insere(X,A,B).insere(X,A,B).insere(X,A,B).insere(X,A,B).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 10
Exercício 3. Ordenação por inserçãoExercício 3. Ordenação por inserção
Digite os predicados definidos no Exemplo 2 e teste com a consulta:
????---- is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).
Modifique o predicado is/2is/2is/2is/2 de modo que os estados da lista AAAA sejam exibidos.
Digite os predicados definidos no Exemplo 2 e teste com a consulta:
????---- is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).is([46,51,39,17,25],[],Lo).
Modifique o predicado is/2is/2is/2is/2 de modo que os estados da lista AAAA sejam exibidos.
![Page 11: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/11.jpg)
Ordenação por intercalação (merge sort)
A operação de intercalaçãoA operação de intercalação
Dadas duas listas ordenadas AoAoAoAo e BoBoBoBo, a operação de intercalação constrói uma lista ordenada LoLoLoLo, com elementos de AoAoAoAo e BoBoBoBo, em tempo proporcional ao tamanho de LoLoLoLo.Dadas duas listas ordenadas AoAoAoAo e BoBoBoBo, a operação de intercalação constrói uma lista ordenada LoLoLoLo, com elementos de AoAoAoAo e BoBoBoBo, em tempo proporcional ao tamanho de LoLoLoLo.
Para ordenar recursivamente uma lista LLLL usando intercalação:
72 51 65 88 90 46 29 15 37
separe
L :
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 11
lista usando intercalação:Separe os elementos de LLLL em duas listas AAAA e BBBB; com aproximadamente o mesmo número de elementos.
Ordene recursivamente as listas AAAAe BBBB, obtendo as respectivas listas ordenadas AoAoAoAo e BoBoBoBo.
Intercale as listas ordenadas AoAoAoAo e BoBoBoBo, obtendo a lista ordenada LoLoLoLo.
72 65 90 29 37 51 88 46 15
29 37 65 72 90 15 46 51 88
15 29 37 46 51 65 72 88 90
separe
ordene
intercale
A : B :
Ao : Bo :
Lo :
![Page 12: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/12.jpg)
Ordenação por intercalação: funcionamento/complexidade
72 51 65 88 90 46 29 15 37
72 65 90 29 37 51 88 46 15
72 90 37 65 29 51 46 88 15
72 37 90 65 29 51 46 88 15
72 37
lg n
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 12
72 37
37 72
46 51 15 88
15 46 51 88
15 29 37 46 51 65 72 88 90
72 37
90 65 29 51 46 88 15
29 6537 72 90
29 37 65 72 90
n
O(n lg n)
![Page 13: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/13.jpg)
Ordenação por intercalação: implementação
Exercício 4. Separação dos elementosExercício 4. Separação dos elementos
Defina o predicado separa(L,A,B)separa(L,A,B)separa(L,A,B)separa(L,A,B), que separa os elementos da lista LLLL em duas listas AAAA e BBBB, cada uma delas com aproximadamente o mesmo número de elementos.Teste com a consulta: ????---- separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).
Defina o predicado separa(L,A,B)separa(L,A,B)separa(L,A,B)separa(L,A,B), que separa os elementos da lista LLLL em duas listas AAAA e BBBB, cada uma delas com aproximadamente o mesmo número de elementos.Teste com a consulta: ????---- separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).separa([72,51,65,88,90,46,29,15,37],A,B).
Exercício 5. Intercalação dos elementosExercício 5. Intercalação dos elementos
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 13
Defina o predicado intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo), que intercala os elementos das listas ordenadas AoAoAoAo e BoBoBoBo para construir uma única lista ordenada LoLoLoLo.Teste com a consulta: ????---- intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).
Defina o predicado intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo)intercala(Ao,Bo,Lo), que intercala os elementos das listas ordenadas AoAoAoAo e BoBoBoBo para construir uma única lista ordenada LoLoLoLo.Teste com a consulta: ????---- intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).intercala([29,37,65,72,90],[15,46,51,88],Lo).
Exercício 6. Ordenação por intercalação (merge sort)Exercício 6. Ordenação por intercalação (merge sort)
Defina o predicado ms(L,Lo)ms(L,Lo)ms(L,Lo)ms(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por intercalação.Teste com a consulta: ????---- ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).
Defina o predicado ms(L,Lo)ms(L,Lo)ms(L,Lo)ms(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por intercalação.Teste com a consulta: ????---- ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).ms([72,51,65,88,90,46,29,15,37],Lo).
![Page 14: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/14.jpg)
Ordenação por partição (quick sort)
A operação de partiçãoA operação de partição
Dada uma lista L=[L=[L=[L=[P|RP|RP|RP|R]]]], a operação de partição distribui os elementos de RRRR em duas listas AAAA e BBBB tais que os elementos de AAAA sejam menores ou iguais a PPPP e os elementos de BBBB sejam maiores que PPPP.
Dada uma lista L=[L=[L=[L=[P|RP|RP|RP|R]]]], a operação de partição distribui os elementos de RRRR em duas listas AAAA e BBBB tais que os elementos de AAAA sejam menores ou iguais a PPPP e os elementos de BBBB sejam maiores que PPPP.
Para ordenar recursivamente uma lista L=[P|R]L=[P|R]L=[P|R]L=[P|R] usando partição:
L : 72 51 65 88 90 46 29 15 37
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 14
lista L=[P|R]L=[P|R]L=[P|R]L=[P|R] usando partição:Particione os elementos de RRRRem duas listas AAAA e BBBB.Ordene recursivamente as listas AAAA e BBBB, obtendo as respectivas listas ordenadas AoAoAoAo e BoBoBoBo.Concatene as listas ordenadas AoAoAoAo e [P|Bo][P|Bo][P|Bo][P|Bo], obtendo a lista ordenada LoLoLoLo.
Bo :Ao :
B :51 65 46 29 15 88 9037
15 29 37 46 51 88 9065
15 29 37 46 51 65 72 88 90
particione
ordene
concatene
A :
Lo :
![Page 15: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/15.jpg)
Ordenação por partição: funcionamento/complexidade
72 51 65 88 90 46 29 15 37
51 65 46 29 15 37 88 90
46 29 15 37 65 90
15 37
29 15 37
n
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 15
15 37
88 90
15 29 37 46 51 65 72 88 90
15 37
65
15 29 37
15 29 37 46
15 29 37 46 51 65
90
n
Pior caso: O(n2)
Melhor caso: O(n lg n)
![Page 16: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/16.jpg)
Ordenação por partição: implementação
Exercício 7. Partição dos elementosExercício 7. Partição dos elementos
Defina particionaparticionaparticionaparticiona(P,L,A,B)(P,L,A,B)(P,L,A,B)(P,L,A,B), que particiona a lista LLLL em duas listas AAAA e BBBB tal que os elementos de A sejam menores ou iguais a PPPP e os de BBBB sejam maiores que PPPP.Teste com a consulta: ????---- particionaparticionaparticionaparticiona(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).
Defina particionaparticionaparticionaparticiona(P,L,A,B)(P,L,A,B)(P,L,A,B)(P,L,A,B), que particiona a lista LLLL em duas listas AAAA e BBBB tal que os elementos de A sejam menores ou iguais a PPPP e os de BBBB sejam maiores que PPPP.Teste com a consulta: ????---- particionaparticionaparticionaparticiona(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).(72,[51,65,88,90,46,29,15,37],A,B).
Exercício 8. Concatenação de listasExercício 8. Concatenação de listas
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 16
Defina concatena(A,B,L)concatena(A,B,L)concatena(A,B,L)concatena(A,B,L), que concatena as listas AAAA e BBBB para construir a lista LLLL.Teste com a consulta: ????---- concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).
Defina concatena(A,B,L)concatena(A,B,L)concatena(A,B,L)concatena(A,B,L), que concatena as listas AAAA e BBBB para construir a lista LLLL.Teste com a consulta: ????---- concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).concatena([15,29,37,46,51,65],[72,88,90],L).
Exercício 9. Ordenação por partição (quick sort)Exercício 9. Ordenação por partição (quick sort)
Defina o predicado qs(L,Lo)qs(L,Lo)qs(L,Lo)qs(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por partição.Teste com a consulta: ????---- qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).
Defina o predicado qs(L,Lo)qs(L,Lo)qs(L,Lo)qs(L,Lo), que transforma a lista LLLL em uma lista ordenada correspondente LoLoLoLo, usando o método de ordenação por partição.Teste com a consulta: ????---- qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).qs([72,51,65,88,90,46,29,15,37],Lo).
![Page 17: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/17.jpg)
Ordenação topológica
definiçãoimplementação
![Page 18: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/18.jpg)
Ordenação topológica
Ordenação topológicaOrdenação topológica
Uma ordenação topológica de um grafo acíclico G=(V,A) é uma ordem total S dos elementos de V tal que se (vi,vj) ∈ A, então vi precede vj em S.Uma ordenação topológica de um grafo acíclico G=(V,A) é uma ordem total S dos elementos de V tal que se (vi,vj) ∈ A, então vi precede vj em S.
Se G representa uma rede de tarefas, isto é:Os elementos de V denotam tarefas
gravata paletó cueca
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 18
Os elementos de V denotam tarefas
Os elementos de A denotam dependências entre tarefas (restrições de ordem)
Então:
Uma ordenação topológica de G indica uma ordem em que as tarefas podem ser realizadas, sem que as restrições de ordem entre elas sejam violadas
camisa cinto calça
relógio meias sapatos
1 2 3
4 5 6
7 8 9
![Page 19: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/19.jpg)
Ordenação topológica: funcionamento
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 19
7 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 97 8 9
Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]Ordenação topológica: [3, 4, 1, 6, 5, 2, 7, 8, 9]
![Page 20: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/20.jpg)
Ordenação topológica: implementação
Exemplo 4. Ordenação topológicaExemplo 4. Ordenação topológica
grafografografografo(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).
ordtopordtopordtopordtop(G,S) :(G,S) :(G,S) :(G,S) :----grafo(G,grafo(G,grafo(G,grafo(G,VsVsVsVs,As),,As),,As),,As),ordtopordtopordtopordtop((((VsVsVsVs,As,S).,As,S).,As,S).,As,S).
ordtopordtopordtopordtop([],_,[]).([],_,[]).([],_,[]).([],_,[]).ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----
grafografografografo(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],(1,[1, 2, 3, 4, 5, 6, 7, 8, 9],[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).[1<2, 3<6, 4<1, 4<5, 5<2, 6<5, 6<9, 8<9]).
ordtopordtopordtopordtop(G,S) :(G,S) :(G,S) :(G,S) :----grafo(G,grafo(G,grafo(G,grafo(G,VsVsVsVs,As),,As),,As),,As),ordtopordtopordtopordtop((((VsVsVsVs,As,S).,As,S).,As,S).,As,S).
ordtopordtopordtopordtop([],_,[]).([],_,[]).([],_,[]).([],_,[]).ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 20
ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----appendappendappendappend(E,[(E,[(E,[(E,[V|DV|DV|DV|D],],],],VsVsVsVs),),),),notnotnotnot((((membermembermembermember(_<V,As)),(_<V,As)),(_<V,As)),(_<V,As)),appendappendappendappend(E,D,(E,D,(E,D,(E,D,NVsNVsNVsNVs),),),),findallfindallfindallfindall(X<Y,(X<Y,(X<Y,(X<Y,((((membermembermembermember(X<Y,As),X(X<Y,As),X(X<Y,As),X(X<Y,As),X\\\\=V)=V)=V)=V),,,,NAsNAsNAsNAs),),),),ordtopordtopordtopordtop((((NVsNVsNVsNVs,,,,NAsNAsNAsNAs,S).,S).,S).,S).
ordtopordtopordtopordtop((((VsVsVsVs,As,[,As,[,As,[,As,[V|SV|SV|SV|S]) :]) :]) :]) :----appendappendappendappend(E,[(E,[(E,[(E,[V|DV|DV|DV|D],],],],VsVsVsVs),),),),notnotnotnot((((membermembermembermember(_<V,As)),(_<V,As)),(_<V,As)),(_<V,As)),appendappendappendappend(E,D,(E,D,(E,D,(E,D,NVsNVsNVsNVs),),),),findallfindallfindallfindall(X<Y,(X<Y,(X<Y,(X<Y,((((membermembermembermember(X<Y,As),X(X<Y,As),X(X<Y,As),X(X<Y,As),X\\\\=V)=V)=V)=V),,,,NAsNAsNAsNAs),),),),ordtopordtopordtopordtop((((NVsNVsNVsNVs,,,,NAsNAsNAsNAs,S).,S).,S).,S).
Exercício 10. Ordenação topológicaExercício 10. Ordenação topológica
Digite o programa do Exemplo 4 e faça a consulta:????---- ordtop(1,S).ordtop(1,S).ordtop(1,S).ordtop(1,S).
Digite o programa do Exemplo 4 e faça a consulta:????---- ordtop(1,S).ordtop(1,S).ordtop(1,S).ordtop(1,S).
![Page 21: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/21.jpg)
Ordenação topológica
Exercício 11. Exibição de todas as soluçõesExercício 11. Exibição de todas as soluções
Represente o grafo a seguir e faça a consulta indicada.
????---- forall(forall(forall(forall(ordtop(2,S)ordtop(2,S)ordtop(2,S)ordtop(2,S), , , , writeln(S)writeln(S)writeln(S)writeln(S)))))....
Represente o grafo a seguir e faça a consulta indicada.
????---- forall(forall(forall(forall(ordtop(2,S)ordtop(2,S)ordtop(2,S)ordtop(2,S), , , , writeln(S)writeln(S)writeln(S)writeln(S)))))....
1 2 3 4
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 21
Exercício 12. Ordenação topológica versus permutaçãoExercício 12. Ordenação topológica versus permutação
Quando não há restrições de ordem entre os vértices do grafo, a ordenação topológica funciona como permutação. Para verificar este fato, represente o grafo a seguir e faça a consulta indicada:
????---- forall(forall(forall(forall(ordtop(3,S)ordtop(3,S)ordtop(3,S)ordtop(3,S), , , , writeln(S)writeln(S)writeln(S)writeln(S)))))....
Quando não há restrições de ordem entre os vértices do grafo, a ordenação topológica funciona como permutação. Para verificar este fato, represente o grafo a seguir e faça a consulta indicada:
????---- forall(forall(forall(forall(ordtop(3,S)ordtop(3,S)ordtop(3,S)ordtop(3,S), , , , writeln(S)writeln(S)writeln(S)writeln(S)))))....
1 2 3
![Page 22: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/22.jpg)
Árvores de busca binária
definição
manipulação
![Page 23: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/23.jpg)
Árvores de busca binária
Uma árvore binária AAAAUma árvore binária AAAA
é uma estrutura composta por n nós tal que se n=0, dizemos que A é vazia (representada por ####); caso contrário:
existe um nó especial em AAAA denominado raizos demais nós de AAAA são organizados em estruturas disjuntas:
uma subárvore binária esquerda Euma subárvore binária direita D
é uma estrutura composta por n nós tal que se n=0, dizemos que A é vazia (representada por ####); caso contrário:
existe um nó especial em AAAA denominado raizos demais nós de AAAA são organizados em estruturas disjuntas:
uma subárvore binária esquerda Euma subárvore binária direita D
RRRR
EEEE DDDD
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 23
uma subárvore binária direita Duma subárvore binária direita D
Uma árvore de busca binária AAAAUma árvore de busca binária AAAA
é uma árvore binária vazia ou uma estrutura nó(R,E,D)nó(R,E,D)nó(R,E,D)nó(R,E,D) tal que:• todo elemento em EEEE é menor ou igual a RRRR• todo elemento em DDDD é maior que RRRR
é uma árvore binária vazia ou uma estrutura nó(R,E,D)nó(R,E,D)nó(R,E,D)nó(R,E,D) tal que:• todo elemento em EEEE é menor ou igual a RRRR• todo elemento em DDDD é maior que RRRR
62
1 3 5 7
4
![Page 24: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/24.jpg)
Árvore de busca binária
Exemplo 5. Criação de árvore de busca bináriaExemplo 5. Criação de árvore de busca binária
abbabbabbabb([],A,A).([],A,A).([],A,A).([],A,A).abbabbabbabb([([([([X|XsX|XsX|XsX|Xs],A,A2) :],A,A2) :],A,A2) :],A,A2) :---- insinsinsins(X,A,A1), (X,A,A1), (X,A,A1), (X,A,A1), abbabbabbabb((((XsXsXsXs,A1,A2).,A1,A2).,A1,A2).,A1,A2).
insinsinsins(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).insinsinsins(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :---- X=<R, !, X=<R, !, X=<R, !, X=<R, !, insinsinsins(X,E,N).(X,E,N).(X,E,N).(X,E,N).insinsinsins(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :---- insinsinsins(X,D,N).(X,D,N).(X,D,N).(X,D,N).
abbabbabbabb([],A,A).([],A,A).([],A,A).([],A,A).abbabbabbabb([([([([X|XsX|XsX|XsX|Xs],A,A2) :],A,A2) :],A,A2) :],A,A2) :---- insinsinsins(X,A,A1), (X,A,A1), (X,A,A1), (X,A,A1), abbabbabbabb((((XsXsXsXs,A1,A2).,A1,A2).,A1,A2).,A1,A2).
insinsinsins(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).(X,#,nó(X,#,#)).insinsinsins(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :(X,nó(R,E,D),nó(R,N,D)) :---- X=<R, !, X=<R, !, X=<R, !, X=<R, !, insinsinsins(X,E,N).(X,E,N).(X,E,N).(X,E,N).insinsinsins(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :(X,nó(R,E,D),nó(R,E,N)) :---- insinsinsins(X,D,N).(X,D,N).(X,D,N).(X,D,N).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 24
Exercício 13. Criação de árvore de busca bináriaExercício 13. Criação de árvore de busca binária
Digite o programa do Exemplo 5, faça a consulta a seguir e desenhe a árvore obtida:????---- abbabbabbabb([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).
Digite o programa do Exemplo 5, faça a consulta a seguir e desenhe a árvore obtida:????---- abbabbabbabb([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).([3,5,1,0,4,2],#,A).
Exercício 14. Exibição de árvore de busca bináriaExercício 14. Exibição de árvore de busca binária
Complete o programa do Exemplo 5 com um predicado para exibir os elementos de uma árvore de busca binária em ordem crescente.Complete o programa do Exemplo 5 com um predicado para exibir os elementos de uma árvore de busca binária em ordem crescente.
![Page 25: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/25.jpg)
Código de Huffman
definiçãoimplementação
![Page 26: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/26.jpg)
Exemplo 6. Códigos de HuffmanExemplo 6. Códigos de Huffman
Texto: MARMELADATexto: MARMELADA
Código de Huffman
O código de HuffmanO código de Huffman
para um texto TTTT é uma atribuição de códigos binários aos caracteres de TTTT que minimiza o número médio de bits por caractere.para um texto TTTT é uma atribuição de códigos binários aos caracteres de TTTT que minimiza o número médio de bits por caractere.
Para obter os códigos de Huffman para os caracteres de um texto TTTT:
Obtenha as frequências dos caracteres em .
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 26
Texto: MARMELADATexto: MARMELADAObtenha as frequências dos caracteres em TTTT .Crie uma floresta contendo uma árvore unitária com a frequência de cada um dos caracteres.Juntes as árvores de menores frequências, duas a duas, até que seja obtida uma única árvore.Associe um bit 0000 às subárvores esquerdas e um bit 1 às subárvores direitas. 1
DDDD
1
EEEE
1
LLLL
1
RRRR
2
MMMM
3
AAAA
2 2 5
4
90
0
0 0 0
1
1
1 11
![Page 27: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/27.jpg)
Código de Huffman
Exemplo 6. Frequência dos caracteresExemplo 6. Frequência dos caracteres
freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :---- !, !, !, !, sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).
freqfreqfreqfreq([([([([S|SsS|SsS|SsS|Ss],F1,F3) :],F1,F3) :],F1,F3) :],F1,F3) :---- insfinsfinsfinsf(S,F1,F2), (S,F1,F2), (S,F1,F2), (S,F1,F2), freqfreqfreqfreq((((SsSsSsSs,F2,F3).,F2,F3).,F2,F3).,F2,F3).
insfinsfinsfinsf(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.
insfinsfinsfinsf(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.
insfinsfinsfinsf(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- insfinsfinsfinsf(X,R,N).(X,R,N).(X,R,N).(X,R,N).
freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :---- !, !, !, !, sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).
freqfreqfreqfreq([([([([S|SsS|SsS|SsS|Ss],F1,F3) :],F1,F3) :],F1,F3) :],F1,F3) :---- insfinsfinsfinsf(S,F1,F2), (S,F1,F2), (S,F1,F2), (S,F1,F2), freqfreqfreqfreq((((SsSsSsSs,F2,F3).,F2,F3).,F2,F3).,F2,F3).
insfinsfinsfinsf(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.
insfinsfinsfinsf(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.
insfinsfinsfinsf(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- insfinsfinsfinsf(X,R,N).(X,R,N).(X,R,N).(X,R,N).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 27
Exercício 15. Frequência dos caracteresExercício 15. Frequência dos caracteres
Digite o programa do Exemplo 6 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S).(marmelada,S).(marmelada,S).(marmelada,S).
????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F).(S,[],F).(S,[],F).(S,[],F).
Digite o programa do Exemplo 6 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S).(marmelada,S).(marmelada,S).(marmelada,S).
????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F).(S,[],F).(S,[],F).(S,[],F).
Note que a lista de frequências dos caracteres FFFF é uma floresta!Note que a lista de frequências dos caracteres FFFF é uma floresta!
![Page 28: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/28.jpg)
Código de Huffman
Exemplo 7. Construção da árvore de HuffmanExemplo 7. Construção da árvore de Huffman
arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :----
!!!!....
arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----
A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),
A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),
F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,
sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),
arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :----
!!!!....
arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----
A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),
A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),
F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,F3 is F1 + F2,
sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 28
sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),
arvhufarvhufarvhufarvhuf(As,B).(As,B).(As,B).(As,B).
sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),
arvhufarvhufarvhufarvhuf(As,B).(As,B).(As,B).(As,B).
Exercício 15. Construção da árvore de HuffmanExercício 15. Construção da árvore de Huffman
Digite o programa do Exemplo 7 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A).(F,A).(F,A).(F,A).
Digite o programa do Exemplo 7 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A).(F,A).(F,A).(F,A).
![Page 29: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/29.jpg)
Código de Huffman
Exemplo 8. Exibição dos códigosExemplo 8. Exibição dos códigos
códigoscódigoscódigoscódigos(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :----
!!!!, , , , reversereversereversereverse(C,R), (C,R), (C,R), (C,R), atom_charsatom_charsatom_charsatom_chars(A,R), (A,R), (A,R), (A,R), writelnwritelnwritelnwriteln(S : A).(S : A).(S : A).(S : A).
códigoscódigoscódigoscódigos(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :----
códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).
códigoscódigoscódigoscódigos(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :(nó(_,S,#,#),C) :----
!!!!, , , , reversereversereversereverse(C,R), (C,R), (C,R), (C,R), atom_charsatom_charsatom_charsatom_chars(A,R), (A,R), (A,R), (A,R), writelnwritelnwritelnwriteln(S : A).(S : A).(S : A).(S : A).
códigoscódigoscódigoscódigos(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :(nó(_,_,E,D),C) :----
códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).códigos(E,['0'|C]), códigos(D,['1'|C]).
Exercício 16. Exibição dos códigosExercício 16. Exibição dos códigos
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 29
Exercício 16. Exibição dos códigosExercício 16. Exibição dos códigos
Digite o programa do Exemplo 8 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).
Digite o programa do Exemplo 8 e faça as consultas a seguir:????---- atom_charsatom_charsatom_charsatom_chars(marmelada,S), (marmelada,S), (marmelada,S), (marmelada,S), freqfreqfreqfreq(S,[],F), (S,[],F), (S,[],F), (S,[],F), arvhufarvhufarvhufarvhuf(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).(F,A), códigos(A,[]).
Exercício 17. Programa principalExercício 17. Programa principal
Defina o predicado huffmanhuffmanhuffmanhuffman(T)(T)(T)(T), que exibe os códigos de Huffman para o texto TTTT:
????---- huffmanhuffmanhuffmanhuffman((((''''MARMELADAMARMELADAMARMELADAMARMELADA'''').).).).
Defina o predicado huffmanhuffmanhuffmanhuffman(T)(T)(T)(T), que exibe os códigos de Huffman para o texto TTTT:
????---- huffmanhuffmanhuffmanhuffman((((''''MARMELADAMARMELADAMARMELADAMARMELADA'''').).).).
![Page 30: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/30.jpg)
Bônus: interface gráfica
::::---- use_module(library(tabular)).use_module(library(tabular)).use_module(library(tabular)).use_module(library(tabular)).
hufhufhufhuf ::::----
newnewnewnew(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),(F,frame('Códigos de Huffman')),
sendsendsendsend(F,append,(F,append,(F,append,(F,append,newnewnewnew(D,(D,(D,(D,dialogdialogdialogdialog)),)),)),)),
sendsendsendsend(D,above,(D,above,(D,above,(D,above,newnewnewnew(P,(P,(P,(P,picturepicturepicturepicture)),)),)),)),
sendsendsendsend(P,size,(P,size,(P,size,(P,size,sizesizesizesize(210,100)),(210,100)),(210,100)),(210,100)),
sendsendsendsend(P,display,(P,display,(P,display,(P,display,newnewnewnew(T,tabular)), (T,tabular)), (T,tabular)), (T,tabular)),
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 30
sendsendsendsend(P,display,(P,display,(P,display,(P,display,newnewnewnew(T,tabular)), (T,tabular)), (T,tabular)), (T,tabular)),
sendsendsendsend(T,border,1),(T,border,1),(T,border,1),(T,border,1),
sendsendsendsend(T,rules,all),(T,rules,all),(T,rules,all),(T,rules,all),
sendsendsendsend(D,append,(D,append,(D,append,(D,append,newnewnewnew(I,(I,(I,(I,text_itemtext_itemtext_itemtext_item(texto))),(texto))),(texto))),(texto))),
sendsendsendsend(D,append,(D,append,(D,append,(D,append,buttonbuttonbuttonbutton(ok,(ok,(ok,(ok,andandandand((((andandandand((((messagemessagemessagemessage(T,clear),(T,clear),(T,clear),(T,clear),
messagemessagemessagemessage(@prolog,huf,T,I(@prolog,huf,T,I(@prolog,huf,T,I(@prolog,huf,T,I????selection)),selection)),selection)),selection)),
messagemessagemessagemessage(I,clear)))),(I,clear)))),(I,clear)))),(I,clear)))),
sendsendsendsend(D,append,(D,append,(D,append,(D,append,buttonbuttonbuttonbutton(sair,(sair,(sair,(sair,messagemessagemessagemessage(F,destroy))),(F,destroy))),(F,destroy))),(F,destroy))),
sendsendsendsend(F,open).(F,open).(F,open).(F,open).
![Page 31: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/31.jpg)
Bônus: interface gráfica
hufhufhufhuf(T,I) :(T,I) :(T,I) :(T,I) :----
atom_charsatom_charsatom_charsatom_chars(I,L),(I,L),(I,L),(I,L),
freq(L,[],F),freq(L,[],F),freq(L,[],F),freq(L,[],F),
arvhuf(F,A),arvhuf(F,A),arvhuf(F,A),arvhuf(F,A),
códigos(T,A,[]).códigos(T,A,[]).códigos(T,A,[]).códigos(T,A,[]).
freqfreqfreqfreq([],F1,F2) :([],F1,F2) :([],F1,F2) :([],F1,F2) :----
!!!!, , , ,
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 31
!!!!, , , ,
sortsortsortsort(F1,F2).(F1,F2).(F1,F2).(F1,F2).
freqfreqfreqfreq([S|Ss],F1,F3) :([S|Ss],F1,F3) :([S|Ss],F1,F3) :([S|Ss],F1,F3) :----
ins(S,F1,F2),ins(S,F1,F2),ins(S,F1,F2),ins(S,F1,F2),
freq(Ss,F2,F3).freq(Ss,F2,F3).freq(Ss,F2,F3).freq(Ss,F2,F3).
insinsinsins(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :(X,[],[nó(1,X,#,#)]) :---- !.!.!.!.
insinsinsins(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :(X,[nó(F,X,#,#)|R],[nó(G,X,#,#)|R]) :---- !, G is F+1.!, G is F+1.!, G is F+1.!, G is F+1.
insinsinsins(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :(X,[nó(F,Y,#,#)|R],[nó(F,Y,#,#)|N]) :---- ins(X,R,N).ins(X,R,N).ins(X,R,N).ins(X,R,N).
![Page 32: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/32.jpg)
Bônus: interface gráfica
arvhufarvhufarvhufarvhuf([A],A) :([A],A) :([A],A) :([A],A) :---- !.!.!.!.
arvhufarvhufarvhufarvhuf([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :([A1,A2|A],B) :----
A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),A1 = nó(F1,_,_,_),
A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),A2 = nó(F2,_,_,_),
F3 F3 F3 F3 isisisis F1+F2,F1+F2,F1+F2,F1+F2,
sortsortsortsort([nó(F3,([nó(F3,([nó(F3,([nó(F3,----,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),,A1,A2)|A],As),
arvhuf(As,B).arvhuf(As,B).arvhuf(As,B).arvhuf(As,B).
Prof. Dr. Silvio do Lago Pereira – DTI / FATEC-SP 32
códigoscódigoscódigoscódigos(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :(T,nó(_,S,#,#),C) :---- !, !, !, !,
reversereversereversereverse(C,CR), (C,CR), (C,CR), (C,CR),
atom_charsatom_charsatom_charsatom_chars(A,CR),(A,CR),(A,CR),(A,CR),
sendsendsendsend(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan(T,append,S,bold,left,colspan:=:=:=:=1),1),1),1),
sendsendsendsend(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan(T,append,A,bold,left,colspan:=:=:=:=1),1),1),1),
sendsendsendsend(T,next_row).(T,next_row).(T,next_row).(T,next_row).
códigoscódigoscódigoscódigos(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :(T,nó(_,_,E,D),C) :----
códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),códigos(T,E,['0'|C]),
códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).códigos(T,D,['1'|C]).
![Page 33: Aplicações de recursividade - ime.usp.brslago/pl-08.pdf · Aplicações de recursividade Nesta aula, veremos algumas aplicações de recursividade em: Ordenação de dados Ordenação](https://reader030.vdocuments.mx/reader030/viewer/2022021721/5bf44e7b09d3f2a65c8cca40/html5/thumbnails/33.jpg)
Fim