几种 Proximity Graphs 的单调性分析
引言
最近,基于近邻图的近似最近邻搜索算法(ANNS)取得了最优的效率和精度权衡。在图索引上,路径的单调性对相关ANNS算法的搜索性能起着至关重要的影响。几种当前最优的ANNS算法比如HNSW,NSG普遍能使搜索路径尽可能的单调递减,从而避免由于“绕远路”而降低搜索效率。本文介绍的几种proximity graphs是这些ANNS算法的基础,与当前的实用算法相比,这些proximity graphs有着严格的形式化定义,这给理论分析相关性质带来便利,从而也给实用的ANNS算法提供理论保证和优化方向。接下来,我们主要分析proximity graphs的单调性,proximity graphs包括德劳内图(Delaunay Graph, 它与voronoi diagram对偶)、Relative Neighborhood Graph (RNG)、Gabriel Graph (GG)、Minimum Spanning Trees (MST)。
首先给出结论:Delaunay Graph 是单调的图,而RNG, GG和MST都不是单调的图。
何为图的单调性
在此之前,我们需要先了解一下什么是单调路径?对于图G上的一个m个依次邻接的顶点形成的路径(v1,v2,⋯,vm)(v_{1},v_{2},\cdots, v_{m})(v1,v2,⋯,vm),若dist(v1,vm)>dist(v2,vm)>⋯>dist(vm−1,vm)dist(v_1,v_m) > dist (v_2, v_m) > \cdots > dist(v_{m-1},v_m)dist(v1,vm)>dist(v2,vm)>⋯>dist(vm−1,vm),则该路径是一条单调路径,dist(,)dist(,)dist(,)表示两个顶点之间的距离。如果一个图G的任意两个顶点之间均存在单调路径,则图G便是单调图了。
如何证明一个图不是单调的
只需要举一个反例就行了。任意画几个点,分别根据RNG, GG和MST的定义建立相应的图结构,很容易找到不存在单调路径的例子。
证明DG是单调的
下面证明DG是单调的。在此之前先给出一个定理。
定理1. 对于DG中的任意两个顶点vav_ava和vjv_jvj,存在一个德劳内边eake_{ak}eak满足d(vk,vj)<d(va,vj)d(v_k, v_j) < d(v_a, v_j)d(vk,vj)<d(va,vj)。
证明:给定在数据集S上的DG。vav_ava可能在DG的边界(如图1(a))或在DG的内部(如图1(b))两种情况。但无论哪一种情况,vav_ava对应的Voronoi diagram(图1中虚线围成的绿色多边形区域,记为V(va)V(v_a)V(va))都不包含其它点(这是由定义保证的),所以vjv_jvj一定落在V(va)V(v_a)V(va)外面。因此,连接vav_ava和vjv_jvj的线段一定经过V(va)V(v_a)V(va)的至少一条边。记这条边为eake_{ak}eak的垂直平分线hakh_{ak}hak,vjv_jvj和vkv_kvk在hakh_{ak}hak的同一侧,故d(vk,vj)<d(va,vj)d(v_k, v_j) < d(v_a, v_j)d(vk,vj)<d(va,vj)。
下面证明DG是单调的。
证明:我们只需证明DG中的任意两个点vav_ava和vjv_jvj,总存在一条由vav_ava至vjv_jvj的单调路径。若vjv_jvj是vav_ava的邻居,则单调路径是显然的。接下来,我们考虑vav_ava与vjv_jvj不邻接的情况。根据定理1,存在一条边eak1e_{ak_1}eak1,满足d(vk1,vj)<d(va,vj)d(v_{k_1},v_j) < d(v_a,v_j)d(vk1,vj)<d(va,vj),存在边ek1k2e_{k_{1}k_2}ek1k2,满足d(vk2,vj)<d(vk1,vj)d(v_{k_2}, v_j) < d(v_{k_1},v_j)d(vk2,vj)<d(vk1,vj) … …,最终,存在边ekije_{k_ij}ekij,满足d(vj,vj)<d(vki),vj)d(v_j, v_j) < d(v_{k_i)},v_j)d(vj,vj)<d(vki),vj)。从而路径(va,vk1,⋯,vki,vj)(v_a, v_{k_1}, \cdots,v_{k_i},v_{j})(va,vk1,⋯,vki,vj)满足d(va,vj)>d(vk1,vj)>d(vk2,vj)>⋯>d(vki,vj)>d(vj,vj)d(v_a, v_j) > d(v_{k_1}, v_j) > d(v_{k_2},v_j) > \cdots > d(v_{k_i},v_j) > d(v_j, v_j)d(va,vj)>d(vk1,vj)>d(vk2,vj)>⋯>d(vki,vj)>d(vj,vj),即是一条单调路径。
RNG几乎是单调的
虽然不能确保RNG是单调的,但在大部分情况下RNG是单调的,而且RNG是几乎所有单调图的子图。
如图2所示,边eij∈e_{ij} \ineij∈ RNG,则lune(i,j)lune(i,j)lune(i,j)(红色圆弧包围的部分)是空的,即里面没有其它点(RNG的定义决定的)。因此,一条从viv_ivi至vjv_jvj且不包含eije_{ij}eij的单调路径的中间点必然落在红色圆弧上,即图3所示的vk1v_{k_1}vk1。
在图3中,(vi,vk1,vj)(v_i, v_{{k_1}},v_j)(vi,vk1,vj)是单调路径,此时,eije_{ij}eij就是冗余边,因为可通过其它单调路径由viv_ivi到vjv_jvj。因此,就RNG而言,若存在冗余边,则可替代单调路径的中间点必须落在图2的红色圆弧上,发生这种情况的概率是非常小的。
参考文献
Kurup, G. D. (1992). A database organized on the basis of similarities with applications in computer vision.
博客地址:mzwang.top
几种 Proximity Graphs 的单调性分析相关推荐
- php遍历数组哪个效率高,PHP遍历数组的三种方法及效率对比分析
PHP遍历数组的三种方法及效率对比分析 发布于 2015-03-04 21:55:27 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...
- Gps高程拟合matlab代码,几种GPS高程拟合方法分析与比较.doc
几种GPS高程拟合方法分析与比较 几种GPS高程拟合方法分析与比较 摘 要:文章论述了几种常用的GPS高程拟合的方法,并在MATLAB中编制了相应的程序,建立了相应的GPS高程拟合模型,并通过实例数据 ...
- Spring 获取 request 的几种方法及其线程安全性分析
转载自 Spring 获取 request 的几种方法及其线程安全性分析 本文将介绍在Spring MVC开发的Web系统中,获取request对象的几种方法,并讨论其线程安全性. 一.概述 在使用 ...
- HashMap 的 7 种遍历方式与性能分析!「修正篇」
这是我的第 57 篇原创文章 首先,给大家说声抱歉~ 事情经过是这样子的,五一节前我发布了一篇文章<HashMap 的 7 种遍历方式与性能分析!>,但是好心的网友却发现了一个问题,他说 ...
- App工程结构搭建:几种常见Android代码架构分析
原文:http://mobile.51cto.com/abased-386212.htm 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优 ...
- diy 扫地机器人 滚刷_无滚刷PK有滚刷:关于保洁机器人两种常见清扫结构的分析...
目前市面上销售的保洁机器人从底部清扫结构上来看,主要分为两种结构类型:一类是以iRobot Roomba为代表的有滚刷三段式清扫结构,另一类则是以V-BOT为代表无滚刷双重清扫结构,今天爸爸乐轻松网主 ...
- 8种 骨干级 架构设计模式 图示 分析 优缺点 总结
8种 骨干级 架构模式 图示 分析 总结 文章目录 8种 骨干级 架构模式 图示 分析 总结 单库单应用模式 内容分发模式 查询分离模式 微服务模式 多级缓存模式 分库分表模式 弹性伸缩模式 多 ...
- 8种常用排序算法稳定性分析
选择排序.快速排序.希尔排序.堆排序不是稳定的排序算法 冒泡排序.插入排序.归并排序和基数排序都是稳定的排序算法. [1]为什么要区分排序算法的稳定性? 排序算法的稳定性通俗地讲就是能保证排序前两个相 ...
- 「独立站必备工具」25种检测竞争对手网站的分析工具
常话说:从竞争对手中能学习到更多!竞争对手才是最好的老师! 许多企业对竞争有不健康的看法.他们认为这是对他们长期的威胁.当然,竞争可能会很可怕.在大多数情况下,竞争是一件好事.当您配备了合适的竞争对手 ...
- 计算机网络体系结构分为几种,几种计算机网络体系结构的对比分析
几种计算机网络体系结构的对比分析 几种计算机网络体系结构的对比分析 摘要:在这篇文章中,将要简要的介绍三种不同的计算机体系结构: OSI 体系结构.TCP/IP体系结构以及综合在这两个基础上的五层体 ...
最新文章
- css cursor 常用值
- 怎么在mac下运行映像dmg_仅用Mac OS X系统映像文件(dmg)安装系统
- 有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
- go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod
- @ta,一起过节吧!
- 测试人必会:Python带你上手WebSocket
- Feign 重试解析
- MyBatis解析<if>动态sql时,Integer类型值为0,返回false
- 倒车雷达C语言程序,基于单片机汽车倒车雷达系统设计(含程序).doc
- (20190401)IGS GNSS数据下载网址与下载说明
- 我的Java秋招面经大合集
- 高等数学---用python求极限
- vtuber面部捕捉工具_做一名VTuber 虚拟UP主需要准备哪些?
- angularjs防抖
- 微信小助手WeChatExtension中文版安装教程
- win10 系统禁用笔记本自带键盘的有效方法
- Win10报错 Windows 找不到文件 “(null)“请确定文件名是否正确后,再试一次。
- 选择傲慢和残忍,会让你更加孤独
- 10种预防癌症的“超级”食品
- 【历史上的今天】1 月 20 日:Scala 问世;苹果低谷期的开始;专家系统之父诞生
热门文章
- Android学习笔记七之ContentProvider
- unreal-教程-第十八章:UI跟随的基本原理(c++)
- matlab制作钟表,利用Matlab制作钟表实例教程
- latex 中下括号 underbrace 如何对齐
- 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结
- 基于Python实现自然间断点批量处理
- 蓝桥杯C语言算法提高:复数归一化
- artdialog ajax新增,artDialog 对话框组件使用简介
- 网络安全涉及到的知识积累(1)
- 公司女同事深夜11点让我去她住处修电脑,原来是C盘爆红,看我一招搞定女同事....的电脑