<html>
<head>
<style>
P
{
margin:0px;
padding:0px
}
body
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body>Hi all,<BR>
&nbsp;<BR>
I am coding a zip application (using huffman algorithm) for academic reasons.<BR>
In the process i needed a permute function that i coded but disliked a lot..<BR>
&nbsp;<BR>
I went to the internet looking for a good generic permute algorithm in haskell the best one i found was not generic at all:<BR>
&nbsp;<BR>
<STRONG>&nbsp;&nbsp; import List<BR><BR>&nbsp;&nbsp;&nbsp; perms [] = [[]]<BR>&nbsp;&nbsp;&nbsp; perms (x:<FONT face="">xs</FONT>) = [ p ++ [x] ++ s | xs' &lt;- perms xs<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , (p, s) &lt;- zip (inits xs') (tails xs') ]</STRONG><BR>
<STRONG></STRONG>&nbsp;<BR>
I also found information regarding this subject in: <A href="http://www.haskell.org/hawiki/PermutationExample">http://www.haskell.org/hawiki/PermutationExample</A><BR>
&nbsp;<BR>
What am i coding in specific? I receive a list in the form:<BR>
&nbsp;<BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- l1 is a pair of the identifier and the associated probability</FONT><BR>
<STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l1 = [("A",0.6),("B",0.2)]</STRONG><BR>
&nbsp;<BR>
I must return the permutation with k levels; for example:<BR>
&nbsp;<BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- permute l k = ...</FONT><BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- should return</FONT><BR>
<STRONG>&nbsp;&nbsp;&nbsp; permute l1 0 = []</STRONG><BR>
<STRONG>&nbsp;&nbsp;&nbsp; permute l1 1 = l1</STRONG><BR>
<STRONG>&nbsp;&nbsp;&nbsp; permute l2 2 = [("AA",0.64),("AB",0.16),("BA",0.16),("BB",0.04)]</STRONG><BR>
<STRONG>&nbsp;&nbsp;&nbsp; permute l3 3 = [("AAA", Pa*Pa*Pa), ("AAB",Pa*Pa*Pb),("ABA",...),("ABB",...),("BAA",...),("BAB",...),("BBA",...),("BBB",...)]</STRONG><BR>
<STRONG></STRONG>&nbsp;<BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; --where</FONT><FONT color=#008000>:</FONT><BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- 0.64 = Pa*Pa</FONT><BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- 0.16 = Pa*Pb</FONT><BR>
<FONT color=#008000>&nbsp;&nbsp;&nbsp; -- 0.04 = Pb*Pb</FONT><BR>
&nbsp;<BR>
All of my friend are developing this in c... Of course its easier but i have enough of c and c# at work, so I'm doing this in haskell, the way i like it :)<BR>
For all interested in huffman coding: <A href="http://en.wikipedia.org/wiki/Huffman_coding">http://en.wikipedia.org/wiki/Huffman_coding</A><BR>
&nbsp;<BR>
Thanks in advance for the help, and greetings to all!<BR>
Nuno<BR>
&nbsp;<BR>
P.s. Follows the code i developed until now.. Its open source :P Just hope no-one submit the same work as i did :P<BR>

<HR id=[object]>
<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Este modulo define uma ferramenta de compressão usando para o <BR>--&nbsp;&nbsp;&nbsp;&nbsp; efeito o algoritmo de Huffman.<BR>--<BR>--&nbsp;&nbsp;&nbsp;&nbsp; HZip quer dizer isso mesmo: HuffmanZip.<BR>-- &lt;/resumo&gt;</FONT><BR><STRONG>module HZip where</STRONG><BR>
<STRONG>&nbsp; import List</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- #region Notas<BR>--&nbsp;&nbsp; . Ver parte de compressão/rendimento pois pode ter boas dicas para eficiência.<BR>-- #endregion</FONT><BR>
<FONT color=#008000></FONT>&nbsp;<BR>
<FONT color=#008000>-- #region Constantes para efeitos de teste.<BR>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Listas usadas para efeito de teste.<BR>-- &lt;/resumo&gt;</FONT><BR><STRONG>&nbsp; l1 = [("b",0.15),("d",0.08),("f",0.02),("g",0.01),("e",0.08),("c",0.15),("a",0.5),("h",0.01)]<BR>&nbsp; l2 = [("a",0.8),("b",0.2)]</STRONG><BR><FONT color=#008000>-- #endregion</FONT><BR>
<FONT color=#008000></FONT>&nbsp;<BR>
<FONT color=#008000>-- #region Funções Auxiliares</FONT><BR><FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Função que testa a convergência de funções.<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Quando o valor da próxima iteração é igual ao da anterior<BR>--&nbsp;&nbsp;&nbsp;&nbsp; devolve o resultado respectivo.<BR>--<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Da autoria de </FONT><A href="mailto:jas@di.uminho.pt"><FONT face="" color=#008000>jas&lt;at&gt;di&lt;dot&gt;uminho&lt;dot&gt;pt</FONT></A><BR><FONT color=#008000>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='f'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A função a aplicar recursivamente.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='s'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A solução actual do problema.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O resultado final da operação.<BR>-- &lt;/devolve&gt;<BR>-- limit :: (a -&gt; a) -&gt; a -&gt; a</FONT><BR><STRONG>&nbsp; limit f s | s == next = s<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise = limit f next<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where next = f s</STRONG><BR>
<STRONG></STRONG>&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Calcula a metade das probabilidades.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A lista de probabilidades.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O total das probabilidades a dividir por 2.<BR>-- &lt;/devolve&gt;</FONT><BR><STRONG>&nbsp; metade l&nbsp;&nbsp; = (sum&nbsp; l) / 2</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Devolve o primeiro elemento de um tuplo de 3.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='t'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O tuplo.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O primeiro elemento.<BR>-- &lt;/devolve&gt;</FONT><BR><STRONG>&nbsp; fst3 (a,_,_) = a</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Devolve o segundo elemento de um tuplo de 3.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='t'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O tuplo.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O segundo elemento.<BR>-- &lt;/devolve&gt;</FONT><BR><STRONG>&nbsp; snd3 (_,b,_) = b</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Devolve o terceiro elemento de um tuplo de 3.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='t'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O tuplo.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O terceiro elemento.<BR>-- &lt;/devolve&gt;<BR></FONT><STRONG>&nbsp; trd3 (_,_,c) = c</STRONG><BR><FONT face="" color=#008000>-- #endregion</FONT><BR>
<FONT color=#008000></FONT>&nbsp;<BR>
<FONT color=#008000>-- #region Funções: Teoria da informação<BR>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Calcula a quantidade de informação de uma determinada mensagem.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='p'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A probabilidade da mensagem.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A quantidade de informação da mensagem.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; i :: Float -&gt; Float</FONT><BR><STRONG>&nbsp; i p = logBase 2 (1/p)</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Entropia, função que calcula a informação média por mensagem.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A lista de probabilidades.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A informação média por mensagem.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; h :: [Float] -&gt; Float</FONT><BR><STRONG>&nbsp; h l = sum $ map (\p -&gt; if p == 0 then 0 else p * i p) l</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Calcula o comprimento médio do código (N).<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade do acontecimento.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Comprimento da palavra código.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O comprimento médio do código.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; n :: [(Float,Int)] -&gt; Float</FONT><BR><STRONG>&nbsp; n l = sum $ map (\(c,p) -&gt; p * c) l</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Desigualdade de Kraft.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A lista de comprimento das palavras código.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; True, se o código binário for univocamente decifravel<BR>--&nbsp;&nbsp;&nbsp;&nbsp; False caso contrário.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; kr :: [Int] -&gt; Bool</FONT><BR><STRONG>&nbsp; kr l = 1 &gt;= sum ( map (\n -&gt; 2^^(-n)) l )</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Algoritmo dos códigos de Huffman.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Tuplo do tipo (t,n,b) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t -&gt; Tabela de Huffman resultante.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n -&gt; Comprimento médio do código.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b -&gt; Se o código resultante é unívocamente decifravel.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; huffman :: [(String,Float)] -&gt; ([(String,Float,[Int])], Float, Float, Bool)</FONT><BR><STRONG>&nbsp; huffman l = (tabHuffman,n lProbTam,kr lTamanhos)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where lProbTam&nbsp;&nbsp; = map (\(c,p,b) -&gt; (p,fromIntegral(length b))) tabHuffman<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lTamanhos&nbsp; = map (\(c,p,b) -&gt; (length b)) tabHuffman<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tabHuffman = concat $ limit passo5 [map (\(c,p) -&gt; (c,p,[])) (passo1 l)]</STRONG><BR>
&nbsp;<BR>
<FONT face="" color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Ordena as mensagens por ordem decrescente de probabilidade.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A lista ordenada por ordem decrescente de probabilidade.<BR>-- &lt;/devolve&gt;<BR>--&nbsp; passo1 :: [(String,Float)] -&gt; [(String,Float)]<BR>&nbsp; passo1 l&nbsp; = sortBy (\(_,p1) (_,p2) -&gt; compare p2 p1) l</FONT><BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Repete o calculo para cada um dos subconjuntos.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p,b) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b -&gt; Lista de inteiros com o binário correspondente.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A lista ordenada por ordem decrescente de probabilidade.<BR>-- &lt;/devolve&gt;<BR>-- passo5 :: [(String,Float,[Int])] -&gt; [(String,Float,[Int])]</FONT><BR><STRONG>&nbsp; passo5 </STRONG><A href="mailto:l@(h"><STRONG>l@(h</STRONG></A><STRONG>:[]) = (passo234 0 (metade (map (\(_,p,_) -&gt; p) h)) h (length h) [] [])<BR>&nbsp; passo5 </STRONG><A href="mailto:l@(h:t"><STRONG>l@(h:t</STRONG></A><STRONG>)&nbsp; = (passo234 0 (metade (map (\(_,p,_) -&gt; p) h)) h (length h) [] []) `union` (passo5 t)</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Divide os subconjuntos cada um com apróximadamente métade da probabilidade<BR>--&nbsp;&nbsp;&nbsp;&nbsp; mantendo a ordenação. Em seguida atribui o código binário e termina a codificação<BR>--&nbsp;&nbsp;&nbsp;&nbsp; para o subconjunto se este tiver apenas um elemento.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='ac'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O acumulador de probabilidade.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='e'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Sublista a esquerda.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='d'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Sublista a direita.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='n'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Define o comportamento de paragem caso sublista tenha comprimento 1.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; O calculo actual da tabela de huffman.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Um passo da tabela de huffman.<BR>-- &lt;/devolve&gt;<BR>-- passo234 :: Float -&gt; Float -&gt; [(String,Float,[Int])] -&gt; Int -&gt; [(String,Float,[Int])]<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; [(String,Float,[Int])] -&gt; [[(String,Float,[Int])]]</FONT><BR><STRONG>&nbsp; passo234 _ _ [] _ e []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [e] <BR>&nbsp; passo234 _ _ [] _ e d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [e]++[d]<BR>&nbsp; passo234 _ _ (h:t) 1 e d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = passo234 0 0 [] 1 [h] d<BR>&nbsp; passo234 ac met </STRONG><A href="mailto:l@((c,p,b):t"><STRONG>l@((c,p,b):t</STRONG></A><STRONG>) n [] d = passo234 (ac+p) met t n [(c,p,b++[0])] d<BR>&nbsp; passo234 ac met </STRONG><A href="mailto:l@((c,p,b):t"><STRONG>l@((c,p,b):t</STRONG></A><STRONG>) _ e d&nbsp; | ac &lt; met = passo234 (ac+p) met t 2 (e++[(c,p,b++[0])]) d<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |otherwise = passo234 (ac+p) met t 2 e (d++[(c,p,b++[1])])</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Codifica por blocos conforme um factor.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='k'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; k = 1, codificação =&nbsp; 8 bits.<BR>--&nbsp;&nbsp;&nbsp;&nbsp; k = 2, codificaçao = 16 bits.<BR>--&nbsp;&nbsp;&nbsp;&nbsp; k = 3, codificação = 32 bits.<BR>--&nbsp;&nbsp;&nbsp;&nbsp; k = n, cofificação = 2^(<FONT face="">n+2</FONT>) bits.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; A tabela de huffman associada,<BR>--&nbsp;&nbsp;&nbsp;&nbsp; H (fonte),<BR>--&nbsp;&nbsp;&nbsp;&nbsp; N,<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Se o codigo gerado é unívocamente decifravel.<BR>-- &lt;/devolve&gt;<BR>-- permute deve ser subsituido por (permute l k)</FONT><BR><STRONG>&nbsp; blocos l k = (fst3 tabHuffman, h (map snd l), (snd3 tabHuffman)/k, trd3 tabHuffman)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where tabHuffman = huffman permute</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Cria as permutações da de simbolos e calcula a probabilidade associada.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='k'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Número de niveis.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Uma lista com os novos simbolos (codificação por blocos) e a respectiva<BR>--&nbsp;&nbsp;&nbsp;&nbsp; probabilidade.<BR>-- &lt;/devolve&gt;</FONT><BR><STRONG>&nbsp; permute = [("aa",0.64),("ab",0.16),("ba",0.16),("bb",0.04)]</STRONG><BR>
&nbsp;<BR>
<FONT color=#008000>-- &lt;resumo&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Calcula a compressão num determinado passo.<BR>-- &lt;/resumo&gt;<BR>-- &lt;variavel termo='l'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Lista do tipo (c,p) em que:<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c -&gt; Caracter identificativo.<BR>--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p -&gt; Probabilidade desse caracter acontecer.<BR>-- &lt;/variavel&gt;<BR>-- &lt;variavel termo='k'&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Número do passo.<BR>-- &lt;/variavel&gt;<BR>-- &lt;devolve&gt;<BR>--&nbsp;&nbsp;&nbsp;&nbsp; Percentagem de compressão.<BR>-- &lt;/devolve&gt;</FONT><BR><STRONG>&nbsp; compressao l k = (nf - n_)/nf<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where nf = snd3 (huffman l)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n_ = trd4 (blocos l k)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trd4 (_,_,c,_) = c</STRONG><BR><FONT color=#008000>-- #endregion</FONT><BR><br /><hr />Windows Live Spaces is here! It’s easy to create your own personal Web site. <a href='http://spaces.live.com/signup.aspx' target='_new'>Check it out!</a></body>
</html>