k近邻算法C++二维情况下的实现

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

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

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

相关文章

java——对象学习笔记

1.面向对象&#xff08;OOP&#xff09;的三大特性 对象的行为&#xff08;behavior&#xff09;&#xff1a;可以对对象施加哪些操作&#xff0c;或者可以对对象施加哪些方法。 对象的状态&#xff08;state&#xff09;&#xff1a;当施加那些方法后&#xff0c;对象如何响应…

C++获取一段算法程序耗时方法

1、添加头文件库#include <chrono> 2、代码编写 std::chrono::steady_clock::time_point t1 std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point t2 std::chrono::steady_clock::now(); std::chrono::duration<double> time_used12 st…

cisco 动态路由协议RIP笔记

动态路由协议RIP router(config)#router rip 启动RIP进程 router(config-router)#network 1.0.0.0 宣告主网络号 router(config-router)#version 2 使用版本v2 router(config-router)#no auto-summary 关闭路由汇总功能 本文转自 meteor_hy 51CTO博客&#xff0c;原文链接&a…

EBS FORM开发问题总结

1&#xff0c;form是基于单表视图建立的&#xff0c;没有写on-insert此类的触发器。在视图上加了个rownum列结果导致form上的列不能更新 据说此种情形下的form会判断视图上的列是否属于基表&#xff0c;不属于的话会导致整个块不能更新。 2&#xff0c;在form界面上显示行号 在…

Django 学习资源

相关的分享&#xff1a; 开发者头条&#xff1a;http://toutiao.io/search?utf8%E2%9C%93&qdjango 极客头条及Django资讯&#xff1a;http://www.csdn.net/tag/django/news 一些优秀的文章&#xff1a; Django 常用测试方法&#xff1a;https://messense.me/django-common…

orb-slam2在PC和ARM上运行

ORBSLAM2的编译与运行 环境&#xff1a;Ubuntu16.04 ORBSLAM2 &#xff08;1&#xff09;安装工具 sudo apt-get install cmake sudo apt-get install git sudo apt-get install gcc g (2) 安装pangolin 安装依赖项&#xff1a; sudo apt-get install libglew-dev sudo ap…

烂泥:智能DNS使用与配置

公司的业务现在已经扩展到海外&#xff0c;对外提供的统一接口都是通过域名来解析的&#xff0c;但是海外用户访问国内接口的话&#xff0c;你懂的&#xff0c;很慢的。为了提高域名解析的速度&#xff0c;打算使用智能DNS功能&#xff0c;来解决海外用户域名解析慢的问题。 PS…

现代制造工程——考试复习01

第一部分 金属切削原理 1.切削过程中工件上的加工表面分类 2.不同工艺的工件和刀具的相对关系 3.不同工艺的主运动和进给运动的方向 4.思考&#xff1a;主运动一般只有一个&#xff0c;但是进给运动一个也可以是多个 5.切削三要素&#xff08;必考&#xff09; 6.思考&#x…

C++,C++编程,Windows编程,MFC

编程  我们日常生活中接触到的电子类产品中的应用都是由编程而来  为什么编程&#xff0c;偷懒  我们通过编程驱使&#xff08;指挥&#xff0c;命令&#xff09;的是电信号  为什么上面说编程是偷懒&#xff0c;电的发现&#xff0c;给人们带来了便利&#xff0c;人们…

orb-slam2 代码逻辑梳理

1、开发大型C系统&#xff0c;可以首先从头文件开始&#xff1b;先把头文件的各种接口定义好&#xff1b;含义定义好&#xff1b;实现的时候只管内部实现就行&#xff0c;不需要管理外部的逻辑交互 2、定义在类中的变量&#xff0c;可以在前面加个小标志&#xff0c;mcamerMati…

eclipse中java项目转换为web项目

123456789101112经常在eclipse中导入web项目时&#xff0c;出现转不了项目类型的问题&#xff0c;导入后就是一个java项目&#xff0c;有过很多次经历&#xff0c;今天也有同事遇到类似问题&#xff0c;就把这个解决方法记下来吧&#xff0c;免得以后再到处去搜索。解决步骤&am…

让执行程序引用特定目录下的Dll

当写一个软件&#xff0c;特别是大型的软件&#xff0c;经常会引用一些第三方的类库&#xff0c;再加上一些自己的项目&#xff0c;如果这些Dll全都放在主目录下的话&#xff0c;会显得比较杂乱。我们希望将项目的类库分类成文件夹存放&#xff0c;这样才显得比较整洁。 解决方…

Angularjs controller之间的通信

刚刚看了网上的一些关于控制器之间的通信&#xff1b;然后结合自己项目做了一些&#xff0c;这里主要做的是二个同级之间的controller通信。 Html&#xff1a; 1 <html>2 <script src"http://apps.bdimg.com/libs/angular.js/1.3.9/angular.min.js"><…

最优化课堂笔记05——一维最优化方法(含重点:黄金分割法)

5-1 一维搜索区间的确定 搜索区间只是适用于单峰区间 、 例子 5.2 黄金分割法&#xff08;重点&#xff09; 上面的a与b都会跟着计算的推进而变化的 例子重点 5.3二次插值法 总结&#xff1a; 5.4 切线法&#xff08;牛顿法&#xff09; 5.5 割线法&#xff08;不需要计算导数&…

C++中静态成员数据初始化问题

C中静态成员数据初始化问题 1、静态成员变量&#xff1a;定义为静态成员意味着它能被所有的实例化对象所共有&#xff0c;其修改值为该类的其它所有实例所见。 下面看一个例子 class people { public:people(int i):id(i){num;} private:static int num;int id; }; num为静…

moss2010 sharepoint 2010配置人员搜索

配置人员搜索 http://technet.microsoft.com/zh-cn/library/ee721049.aspx 相关补丁 http://support.microsoft.com/kb/2276339/zh-cn Search Configuration in SharePoint 2010 http://blog.concurrency.com/sharepoint/search-configuration-in-sharepoint-2010/ SharePoint …

现代制造工程笔记04-精密超精密加工和特种加工(主要掌握加工原理加工条件)

一、精密加工与超精密加工 不同时期对精密加工的定义以及要求不一样 1.1金刚石超精密加工&#xff08;&#xff09; 1.2精密磨料加工——精密砂带抛光加工 1.3超声波加工 1.4 电解加工&#xff08;加工材料必须是金属&#xff09;——工件失去电子成型 1.5电铸加工——工件得到…

Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结...

转自&#xff1a;http://www.111cn.net/database/mysql/71648.htm 1.增加一个字段 代码如下复制代码//增加一个字段&#xff0c;默认为空 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段&#xff0c;默认不能为空 alter table user add COLUMN n…

iOS设置UIWebView的UserAgent

接入第三方时&#xff0c;别人又需求,要求传入我们的信息。 // 获取 iOS 默认的 UserAgent&#xff0c;可以很巧妙地创建一个空的UIWebView来获取&#xff1a;NSString *userAgent [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:"navigator.userAge…