首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用KDTree对任意维度进行top-k查询和范围查询

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

Stack Overflow用户
提问于 2010-07-16 06:28:35
回答 1查看 1.2K关注 0票数 2

我使用KD-树(libkdtree++)来存储多维数据集,这里的要求是该数据集可以支持不同维度上的top-k/range查询。例如,KDTree<3,Point>树:查找其点1值最高的前100个点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-16 06:55:31

看一看代码,看起来你不能以一种简单的方式做到这一点,这是够可笑的。如果我是你,我会很想黑进这个库,或者写我自己的kd-tree。我会在他们的邮件列表上询问一下,但看起来你可能不得不这样做:

代码语言:javascript
复制
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。我不熟悉这个库,但这是我粗略检查过的最好的库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3260601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档