算術編碼

算術編碼是一種無損數據壓縮方法，也是一種熵編碼的方法。和其它熵編碼方法不同的地方在於，其他的熵編碼方法通常是把輸入的消息分割為符號，然後對每個符號進行編碼，而算術編碼是直接把整個輸入的消息編碼為一個數，一個滿足（0.0 ≤ n 

現在要對dataX做編碼，假設length(X) = N
*算術編碼的運算方式
initiation: lower =   upper = 
for i=2:N
lower = 
upper = )
end
假設 lower
且C和b為整數(b越小越理想)，則dataX可以被編碼成
且為k進為何b bits來表示C
ex = 01110
ans = b=5,C=14
*範例
1.假設要對X來做二進位(k=2)的編碼且經由事先的估計，Xi = a 的機率為0.8,Xi = b 的機率為0.2
若實際上輸入的資料為X = a a a b a a
initial (X1 = a): lower = 0, upper = 0.8
When i=2, (X2 = a): lower = 0, upper = 0.64
When i=3, (X3 = a): lower = 0, upper = 0.512
When i=4, (X4 = b): lower = 0.4096, upper = 0.512
When i=5, (X5 = a): lower = 0.4096, upper = 0.49152
When i=6, (X6 = a): lower = 0.4096, upper = 0.475136
由於 lower = 0.4096, upper = 0.475136
lower  upper
所以編碼結果為
,2進位,5bits

**解碼**
假設編碼的結果為Y,length(Y) = b,其他的假設和編碼相同(k進位)
*算術解碼的運算方式
initiation: lower = 0, upper = 1, lower1 = 1, upper1 = 1
for i=1:N
check = 1;
while check =1
if there exists an n such that 
and 
are both satisfied,
then check = 0;
else


j = j+1
end
X(i) = n;


end

**資料長度**
假設是預測的Xi = n的機率,是實際上的Xi = n的機率
也就是說,若length(X) = N,當中會有N個elements等於n
則
另一方面，由於編碼的假設
在機率的預測完全準確的情況下,
Totoal coding length b 的範圍是
算術編碼的總資料長度的上限比霍夫曼編碼更低

**自適應算術編碼**
與其他類似的數據壓縮方法相比，算術編碼的一個優點是適應的便利性。適應是在處理數據時改變頻率（或概率）表。只要解碼中的頻率表以與編碼相同的方式和相同的步驟被替換，解碼的數據就匹配原始數據。通常，同步基於在編碼和解碼過程期間出現的符號的組合。

**精度和再正規化**
上面對算術編碼的解釋進行了一些簡化。尤其是，這種寫法看起來好像算術編碼首先使用無限精度精度的數值計算總體上表示最後節點的分數，然後在編碼結束的時候將這個分數轉換成最終的形式。許多算術編碼器使用有限精度的數值計算，而不是儘量去模擬無限精度，因為它們知道解碼器能夠匹配、並且將所計算的分數在那個精度四捨五入到對應值。一個例子能夠說明一個模型要將間隔分成三份並且使用8位的精度來實現。注意既然精度已經知道，我們能用的二進制數值的範圍也已經知道。
一個稱為再歸一化的過程使有限精度不再是能夠編碼的字符數目的限制。當範圍減小到範圍內的所有數值共享特定的數字時，那些數字就送到輸出數據中。儘管計算機能夠處理許多位數的精度，編碼所用位數少於它們的精度，這樣現存的數據進行左移，在右面添加新的數據位以儘量擴展能用的數據範圍。注意這樣的結果出現在前面三個例子中的兩個裡面。

**算術編碼和其他壓縮方法的關係**

**霍夫曼編碼**
算術編碼和哈夫曼編碼的相似程度很高——事實上，哈夫曼編碼只是算術編碼的一個特例。但是，算術編碼將整個消息翻譯成一個表示為基數 b，而不是將消息中的每個符號翻譯成一系列的以 b 為基數的數字，因此通常比哈夫曼編碼更能達到最優熵編碼。
因為算術編碼不能一次壓縮一個數據，所以在壓縮iid字符串時它可以任意接近熵。相反，使用霍夫曼編碼（到字符串）的擴展不會達到熵，除非字母符號的所有概率都是 2 的冪，在這種情況下，霍夫曼和算術編碼都實現熵。
當霍夫曼編碼二進製字符串時，即使熵低（例如（{0, 1}）具有概率{0.95, 0.05}），也不可能進行壓縮。霍夫曼編碼為每個值分配 1 位元，產生與輸入長度相同的代碼。相比之下，算術編碼可以更加地壓縮位元，接近最佳壓縮比

解決霍夫曼編碼次優性的一種簡單方法是連接符號（阻塞）以形成新的字母表，其中每個新符號表示來自原始字母表的原始符號序列（在這種情況下是位元）。在上面的例子中，在編碼之前對三個符號的序列進行分組將產生具有以下頻率的新「超符號」：- 000: 85.7%- 001, 010, 100: 4.5% each- 011, 101, 110: 0.24% each- 111: 0.0125%
通過這種分組，霍夫曼編碼每三個符號平均為 1.3 位元，或每符號 0.433 位元，而原始編碼中每符號一位元，即  壓縮。允許任意大的序列隨意接近熵（就像算術編碼一樣），但需要大量代碼才能這樣做，因此不如算術編碼那麼實用。
另一種方法是通過基於霍夫曼的 Golomb-Rice 編碼編碼遊程長度。這種方法允許比算術編碼或甚至霍夫曼編碼更簡單和更快的編碼/解碼，因為後者需要表查找。在 {0.95, 0.05} 示例中，具有四位餘數的 Golomb-Rice 代碼實現了壓縮率  ，遠遠低於使用三位塊的壓縮率。 Golomb-Rice 代碼僅適用於伯努利輸入，例如本例中的輸入，因此它不能代替所有情況下的阻塞。

**區間編碼**
算術編碼與區間編碼有很深的相似淵源，以至於人們通常認為兩者的性能是相同的，如果確實有什麼不同的話也只是區間編碼僅僅落後幾個位的值而已。區間編碼與算術編碼不同，通常認為它不被任何公司的專利所約束。
區間編碼的原理是這樣的，它沒有像算術編碼那樣從  開始並根據每個字符出現的概率把它分成相應的不同的小區間，它從如 000,000,000,000 到 999,999,999,999 這樣一個很大的非負整數區間開始，並且根據每個字符的概率劃分成小的子區間。當子區間小到一定程度最後結果的開頭數字出現的時候，那些數字就能夠“左移”出整個運算，並且用“右邊”的數字替換——每次出現移位時，就大體相當於最初區間的一個迴歸放大（retroactive multiplication）。

**關於算術編碼的美國專利**
許多算術編碼所用的不同方法受美國專利的保護。其中一些專利對於實現一些國際標準中定義的算術編碼算法是很關鍵的。在這種情況下，這些專利通常按照一種合理和非歧視（RAND）授權協議使用（至少是作為標準委員會的一種策略）。在一些著名的案例中（包括一些涉及IBM的專利）這些授權是免費的，而在另外一些案例中，則收取一定的授權費用。RAND條款的授權協議不一定能夠滿足所有打算使用這項技術的用戶，因為對於一個打算生產擁有所有權軟件的公司來說這項費用是“合理的”，而對於自由軟件和開源軟件項目來說它是不合理的。
在算術編碼領域做了很多開創性工作並擁有很多專利的一個著名公司是IBM。一些分析人士感到那種認為沒有一種實用並且有效的算術編碼能夠在不觸犯IBM和其它公司擁有的專利條件下實現只是數據壓縮界中的一種持續的都會傳奇（尤其是當看到有效的算術編碼已經使用了很長時間最初的專利開始到期）。然而，由於專利法沒有提供“明確界線”測試所以一種威懾心理總讓人擔憂法庭將會找到觸犯專利的特殊應用，並且隨著對於專利範圍的詳細審查將會發現一個不好的裁決將帶來很大的損失，這些技術的專利保護然而對它們的應用產生了一種阻止的效果。至少一種重要的壓縮軟件bzip2，出於對於專利狀況的擔心，故意停止了算術編碼的使用而轉向Huffman編碼。
關於算術編碼的美國專利列在下面。- Patent 4,122,440—（IBM）提交日期March 4, 1977,批准日期Oct 24, 1978（現在已經到期）- Patent 4,286,256—（IBM）批准日期Aug 25, 1981（大概已經到期）- Patent 4,467,317—（IBM）批准日期Aug 21, 1984（大概已經到期）- Patent 4,652,856—（IBM）批准日期Feb  4, 1986（大概已經到期）- Patent 4,891,643—（IBM）提交時間1986/09/15,批准日期1990/01/02- Patent 4,905,297—（IBM）批准日期Feb 27, 1990- Patent 4,933,883—（IBM）批准日期Jun 12, 1990- Patent 4,935,882—（IBM）批准日期Jun 19, 1990- Patent 4,989,000—（???）提交時間1989/06/19,批准日期1991/01/29- Patent 5,099,440- Patent 5,272,478—（Ricoh）
注意：這個列表沒有囊括所有的專利。關於更多的專利信息請參見後面的鏈接。 date=20061011035526 
算術編碼的專利可能在其它國家司法領域存在，參見軟件專利中關於軟件在世界各地專利性的討論。

**參考**
數據壓縮
*區間編碼
*哈夫曼編碼
*熵編碼
上面文章的一個早期版本（公開內容）張貼在 PlanetMath date=20030228094950 .

**外部鏈接**
  The on-line textbook: Information Theory, Inference, and Learning Algorithms date=20150206001819 , by David J.C. MacKay, explains arithmetic coding in Chapter 6.- arithmeticCoding-  "Arithmetic Coding" site on Compression-links.info (free open version of DataCompression.info) date=20111209052340  - collection of links pertaining to arithmetic coding-  Newsgroup posting date=20210125124729  with a short worked example of arithmetic encoding (integer-only).-   AIC-Context Adaptive Binary Arithmetic Coding date=20160306224214  very clear concept and demonstration for fresher.