k近邻算法C++二维实现

这是一个k近邻算法的二维实现(即K=2的情况)。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const double inf = 1000.0;
const int maxn = 10010;void debug_dfs(int);
void go_method();
bool should_go(int);
void dfs(int);
void back_method();double Left[maxn], Right[maxn], Top[maxn], Button[maxn];
int tree[maxn][2], parent[maxn], cnt = 0, n;
int depth[maxn];
struct point {double x, y;
};
vector<point> points[maxn];
queue<int> q;
point tmp[maxn];
point node[maxn];
point p0, anspoint;
int ansid;
double R;
bool cmpx(point a, point b) {return a.x < b.x;
}
bool cmpy(point a, point b) {return a.y < b.y;
}
int main() {scanf("%d", &n);point p;for(int i=0;i<n;i++) {scanf("%lf%lf", &p.x , &p.y);points[cnt].push_back(p);}depth[cnt] = 0;Left[cnt] = Button[cnt] = -inf;Right[cnt] = Top[cnt] = inf;parent[cnt] = -1;q.push(cnt);while(!q.empty()) {int u = q.front();q.pop();vector<point> &ps = points[u];int sz = ps.size();if(sz <= 0) continue;if(sz == 1) {node[u] = ps[0];continue;}for(int i=0;i<sz;i++) {tmp[i] = ps[i];}if(depth[u] % 2 == 0) sort(tmp, tmp+sz, cmpx);else sort(tmp, tmp+sz, cmpy);int mid = sz / 2;node[u] = tmp[mid];int lsz = mid, rsz = sz - 1 - mid;if(lsz) {int l = ++cnt;tree[u][0] = l;parent[l] = u;depth[l] = depth[u] + 1;q.push(l);for(int i=0;i<mid;i++) points[l].push_back(tmp[i]);Left[l] = Left[u]; Right[l] = Right[u]; Top[l] = Top[u]; Button[l] = Button[u];if(depth[u] % 2 == 0) Right[l] = tmp[mid].x;else Top[l] = tmp[mid].y;}if(rsz) {int r = ++cnt;tree[u][1] = r;parent[r] = u;depth[r] = depth[u] + 1;q.push(r);for(int i=mid+1;i<sz;i++) points[r].push_back(tmp[i]);Left[r] = Left[u]; Right[r] = Right[u]; Top[r] = Top[u]; Button[r] = Button[u];if(depth[u] % 2 == 0) Left[r] = tmp[mid].x;else Button[r] = tmp[mid].y;}}scanf("%lf%lf", &p0.x, &p0.y);back_method();printf("(%.2lf,%.2lf)\n", node[ansid].x, node[ansid].y);//debug_dfs(0);return 0;
}void go_method() {int cur = 0;ansid = cur;while(true) {int l = tree[cur][0], r = tree[cur][1];if(l && Left[l] <= p0.x && Right[l] >= p0.x && Button[l] <= p0.y && Top[l] >= p0.y) {cur = l;ansid = l;} else if(r && Left[r] <= p0.x && Right[r] >= p0.x && Button[r] <= p0.y && Top[r] >= p0.y) {cur = r;ansid = r;} else {R = sqrt((p0.x-node[ansid].x)*(p0.x-node[ansid].x)+(p0.y-node[ansid].y)*(p0.y-node[ansid].y));return;}}
}bool should_go(int u) {double dd, tt;dd = fabs(p0.x - Left[u]);if(dd < R) {tt = sqrt(R*R-dd*dd);if(p0.y-tt > Button[u] && p0.y-tt < Top[u]) return true;if(p0.y+tt > Button[u] && p0.y+tt < Top[u]) return true;if(Button[u] > p0.y-tt && Button[u] < p0.y+tt) return true;if(Top[u] > p0.y-tt && Top[u] < p0.y+tt) return true;}dd = fabs(p0.x - Right[u]);if(dd < R) {tt = sqrt(R*R-dd*dd);if(p0.y-tt > Button[u] && p0.y-tt < Top[u]) return true;if(p0.y+tt > Button[u] && p0.y+tt < Top[u]) return true;if(Button[u] > p0.y-tt && Button[u] < p0.y+tt) return true;if(Top[u] > p0.y-tt && Top[u] < p0.y+tt) return true;}dd = fabs(p0.y - Button[u]);if(dd < R) {tt = sqrt(R*R-dd*dd);if(p0.x-tt > Left[u] && p0.x+tt < Right[u]) return true;if(p0.x+tt > Left[u] && p0.x+tt < Right[u]) return true;if(Left[u] > p0.x-tt && Left[u] < p0.x+tt) return true;if(Right[u] > p0.x-tt && Right[u] < p0.x+tt) return true;}dd = fabs(p0.y - Top[u]);if(dd < R) {tt = sqrt(R*R-dd*dd);if(p0.x-tt > Left[u] && p0.x+tt < Right[u]) return true;if(p0.x+tt > Left[u] && p0.x+tt < Right[u]) return true;if(Left[u] > p0.x-tt && Left[u] < p0.x+tt) return true;if(Right[u] > p0.x-tt && Right[u] < p0.x+tt) return true;}return false;
}void dfs(int u) {double _x = node[u].x, _y = node[u].y;double _r = sqrt((_x-p0.x)*(_x-p0.x)+(_y-p0.y)*(_y-p0.y));if(_r < R) {R = _r;ansid = u;}int l = tree[u][0], r = tree[u][1];if(l && should_go(l)) dfs(l);if(r && should_go(r)) dfs(r);return;
}void back_method() {go_method();int cur = ansid, precur;while(cur != 0) {precur = cur;cur = parent[cur];int l = tree[cur][0], r = tree[cur][1];if(precur == l && r && should_go(r)) dfs(r);else if(precur == r && l && should_go(l)) dfs(l);}
}void debug_dfs(int u) {printf("dep[%d] = %d; (%.2lf,%.2lf); left:%.2lf,right:%.2lf,button:%.2lf,top:%.2lf\n",u, depth[u], node[u].x , node[u].y, Left[u], Right[u], Button[u], Top[u]);int l = tree[u][0], r = tree[u][1];if(l) debug_dfs(l);if(r) debug_dfs(r);
}

转载于:https://www.cnblogs.com/wuyouwulv/p/ml_knn_2d.html

k近邻算法C++二维情况下的实现相关推荐

  1. 高等统计物理考题--证明二维情况下不存在玻色爱因斯坦凝聚

  2. 机器学习入门笔记(三):K近邻算法

    文章目录 一.K近邻算法的基本概念 1.1 K近邻算法实现 二.K近邻分类三要素 2.1 距离度量 2.2 K值的选择 2.2.1 基于m-fold cross validation的 K值选择 2. ...

  3. k近邻算法原理c语言,实验二 K-近邻算法及应用

    作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...

  4. 机器学习算法系列(二十二)-近似k近邻算法-Annoy(Approximate Nearest Neighbor / ANN)

    阅读本文需要的背景知识点:k近邻算法.一丢丢编程知识 一.引言   前面一节我们学习了机器学习算法系列(二十一)-k近邻算法(k-Nearest Neighbor / kNN Algorithm),其 ...

  5. win10+Python3.7.3+OpenCV3.4.1入门学习(二十章 K近邻算法)————20.1理论基础

    Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm 文章目录 第20章 K近邻算法 20.1 理论基础 第20章 K近邻算法 机器学习算法是从数 ...

  6. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

  7. 机器学习之重点汇总系列(二)——K近邻算法(k-Nearest Neighbor,kNN)

    什么是K近邻算法 引例 假设有数据集,其中前6部是训练集(有属性值和标记),我们根据训练集训练一个KNN模型,预测最后一部影片的电影类型 首先,将训练集中的所有样例画入坐标系,也将待测样例画入 然后计 ...

  8. 【机器学习】机器学习从零到掌握之二 -- 教你实现K近邻算法

    本文是<机器学习从零到掌握>系列之第2篇 [机器学习]机器学习从零到掌握之一 -- 教你理解K近邻算法 伪代码如下: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别 ...

  9. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

最新文章

  1. java 重用性_提高Java代码重用性的三个方法
  2. spark-机器学习实践-K近邻应用实践一
  3. 利用STC8G1K08实现的数字信号合成模块
  4. 基于单片机的调光控制器设计
  5. 薅羊毛!1024程序员的狂欢!
  6. cnn 一维时序数据_蚂蚁集团智能监控的时序异常检测:基于 CNN 神经网络的异常检测...
  7. 英语常见介词错误用法,你有犯过吗?
  8. 存储对手机性能的影响
  9. python是动态语言
  10. [literature]地下铁文本
  11. java tts引擎_让Java说话-用Java实现语音引擎
  12. 樊登讲亲密关系_看了《亲密关系》这本书,原来吵架是牺牲对方来保护自己
  13. a标签js阻止跳转_前端笔试知识点:阻止冒泡
  14. 都在这儿了!5月 Flink 社区发版、更新汇总
  15. vue 同步加载_如何在vue里实现同步阻塞请求,请求完成之前不加载页面或组件?...
  16. 查看vs支持的c#语言版本/查看.NetCore版本/更改c#语言版本
  17. 【OpenCV学习】对于仕琪所写《OpenCV教程基础篇》的一些想法
  18. Pytorch模型量化
  19. 深度去除WinRAR广告
  20. 使用计算机自带的wifi,电脑的自带无线网卡你知道怎么用吗?赶紧学习一下

热门文章

  1. python自动化办公知识点整理汇总_Python自动化办公知识点整理汇总
  2. 【算法竞赛学习】资金流入流出预测-挑战Baseline_建模预测
  3. 数据挖掘常用的方法(分类,回归、聚类、关联规则)
  4. [零基础,全开源]基于web的远程深度学习服务搭建
  5. [深度学习] 自然语言处理--- 基于Keras Bert使用(上)
  6. 【Ubuntu-Docker】ubuntu16.04(18.04)Docker安装配置与卸载
  7. 直流耦合and交流耦合
  8. mysql explain中key_len值的说明
  9. 救命代码_救命! 如何选择功能?
  10. R语言数据转换(split-apply-combin…