HNSW近邻搜索算法

HNSW近邻搜索算法记录

1 NSW算法

如果要知道HNSW算法,那首先必须得了解NSW原理,毕竟HNSW是根据HNSW升级转换而来

理想状态下,一个好的近邻搜索算法应该要包括三点的内容:1、构图算法的时间复杂度低;2、查找目标的效率高;3、具备"高速公路"机制(高速公路:相隔较远的点的连接,方便快速查找到当前节点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ab86oLv5-1631263977704)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/HNSW%E7%AE%97%E6%B3%95%E8%AE%B0%E5%BD%95/image-20210910162705698.png)]

人为规定友节点数量是4(友节点:和自己最近的点的数量),上图解释:

1、我们要做的是搜索近邻,那肯定是要选择距离自己近的,当图中只有a节点的时候,没有友节点,所以a->0

2、当b插入图中的时候,发现只有a,那a就是b唯一的友节点,此时要更新a的友节点,所以a->b,b->a

3、当c插入图中的时候友节点都没超过4,同理b,所以a-73->b-90->c、b-73->a-88->c、c-88->b-90->a

4、当d插入图中的时候同理c,所以a-73->b-90->c-120->d、b-73->a-85->d-88->c、c-39->d-88->b-90->a、d-39->c-85->b-120->a

5、e插入的图中的时候同理d,所以a-48->e-73->b-90->c-120->d、b-73->a-85->d-88->c-99->e、c-39->d-59->e-88->b-90->a、d-39->c-85->b-101->e-120->a、e-48->a-59->c-99->b-101->d

6、当f插入的时候,发现图中已经有了5个节点,但规定是每个节点4个友节点,所以此时会选取离f点最近的4个点作为它的友节点,同样的,其他5个点当f选完后他们也会跟着变化自己的友节点,所以a-48->e-73->b-90->c-120->d、b-52->f-73->a-85->d-88->c-99->e、c-39->d-59->e-87->f-88->b-90->a、d-39->c-56->f-85->b-101->e-120->a、e-48->a-59->c-99->b-101->d、f-52->b-56->d-87->c-121->a

最后,我们可以发现原来存在的高速公路在这样逐步加入新的节点的时候已经被取代,这样肯定不是我们所想的,我们所想的肯定是不仅要查的快还要查的准,那这种高速公路肯定是要有所保留的,于是就有了HNSW算法

2 跳表原理

上文的讲述其实已经引出了HNSW的必要性就是高速公路的存在,那怎么才能让高速公路保留一定的数量呢,那就是将NSW和跳表结合,下面看下跳表的原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvFa7ABc-1631263977706)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/HNSW%E7%AE%97%E6%B3%95%E8%AE%B0%E5%BD%95/image-20210910164719747.png)]

上图的原始链表是有序的链表,原始链表中的每个节点都有50%的概率添加到一级索引层,而一级索引层的节点同样也有50%的概率添加到二级索引层。当我现在要查找图中绿色节点32时,我可以分两种方法查找。

方法一:在原始链表中查找,那么需要跳转11次才能到达绿色节点。

方法二:先在二级索引中查找,经过两次跳转到达30节点,然后从下一级的30节点开始查找,最后再到原始链表查找,那么算上层之间的跳转,只需要跳转6次便可到达绿色节点。

3 HNSW算法

上文已经介绍了NSW算法以及跳表的原理,下图就是将NSW算法结合跳表实现的HNSW算法图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1E2iuIc-1631263977707)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/HNSW%E7%AE%97%E6%B3%95%E8%AE%B0%E5%BD%95/image-20210910165039036.png)]

附上原文链接:https://www.jianshu.com/p/c8f731e7510d

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友培

数据皆开源!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值