以利亚戴尔达码

✍ dations ◷ 2025-08-27 12:47:26 #数字,无损压缩算法

以利亚戴尔达码(Elias delta code)是一种用于正整数之通用编码。该码由 Peter Elias 发明。

对于待编码正整数 ≥1:

另一个等价的编码方式为:

要对 x {\displaystyle x} 进行编码,以利亚戴尔达码必须使用 log 2 ( x ) + 2 log 2 ( log 2 ( x ) + 1 ) + 1 {\displaystyle \lfloor \log _{2}(x)\rfloor +2\lfloor \log _{2}(\lfloor \log _{2}(x)\rfloor +1)\rfloor +1} 个比特。

以下为一编码对照表:

以利亚戴尔达码之解码遵循下列步骤:

举例:

0010100111. 最左方有兩個零位元 0012. 再讀取兩個位元 001013. 還原 00101 = 54. 再讀取 N = 5 − 1 = 4 個位元 0011 = 35. 解碼為 = 24 + 3 = 19

示例代码

编码

void eliasDeltaEncode(char* source, char* dest){    IntReader intreader(source);    BitWriter bitwriter(dest);    while (intreader.hasLeft())    {        int num = intreader.getInt();        int len = 0;        int lengthOfLen = 0;        for (int temp = num; temp > 0; temp >>= 1)  // calculate 1+floor(log2(num))            len++;        for (int temp = len; temp > 1; temp >>= 1)  // calculate floor(log2(len))            lengthOfLen++;        for (int i = lengthOfLen; i > 0; --i)            bitwriter.outputBit(0);        for (int i = lengthOfLen; i >= 0; --i)            bitwriter.outputBit((len >> i) & 1);        for (int i = len-2; i >= 0; i--)            bitwriter.outputBit((num >> i) & 1);    }    bitwriter.close();    intreader.close();}

解码

void eliasDeltaDecode(char* source, char* dest){    BitReader bitreader(source);    IntWriter intwriter(dest);    while (bitreader.hasLeft())    {        int num = 1;        int len = 1;        int lengthOfLen = 0;        while (!bitreader.inputBit())     // potentially dangerous with malformed files.            lengthOfLen++;        for (int i = 0; i < lengthOfLen; i++)        {            len <<= 1;            if (bitreader.inputBit())                len |= 1;        }        for (int i = 0; i < len-1; i++)        {            num <<= 1;            if (bitreader.inputBit())                num |= 1;        }        intwriter.putInt(num);            // write out the value    }    bitreader.close();    intwriter.close();}

一般化

以利亚戴尔达码并不适用于零或负整数。一个一般化的方式是在最左侧先加一个一比特,解码时再行扣掉。另一个方法是在编码前将所有整数映射至正整数,例如:(0, 1, −1, 2, −2, 3, −3, ...) 对应至 (1, 2, 3, 4, 5, 6, 7, ...)。

相关

  • 广南省广南省(越南语:Tỉnh Quảng Nam/.mw-parser-output .han-nom{font-family:"Nom Na Tong","Han-Nom Gothic","Han-Nom Ming","HAN NOM A","HAN NOM B","Ming-Lt-HKSCS-UNI-H","
  • Testosterone睾酮,又称睾固酮、睾丸素、睾丸酮或睾甾酮、睾脂酮等(英语:Testosterone),是类固醇激素,由男性的睾丸或女性的卵巢分泌,肾上腺亦分泌少量睾酮。睾酮是主要的雌雄激素及蛋白同化甾
  • 侯官片侯官片,又称闽东语南片,是闽东语的一个方言片区,通行于清末福州府(福州十邑)所辖的大部分地域,大致相当于福州市区、闽侯、永泰、闽清、长乐、罗源、连江、福清、平潭、屏南和古田
  • 螺蛳螺蛳属(学名:Margarya)是一个淡水生、有口盖(英语:operculum (gastropod))的淡水螺(英语:freshwater snail)的属,是田螺科环棱螺亚科的腹足纲软体动物。螺蛳属的学名Margarya源于本属
  • 开曼群岛总理开曼群岛总理(The Premier of the Cayman Islands),英国海外领土开曼群岛的政府首脑,称号JP、MBE。May 12, 2005 Elections:Cayman Islands Government Portal:阿根廷总统 · 安
  • 芳香族L-氨基酸脱羧酶芳香族L-氨基酸脱羧酶(英语:Aromatic L-amino acid decarboxylase,EC 4.1.1.28;同义词:多巴脱羧酶、色氨酸脱羧酶、5-羟色氨酸脱羧酶、AAAD)是一个裂合酶。 · 2.1/2/3/4/5/6/7(2
  • 约翰·帕克 (上尉)约翰·帕克(John Parker,1729年7月13日-1775年9月17日)是一名英国农夫、技工和士兵,在1775年4月19日的列克星敦和康科德战役中担任列克星敦民兵指挥官。
  • 杨维藩 (明朝将领)杨维藩(?-1565年),辽东都司广宁前屯卫(今辽宁省绥中省管县)人,明朝将领,官至蓟州卫指挥佥事,广宁镇武堡游击。嘉靖四十四年(1565年)阵亡,明廷追赠都督佥事,立祠纪念。杨维藩出生于辽东前
  • 金海珍金海珍(韩语:Kim Hae-jin,1997年4月23日-)是一位韩国女子花样滑冰选手。她在2015年韩国花式滑冰全国赛取得银牌。
  • 巴拿马历史巴拿马是中美洲划分北南美洲的国家。其历史可追溯至公元前的阿兹特克文明、玛雅文明。于1513年,哥伦布的助手到达一个小渔村(现今的巴拿马城),将之改称巴拿马,意思为渔乡、渔群。