以利亚戴尔达码

✍ dations ◷ 2025-12-10 22:46:36 #数字,无损压缩算法

以利亚戴尔达码(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, ...)。

相关

  • 裂殖酵母纲裂殖酵母纲的真菌类似酵母菌,但不论基因的组织、结构及基因的表达调控等方面,还是细胞周期、rRNA的生物合成都和酵母菌并不相同,在某些方面裂殖酵母纲的真菌甚至和高等动物有一
  • 企业WikiWiki引擎,或称为Wiki软件,是指用来架设Wiki的软件。广义来说,即是一种软件能作为网络共笔,供网民自行编辑,并最终集合成完整的数据库。狭义来说,即是能达成维基百科样式的软件。由
  • 晶格晶体结构是指晶体的周期性结构。固体材料可以分为晶体、准晶体和非晶体三大类,其中,晶体内部原子的排列具有周期性,外部具有规则外形,比如钻石(图)。Hauy最早提出晶体的规则外型是
  • 日本交通日本交通以公路、铁路、航空和水路为主,首都东京是日本的公路、铁路、水路及航空总枢纽,以及重要的航空转口港和港口。日本的高速公路收费和征税都较其他国家高,但同时亦在公路
  • 地缘政治学Portal:政治地缘政治学(英语:Geopolitics、德语:Geopolitik)是探讨个人、组织或团体,因为空间分布等的地理因素,经营政治的手段及方法。目前用于军事、外交等战略分析方面较多,通常
  • 云鲥云鲥为辐鳍鱼纲鲱形目鲱科的其中一种,分布于印度洋区,从波斯湾至缅甸海域、淡水、半咸水水域,栖息深度可达200米,体长可达60公分,栖息在沿海的洄游性鱼类,也会进入河流、河口区,主
  • 伊登伊登(Idun)是北欧神话中的一位女神,她是青春与春天的化身,同时负责掌管能让诸神保持青春的黄金苹果。她也是诗神布拉基(Bragi)的妻子。她的出身颇为神秘,有说法认为她属于华纳神族(V
  • 帕尔马河帕尔马河是意大利的河流,位于该国北部,属于波河的支流,河道全长92公里,流域面积796平方公里,平均流量每秒11.3立方米,发源自亚平宁山脉,河口处在梅扎尼附近。坐标:44°56′06″N 10
  • 布加勒斯特伯尼亚萨-奥雷尔·弗拉伊库国际机场布加勒斯特伯尼亚萨-奥雷尔·弗拉伊库国际机场(罗马尼亚语:Aeroportul Internaţional Bucureşti Băneasa - Aurel Vlaicu,IATA代码:BBU;ICAO代码:LRBS)是罗马尼亚首都布加勒斯特
  • 恩斯特·乌德特恩斯特·乌德特(德语:Ernst Udet,1896年4月26日-1941年11月17日)是纳粹德国一名空军大将,也是第一次世界大战德国幸存的飞行员中,战绩排名第二的王牌飞行员。乌德特一战时仅有22岁,