Carregar apresentação
1
COMPRESSÃO ARITMÉTICA
Teoria da Informação COMPRESSÃO ARITMÉTICA Epifanio Diniz Giovani Facchini Renato Costa
2
Motivação Considere uma fonte com alfabeto A={a1, a2, a3), com P(a1)=0.95, P(a2)=0.02 e P(a3)=0.03. A entropia, o código de Huffman e o tamanho médio do código estão dispostos abaixo. H=0.335 bits/símbolo Tamanho médio=1.05 bits/símbolo Diferença de bits/símbolo que é 213% da entropia! Letra Probabilidade Código a1 0.95 a2 0.02 11 a3 0.03 10
3
Motivação A codificação aritmética resolve o problema de probabilidades acumuladas. Bastante útil também com pequenos alfabetos.
4
Idéia Principal É mais eficiente atribuir um código para um seqüência em particular do que gerar um código para cada símbolo. Identificador ÚNICO é gerado para representar a seqüência, este é uma fração binária. Ao contrário do algoritmo de Huffman, que precisa de códigos para cada seqüência possível (crescimento exponencial), a Codificação Aritmética gera um código único.
5
Codificação Para distinguir uma seqüência de símbolos é necessário criar um código único. O código pode ser um número dentro do intervalo [0,1). Necessitamos de uma função mapeando as seqüências nesse intervalo. A função chama-se função de distribuição acumulativa.
6
Modelo Matemático Mapeamento dos símbolos da fonte em números:
X(ai)=i ai Є A Onde A={a1,a2,...,am} é o alfabeto de entrada. X é a variável randômica. A função de densidade de probabilidade para a variável randômica é dada por: P(X = i) = P(ai) E a função de densidade cumulativa é dada por: Fx(i) = ∑ik=1 P(X = k)
7
Gerando uma Tag Exemplo: considere um alfabeto de três letras A={a1,a2,a3}, com P(a1)=0.7, P(a2)=0.1 e P(a3)=0.2. Com a função de densidade temos Fx(1)=0.7, Fx(2)=0.8 e Fx(3 )=1. Particionando o intervalo como na figura a seguir:
8
Procedimento Matemático
Para facilitar, começaremos com uma seqüência de tamanho 1. Para o alfabeto A mapeamos cada símbolo para números reais com a fórmula: Analogamente podemos afirmar: Com isso, cada símbolo do alfabeto de entrada tem um valor único. Este é exatamente o ponto intermediário do intervalo, mas podemos pegar qualquer número dentro do intervalo para representar o código de entrada.
9
Procedimento Matemático
Agora veremos o procedimento para geração de uma tag de uma seqüência de comprimento inteiro qualquer. Para a seqüência xi temos: Onde y < x significa que y precede x na ordem e o sobrescrito significa o tamanho da seqüência.
10
Geração do Limite Superior e Inferior
Para conseguir o limite superior e inferior do intervalo que queremos avaliar temos: Com isso temos o intervalo no qual podemos escolher um número qualquer. Para pegar-se o ponto intermediário usa-se:
11
Exemplo - Codificação Expressar a frase “SWISS_MISS” em um número, através do método de Codificação Aritmética por Deslocamento.
12
Exemplo - Codificação LOW=0000, HIGH=9999
NovoLow = VelhoLow + Intervalo*IntervaloLow(X) NovoHigh = VelhoLow + Intervalo*InvertaloHigh(X) Intervalo = VelhoHigh - VelhoLow
13
Char Cálculo do index Low/High
S W I L= ( 1 – 0 )*0.5 = H= 0 + ( 1 – 0 )*1.0 = L= ( 1 – 0.5 )*0.4 = H= ( 1 – 0.5 )*0.5 = L= 0 + ( )*0.2 = H= 0 + ( )*0.4 = L= ( 1 – 0.5 )*0.5 = H= ( 1 – 0.5 )*1.0 =
14
Char Cálculo do index Low/High
_ M I S L= ( 1 – 0.75 )*0.0= H= ( 1 – 0.75 )*0.1= L= (0.75 – 0.5)*0.1= H= (0.75 – 0.5)*0.2 = L= (0.5 – 0.25)*0.2 = H= (0.5 – 0.25)*0.4 = L= ( 0.5 – 0 )*0.5 = H= 0 + ( 0.5 – 0 )*1.0 = L= (0.5 – 0.25)*0.5= H= (0.5 – 0.25)*1.0 =
15
Exemplo - Codificação Valor de saída:
16
Exemplo - Decodificação
LOW=0000, HIGH=9999, CODE = 7175 index = ((Code-Low+1)*10-1)/(High-Low+1) Low = Low+(High-Low+1) * LowCumFreq[X]/10 High = Low+(High-Low+1) * HighCumFreq[X]/10-1
17
Exemplo - Decodificação
1. index= [( ) x ]/( ) = -> 7. Symbol "s" is selected. Low = 0 + ( ) x 5/10 = 5000. High = 0+ ( ) x 10/10-1 = 9999. 2. index= [( ) x ]/( ) = -> 4. Symbol "w" is selected. Low = ( ) x 4/10 = 7000. High = ( ) x 5/ = 7499. After the 7 is shifted out, Low=0000, High=4999, and Code=1753.
18
Exemplo - Decodificação
3. index= [( ) x ]/( ) = -> 3. Symbol "I" is selected. Low = 0+ ( ) x 2/10 = 1000. High = 0+ ( ) x 4/10-1 = 1999. After the 1 is shifted out, Low=0000, High=9999, and Code=7533. 4. index= [( ) x ]/( ) = -> 7. Symbol "s" is selected. Low = 0+( ) x 5/10 = 5000. High = 0+( ) x 10/10-1 = 9999.
19
Exemplo - Decodificação
5. index= [( ) x ]/( ) = -> 5. Symbol "s" is selected. Low = ( ) x 5/10 = 7500. High = ( ) x 10/10 -1 = 9999. 6. index= [( ) x ]/( I- 1) = -> 0. Symbol "u" is selected. Low = ( ) x 0/10 = 7500. High = ( ) x 1/ = 7749. After the 7 is shifted out, Low=5000, High=7499, and Code=5337.
20
Exemplo - Decodificação
7. index= [( ) x ]/( ) = -> 1. Symbol "M" is selected. Low = ( ) x 1/10 = 5250. High = ( ) x 2/ = 5499. After the 5 is shifted out, Low=2500, High=4999, and Code=1375. 8. index= [( ) x ]/( ) = -> 3. Symbol "I" is selected. Low = ( ) x 2/10 = 3000. High = ( ) x 4/10-1 = 3499. After the 3 is shifted out, Low=0000, High=4999, and Code=3750.
21
Exemplo - Decodificação
9. index= [( ) x ]/( ) = -> 7. Symbol "s" is selected. Low = 0+( ) x 5/10 = 2500. High = 0+ ( ) x 10/10-1 = 4999. 10. index= [( ) x ]/( ) = -> 5. Symbol "s" is selected. Low = ( ) x 5/10 = 3750. High = ( ) x 10/ = 4999.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.