我刚刚完成了一个用于快速最近邻搜索的kd树.我有兴趣玩欧几里德距离以外的不同距离指标.我对kd-tree的理解是,如果度量是非欧几里德,那么快速的kd-tree搜索不能保证给出精确的搜索,这意味着如果我想尝试我可能需要实现一个新的数据结构和搜索算法我的搜索新指标.
我有两个问题:
使用kd树永久地将我绑定到欧几里德距离吗?
如果是这样,我应该尝试使用哪种其他类型的算法来处理任意指标?我没有太多时间来实现许多不同的数据结构,但我正在考虑的其他结构包括覆盖树和vp树.
j_random_hac.. 9
您链接到的Wikipedia页面上描述的最近邻搜索过程当然可以推广到其他距离度量,前提是您将"超球面"替换为给定度量的等效几何对象,并测试每个超平面与此对象的交叉.
示例:如果您正在使用曼哈顿距离(即矢量分量中所有差异的绝对值之和),则您的超球面将成为(多维)钻石.(这是最简单的在二维可视化-如果您当前的最近的邻居是在距离X从查询点p,然后后面的不同超平面更接近邻居必须相交具有宽度和高度2x和居中于菱形形状p) .这可能使超平面交叉测试更难编码或更慢运行,但是一般原则仍然适用.
您链接到的Wikipedia页面上描述的最近邻搜索过程当然可以推广到其他距离度量,前提是您将"超球面"替换为给定度量的等效几何对象,并测试每个超平面与此对象的交叉.
示例:如果您正在使用曼哈顿距离(即矢量分量中所有差异的绝对值之和),则您的超球面将成为(多维)钻石.(这是最简单的在二维可视化-如果您当前的最近的邻居是在距离X从查询点p,然后后面的不同超平面更接近邻居必须相交具有宽度和高度2x和居中于菱形形状p) .这可能使超平面交叉测试更难编码或更慢运行,但是一般原则仍然适用.