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 = ; 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][], parent[maxn], cnt = , 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=;i<n;i++) {
scanf("%lf%lf", &p.x , &p.y);
points[cnt].push_back(p);
}
depth[cnt] = ;
Left[cnt] = Button[cnt] = -inf;
Right[cnt] = Top[cnt] = inf;
parent[cnt] = -;
q.push(cnt);
while(!q.empty()) {
int u = q.front();
q.pop();
vector<point> &ps = points[u];
int sz = ps.size();
if(sz <= ) continue;
if(sz == ) {
node[u] = ps[];
continue;
}
for(int i=;i<sz;i++) {
tmp[i] = ps[i];
}
if(depth[u] % == ) sort(tmp, tmp+sz, cmpx);
else sort(tmp, tmp+sz, cmpy);
int mid = sz / ;
node[u] = tmp[mid];
int lsz = mid, rsz = sz - - mid;
if(lsz) {
int l = ++cnt;
tree[u][] = l;
parent[l] = u;
depth[l] = depth[u] + ;
q.push(l);
for(int i=;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] % == ) Right[l] = tmp[mid].x;
else Top[l] = tmp[mid].y;
}
if(rsz) {
int r = ++cnt;
tree[u][] = r;
parent[r] = u;
depth[r] = depth[u] + ;
q.push(r);
for(int i=mid+;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] % == ) 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 ;
} void go_method() {
int cur = ;
ansid = cur;
while(true) {
int l = tree[cur][], r = tree[cur][];
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][], r = tree[u][];
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 != ) {
precur = cur;
cur = parent[cur];
int l = tree[cur][], r = tree[cur][];
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][], r = tree[u][];
if(l) debug_dfs(l);
if(r) debug_dfs(r);
}

k近邻算法C++二维情况下的实现的更多相关文章

  1. K近邻算法(二)

    def KNN_classify(k, X_train, y_train, x): assert 1 <= k <= X_train.shape[0], "k must be v ...

  2. 02-16 k近邻算法

    目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...

  3. python 机器学习(二)分类算法-k近邻算法

      一.什么是K近邻算法? 定义: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源: KNN算法最早是由Cover和Hart提 ...

  4. 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

    六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...

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

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

  6. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  7. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  8. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  9. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

随机推荐

  1. 【HackerRank】Insertion Sort Advanced Analysis(归并排序求数列逆序数对)

    Insertion Sort is a simple sorting technique which was covered in previous challenges. Sometimes, ar ...

  2. this 机制的四种规则

    江湖人称,谁调用 this,this 就指向谁. 那么 this 到底绑定或者引用的是哪个对象环境呢,以下便是四种规则 1. 默认绑定全局变量 function fn() { console.log( ...

  3. JSP笔记03——环境搭建(转)

    不完全翻译,结合谷歌,一定主观性,还可能有误,原始内容地址:https://www.tutorialspoint.com/jsp/jsp_environment_setup.htm [注释]这篇貌似有 ...

  4. Python编程-面向对象和类

    一.面向对象的程序设计 1.面向过程 VS 面向对象 (1)编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组 ...

  5. SOA 面向服务架构 阅读笔记(二)

    SOA并不能保证企业的员工更加轻松,企业的收益更加客观. 6.软件组件 6.1  组件和组件的作用  通过可重用的软件代码-组件,可以构建灵活的软件. 6.2  软件组件又称为应用程序,程序,函数,模 ...

  6. H3C 交换机设置telnet WEB用户

    huwei : local-user admin password cipher @#$@#$ service-type telnet ssh service-type telnet ssh leve ...

  7. IDEA配置文件的保存目录

    IntelliJ IDEA 的实时代码模板保存在 /templates 目录下,其他系统目录位置如下:(因为目录名在各个系统上是一致的,建议用硬盘搜索工具搜索即可) Windows: . Linux: ...

  8. nodejs 中 excel-export 使用介绍

    1. 为了在nodejs 服务器端操作数据导出excel 格式用的 excel-export  包地址:https://github.com/functionscope/Node-Excel-Expo ...

  9. numpy random 生成随机矩阵

    import numpy as np np.random.rand(a, b): >>> np.random.rand(4,3) array([[ 0.06679473, 0.710 ...

  10. Jquery Ajax模版

    $.ajax({ type: "GET", url: "test.json", data: {username:'tt', content:'tt'}, dat ...