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.pswp.cn/news/256747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256747.shtml
英文地址,請注明出處:http://en.pswp.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…