huffman da depressão
depressão de huffmanunknown
plain_text
4 years ago
3.0 kB
11
Indexable
// Classe nodo é a estrutura basica de cada nó presente na arvore de huffman
class NodoHuffman
{
construtor()
{
// quantidade de vezes que aparece
dados = 0;
// caracter representado pelo nodo
c = '';
esquerda = vazio;
direita = vazio;
}
}
// função recursiva para printar o código de huffman, onde S é o código de huffman
funcao printCode(raiz, s)
{
// caso base; se o nó esquerdo e direito são vazios então é uma folha e deve printar o código gerado pelo percurso da arvore.
se (raiz.esquerda == vazio
&& raiz.direita == vazio
&& (raiz.c).paraLetraMinuscula() != (raiz.c).paraLetraMaiuscula()) {
// c é o caractere no nó
print(raiz.c + ":" + s + "\n");
returna;
}
// se vamos para esquerda adicionamos '0' ao codigo
// se vamos para direira adicionamos '1' ao código
// chamada recursiva para a direita e esquerda das subarvores geradas.
printCode(raiz.left, s + "0");
printCode(raiz.right, s + "1");
}
contaFrequencia(palavra)
{
defina dicionario = vector<caractere, inteiro>([]);
for(defina i = 0; i < palavra.tamanho; i++){
for(defina j = 0; j < dicionario.tamanho + 1; j++){
se(j == dicionario.tamanho+1){
dicionario.insere(palavra[i], 1)
// sai do laço de repeticao
sair;
}senao se(dicionario[j][0] == palavra[i]){
dicionario[i][1] = dicionario[i][1] + 1;
}
}
}
retorna dicionario.ordena(funcao(a,b){retorna a[1]-b[1];});
}
// função principal
// numero de caracteres
defina palavra = “Em rápido raptoum rápido rato raptou três ratos sem deixar rastros”.
defina dicionario = contaFrequencia(palavra);
defina n = dicionario.tamanho;
// Criando uma fila de prioridades q.
// criando um min-priority queur(min-heap)
defina q = [];
for (defina i = 0; i < n; i++) {
// criando um nodo huffman através de um objeto
// e adicionando na fila de prioridades
defina hn = new NodoHuffman();
hn.c = dicionario[0][i];
hn.data = dicionario[1][i];
hn.left = vazio;
hn.right = vazio;
// adiciona o nodo na fila
q.push(hn);
}
// cria o nó raiz
defina raiz = vazio;
// ordena os valores
q.ordena(funcao(a,b){return a.data-b.data;});
// Extrai os dois menores valores
// da heap até o tamanho ser igual a 1
enquanto (q.tamanho > 1) {
// menor elemento extraido
defina x = q[0];
q.remove();
// segundo menor extraido.
defina y = q[0];
q.remove();
// cria um novo nodo F
defina f = new NodoHuffman();
// soma a frequencia dos dois nodos e atribui ao nodo F criado
f.data = x.data + y.data;
// indica que não possui caractere
f.c = '-';
// primeiro nodo extraido se torna seu filho a esquerda
f.left = x;
// segundo nodo extraido se torna seu filho a direita
f.right = y;
// faz o nodo F como a raiz
raiz = f;
// adiciona o nodo F na fila de prioridades
q.insere(f);
q.ordena(funcao(a,b){return a.data-b.data;});
}
// print the codes by traversing the tree
printCode(raiz, "");
Editor is loading...