KNN算法
作者:互联网
#include<cstdio> struct node { int id; double tall,dif;//身高和相异度 int type;//类型 假定矮个为0,中等为1,高个为2 }a[105],e[105]; int cnt[10],maxcnt,typ=-1; int n,k; double tabs(double x) { return x<0?-x:x; } void sort(int x)//每次对邻居集合排序,使得相异度最大的数据在栈顶 { for(int i=x;i>1;i--) { if(e[i].dif<e[i-1].dif) { node t=e[i]; e[i]=e[i-1]; e[i-1]=t; } else break; } return; } int main() { scanf("%d%d",&n,&k); scanf("%lf",&a[0].tall);//输入待分类的数据 for(int i=1;i<=n;i++)//输入已有的数据并计算相异度 { scanf("%lf %d",&a[i].tall,&a[i].type); a[i].id=i; a[i].dif=tabs(a[i].tall-a[0].tall); } for(int i=1;i<=k;i++)//形成初始邻居集合 { e[i]=a[i]; sort(i); } for(int i=k+1;i<=n;i++) { if(a[i].dif<e[k].dif)//新数据相异度更小,加入邻居集合并重新排序 { e[k]=a[i]; sort(k); } } for(int i=1;i<=k;i++) { printf("%d %.2lf %.2lf %d\n",e[i].id,e[i].tall,e[i].dif,e[i].type);//输出最终邻居集合内的数据 cnt[e[i].type]++; if(cnt[e[i].type]>maxcnt)//统计各个类型的数量 { maxcnt=cnt[e[i].type]; typ=e[i].type; } } printf("%d",typ);//输出最终的分类 return 0; } /* 样例数据: 15 5 1.62 1.60 0 2.00 2 1.90 1 1.88 1 1.70 0 1.85 1 1.59 0 1.70 0 2.20 2 2.10 2 1.80 1 1.95 1 1.90 1 1.80 1 1.75 1 */
标签:KNN,cnt,int,typ,算法,double,type,1.90 来源: https://www.cnblogs.com/zeroform/p/16227276.html