这个算法就比较简单易懂了
就是把每个向量的特征值抽象成坐标,寻找最近的k个点,来进行划分
代码如下
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <map> using namespace std; typedef vector<double> Vd; const int maxn = 1111; Vd V[maxn], Vt; struct Date { int lab; double v; bool operator <(const Date &B) const { return v < B.v; } }a[maxn]; int lab[maxn], T[maxn]; double Distance(Vd A, Vd B) { double ans = 0; for(int i = 0; i < A.size(); i++) ans += (A[i] - B[i])*(A[i] - B[i]); return ans; } int n, m, k; double x; int main() { cin>>n>>m; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin>>x; V[i].push_back(x); } cin>>x; lab[i] = x; } for(int i = 0; i < m; i++) cin>>x, Vt.push_back(x); for(int i = 0; i < n; i++) { a[i].lab = lab[i]; a[i].v = Distance(V[i], Vt); } sort(a, a+n); int ans, ansv = 0; for(int i = 0; i < k; i++) if(++T[a[i].lab] > ansv) ans = a[i].lab, ansv = T[a[i].lab]; cout<<ans<<endl; }