早上起来头有点疼,突然就想到能不能用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树解平面最近点对的更多相关文章

  1. C# 通过KD树进行距离最近点的查找.

    本文首先介绍Kd-Tree的构造方法,然后介绍Kd-Tree的搜索流程及代码实现,最后给出本人利用C#语言实现的二维KD树代码.这也是我自己动手实现的第一个树形的数据结构.理解上难免会有偏差,敬请各位 ...

  2. BZOJ - 2648 KD树 最近点查询

    省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits ...

  3. K-D树详解

    K-D树最近邻算法https://blog.csdn.net/image_fzx/article/details/80624968 一般说来,索引结构中相似性查询有两种基本的方式: 一种是范围查询,范 ...

  4. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

  5. k临近法的实现:kd树

    # coding:utf-8 import numpy as np import matplotlib.pyplot as plt T = [[2, 3], [5, 4], [9, 6], [4, 7 ...

  6. tju_4147 kd树+最小生成树

    kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...

  7. 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 流程 ...

  8. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  9. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

随机推荐

  1. [hadoop](2) MapReducer:Distributed Cache

    前言 本章主要内容是讲述hadoop的分布式缓存的使用,通过分布式缓存可以将一些需要共享的数据在各个集群中共享. 准备工作 数据集:ufo-60000条记录,这个数据集有一系列包含下列字段的UFO目击 ...

  2. 170821-关于SpringMVC的知识点

    1.SpringMVC 概述以及优势 SpringMVC和Spring的关系:  软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBas ...

  3. linux之yum源的RPM软件包管理

    1.yum源的配置文件 路径:vim /etc/yum.repos.d/CnetOS-Base.repo 文件格式: 2.yum查询 yum list 查询所有可用软件包 yum search 包名 ...

  4. execute、executeQuery和executeUpdate之间的区别 转

    转:http://blog.csdn.net/colin_fantasy/article/details/3898070 execute.executeQuery和executeUpdate之间的区别 ...

  5. LintCode之主元素

    题目描述: 分析:由题目可知这个数组不为空且该主元素一定存在,我选用HashMap来存储,HashMap的存储结构是”键—值对“,”键“用来存储数组元素,”值“用来存储这个元素出现的次数,然后循环遍历 ...

  6. 面向对象编程思想(OOP)(转发)

    本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...

  7. 2017华南理工华为杯D bx回文

    比赛的时候队友过了,补补题XD. 题目链接:https://scut.online/p/125(赛后补题) 125. 笔芯回文     题目描述 bx有一个长度一个字符串S,bx可以对其进行若干次操作 ...

  8. GIS网站收藏

    igismap: https://www.igismap.com/ 高德WebAPI: https://lbs.amap.com/api/javascript-api/example/other-ga ...

  9. Remote desktop manager共享账号

    因为多个远程机器,是会用了域账号进行登录的.而域账号的密码,三个月之后,密码强制过期 添加一个新的entry,类型是Credential Entry,然后选择用户名/密码 在remote deskto ...

  10. mysql主从架构,IO、SQL线程运行为YES,从库没有同步数据

    mysql基于binlog主从复制架构,IO.SQL线程运行为YES,从库没有同步数据 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_D ...