以利亚戴尔达码

✍ dations ◷ 2025-11-16 13:58:27 #数字,无损压缩算法

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

相关

  • 消除半衰期生物半衰期(英语:Biological Half-Life)是一个物质(如代谢物、药、讯息分子、放射性核种)失去一半的药理、生理、或放射性效应所需的时间。通常这个词用来描述肝、肾或排泄过程将
  • 法国圣雅克伯朝圣之路1998年,法国境内的若干地点以法国的圣地亚哥-德孔波斯特拉之路(法语:Chemins de Compostelle en France)的名称列为联合国教科文组织世界遗产,这些地点均位于前往西班牙西北部城
  • 途易集团途易集团(德语:TUI AG,中文翻译为途易股份有限公司,一般通称为途易集团)的前身为普罗伊萨格,是一家在法兰克福证券交易所上市的跨国旅行及旅游企业,总部设在德国下萨克森州的汉诺威
  • 得克萨斯独立运动德克萨斯独立运动是部分德克萨斯人因为不满美国政府体制,而欲脱离美国独立的运动。虽然德州人的“德州思想”很强烈,但是“德州思想”亦是“美国爱国主义”重要构成,因此这项运
  • 十字形墓室十字形墓室在世界各地的古迹都有发现。具体来说,十字形墓室的具体形状,是墓室的入口处较长,而深入到墓室里,分成左、右和后三个墓室,就好像十字架的形状一样。考古学家指,墓室设计
  • 廖学章廖学章(1880年-1953年),字天祥,四川华阳县人,早年曾两度公费留学日本,主攻英国文学。毕业于日本立教大学外语系。留学期间,曾参加同盟会。回国后,历任四川省城高等学堂及其附属中学教
  • 尼特拉州尼特拉州(斯洛伐克语:Nitriansky kraj)是斯洛伐克西南部的一个自治州,毗邻匈牙利。面积6,343平方公里,占斯洛伐克的13%,人口713,422(2001年)。尼特拉自治州下设7个区。分别为Nitra,Ko
  • 吉良知夏吉良知夏(日语:吉良 知夏/きら ちなつ ,1991年7月5日-),日本足球运动员,日本国家女子足球队成员。2014年,她共为日本国家女子足球队出场12次,打进5球。她也曾代表日本参加2014年亚足
  • ­佐佐木等佐佐木等(1891年-1982年7月23日),日本足球运动员,教练,曾经率领日本国家足球队参加上海1921年远东运动会。佐佐木等经率领日本国家足球队参加上海1921年远东运动会。(日本 1-3 菲律
  • STermSTerm是针对中国BBS的特点设计的一个专用上站软件(也可用于Telnet站点的登录)。它在运行中对用户和服务器之间的信息进行了分析,知道用户在BBS上的当前状态,从而提供相应的服务