3,881
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
#include<stdio.h>
using namespace std;
class Candidate
{
public:
Candidate() : r(0.0) {}
~Candidate() {}
void Input(Candidate c[], int);
void Average(Candidate c[], int);
void Group(Candidate c[],Candidate WS[],Candidate MS[],Candidate LS[], int n);
void Top_k(Candidate WS[],Candidate TOPK[], int);
void Query(Candidate c[],Candidate TOPK [],Candidate WS[], Candidate MS[], Candidate LS[], int n,int k);
void Sort(Candidate TOPK[], int);
private:
string name;
float mean;
int m;
float delta; //阈值
float r;
};
static Candidate * s_can = nullptr;
//输入数据和其评分
void Candidate::Input(Candidate c[], int n)
{
for (int i = 0; i < n; i++)
{
cout << "输入第" << i+1 << "个候选项的名字:";
cin >> c[i].name;
cout << "输入第" << i+1 << "个候选项评分:";
cin >> c[i].mean;
}
}
//求参考项r
void Candidate::Average(Candidate c[], int n)
{
float sum = 0.0;
for (int i = 0; i < n; i++)
{
sum += c[i].mean;
}
r = sum / n;
cout << "参考项:" << r << endl;
}
//分组
void Candidate::Group(Candidate c[], Candidate WS[], Candidate MS[], Candidate LS[], int n)
{
int a = 0; //分组后的数组索引
int b = 0;
int d = 0;
for (int i = 0; i < n; i++)
{
//进入胜者组
if ((c[i].mean > r) && (c[i].mean>r + delta))
{
WS[a].mean = c[i].mean;
WS[a].name = c[i].name;
a++;
}
else
{
//进入接近组
if ((c[i].mean >= r - delta) && (c[i].mean <= r + delta))
{
MS[b].mean = c[i].mean;
MS[b].name = c[i].name;
b++;
}
else
{
//进入败者组
if (c[i].mean < (r-delta))
{
LS[d].mean = c[i].mean;
LS[d].name = c[i].name;
//d++;
}
}
}
}
cout << "胜者组个数" << a+1 << endl;
cout << "接近组个数" << b+1 << endl;
cout<< "败者组个数" << d+1 << endl;
}
//top-k
void Candidate::Top_k(Candidate WS[],Candidate TOPK[], int k)
{
int x = 0;
//统计胜者组中数据量
for (int i = 0; i < 100000; i++)
{
if (WS[i].mean == 0)
{
x = i;
break;
}
}
cout <<"----胜者组中元素个数:"<< x << endl;
//将胜者组中的k个元素放入TOPK中,删除WS中进入TOPK的元素
for (int i = 0; i < k; i++)
{
TOPK[i].mean = WS[i].mean;
TOPK[i].name = WS[i].name;
WS[i].mean = WS[i + k].mean;
WS[i].name = WS[i + k].name;
}
//若胜者组中还有元素
if ((x-k)>0)
{
//求TOPK中最小分值
for (int i = 0; i < x-k; ++i)
{
float min = TOPK[1].mean;
int s;
for (int j = 0; j < k; j++)
{
if (TOPK[j].mean < min)
{
min = TOPK[j].mean;
s = j;
}
}
//从胜者组中找更好的
if (WS[i].mean > min)
{
TOPK[s].mean = WS[i].mean;
TOPK[s].name = WS[i].name;
}
}
}
}
//查询
void Candidate::Query(Candidate c[],Candidate TOPK[],Candidate WS[], Candidate MS[], Candidate LS[], int n,int k)
{
Candidate *R, *P;
R = new Candidate;
P = new Candidate;
while (n > 2 * k)
{
int x;
Group(s_can, WS, MS, LS, n);
for (int i = 0; i < n; i++)
{
if (WS[i].mean == 0)
{
x = i;
break;
}
}
if (x >= k && x <= 2 * k)
{
Top_k(WS, R, k);
}
else
{
if (x < k)
{
for (int j = 0; j < x; j++)
{
TOPK[j].mean = WS[j].mean;
TOPK[j].name = WS[j].name;
}
Top_k(MS, P, k - x);
for (int j = x; j <k; j++)
{
TOPK[j].mean = P[j - x + 1].mean;
TOPK[j].name = P[j - x + 1].name;
}
}
}
n = x;
}
}
//排序并输出
void Candidate::Sort(Candidate TOPK[], int k)
{
float Mscore;
string Mname;
for (int i = 0; i < k; i++)
{
for (int j = i + 1; j < k; j++)
{
Mscore = TOPK[i].mean;
Mname = TOPK[i].name;
if (TOPK[j].mean > TOPK[i].mean)
{
TOPK[i].mean = TOPK[j].mean;
TOPK[i].name = TOPK[j].name;
}
}
}
cout << "---最后的TOPK结果----" << endl;
for (int i = 0; i < k; i++)
cout << "名字:" << TOPK[i].name << " " << "评分:" <<TOPK[i].mean<< endl;
}
void main()
{
int k;
int N;
cout << "查询k值:" << endl;
cin >> k;
cout << "候选集项数:" << endl;
cin >> N;
Candidate c;
Candidate *WS,*MS,*LS,*TOPK;
WS = new Candidate;
MS = new Candidate;
LS = new Candidate;
TOPK = new Candidate;
s_can = new Candidate[N];
c.Input(s_can, N);
c.Average(s_can, N);
c.Group(s_can, WS, MS, LS, N);
c.Query(s_can, TOPK, WS, MS, LS, N, k);
//c.Top_k(WS, TOPK, k);
c.Sort(TOPK, k);
}