寻找有关 Jeff 幻灯片中介绍的“Group varint 编码/解码”的更多详细信息

2024-03-28

我注意到 Jeff 的幻灯片“构建大规模信息检索系统的挑战”,也可以在这里下载:http://research.google.com/people/jeff/WSDM09-keynote.pdf http://research.google.com/people/jeff/WSDM09-keynote.pdf,提到了一种称为“组varint编码”的整数压缩方法。据说比每字节 7 位整数编码快得多(快 2 倍)。我对此非常感兴趣,并正在寻找它的实现,或者任何可以帮助我自己实现它的更多细节。

我不是专业人士,也不是新手,欢迎任何帮助!


这指的是“可变整数编码”,其中序列化时用于存储整数的位数不固定为 4 个字节。有一个很好的描述Protocol buffer 文档中的 varint http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints.

它用于编码Google 的协议缓冲区 http://code.google.com/apis/protocolbuffers/,您可以浏览.

The CodedOutputStream包含精确的编码函数:

inline uint8* CodedOutputStream::WriteVarint32FallbackToArrayInline(
    uint32 value, uint8* target) {
  target[0] = static_cast<uint8>(value | 0x80);
  if (value >= (1 << 7)) {
    target[1] = static_cast<uint8>((value >>  7) | 0x80);
    if (value >= (1 << 14)) {
      target[2] = static_cast<uint8>((value >> 14) | 0x80);
      if (value >= (1 << 21)) {
        target[3] = static_cast<uint8>((value >> 21) | 0x80);
        if (value >= (1 << 28)) {
          target[4] = static_cast<uint8>(value >> 28);
          return target + 5;
        } else {
          target[3] &= 0x7F;
          return target + 4;
        }
      } else {
        target[2] &= 0x7F;
        return target + 3;
      }
    } else {
      target[1] &= 0x7F;
      return target + 2;
    }
  } else {
    target[0] &= 0x7F;
    return target + 1;
  }
}

级联式ifs 只会在末尾添加额外的字节target数组如果大小为value保证这些额外的字节。这0x80屏蔽正在写入的字节,并且value被向下移动。据我所知,0x7fmask 使其表示“编码的最后一个字节”。 (当进行“或”运算时0x80,最高位始终是1,然后最后一个字节清除最高位(通过 AND'ing0x7f)。因此,在读取 varint 时,您会一直读取直到获得最高位为零的字节。

我刚刚意识到您专门询问了“Group VarInt 编码”。抱歉,该代码是关于基本 VarInt 编码(仍然比 7 位快)。基本思想看起来很相似。不幸的是,这是not用于在协议缓冲区中存储 64 位数字的内容。如果该代码在某处开源,我不会感到惊讶。

使用来自的想法varint以及幻灯片中的“Group varint”图表,自己制作应该不会太难:)

这是另一页描述组 VarInt 压缩 http://www.ir.uwaterloo.ca/book/addenda-06-index-compression.html,其中包含解码代码。不幸的是,他们提到了公开可用的实现,但没有提供参考。

void DecodeGroupVarInt(const byte* compressed, int size, uint32_t* uncompressed) {
  const uint32_t MASK[4] = { 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF };
  const byte* limit = compressed + size;
  uint32_t current_value = 0;
  while (compressed != limit) {
    const uint32_t selector = *compressed++;
    const uint32_t selector1 = (selector & 3);
    current_value += *((uint32_t*)(compressed)) & MASK[selector1];
    *uncompressed++ = current_value;
    compressed += selector1 + 1;
    const uint32_t selector2 = ((selector >> 2) & 3);
    current_value += *((uint32_t*)(compressed)) & MASK[selector2];
    *uncompressed++ = current_value;
    compressed += selector2 + 1;
    const uint32_t selector3 = ((selector >> 4) & 3);
    current_value += *((uint32_t*)(compressed)) & MASK[selector3];
    *uncompressed++ = current_value;
    compressed += selector3 + 1;
    const uint32_t selector4 = (selector >> 6);
    current_value += *((uint32_t*)(compressed)) & MASK[selector4];
    *uncompressed++ = current_value;
    compressed += selector4 + 1;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找有关 Jeff 幻灯片中介绍的“Group varint 编码/解码”的更多详细信息 的相关文章

  • 使用布隆过滤器有什么好处?

    我正在阅读布隆过滤器 它们看起来很愚蠢 使用布隆过滤器可以完成的任何事情 都可以使用单个哈希函数而不是多个哈希函数在更少的空间内更有效地完成 或者看起来就是这样 为什么要使用布隆过滤器以及它有何用处 亚历克斯已经解释得很好了 对于那些还没有
  • 如何正确区分树(即嵌套的字符串列表)?

    我正在使用由嵌套字符串列表组成的数据类型的在线编辑器 请注意 如果每次更改单个值时我都要传输整个结构 那么流量可能会变得难以忍受 所以 为了减少流量 我想到了应用 diff 工具 问题是 如何找到并报告两棵树的差异 例如 ah bh ha
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • 像随机关卡生成一样自由流动,只有一种可能的解决方案?

    我已经实现了在这个问题中标记为正确答案的算法 流畅类游戏随机关卡制作用什么 https stackoverflow com questions 12926111 what to use for flow free like game ran
  • 找到数组中最长的连续体,该连续体中的值的总和等于零模 3

    我编写了一段代码 用于查找数组中最长的连续体 连续体中的值之和等于零模 3 例如对于数组a 2 3 5 7 20 7 我们有 2 3 5 7 20 9 所以输出是 5 我的问题是复杂性 现在是O n 3 一只鸟低声对我说 这可以在O n p
  • 对于基准测试和压力测试子串搜索算法有哪些好的测试用例?

    我正在尝试评估不同的子字符串搜索 ala strstr 算法和实现 并寻找一些精心设计的针和干草堆字符串 这些字符串将捕获最坏情况的性能和可能的极端情况错误 我想我可以自己解决它们 但我认为有人必须在某个地方收集大量测试用例 一些想法和对自
  • mysql中auto_increment(整数)的限制是多少

    我有一个mysql数据库 我在其中使用auto increment integer 你能告诉我它可以增加多少整数吗 我们如何提高auto increment的限制 的极限auto increment column 是列的大小 https d
  • Array.Sort 使用重要的比较函数

    考虑以下代码C 5 0 简而言之 p 289 int numbers 1 2 3 4 5 Array Sort numbers x y gt x 2 y 2 0 x 2 1 1 1 这给出了结果 3 5 1 2 4 我在纸上尝试了这个并得到
  • 最大覆盖不相交间隔

    假设您有 k 无法尝试所有可能的子集 2 k 不可行 贪婪方法按 a i 区间覆盖算法 排序 按 b i 最大不相交区间数算法 排序不起作用 不知道是否有动态程序解决方案 考虑到输入的大小 我认为解决方案应该是 O k log k 或 O
  • 查找集合列表中不相交集合对的数量

    问题陈述如下 给定一个包含 n 个集合的列表 每个集合包含 k 个整数 找到不相交集合对的数量 假设集合的可能元素为正 且上界为 c gt n 并且假设 k 我试图想出一种有效的算法来比 O kn 2 更快地解决这个问题 这是简单解决方案的
  • 使用 YUIcompressor 压缩多个 JavaScript 文件?

    我正在尝试使用 YUI 压缩机压缩多个 JS 文件 我认为我的语法错误 我想压缩目录中以以下内容开头的所有文件at 然而 当 YUI 压缩机运行时 我发现 YUI 压缩机在输出中只放置了一个文件的压缩版本 具体来说 假设我有三个文件 at
  • 经济模拟的算法?

    我想创建一个游戏 玩家可以创建不同价格的不同产品 称为报价 然后我给他们一定数量的客户 称为需求 现在 我想要一个算法来确定每个参与者的市场份额 当然 我现在就可以使用随机的方式来制作我的 但在这样做之前 我更愿意先问一下 因为我确信在我之
  • 根据 1 的数量查找数字的排名

    令 f k y 其中 k 是非负整数递增序列中的第 y 个数 其二进制表示形式中的 1 数量与 k 相同 例如f 0 1 f 1 1 f 2 2 f 3 1 f 4 3 f 5 2 f 6 3 等等 给定 k gt 0 计算 f k 我们很
  • 当 python 添加小整数时,幕后会发生什么? [复制]

    这个问题在这里已经有答案了 我正在摆弄id最近意识到 c Python 做了一些非常明智的事情 它确保小整数始终具有相同的值id gt gt gt a b c d e 1 2 3 4 5 gt gt gt f g h i j 1 2 3 4
  • 尽管缓冲区分配给 compressBound 结果(文件太大?),zlib compress() 返回 Z_BUF_ERROR

    使用 zlib 时 我调用compress 给出一个Z BUF ERROR当我尝试压缩一个 13G 的文件时 尽管我认为缓冲区分配是正确的 此代码适用于较小的文件 struct stat infile stat FILE fp NULL i
  • 如何在文本文件中找到最长的 N 行并将其打印到标准输出?

    第一行包含数字 N 的值 后跟多行 我可以按照n 2算法的顺序解决它 有人可以建议一个更好的吗 您可以使用最小堆并在 O n log N 中完成 heap new Min Heap N foreach line in text if len
  • 3 维装箱算法

    我面临着 3 维装箱问题 目前正在进行一些初步研究 了解哪些算法 启发式方法目前能产生最佳结果 由于问题是 NP 难问题 我不希望在每种情况下都能找到最佳解决方案 但我想知道 1 最好的精确求解器是什么 分支定界 我期望使用合理的计算资源可
  • 查找字符串中只出现一次的字符

    我正在用 PHP 编写一个算法来解决给定的数独难题 我已经设置了一个带有两个类的面向对象的实现 Square9x9 棋盘上每个单独图块的类 以及Sudoku类 其矩阵为Squares 代表董事会 我正在使用的算法的实现是一种三层方法 第一步
  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但

随机推荐

  • Pascal 支持向函数传递参数吗?

    我是 Pascal 新手 我正在尝试编写一个简单的程序 但在函数之间传递值时遇到问题 这是我所拥有的一小部分 program numberConverter const maxValue 4999 minValue 1 var num in
  • @echo 在cmd中关闭

    我正在尝试编写一个 BAT 脚本 我有以下内容 echo off REM Comments here SETLOCAL ENABLEDELAYEDEXPANSION set PROG ROOT C Prog set ONE 1 echo 1
  • .htaccess文件自动修改

    我有由 WordPress 提供支持的网站 并且 WordPress 根文件夹中也有 html 文件 因为 WordPress 不允许 html 文件 我编写了 htaccess 代码来打开 html 文件以及 WordPress 页面 但
  • 使用 python-ldap 向 Active Directory 进行身份验证始终返回 (97, [])

    如同这个问题 https stackoverflow com questions 140439 authenticating against active directory using python ldap 我尝试使用 python l
  • 将引用单元格公式添加到代码中

    在此输入图像描述 https i stack imgur com 48OqU jpg 这就是输出 https i stack imgur com FCqOg jpg 我在单元格 C1 中有这个公式 用于平均第 2 列中的值相对于第 1 列的
  • rake 数据库适配器与database.yml不一致

    In database yml rails 生成的默认文件 default default adapter sqlite3 pool 5 timeout 5000 development lt lt default database db
  • 无法与 aSmack 4.0.2 建立新连接

    我正在学习 Android 编程 这几天我一直在努力解决这个问题 我正在编写一个应该连接到 XMPP 服务器的 Android 应用程序 我总是遇到同样的错误 并且真的不知道我做错了什么 我尝试过通过谷歌找到的示例代码 但也无法与它们建立连
  • 循环遍历 PL/pgSQL 中给定的值列表

    我试图循环遍历几个字段并在它们上运行一个函数 FOR field IN ARRAY f1 f2 LOOP execute pg temp converFieldToLower newTableNameRaw field END LOOP 这
  • 监视单元格值并将其复制到另一个单元格

    我想知道如何监视单元格值并使该值始终在其他单元格上更新 到目前为止 我一直在使用 符号 然后选择我想要监视的单元格 问题是我正在监视的行 单元格由于另一个 vba 脚本而不断更新 当发生这种情况时我得到REF error e g On th
  • 将变量值从第二个 PowerShell 脚本返回到第一个 PowerShell 脚本?

    我创建1 ps1调用的脚本2 ps1脚本 打电话后2 ps1它给出了一些结果 variable 我要这个 variable结果将在我的中使用1 ps1用于操纵 csv Get Content 10 46 198 141 try window
  • matplotlib 两种颜色之间的颜色渐变

    我想要 matplotlib 中黑色和红色之间的颜色渐变 其中低值是黑色 随着 Y 值的增加而变得越来越红色 import matplotlib pyplot as plt xvals np arange 0 1 0 01 yvals xv
  • 使用 str_extract_all 查找多个字符串

    我有一个字符串列表 如下所示 tofind lt c aaa bbb ccc ddd 我还有一个向量如下 n lt c aaabbb aaa aaacccddd eee 我想找到我的所有匹配项tofind字符串 以便输出应该是 aaa bb
  • 如何使用 dcpcrypt 在 delphi 和 php 之间同步加密

    我正在使用 Delphi 2009 我在这里看到的大多数答案都是针对 2010 我正在尝试将加密 delphi 同步到解密 php 并且失败 在delphi中生成加密字符串 program Project4 APPTYPE CONSOLE
  • 带键的 array_pop()

    考虑以下数组 array array fruit gt apple vegetable gt potato dairy gt cheese 我想用数组弹出 http php net manual en function array pop
  • 从 matplotlib 轴对象获取数据

    我正在尝试确定 matplotlib 上的数据点axes http matplotlib org api axes api html matplotlib axes 是否有我缺少的属性Axes http matplotlib org api
  • 被释放的指针未分配[Swift]

    我正在尝试读取 TCP 套接字连接中的长字符串 对于读取短长度字符串 它工作正常 但是当我尝试发送长长度的 base64 编码图像时 它崩溃了 我尝试增加到maxReadLength 10000 但仍然不起作用 读取传入消息 private
  • 在转储文件上使用 pg_restore

    我在 Heroku 上有一个数据库 我正在尝试将其复制到本地计算机 我通过执行以下操作创建了数据库的备份 heroku pgbackups capture 这将创建一个数据库的转储文件 我通过创建指向该数据库的 URL 链接来下载该文件 h
  • Ajax 删除链接 注销current_user

    标题几乎解释了这一点 我遇到了一种奇怪的情况 允许用户使用 Ajax 删除通知的视图会导致 current user 被注销 我什至不知道从哪里开始调试这个 这是控制器 class NotificationsController lt Ap
  • 如何从 JPA 标准中的时间戳列中按日期查找?

    我想按日期查找记录 在实体和数据库表中 数据类型是时间戳 我用的是Oracle数据库 Entity public class Request implements Serializable Id private String id Vers
  • 寻找有关 Jeff 幻灯片中介绍的“Group varint 编码/解码”的更多详细信息

    我注意到 Jeff 的幻灯片 构建大规模信息检索系统的挑战 也可以在这里下载 http research google com people jeff WSDM09 keynote pdf http research google com