以利亚戴尔达码

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

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

相关

  • 2007年U20世界杯足球赛2007年国际足联U-20世界杯(2007 FIFA U-20 World Cup)为第 16 届世界青年足球锦标赛(从本届杯赛起,世青杯的英文名称由FIFA World Youth Championship改为FIFA U-20 World Cup),于
  • 抽象语法树在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源
  • 工人运动劳工运动或工人运动,简称工运,泛指某个或某些劳工团体为了己方或己方团体得到雇主与政府较好的待遇(例如制定劳动法令),而组织起来的活动。这些组织通常称为工联(trade unions)。许
  • 马可·卡萨格兰马可‧卡萨格兰(Marco Casagrande,1971年5月7日-),芬兰建筑师、地景环境艺术家、建筑理论家、作家及建筑学教授。2001年毕业于原赫尔辛基理工大学(今阿尔托大学)建筑系。马可‧卡萨
  • 赫拉多·迪亚哥赫拉多·迪亚哥(西班牙语:Gerardo Diego,1896年10月3日-1987年7月8日),西班牙诗人,出生于桑坦德,西班牙皇家语言学院成员之一。
  • 全氟丁磺酸根全氟丁磺酸根或称九氟丁磺酸根,是指CF3CF2CF2CF2SO3–离子。含有它的化合物是全氟丁磺酸的盐或酯。它们的用途与三氟甲磺酸盐或酯比较类似。
  • 巴克德·汗巴克德·汗(Bakht Khan Rohilla,Bakht Khan,1797年-1859年)为北印度及孟加拉地区的民族主义支持者。1857年5月,于英国东印度公司具有40年军事经验的他,带领当地人所组成的军队反抗
  • 抓贼高手《抓贼高手》(英语:A Thief Catcher)是一部1914年的美国无声喜剧短片,演员包括了查理·卓别林、福特·史特林(Ford Sterling)、马克·斯维恩(Mack Swain)、埃德加·肯尼迪(Edgar Kenn
  • 新咒怨《怨咒》(英语:)是一部2020年美国超自然(英语:Supernatural fiction)恐怖片,由尼古拉斯·佩斯(英语:Nicolas Pesce)执导和编剧并与杰夫·布什勒(Jeff Buhler)共同构思故事,山姆·雷米、罗
  • 龙与雀斑公主《龙与雀斑公主》(日语:竜とそばかすの姫,英语:)是一部预定于2021年上映的日本动画电影,由细田守编剧和执导。本片是细田守自《未来的未来》后所执导的第6部原创动画作品,也是细田