二进制哈希码快速搜索:Multi-Index Hashing

news2025/3/1 22:31:53

前言

如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。

哈希方法通常包含两个部分:

  • 【编码】将元素通过「data-dependent」或「data-independent」的方式映射为二进制,并通过比较二进制码的汉明距离 (hamming distance) 来搜索相似元素;
  • 【搜索】由于二进制码往往比较长(例如 64, 128, 256 bits),采用直接映射的方式,通常找不到任何元素,因此通常考虑找汉明距离小于 r r r 的元素,即二进制编码最多只有 r r r 个位置不同。

下文主要介绍 [TPAMI13 - Mohammad Norouzi] 中提出的「在汉明空间中,使用 Multi-index Hashing 精确快速搜索」的方法。


Multi-Index Hashing

首先介绍一下我们所关心的问题:

  • n n n 个元素,每个元素对应 q q q 位的二进制码;
  • 给定一个查询元素,如何快速在 n n n 个元素中,找到与查询元素汉明距离小于等于 r r r 的元素。

如果直接搜索,则需要检查的不同的哈希桶 (hash buckets) 个数为:
L ( q , r ) = ∑ z = 0 r ( q z ) . L(q,r)=\sum_{z=0}^r\left(\begin{array}{l} q \\ z \end{array}\right). L(q,r)=z=0r(qz).

这显然是不可接受的。因此为了加速上述过程,我们将每个包含 q q q 位的哈希码 h \mathbf{h} h 连续切分为了 m m m 个不相交的子串, h ( 1 ) , . . . , h ( m ) \mathbf{h}^{(1)},...,\mathbf{h}^{(m)} h(1),...,h(m),每个子串包含 q / m q/m q/m 位。

若两个哈希码 h \mathbf{h} h g \mathbf{g} g 最多相差 r r r 位,则在 m m m 个子串中,至少存在一个子串,两个哈希码相差的位数不超过 ⌊ r / m ⌋ \lfloor r / m\rfloor r/m,即对应下述结果:

在这里插入图片描述
上述结果即说明,为了找到与 h \mathbf{h} h 相差位数小于等于 r r r 的元素,只需分别在 m m m 个子串中寻找汉明距离小于等于 r ′ r' r 的元素,然后再一一检查小于 r ′ r' r 的元素是否满足小于 r r r 的要求,整体时间开销得到下降。

当然,上述结果还可以进一步提升,即:

在这里插入图片描述
具体证明思路是:假设第一个结论不成立,则 h \mathbf{h} h g \mathbf{g} g 在前 a + 1 a+1 a+1 个子串中至少一共有 ( a + 1 ) ( r ′ + 1 ) (a+1)(r'+1) (a+1)(r+1) 位不同,即在剩下的 m − ( a + 1 ) m-(a+1) m(a+1) 个子串中,只需找有 r − ( a + 1 ) ( r ′ + 1 ) r-(a+1)(r'+1) r(a+1)(r+1) 位不同的元素。此时运用「Proposition 1」,即可得到:
⌊ r − ( a + 1 ) ( r ′ + 1 ) m − ( a + 1 ) ⌋ = ⌊ m r ′ + a − ( a + 1 ) r ′ − ( a + 1 ) m − ( a + 1 ) ⌋ = ⌊ r ′ − 1 m − ( a + 1 ) ⌋ = r ′ − 1 \begin{aligned} \left\lfloor\frac{r-(a+1)\left(r^{\prime}+1\right)}{m-(a+1)}\right\rfloor & =\left\lfloor\frac{m r^{\prime}+a-(a+1) r^{\prime}-(a+1)}{m-(a+1)}\right\rfloor \\ & =\left\lfloor r^{\prime}-\frac{1}{m-(a+1)}\right\rfloor \\ & =r^{\prime}-1 \end{aligned} m(a+1)r(a+1)(r+1)=m(a+1)mr+a(a+1)r(a+1)=rm(a+1)1=r1

因此若第一个结论不成立,第二个结论必定成立。由此可知,为找到与 h \mathbf{h} h 相差位数小于等于 r r r 的元素,只需先在前 a + 1 a+1 a+1 个子串中寻找距离小于等于 r ′ r' r 的元素,再在第 a + 1 a+1 a+1 到第 m m m 个子串中寻找距离小于等于 r ′ − 1 r'-1 r1 的元素即可,整体时间开销进一步得到下降。具体算法如下:

在这里插入图片描述
对于「Proposition 2」,有一个特殊情况,即当 r < m r<m r<m 时, r ′ = 0 r'=0 r=0 a = r a=r a=r,因此只需在前 r + 1 r+1 r+1 个子串中判断 r ′ = 0 r'=0 r=0 的情况。


性能分析

s = q / m s=q/m s=q/m 为每个子串的长度,根据「Proposition 1」可知,上述算法需要检索哈希表的总次数为:
lookups ⁡ ( s ) = q s ∑ z = 0 ⌊ s r / q ⌋ ( s z ) ≤ q s 2 H ( r / q ) s , \operatorname{lookups}(s)=\frac{q}{s} \sum_{z=0}^{\lfloor s r / q\rfloor}\left(\begin{array}{l} s \\ z \end{array}\right) \leq \frac{q}{s} 2^{H(r / q) s}, lookups(s)=sqz=0sr/q(sz)sq2H(r/q)s,

其中不等号由组合数公式得到(需满足 r ≤ q / 2 r\leq q/2 rq/2)。除了查表外,时间开销还包括将查到的元素进行比对,由于元素在哈希表内的分布难以确定,因此假定 n n n 个元素均匀分布在大小为 2 s 2^s 2s 的哈希表中,即总时间开销为:
cost ⁡ ( s ) = ( 1 + n 2 s ) q s ∑ z = 0 ⌊ s r / q ⌋ ( s z ) , ≤ ( 1 + n 2 s ) q s 2 H ( r / q ) s . \begin{aligned} \operatorname{cost}(s) & =\left(1+\frac{n}{2^s}\right) \frac{q}{s} \sum_{z=0}^{\lfloor s r / q\rfloor}\left(\begin{array}{l} s \\ z \end{array}\right), \\ & \leq\left(1+\frac{n}{2^s}\right) \frac{q}{s} 2^{H(r / q) s} . \end{aligned} cost(s)=(1+2sn)sqz=0sr/q(sz),(1+2sn)sq2H(r/q)s.

另外,文中指出当 s = log ⁡ 2 n s=\log_2 n s=log2n 时,查搜效果较好,因此将 s = log ⁡ 2 n s=\log_2 n s=log2n 代入 cost ⁡ ( s ) \operatorname{cost}(s) cost(s),得到:
cost ⁡ ( log ⁡ 2 n ) ≤ 2 q log ⁡ 2 n n H ( r / q ) . \operatorname{cost}\left(\log _2 n\right) \leq 2 \frac{q}{\log _2 n} n^{H(r / q)}. cost(log2n)2log2nqnH(r/q).

r / q ≤ . 11 r/q\leq .11 r/q.11 时, H ( . 11 ) < . 5 H(.11)<.5 H(.11)<.5,运行时间复杂度为 O ( q n / log ⁡ 2 n ) O(q\sqrt{n}/\log_2 n) O(qn /log2n);当 r / q ≤ . 06 r/q\leq .06 r/q.06 时,时间复杂度变为 O ( q n 3 / log ⁡ 2 n ) O\left(q \sqrt[3]{n} / \log _2 n\right) O(q3n /log2n),即与 n n n 的关系为 sub-linear。


K 近邻搜索

很多时候我们并不想找汉明距离小于等于 r r r 的元素,而是想找汉明距离最近的 k k k 个元素,但对于不同的查询元素,对于固定的 k k k,需要的 r r r 相差很大,如下图所示:

在这里插入图片描述
对于相同的 k-NN \text{k-NN} k-NN 问题,不同查询元素所需要的汉明距离 r r r 也不相同。

因此对于 k-NN \text{k-NN} k-NN 问题,我们可以将 r r r 0 0 0 向上遍历,直至找到 k k k 个元素为止,具体算法如下:

在这里插入图片描述


参考资料

  • [TPAMI13 - Mohammad Norouzi] Fast Exact Search in Hamming Space with Multi-Index Hashing

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C变量区域

C语言中有五大内存分区&#xff0c;分别是栈区、堆区、全局区/静态区、常量区和代码区。1.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值、局部变量的值等。当调用函数的时候函数中定义的变量会被加到栈中&#xff0c;当函数离开的时候&#xff0c;被添加…

HTML看这一篇就够啦,HTML基础大全,可用于快速回顾知识,面试首选

HTML 1 基础 1.1 DOCTYPE <!DOCTYPE> 文档类型声明&#xff0c;作用就是告诉浏览器使用哪种HTML版本来显示网页。 <!DOCTYPE html> 这句代码的意思是: 当前页面采取的是 HTML5 版本来显示网页. 注意: 声明位于文档中的最前面的位置&#xff0c;处于 标签之前。 …

互联网新理念,对于WEB 3.0 你怎么看?

WEB 3.0 这个名词走进大众视野已经有一段时间了&#xff0c;也曾在各个圈子里火热一时&#xff0c;至今各大互联网企业任旧在 WEB 3.0 上不断探索。但关于 WEB 3.0 是什么这个问题&#xff0c;其实大部分人都没有一个比较明确的认知&#xff0c;包括区块链和元宇宙等相关行业的…

【设计模式】备忘录模式和迭代器模式

备忘录模式和迭代器模式备忘录模式代码示例迭代器模式代码示例使用迭代器遍历集合的同时不能删除/增加元素总结备忘录模式 备忘录模式&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。 在 GoF的《设计模式》⼀书中&#xff0c;备忘录模式是这么定义的&#xff1a;…

【Spring6】面向切面:AOP

5.1、场景模拟 搭建子模块&#xff1a;spring6-aop 5.1.1、声明接口 声明计算器接口Calculator&#xff0c;包含加减乘除的抽象方法 public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}5.1.2、创建…

计算机视觉与深度学习 | Visual ChatGPT:微软开源视觉(图文)聊天系统——图像生成、迁移学习、边缘检测、颜色渲染等多功能(附代码下载链接)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== Visual ChatGPT: Talking, Drawing and Editing with V

LeetCode 134. 加油站(函数图像法 / 贪心)

题目&#xff1a; 链接&#xff1a;LeetCode 134. 加油站 难度&#xff1a;中等 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中…

CentOS系统变化看开源演进

CentOS社区还存不存在&#xff1f;CentOS项目还存不存在&#xff1f;众多CentOS用户将何去何从&#xff1f;伴随CentOS停更&#xff0c;大家可能会有这样那样的疑问&#xff0c;今天针对以上问题&#xff0c;我来进行一一解答。CentOS实际上有两个变种&#xff0c;一个叫做Cent…

C#和.net框架之第二弹

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、什么是标示符&#xff1f;二、标示符命名规则三、c#命名规范是什么&#xff1f;四、c#命名规范内容五、关键字的用处注意&#xff1a;六、Main方法是干什么的…

12 | 架构案例:基于OAuth 2.0/JWT的微服务参考架构

12 | 架构案例&#xff1a;基于OAuth 2.0/JWT的微服务参考架构 架构图 令牌的校验和转换&#xff0c;将前端传递过来的 OAuth 2.0 访问令牌&#xff0c;通过调用 IDP 进行校验&#xff0c;并转换为包含用户和权限信息的 JWT 令牌&#xff0c;再将 JWT 令牌向后台微服务传递。…

New Bing乘上ChatGPT的东风,日活突破1亿

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 注&#xff1a;本文由松松杰哥缮写&#xff0c;ChatGPT进行了补充和润色&#xff0c;你们可以看看本文和其他文有什么区别&#xff1f; 微软今天宣布&#xff0c;New Bing乘上ChatGPT的东风&#xf…

【设计模式】中介者模式和观察者模式

中介者模式 中介模式的英⽂翻译是 Mediator Design Pattern。 在 GoF 中的《设计模式》⼀书中&#xff0c;它是这样定义的&#xff1a; Mediator pattern defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects …

C#:Krypton控件使用方法详解(第十五讲) ——kryptonBorderEdge

今天介绍的Krypton控件中的kryptonBorderEdge。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;UseWaitCursor属性&#xff1a;表示鼠标在控件中等待时&#xff0c;以…

大学模拟电路期末考试模拟题详解

&#xff08;一&#xff09;选择题 3.4.5.6.7.8.9.10. &#xff08;二&#xff09;填空题 1.漂流电流是温度电流&#xff0c;它由少数、载流子形成、其大小与温度有关&#xff0c;而与外加电压无关。 反向电流是由少数载流子形成、其大小与温度有关&#xff0c;而与外加电压无…

AOP通知类型:

AOP通知类型&#xff1a; 环绕通知无参与ProceedingJoinPoint接口&#xff1a;方法的前后进行环绕&#xff0c;但是与before和after不同的是&#xff0c;他无法知道下面代码中的环绕前方法是否是在前置位置&#xff0c;后置同理&#xff0c;于是要在方法中添加参数ProceedingJo…

Android之事件机制

Android之事件机制MotionEvent事件的分发与处理触屏事件的类型触摸事件发生的位置触摸事件的分发和处理用于分发和处理的方法事件分发和处理的过程KeyEvent参考MotionEvent事件的分发与处理 在我们日常使用app的时候会进行各种各样的触摸操作&#xff0c;比如点击、长按等&…

谈一谈搜索引擎是如何跟踪你、出卖你的

文章目录跟踪结果点击跟踪关键词跟踪other跟踪 结果点击跟踪 以b网为例&#xff0c;当我们搜索关键词“haha”后&#xff0c;搜索结果链接是这样子的&#xff1a; https://www.baidu.com/link?urlX02KNEaEhaHM-7eY_i6OWGWBZ9_KEYvIlMec91jStRWvcg4uyumrhdefe-ZzdrLKk7iewh9a…

pycharm专业版安装_教育邮箱

怎样安装pycharm专业版&#xff1f; 专业版与社区版的区别 二者区别很多&#xff0c;笔者主要看中了远程连接这个功能。下面讲解怎样使用教育邮箱免费获取专业版pcharm。 1.获取免费的利license &#xff08;1&#xff09;进入pycharm官方网站&#xff0c;链接为&#xff1…

小米数据恢复:有无备份从小米手机恢复删除数据方法

如果您不小心删除了小米手机上的数据&#xff0c;后来发现您需要它&#xff0c;那么本文适合您。我将向您介绍一些最可靠的小米恢复方法&#xff0c;以将您的数据恢复到您的设备上。无论您是否有备份&#xff0c;都可以处理。让我们开始吧&#xff01; 小米数据恢复 - 如何做&a…

vue打包后用docker镜像部署

vue3项目打包成dist后&#xff0c;用Dockerfile&#xff0c;镜像部署。后在线上运行。 我在阿里云买了个轻量服务器。系统镜像是centos7。现在Linux下安装Docker。 比如我打包好的dist文件夹&#xff0c;要和Dockorfile在同一级目录下&#xff0c;不然在build构建时是找不到d…