【算法竞赛学习笔记】KD-Tree

最近邻算法的实现:k-d tree 一、如何高效率地实现k近邻法?   在SIFT图像特征匹配等应用中,需要在高维特征空间中快速找到距离目标图像特征最近邻的那个特征点,往往需要进行比较的特征向量的数量很大,如果进行朴素最近邻搜索,也就是依次计算目标点和每一个待匹配特征的距离,然后再算出最短距离这样的策略,那么特征匹配算法的时间复杂度将会高得令人难以接受。因此,我们需要借助一种存储和表示k维数据的数据结构,既能够方便地存储k维数 阅读详情

title : KD-Tree
date : 2022-4-7
tags : ACM,数据结构
author : Linno


K-D tree

K-D树是在k维欧几里得空间中组织点的数据结构。在算法竞赛中,K-D树往往用于在二维平面内的信息检索。具体应用如:多维键值搜索(范围搜索及最邻近搜索)下面我们针对二维平面的KD-Tree进行讲解。

定义

K-D Tree是一颗存储k维信息的二叉树,代表对数据集合的划分,每个结点都对应着一个k维超矩形区域。

①在一维数据情况下,KD-Tree是一颗二叉搜索树。

②二维情况下,我们轮流按照x维和y维对数据进行划分。这是最简单的一种划分方式,使得每次划分都将平面分成不相交的两部分。

建树

对于KD-Tree每个结点的存储信息如下:

struct KDTree{
    int ch[2],id;  //左右儿子和当前结点的编号
    Point p,r1,r2;
    //结点表示的点,子树赋改的矩形的左下角,右上角
}

每次新建结点是根据当前划分维度选中位数进行划分,注意nth_elementnth\_elementnth_element函数的使用,是线性时间选择中位数,并将比他小的元素排序到左边,比他大的元素排序到右边的。

int build(int l,int r,int d) {  //KD-Tree建树 
    if (l>r) return 0;
    del=d;  //改变划分维度 
	int mid=(l+r)>>1,at=++ncnt;
    nth_element(ps+l,ps+mid,ps+r+1,cmp); //O(n)找到第mid大元素,将比他小的放左边,比他大的放右边 
    T[at]=Tree(ps[mid],mid);
    T[at].ch[0]=build(l,mid-1,d^1),T[at].ch[1]=build(mid+1,r,d^1);
    pushup(at);return at;
}

更新

对于KD-Tree每个结点表示的矩形,需要由左右儿子向上更新

void pushup(int rt) {  //更新操作 
    T[rt].r1.x=min(min(T[ls].r1.x,T[rs].r1.x),T[rt].r1.x);
    T[rt].r1.y=min(min(T[ls].r1.y,T[rs].r1.y),T[rt].r1.y);
    T[rt].r2.x=max(max(T[ls].r2.x,T[rs].r2.x),T[rt].r2.x);
    T[rt].r2.y=max(max(T[ls].r2.y,T[rs].r2.y),T[rt].r2.y);
}

插入

插入是根据当前层比较的维度,较小的插左子树,较大的插右子树,比较简单。

void modify(int rt,Point p){
    if(!rt){T[rt]=Tree(P,++ncnt);return;}
    int d=cmp(p,T[rt].p)^1;
    del^=1;
    modify(T[rt].ch[d],p);
    pushup(T[rt]);
}

查询

最近点查询

1.设定答案ans为初始值∞\infty∞

2.将点P从根节点开始,先用根节点代表的点更新答案。由于根节点的左右儿子各表示一个矩形区域,而两个区域都有可能存在距离P最近的点,我们优先选择距离点P最近的矩形递归查询。

3.以P为圆心,ans为半径画圆,如果与之前未递归的矩形相交,则递归下去,否则不可能由更优解。

事实上剪枝+搜素,单次查询均摊复杂度是O(logn)O(logn)O(logn),最坏O(n)O(\sqrt n)O(n​)
void query(int rt,Point p) {  //查询操作 
    if (!rt) return;
    node st=node(dis(T[rt].p,p),T[rt].p.id);
    if (st<q.top()) q.pop(),q.push(st);
    double dis[2]={T[ls].dis(p),T[rs].dis(p)};
    int nxt=dis[0]<dis[1]; 
	query(T[rt].ch[nxt],p);  //优先选择两个儿子中矩形距离小的那个 
    if (node(dis[nxt^1],T[T[rt].ch[nxt^1]].id)<q.top()) query(T[rt].ch[nxt^1],p); //如果另一个儿子有可能比当前结果小,就递归下去 
}
K远点

在寻找最近点时,我们维护一个大根堆,一开始放k个−∞-\infty−∞,然后维护查询结果即可。

例题

luoguP4357 [CQOI2016]K 远点对

题意:给定k个点,求第k远点对的距离平方。

将所有点插进KD-Tree中维护小顶堆即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+7;

const double inf=1e16;
struct Point {  //二维平面的点 
    int x,y,id;
    Point (int x=0,int y=0):x(x),y(y) {}
}ps[N];

bool del;  //比较x为0,比较y为1 
bool cmp(Point p1,Point p2) { 
    if (!del) return (p1.x<p2.x||(p1.x==p2.x&&p1.y<p2.y));
    return (p1.y<p2.y||(p1.y==p2.y&&p1.x<p2.x));
}
int dis(Point p1,Point p2) { //计算两点距离 
    return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
#define ls T[rt].ch[0]
#define rs T[rt].ch[1] 
struct Tree { //KD-Tree
    int ch[2],id;Point p,r1,r2; //左右儿子和当前结点编号,当前点和表示平面的左下右上角 
    Tree(Point p=Point(),int id=0):p(p),r1(p),r2(p),id(id) {}
    double dis(Point p) {  
        if (!id) return -inf;
        return max(max(::dis(p,r1),::dis(p,r2)),max(::dis(p,Point(r1.x,r2.y)),::dis(p,Point(r2.x,r1.y))));
    }
}T[N];
void pushup(int rt) {  //更新操作 
    T[rt].r1.x=min(min(T[ls].r1.x,T[rs].r1.x),T[rt].r1.x);
    T[rt].r1.y=min(min(T[ls].r1.y,T[rs].r1.y),T[rt].r1.y);
    T[rt].r2.x=max(max(T[ls].r2.x,T[rs].r2.x),T[rt].r2.x);
    T[rt].r2.y=max(max(T[ls].r2.y,T[rs].r2.y),T[rt].r2.y);
}
int ncnt=0;
void init() {  //初始化平面 
    T[0].r1=Point(0x3f3f3f3f,0x3f3f3f3f),T[0].r2=Point(-0x3f3f3f3f,-0x3f3f3f3f);
}
int build(int l,int r,int d) {  //KD-Tree建树 
    if(l>r) return 0;
    del=d;  //改变划分维度 
	int mid=(l+r)>>1,at=++ncnt;
    nth_element(ps+l,ps+mid,ps+r+1,cmp); //O(n)找到第mid大元素,将比他小的放左边,比他大的放右边 
    T[at]=Tree(ps[mid],mid);
    T[at].ch[0]=build(l,mid-1,d^1),T[at].ch[1]=build(mid+1,r,d^1);
    pushup(at);return at;
}
struct node {  //堆中的结点 
    int dis;int id;
    node(int dis=0,int id=0):dis(dis),id(id) {}
    bool operator < (node b) const {
        return dis>b.dis||(dis==b.dis&&id<b.id);
    }
};
priority_queue<node>q; //大根堆
priority_queue<int>ans;
 
void query(int rt,Point p) {  //查询操作 
    if(!rt) return;
    node st=node(dis(T[rt].p,p),T[rt].p.id);
    if(st<q.top()) q.pop(),q.push(st);
    double dis[2]={T[ls].dis(p),T[rs].dis(p)};
    int nxt=dis[0]<dis[1]; 
	query(T[rt].ch[nxt],p);  //优先选择两个儿子中矩形距离小的那个 
    if(node(dis[nxt^1],T[T[rt].ch[nxt^1]].id)<q.top()) query(T[rt].ch[nxt^1],p); //如果另一个儿子有可能比当前结果小,就递归下去 
}
signed main() {
    init();
	int n,k;
	scanf("%lld%lld",&n,&k);
    k*=2;
	for(int i=1;i<=n;i++) scanf("%lld%lld",&ps[i].x,&ps[i].y),ps[i].id=i;
    build(1,n,0);
    while (!q.empty()) q.pop();  //初始化队列 
    for(int j=1;j<=k;j++) q.push(node(-inf)); //设定答案初始值 
	for(int i=1;i<=n;i++) query(1,ps[i]);	
	cout<<q.top().dis;
	return 0;
}
luogu P2093 [国家集训队]JZPFAR

题意:求平面内距离给定点第k远的点。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;

const double inf=1e16;
struct Point {  //二维平面的点 
    int x,y,id;
    Point (int x=0,int y=0):x(x),y(y) {}
}ps[N];

bool del;  //比较x为0,比较y为1 
bool cmp(Point p1,Point p2) { 
    if (!del) return (p1.x<p2.x||(p1.x==p2.x&&p1.y<p2.y));
    return (p1.y<p2.y||(p1.y==p2.y&&p1.x<p2.x));
}
double dis(Point p1,Point p2) { //计算两点距离 
    return (double)(p1.x-p2.x)*(p1.x-p2.x)+(double)(p1.y-p2.y)*(p1.y-p2.y);
}
#define ls T[rt].ch[0]
#define rs T[rt].ch[1] 
struct Tree { //KD-Tree
    int ch[2],id;Point p,r1,r2; //左右儿子和当前结点编号,当前点和表示平面的左下右上角 
    Tree(Point p=Point(),int id=0):p(p),r1(p),r2(p),id(id) {}
    double dis(Point p) {  
        if (!id) return -inf;
        return max(max(::dis(p,r1),::dis(p,r2)),max(::dis(p,Point(r1.x,r2.y)),::dis(p,Point(r2.x,r1.y))));
    }
}T[N];
void pushup(int rt) {  //更新操作 
    T[rt].r1.x=min(min(T[ls].r1.x,T[rs].r1.x),T[rt].r1.x);
    T[rt].r1.y=min(min(T[ls].r1.y,T[rs].r1.y),T[rt].r1.y);
    T[rt].r2.x=max(max(T[ls].r2.x,T[rs].r2.x),T[rt].r2.x);
    T[rt].r2.y=max(max(T[ls].r2.y,T[rs].r2.y),T[rt].r2.y);
}
int ncnt=0;
void init() {  //初始化平面 
    T[0].r1=Point(0x3f3f3f3f,0x3f3f3f3f),T[0].r2=Point(-0x3f3f3f3f,-0x3f3f3f3f);
}
int build(int l,int r,int d) {  //KD-Tree建树 
    if (l>r) return 0;
    del=d;  //改变划分维度 
	int mid=(l+r)>>1,at=++ncnt;
    nth_element(ps+l,ps+mid,ps+r+1,cmp); //O(n)找到第mid大元素,将比他小的放左边,比他大的放右边 
    T[at]=Tree(ps[mid],mid);
    T[at].ch[0]=build(l,mid-1,d^1),T[at].ch[1]=build(mid+1,r,d^1);
    pushup(at);return at;
}
struct node {  //堆中的结点 
    double dis;int id;
    node(double dis=0,int id=0):dis(dis),id(id) {}
    bool operator < (node b) const {
        return dis>b.dis||(dis==b.dis&&id<b.id);
    }
};
priority_queue<node> q; //大根堆 
void query(int rt,Point p) {  //查询操作 
    if (!rt) return;
    node st=node(dis(T[rt].p,p),T[rt].p.id);
    if (st<q.top()) q.pop(),q.push(st);
    double dis[2]={T[ls].dis(p),T[rs].dis(p)};
    int nxt=dis[0]<dis[1]; 
	query(T[rt].ch[nxt],p);  //优先选择两个儿子中矩形距离小的那个 
    if (node(dis[nxt^1],T[T[rt].ch[nxt^1]].id)<q.top()) query(T[rt].ch[nxt^1],p); //如果另一个儿子有可能比当前结果小,就递归下去 
}
int main() {
    init();
	int n,m;scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d%d",&ps[i].x,&ps[i].y),ps[i].id=i;
    build(1,n,0);
	scanf("%d",&m);
    int x,y,k;
    while (m--) {
		scanf("%d%d%d",&x,&y,&k);
        while (!q.empty()) q.pop();  //初始化队列 
        for (int i=1;i<=k;i++) q.push(node(-inf)); //设定答案初始值 
        query(1,Point(x,y));  //从根节点出发查询答案 
		printf("%d\n",q.top().id); 
    }
    return 0;
}

参考资料

https://blog.sengxian.com/algorithms/k-dimensional-tree

https://www.jianshu.com/p/4fd7cad27906

机器学习算法(二十五):KD树详解及KD树最近邻算法 目录 1 KD树 1.1什么是KD树 1.2KD树的构建 1.3 KD树的插入 1.4KD树的删除 1.5KD树的最近邻搜索算法 1.5.1举例:查询点(2.1,3.1) 1.5.2 举例:查询点(2,4.5) 2 kd树近邻搜索算法的改进:BBF算法 3 球树、M树、VP树、MVP树 3.1球树 3.2VP树与MVP树简介 特征点匹配和数据库查、图像检索本质上是同一个问题,都可以归结为一个通过距离函数在高维矢量之间进行相似性检索的问题,如何快速而准确... 阅读详情

相关推荐

K-D树算法的一些总结

在2016年ACM ICPC青岛站的比赛中,一道K-D树问题成为了金银牌的分界线,最后由我们队一个强力队友写出了该题,其实那题本来该由我负责的,都怪我学艺不精。 k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。 应用背景   SIFT算法中做特征点匹配的时候就会

xiuceliu的博客 4934

KD树

实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,这点在特征空间的维数大以及训练数据容量大时尤其重要。为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。kd树方法就是其中一种方法。

doreen_701的博客 631

【信息科学与工程学】【控制科学】第十二篇 微型计算机控制技术01

更精确的经典模型:I1在第5周期WB结束,I2最早可在第6周期进入EX,但I2在ID阶段就需要R1,因此I2的ID需在第6周期,而I1的WB在第5周期,所以I2的ID可以紧接在第6周期,但中间仍有一个stall(因为I1的EX结果要等到MEM之后才能转发给ID?有优先级继承后,Task_L被提升优先级,不会被Task_M抢占,阻塞时间缩短为Task_L剩余执行时间(9ms),仍可能超过10ms,但可通过调整任务周期或使用中断处理缓解。电感L=10μH,输出电容C=100μF,ESR=5mΩ。

weixin_49199313的博客 8638

K-D树 Hdu4347

原本是CV研究HC算法时,有一步要求对图片中每一个像素点,在lab空间上距离它最近的K个点。意识到对于哪怕小尺寸的图片(例如300*500)数据点也有足足1e5数量级,对每一个遍历全图来一次,O(N^2),哪怕Matlab矩阵优化顶破天,一幅图最起码也要3s,em,MSRA10k的图库一晚上都跑不完。     最后勉强想起来acm里面有一个东西叫KD树,专解此类问题。于是认知研究了一发。这里以H

cjjst123的博客 595

MCSDK5.4.8电机库双电阻采样适配:从扇区判断到固定采样的重构实践

本文详细解析了MCSDK5.4.8电机库中双电阻采样技术的重构实践,从扇区判断到固定采样的关键步骤。通过硬件配置优化、核心文件重构及电流读取函数改造,实现高效稳定的电机控制,特别适用于成本敏感型项目。文章还提供了占空比限制计算、参数调整及常见问题排查等实用技巧,助力工程师快速掌握两电阻采样方法。

weixin_42532938的博客 281

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板

手把手教你搭建一个属于自己的网站-适合零基础小白写在前面搭建需求功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 前段时间休息想着搭一个属于自己的网站,几经尝试终于成功了,网上其实有很多教程,但很多,希望这篇文章能够帮助到

qq_46788925的博客 1万+

二维的kdtree c++代码

kdtree c++

weixin_39566143的博客 470

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成

本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。

weixin_28318011的博客 632

[2016ACM多校] HDU5809 KD树 并查集

维平面有N(<=10^5)个蚁穴,每个蚁穴的蚂蚁会不断的爬向最近的蚁穴(距离相同则按x,y坐标选最小的),Q(<=10^5)个查询,问两只蚂蚁是否会相遇。思路其实行走过程就像不断寻找、逼近最近点对,最终再最近点对循环,那么落入同一个最近点对的蚂蚁就会相遇。即把每个点和离他最近的点连边,不必考虑方向,同一个连通分量中的蚂蚁一定会相遇。建立图之后用并查集维护一下联通关系即可。   建图KD树

Burning1108的博客 1349

API安全攻防实战:从信息搜集到漏洞利用的完整路径

本文详细解析了API安全攻防实战的全过程,从信息搜集到漏洞利用,涵盖了渗透测试的核心技巧和工具使用。通过真实案例展示如何发现和利用API漏洞,如HTTP方法滥用、内容类型转换攻击等,并提供企业级防御策略和测试心得,帮助安全研究人员提升API安全防护能力。

weixin_30394981的博客 434

Uniapp+Vue3+Monorepo:如何优化你的前端开发流程(附完整配置代码)

本文详细介绍了如何利用Uniapp+Vue3+Monorepo技术栈优化前端开发流程,提升代码可维护性和团队协作效率。通过Monorepo架构实现依赖管理智能化、代码复用最大化和构建流程统一化,结合完整配置代码和实战指南,帮助开发者快速构建高性能跨端应用。

weixin_29011993的博客 453

KD树详解及KD树最近邻算法

本文主要内容转载自:http://blog.youkuaiyun.com/app_12062011/article/details/51986805 之前blog内曾经介绍过SIFT特征匹配算法,特征点匹配和数据库查、图像检索本质上是同一个问题,都可以归结为一个通过距离函数在高维矢量之间进行相似性检索的问题,如何快速而准确地找到查询点的近邻,不少人提出了很多高维空间索引结构和近似查询的算法。

酒酿小圆子呀~ 1574

【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】

生成KEIL工程之后,勾选上use MicroLIB,代码上暂时无需做其他修改,编译下载。由于使用了FreeRTOS,因此系统的TimeBase Source修改成TIM1。在CubeMx上面选择NUCLEO-F429ZI开发板,并采用默认配置。打开电脑命令行,去ping这设置好的IP,能够实现Ping通。使能LWIP,并且先禁用DHCP,设置好静态IP。修改defaultTask的栈大小。Platform选择LAN8742。修改堆栈大小,生成工程。使能FreeRTOS。

qq_42617357的博客 6112

KD - Tree 学习笔记

(这本是 P4169 的一篇无法提交的题解) 而 KD - Tree 本身在竞赛中的应用就比较少,又几乎不作为正解出现,所以这里只拿一道例题来举例讲解 题意: 给定一个二维点集 S ,每次有两种操作: 操作 1 : 往点集 S 中加入一个点 操作 2 : 给定一个点 (x,y)(x, y)(x,y) ,询问该点到点集 S 中每个点曼哈顿距离的最小值 两点 (x1,y1),(x2,y2)(x_1, y_1), (x_2, y_2)(x1​,y1​),(x2​,y2​) 之间的曼哈顿距离定义为: ∣x1−x2

Recalling_Clouds的博客 406

财务数智化——解读224页 2025年数智技术业财融合应用蓝皮书【附全文阅读】

《数智技术赋能业财融合蓝皮书》面向企业管理者及数字化转型从业者,系统阐述数智技术在业财融合中的应用。全书围绕技术基础(定义、分类、发展趋势)、融合框架(三阶段路径与三层价值)、七大行业应用场景(涵盖核算自动化、智能收款、项目管控等)、关键技术(AI、大数据等)及实施要点(组织协同、数据治理等),通过典型案例为企业提供从技术到实践的全面指导,助力实现数据贯通与价值创造。

cdfunlove的博客 1747

RobotFramework二次开发——实时日志

背景基于RobotFramework的二次开发,少不了要打印实时日志出来,比如广泛应用的工具ride中,在执行用例时会把执行过程中的log全部打印出来,如果二次开发的时候,执行用例只能静默等待执行完毕,那只能算是一个半成品。结果在最后,不想看过程的可以直接跳到最后思路RobotFramework的日志有好几种,一个是执行后的log文件,这个文件可以作为数据留存,但是没办法实时获取,因为文件是在执行完

点点寒彬的博客 1万+

kd tree学习笔记 (最近邻域查询)

https://zhuanlan.zhihu.com/p/22557068 http://blog.youkuaiyun.com/zhjchengfeng5/article/details/7855241 KD树在算法竞赛中主要用来做各种各样的平面区域查询,包含则累加直接返回,相交则继续递归,相离的没有任何贡献也直接返回。可以处理圆,三角形,矩形等判断起来相对容易的平面区域内的符合加法性质的操作。 ...

weixin_30653023的博客 205

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构优化建图

数据结构的边定向,方便对一个区域点连边 缩小边数量,点数量通常会多 前缀后缀处理: 经常会有正反边的两棵树,表示出入等 [学习笔记]线段树优化建图 2019.2.28考试 KDtree也可以 upda:2019.4.8 省选也考到了[十二省联考2019]字符串问题 parent树的利用很巧妙。 转载于:https://www.cnblogs.com/Mirac...

weixin_34268169的博客 542

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

浅谈 K-D Tree 及其进阶应用

前言 K-D Tree (K-Dimension Tree)K-D Tree (K-Dimension Tree)\text{K-D Tree (K-Dimension Tree)} 是一种可以有效处理高维信息的数据结构。 在一般信息学竞赛题目中 k=2k=2k = 2,此时它又称 2-D Tree2-D Tree\text{2-D Tree}。 但遗憾的是,k≥3k≥3k \ge 3 的情况并...

weixin_42287030的博客 263

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【C++】pcl库中的k-d tree和八叉树算法

1.计算机图形学中的Mesh(网格)数据结构;2.k-d tree的概念以及在pcl中的应用(快速邻域搜索);3.八叉树的概念以及在pcl中的应用(空间划分及搜索)

Zhang_Chen_的博客 3787

C++ 版 K-D 树(kdtree)的实现——源码解析

本文解析了kd-tree的实现方式,源码为C++完成,并通过测试用例测试了该代码。

weixin_45867382的博客 3785

k近邻(kNN)算法简介

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。 一、算法概述     k -近邻算法是基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念。 基于实例的学习。 1、已知一系列的训练样例,很多学习方法为目标函数建立起明确的一般化描述;但与此不同,基于实例的学习方法只是简单地

Star——Flying in the cyberspace 1万+

最近邻查找算法kd-tree

http://blog.youkuaiyun.com/pipisorry/article/details/52186307 海量数据最近邻查找的kd-tree简介         利用Octree,為封閉的3D空間建立一個資料結構來管理空間中的每個元素。如此我們可以在 O(log N) 的時間內對這3D空間進行搜尋。         3D空間可以用Octree,2D空間可以用Quadtree(四元樹,概...

皮皮blog 6万+

K-D树

K-D树,即K-Dimensional Tree,是一种高维索引树型数据结构。常用于大规模高维数据空间的最邻近或者K邻 近查找,例如图像检索中高维图像特征向量的K邻近匹配,对KNN算法的优化等。   Contents      1. K-D树的基本原理    2. K-D树的改进(BBF算法)    3. K-D树的C++实现    4. K-D树的开源框架介绍     1.

ACdreamer 1万+

KDTree复杂度

KD Tree Kd-树其实是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构。其实,Kd-树是一种平衡二叉树。 举一示例: 假设有六个二维数据点 = {(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间中。为了能有效的找到最近邻,Kd-树采用分而治之的思想,即将整个空间划分为几个小部分。六个二维数据点生成的Kd-树的

alaclp的专栏 1万+

k-d Tree算法

本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd- Tree(Kd树)。Kd-Tree,即K-dimensional tree,是一种高维索引树形数据结构,常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor),例如图像检索和识别中的高维图像特征向量的K近邻查找与匹配。Kd树在维度较小时(比如203020、302030K≥100K≥100K≥100。

weixin_44852067的博客 4516
上一篇: 【超好懂的比赛题解】Educational Codeforces Round 125
下一篇: 【算法竞赛学习笔记】数位DP
RWLinno
博客等级 码龄8年 3728粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RWLinno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值