kd树解平面最近点对
早上起来头有点疼,突然就想到能不能用kd树解平面最近点对问题,就找了道题试了一下,结果可以,虽然效率不高,但还是AC了~
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007
题目要求平面上最近点对间距离的一半。
思路如下:先建立一棵树,所有点插入树中,之后为每个点查询其最近点,枚举找到最小值。注意查询的时候不要让点自己跟自己比。个人感觉,这种写法也可以达到O(nlogn)的复杂度。建树分区间的时候,按x,y中跨度大的一个来分,应该就接近O(nlogn)了,不过我太懒了,那种方法之后再试,现在先x,y轮流着来了。
kd树代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cmath>
#define MAX (101000)
#define pow(x) ((x)*(x)) using namespace std; int n, idx; struct Point{
double x[];
bool operator < (const Point &u) const{
return x[idx] < u.x[idx];
}
}po[MAX]; struct Tree {
Point p[MAX<<];
int son[MAX<<];
bool f[MAX<<];
int ps[MAX<<];
void build ( int l , int r , int u = , int dep = )
{
if(l > r) return;
son[u] = r-l;
son[u<<] = son[u<<|] = -;
idx = dep%;
int mid = (l+r)>>;
nth_element(po+l, po+mid, po+r+);
p[u] = po[mid], ps[u] = mid;
build ( l , mid- , u<< , dep+ );
build ( mid+ , r , u<<| , dep+ );
} double query(Point a, int id, int u = , int dep = ){
if(son[u] == -) return 1000000000.0; double dis = pow(p[u].x[]-a.x[]) + pow(p[u].x[]-a.x[]);
if(ps[u] == id) dis = 1000000000.0;
int dim = dep%, fg = ;
int x = u<<, y = u<<|;
if(a.x[dim] >= p[u].x[dim]) swap(x, y);
double tm1 = 1000000000.0, tm2 = 1000000000.0;
if(~son[x])tm1 = query(a, id, x, dep+);
if(pow(a.x[dim] - p[u].x[dim]) < tm1) fg = ;
if(~son[y] && fg) tm2 = query(a, id, y, dep+);
if(dis > tm1) dis = tm1;
if(dis > tm2) dis = tm2;
return dis;
}
}kd; int main(){
while(~scanf("%d", &n), n){
for(int i = ; i < n; i++)
scanf("%lf %lf", &po[i].x[], &po[i].x[]);
memset(kd.f, , sizeof(kd.f));
memset(kd.ps, -, sizeof(kd.ps));
kd.build(, n-);
double ans = 1000000000.0;
for(int i = ; i < n; i++){
double tm = kd.query(po[i], i);
if(tm < ans) ans = tm;
}
printf("%.2lf\n", sqrt(ans)/);
}
return ;
}
kd树解平面最近点对的更多相关文章
- C# 通过KD树进行距离最近点的查找.
本文首先介绍Kd-Tree的构造方法,然后介绍Kd-Tree的搜索流程及代码实现,最后给出本人利用C#语言实现的二维KD树代码.这也是我自己动手实现的第一个树形的数据结构.理解上难免会有偏差,敬请各位 ...
- BZOJ - 2648 KD树 最近点查询
省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits ...
- K-D树详解
K-D树最近邻算法https://blog.csdn.net/image_fzx/article/details/80624968 一般说来,索引结构中相似性查询有两种基本的方式: 一种是范围查询,范 ...
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
- k临近法的实现:kd树
# coding:utf-8 import numpy as np import matplotlib.pyplot as plt T = [[2, 3], [5, 4], [9, 6], [4, 7 ...
- tju_4147 kd树+最小生成树
kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...
- 02-17 kd树
目录 kd树 一.kd树学习目标 二.kd树引入 三.kd树详解 3.1 构造kd树 3.1.1 示例 3.2 kd树搜索 3.2.1 示例 四.kd树流程 4.1 输入 4.2 输出 4.3 流程 ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...
随机推荐
- js请求解析xml
xml数据 <?xml version="1.0" encoding="utf-8"?> <table> <node name=& ...
- loj#2334 「JOI 2017 Final」JOIOI 王国
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...
- P5018对称二叉树
传送 题目说了那么多,到底什么是对称二叉树呢? 就是关于根节点左右镜面对称的二叉树辣. 当然,一棵对称二叉树的子树不一定是对称二叉树,就比如下面这个 它是对称二叉树,但是对于它的子树 这并不是对称二叉 ...
- python杂谈
1.for循环过界保护 例如: a=len([1,2,3]) for i in range(a): for j in range(i+1:a) print(i,j) 不会报错 2.python集合和列 ...
- jQuery插件3种类型
1.封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件. 此类插件可以发挥出jQuery选择器的强大优势,有相当一部分的jQuery方 ...
- POJ - 3176 Cow Bowling 动态规划
动态规划:多阶段决策问题,每步求解的问题是后面阶段问题求解的子问题,每步决策将依赖于以前步骤的决策结果.(可以用于组合优化问题) 优化原则:一个最优决策序列的任何子序列本身一定是相当于子序列初始和结束 ...
- reuseaddr和点对点聊天
解决绑定失败 在测试时,经常会出现绑定错误,bind error: Address already in use 这里只要指定一下socket的reuseaddr属性即可解决 int on=1; if ...
- phpstudy开启PHPSocket扩展(windows系统)
PHP开启Socket扩展 一.windows系统(本地电脑) 1.打开phpstudy,设置——>配置文件——>打开php.ini(我安装的是PhpStudy v8.0,其他版本请自己找 ...
- 《JAVA设计模式》之备忘录模式(Memento)
在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...
- tmux多终端工具
在Linux服务器上没有办法像在桌面系统一样开多个终端,所以有时后进行一些操作不是太方便,所以可以使用tmux工具,创建多个终端. 这里仅仅是简单的介绍一下如何创建多个终端和进行多个终端之间切换,tm ...