如何使用KDTree在任意维度上进行top-k查询和范围查询

时间:2010-07-15 22:28:35

标签: c++ performance data-structures kdtree

我使用KD-tree(libkdtree ++)来存储多维数据集,这里的要求是这个数据集可以支持不同维度的top-k / range查询。例如,KDTree <3,点&gt; tree:查找具有最高Point [1](y轴)值的前100个点。

从libkdtree ++的实现来看,类似的是“find_within_range”函数,但它基于“曼哈顿距离”计算,它等于max(x_dist,max(y_dist,z_dist))。如何在一个维度上使用范围查询?

1 个答案:

答案 0 :(得分:1)

看看代码,看起来你不能以一种直截了当的方式做到这一点,非常荒谬。如果我是你,我会想要破解图书馆或写我自己的kd树。我会在他们的邮件列表上询问,但看起来你可能需要这样做:

kdtreetype::_Region_ r(point_with_min_y);
r.set_low_bound(min_x, 0);
r.set_high_bound(max_x, 0);
r.set_low_bound(min_z, 2);
r.set_high_bound(max_z, 2);
r.set_high_bound((min_y + max_y) / 2, 1);

double search_min = min_y, search_max = max_y;

// binary search to get 100 points
int c;
while (c = tree.count_within_range(r) != 100) {
    if (c > 100) search_max = (search_min + search_max) / 2;
    else         search_min = (search_min + search_max) / 2;
    r.set_high_bound((search_min + search_max) / 2);
}

tree.visit_within_range(r, process_min_y_point);

这是一个非常低效的二进制搜索Y,其中计数(y <= Y的点)== 100.我不熟悉该库,但这是我在粗略检查中得到的最好的

相关问题