【KD树】 学习资料(转自木子日匀大神)
来源:互联网 发布:linux中cat的用法 编辑:程序博客网 时间:2024/06/02 07:32
KD树是一种能在
其思想是,每次把当前处理的区域按照点数分成两部分,然后对两部分进行递归处理。。。
分成两部分有两种策略,一种是横着竖着横着竖着交替划分。。
一种是把坐标跨度大的那一维划分成两部分。
似乎没什么影响。
上图是一种可行的划分方式。每次找到当前处理点集
查询一个点的最近点时,首先令最近距离为
这里还有个问题,可能点被分到了左区间,但是可能和右区间的某个点比较近。那么怎么办。?
假设这个点到分界线的距离已经是大于等于当前最优答案了,那么另一个区间的所有点到这个点的距离都比当前最优答案远,只有这时候不需要考虑另一个区间。
这个看起来蠢爆了好么。但是复杂度分析均摊下来的确是
STL中提供了一个叫做nth_element的函数,可以在O(n)的复杂度下找到序列的第k大数并且把序列以第k大为界分为两半,用这个就能写出很短的建树过程了。
bool
Div[MaxN];\\记录这个区间是用什么体位划分的
void
BuildKD(
int
l,
int
r, Point p[])\\记得备份一下p
{
if
(l > r)
return
;
int
mid = l + r >> 1;
int
minX, minY, maxX, maxY;
minX = min_element(p + l, p + r + 1, cmpX)->x;
minY = min_element(p + l, p + r + 1, cmpY)->y;
maxX = max_element(p + l, p + r + 1, cmpX)->x;
maxY = max_element(p + l, p + r + 1, cmpY)->y;
Div[mid] = (maxX - minX >= maxY - minY);
nth_element(p + l, p + mid, p + r + 1, Div[mid] ? cmpX : cmpY);
BuildKD(l, mid - 1, p);
BuildKD(mid + 1, r, p);
}
查找的时候照着思路写就可以了。
void
Find(
int
l,
int
r, Point a, Point p[])
{
if
(l > r)
return
;
int
mid = l + r >> 1;
long
long
dist = dist2(a, p[mid]);
if
(dist > 0)
//如果有重点不能这样判断
res = min(res, dist);
long
long
d = Div[mid] ? (a.x - p[mid].x) : (a.y - p[mid].y);
int
l1, l2, r1, r2;
l1 = l, l2 = mid + 1;
r1 = mid - 1, r2 = r;
if
(d > 0)
swap(l1, l2), swap(r1, r2);
Find(l1, r1, a, p);
if
(d * d < res)
Find(l2, r2, a, p);
}
这份KD树是参照佐倉杏子的代码学习的。Orz。
相关题目:In case of failure
别的用处。。?何老鱼说可以维护一个矩形区域的点的权值和啊之类的问题。还没细想。
- 【KD树】 学习资料(转自木子日匀大神)
- 【AC自动机模板】(转自木子日匀大神)
- 【转自木子博客】C# 4.0新特性(白皮书)
- kd树学习
- 食物链(转自yekehe2002大神)
- 《Python大神晋级之路》公开课资料分享(附赠学习资料)
- kd树(学习总结及伪代码)
- K近邻算法(kNN)学习——kd树
- 并查集详解(转自大神博客)
- 关于KD树(未完)
- Openstack学习资料链接总结(包括主要的大神级博客)
- KD树
- kd树
- KD树
- kd树
- KD树
- KD树
- KD树
- iOS 从证书申请到上架App Store流程( xcode 5)详细解析
- jQuery 遍历 JSON 对象
- 一位ACMer过来人的心得
- 1009. 说反话 (20)
- Linux网络编程 五种I/O 模式及select、epoll方法的理解
- 【KD树】 学习资料(转自木子日匀大神)
- 如何将windows格式的图标作为os x应用程序的图标
- 【Matlab】isa函数解析 类型判断函数
- 多行文本溢出显示省略号(...)的方法整理
- 【Hibernate学习】 ——ORM(三)
- HDU1258:Sum It Up(DFS)
- 下定决心创新路径 持续推进集成电路产业跨越发展
- fragment延迟加载
- Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理