K-D Tree 学习笔记

K-D Tree 学习笔记

最近看了一下k-NN然后它说如果特征空间维数比较低的时候用K-D Tree来求k近邻比较快所以就来补一下学OI时没学的K-D Tree假装写一个学习笔记吧。

是什么?

是一个平衡二叉树

k=1的时候就是一只BST

k>1的话,每一层换一维来分割

就是用许多垂直坐标轴的超平面将一个k维空间分割

每个节点保存了一个点,它所代表的超平面就是经过这个点垂直于某个坐标轴一个超平面

每个子树代表了一个区域(代码实现中是包含子树中所有点的最小超矩形,实际上应该是划分后的那个超矩形

怎么做?

建树

我没有任何建树,下一个

复杂度\(O(kn\log n)\),一个分治...

插入

直接插入就行了,注意一路update

挺不科学的插入的话会破坏建树时的平衡性

所以要加入重构好麻烦不想写

查询

有点诡异的启发式搜索

有一个估算一个点到一个超矩形的最大/最小距离的操作

对于最近邻来说,先搜左右儿子中距离近的,并且只搜估算最近距离小于当前ans的

k近邻的话,用个大根堆,一直保持堆中有k个的元素

远的话换成远就行了QwQ

听说随机数据复杂度\(O(\log n)\)\(O(n\sqrt{n})\) ,不会证不会证

代码实现

因为早就退役了所以我也没有做很多题来练习各种鬼畜用法的必要了扔模板就跑

bzoj2648 带插入最近邻

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e6+5, inf = 1e9;
#define lc t[x].ch[0]
#define rc t[x].ch[1]
#define max0(x) max(x, 0)int n, m;
int curD = 0;
struct meow {int d[2];meow() {}meow(int x, int y){d[0]=x; d[1]=y;}bool operator < (const meow &r) const {return d[curD] < r.d[curD];}int calDist(meow &a) {return abs(d[0] - a.d[0]) + abs(d[1] - a.d[1]);}
};
meow a[N];
struct node {int ch[2], x[2], y[2];meow p;void update(node &a) {x[0] = min(x[0], a.x[0]); x[1] = max(x[1], a.x[1]);y[0] = min(y[0], a.y[0]); y[1] = max(y[1], a.y[1]);}void set(meow &a) {p = a;x[0] = x[1] = a.d[0];y[0] = y[1] = a.d[1];}int evaDist(meow &a) {int xx = a.d[0], yy = a.d[1];return max0(x[0] - xx) + max0(xx - x[1]) + max0(y[0] - yy) + max0(yy - y[1]);}
} t[N];
int root;
int build(int l, int r, int d) {curD = d;int x = (l+r)>>1;nth_element(a+l, a+x, a+r+1);t[x].set(a[x]);if(l < x) lc = build(l, x-1, d^1), t[x].update(t[lc]);if(x < r) rc = build(x+1, r, d^1), t[x].update(t[rc]);return x;
}
void insert(meow q) {t[++n].set(q);for(int x=root, D=0; x; D^=1) {t[x].update(t[n]);int &nxt = t[x].ch[q.d[D] >= t[x].p.d[D]];if(nxt == 0) {nxt = n;break;}else x = nxt;}
}int ans;
void query(int x, meow q) {int nowDist = t[x].p.calDist(q), d[2];d[0] = lc ? t[lc].evaDist(q) : inf;d[1] = rc ? t[rc].evaDist(q) : inf;int wh = d[1] <= d[0];ans = min(ans, nowDist);if(d[wh] < ans) query(t[x].ch[wh], q);wh ^= 1;if(d[wh] < ans) query(t[x].ch[wh], q);
}int main() {cin >> n >> m;int c, x, y;for(int i=1; i<=n; i++) {scanf("%d %d", &x, &y);a[i] = meow(x, y);}root = build(1, n, 0);for(int i=1; i<=m; i++) {scanf("%d %d %d", &c, &x, &y);if(c == 1) insert(meow(x, y));else {ans = inf;query(root, meow(x, y));printf("%d\n", ans);}}
}

bzoj4520 k远点对

每个点求一次k远点

值得注意的是会TLE所以整体用一个大根堆才行

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <ctime>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
const ll inf = 1e18;
#define lc t[x].ch[0]
#define rc t[x].ch[1]
#define max0(x) max(x, 0)inline ll sqr(ll x) {return x*x;}int n, K;
int curD = 0;
struct meow {ll d[2];meow() {}meow(ll x, ll y){d[0]=x; d[1]=y;}bool operator < (const meow &r) const {//if(d[curD] == r.d[curD]) return d[curD^1] < r.d[curD^1];return d[curD] < r.d[curD];}ll calDist(meow &a) {//return abs(d[0] - a.d[0]) + abs(d[1] - a.d[1]);return sqr(d[0] - a.d[0]) + sqr(d[1] - a.d[1]);}
};
meow a[N];
struct node {int ch[2], x[2], y[2];meow p;void update(node &a) {x[0] = min(x[0], a.x[0]);x[1] = max(x[1], a.x[1]);y[0] = min(y[0], a.y[0]);y[1] = max(y[1], a.y[1]);}void set(meow &a) {p = a;x[0] = x[1] = a.d[0];y[0] = y[1] = a.d[1];}ll evaMaxDist(meow &a) {ll xx = a.d[0], yy = a.d[1];return max(sqr(x[0]-xx), sqr(x[1]-xx)) + max(sqr(y[0]-yy), sqr(y[1]-yy));}
} t[N];
int root;
int build(int l, int r, int d) {curD = d;int x = (l+r)>>1;nth_element(a+l, a+x, a+r+1);t[x].set(a[x]);if(l < x) {lc = build(l, x-1, d^1);t[x].update(t[lc]);}if(x < r) {rc = build(x+1, r, d^1);t[x].update(t[rc]);}return x;
}priority_queue<ll, vector<ll>, greater<ll> > ans;
void query(int x, meow q) {ll nowDist = t[x].p.calDist(q), d[2];d[0] = lc ? t[lc].evaMaxDist(q) : -inf;d[1] = rc ? t[rc].evaMaxDist(q) : -inf;int wh = d[1] >= d[0];if(nowDist > ans.top()) ans.pop(), ans.push(nowDist);if(d[wh] > ans.top()) query(t[x].ch[wh], q);wh ^= 1;if(d[wh] > ans.top()) query(t[x].ch[wh], q);
}int main() {cin >> n >> K; K <<= 1;int x, y;for(int i=1; i<=n; i++) {scanf("%d %d", &x, &y);a[i] = meow(x, y);}root = build(1, n, 0);for(int j=1; j<=K; j++) ans.push(-inf);for(int i=1; i<=n; i++) {query(root, a[i]);} cout << ans.top() << endl;
}

转载于:https://www.cnblogs.com/candy99/p/10346870.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html将excel数据自动导入到网页,如何把excel表中的数据自动输入到网页中

怎么把excel表中的数据自动输入到网页中因要给员工网上投工伤保险&#xff0c;员工资料在excel表中&#xff0c;现在在网上投保险时只能一笔笔的复杂粘贴到网页中&#xff0c;有没有办法能直接把excel表中的资料自动输入到网页中的对应的表格中呢&#xff1f;请知道的朋友说下方…

高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )

理论拓扑 环境准备&#xff1a; N 台 Linux 测试服务器 操作系统版本 CentOS 6.5 32bit ***系统分区要求&#xff1a;需要为格式化的空分区*** IP 地址&#xff1a; mfsmaster&#xff1a;10.3.0.81 心跳 ip 192.168.1.11 mfsbackup&#xff1a;10.3.0.82 …

k-means 聚类过程演示

k-means是一种非监督 &#xff08;从下图 0 当中我们可以看到训练数据并没有标签标注类别&#xff09;的聚类算法&#xff1a; K-Means clustering intends to partition n objects into k clusters in which each object belongs to the cluster with the nearest mean. This …

html网页距离顶部50像素,HTML5 教程之CSS Padding(填充)

CSS Padding(填充)CSS Padding(填充)属性定义元素边框与元素内容之间的空间。Padding(填充)当元素的 Padding(填充)(内边距)被清除时&#xff0c;所"释放"的区域将会受到元素背景颜色的填充。单独使用填充属性可以改变上下左右的填充。缩写填充属性也可以使用&#x…

PHP在金山游戏运营中的应用

PHP在金山游戏官方网站中的应用&#xff1a; ①、PHP团队协作开发&#xff1b; ②、PHP系统架构应用。 PHP在金山游戏运营系统 Keyes 中的应用&#xff1a; ①、分层架构设计模型&#xff1b; ②、通用性API接口设计 PHP在金山游戏官方网站中的应用 PHP团队协作开发环境 PHP…

[Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]

【问题描述】 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可…

html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...

本文实例总结了Javascript DOM事件操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;使用JavaScript可以对HTML页面上的各种事件进行监听&#xff0c;如鼠标点击/释放&#xff0c;鼠标悬停/离开&#xff0c;等等。效果图&#xff1a;代码&#xff1a;/p>"ht…

2019 wannafly winter camp day5-8代码库

目录 day55H div2 Nested Tree (树形dp)5F div2 Kropki (状压dp)5J div1 Special Judge (计算几何)5I div1 Sorting (线段树)5D div1 Doppelblock (搜索)5C div1 Division (主席树)5E div1 Fast Kronecker Transform (NTTorFFT)day77G div1&2 抢红包机器人 (拓扑序)7A div1…

蓝桥杯-凑算式

凑算式B DEFA --- ------- 10C GHI&#xff08;如果显示有问题&#xff0c;可以参见【图1.jpg】&#xff09;这个算式中A~I代表1~9的数字&#xff0c;不同的字母代表不同的数字。比如&#xff1a;68/3952/714 就是一种解法&#xff0c;53/1972/486 是另一种解法。…

天猫系统的流控降级

目录 1交易应用介绍 2系统挑战及应对 3优雅降级思路 4心得总结 交易应用介绍 购物袋 下单 确认订单 系统挑战及应对 挑战 • 高并发 • 低时延 • 容量有限 • 多外部系统协力&下单信息准确 目标 • 不挂掉 – 不因为容量原因导致网站瘫痪 – 自身的容量 – 后…

[剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

【问题描述】[第235题][二叉搜索树的最近公共祖先][简单] 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖…

html5 应用框架,基于HTML5移动应用框架的研究及应用

摘要&#xff1a;随着3G网络的技术的成熟,以及4G网络的到来,移动设备的普及,移动互联网得到了空前的发展,与此同时,伴随移动互联网产生的移动应用也渗透到了大众生活的各方各面,比如微信,手机银行等等。但是当前移动设备的多样化,不同的厂商,不同的型号,更重要的是不同的平台,即…

天猫服务系统的架构和经验

主要内容 业务介绍 分析设计过程 过程推演 事件/流程架构及使用场景讨论 基础组件介绍 改进点 业务介绍 业务介绍-业务关键点 产品定位 买家&#xff1a;提供标准的、优质的服务体验卖家&#xff1a;整合各环节资源&#xff0c;提供便捷的产品&#xff1b;提升服务质量、降低…

语义化版本控制规范(SemVer)

参考链接 https://semver.org/lang/zh-CN/ 语义化版本 2.0.0 (透过版本号的改变来传达信息.) 摘要 版本格式: 主版本号.次版本号.修订号 版本号递增规则如下: 1.主版本号: 做了不兼容的API修改. 2.次版本号: 做了向下兼容的功能性新增. 3.修订号: 做了向下兼容的问题修正. 规范…

[Leedcode][JAVA][第50题][Pow(x, n)][快速幂][分治][转换类型]

【问题描述】[第50题][Pow(x, n)][中等] 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。输入: 2.10000, 3 输出: 9.26100 示例 3:输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25【解答思路】 1.快速幂 时间复杂度&#xff1a;O(logN) 空间复杂度&#x…

淘宝网商品管理?技术 ?

目录 技术挑战 商品管理 系统的演化过程 技术细节 展望 技术挑战淘宝商品管理 十亿级商品数百万级用户数每天处理TB级数据数据沉淀成本控制业务多变上千条业务规则 发展过程淘宝商品管理 第一阶段&#xff1a;基于搜索 基于搜索的商品管理 〙实现 存储用户设置的规则&…

考计算机网络证书转深户,惊?这个证书能帮你直接入深户,还没有学历要求? 你还在等什么...

原标题&#xff1a;惊&#xff1f;这个证书能帮你直接入深户&#xff0c;还没有学历要求&#xff1f; 你还在等什么只要持有中级职称&#xff0c;40周岁以内申请入户时&#xff0c;有连续半年以上社保&#xff0c;就可以直接入户了&#xff0c;没有学历的要求&#xff01;而之前…

[Leedcode][JAVA][第155题][最小栈][基本类型包装类]

【问题描述】 【解答思路】 1. 两个栈实现 1.1、辅助栈和数据栈同步 特点&#xff1a;编码简单&#xff0c;不用考虑一些边界情况&#xff0c;就有一点不好&#xff1a;辅助栈可能会存一些“不必要”的元素。 1.2、辅助栈和数据栈不同步 特点&#xff1a;由“辅助栈和数据…

淘宝主站Cgroup资源控制

目录 项目背景&#xff1a;主站的现状 选型的过程 Cgroup/LinuxContainer介绍 定制和开发 存在的问题和对策 项目背景 主站&#xff1a; 跑在xen虚拟机上的Java应用 处理业务逻辑&#xff0c;本地无重要存储&#xff0c;无状态。 一台物理机部署3台虚拟机 双路Xeon&#…