以利亚戴尔达码

✍ dations ◷ 2025-08-05 21:11:19 #数字,无损压缩算法

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

相关

  • 肝病肝病(英语:Hepatic disease、Liver disease)是指肝脏疾病,或是肝脏受损的症状。肝病种类超过一百种以上。症状包括黄疸及体重减轻。以下是一最常见的肝病:
  • 细菌性疾病病原细菌(英语:Pathogenic bacteria)是指能导致传染病的细菌病原体。本条目主要针对会造成人类传染病的病原细菌。大部分的细菌是无害,甚至是有益的,不过有些细菌是病原体。像结
  • 丙子胡乱丙子战争,又称“丙子胡乱”,指1636年(清崇德元年、朝鲜仁祖十四年)皇太极称帝后不久率领“十万”清朝军队攻打朝鲜的事件。这是满洲(后金及清)政权第二次攻打朝鲜,因爆发于丙子年,故
  • 客籍法和镇压叛乱法《客籍法和镇压叛乱法》(Alien and Sedition Acts)是美国联邦党在第五届国会(英语:5th United States Congress)上通过的四则法律。于1798年由美国总统约翰·亚当斯签署。该法律
  • 根黄藻目根黄藻目(Rhizochloridales)为藻类植物之一植物目。该植物于植物分类表上,归于黄藻门(Xanthophyta) (Chromophyta)黄藻纲 (Xanthophyceae) ,同纲者尚有异鞭藻目(Heterochloridales)
  • 彼得·尼古拉耶维奇·费多谢耶夫彼得·尼古拉耶维奇·费多谢耶夫(俄语:Пётр Никола́евич Федосе́ев,1908年8月22日(9日)-1990年10月18日)苏联哲学家,社会学家和社会活动家,勃列日涅夫统治时
  • 安东尼·普罗文察诺安东尼·普罗文察诺(Anthony Provenzano,1917年5月7日-1988年12月12日),又称为Tony Pro,是一名新泽西州吉诺维斯犯罪家族(英语:Genovese crime family)的副头目(caporegime)。普罗文察
  • 囊舌总目囊舌类动物(学名:Sacoglossa)是软体动物门腹足纲泛有肺类支序之下的一个支序,皆为细小的海螺及蛞蝓,以吸食藻类生物细胞内的养份为生。当这些囊舌类动物从藻类生物的细胞抽取其细
  • 阿拉伯撒哈拉民主共和国外交 阿拉伯撒哈拉民主共和国(西撒国)1976年2月27日单方面宣布建国,视整个西撒哈拉为该国法定领土。由于该国大部分领土至今依旧被摩洛哥占领,至今仍未能加入联合国,该国外交一直不
  • 停机时间停机时间(downtime)是指系统不能进行操作的时段。然而,高度计算能力可以帮助公司很快的从系统崩溃中恢复过来,相比之下,错误包容性则既保证了不间断的可用性,又缩短了恢复时间。Ke