📄 valreductionone.cpp
字号:
// ValReductionOne.cpp: implementation of the ValReductionOne class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "rset.h"
#include "ValReductionOne.h"
#include"stdlib.h"
#include"string.h"
//////////////////////////////////////////////////////////////////////
bool ValReductionOne::CheckAtt()
{//success:return true; else return false
bool RecCon;//行冲突标志,false有冲突,初值
bool RecEqual;//行相等标志,true相等,初值
int r1,r2;//行循环变量
int a1,a2;//列循环变量
//赋初值
if((flagtab=new bool *[RecCount])==0)
return false;
for(r1=0;r1<RecCount;r1++)
if((flagtab[r1]=new bool[AttCount])==0)
return false;
for(r1=0;r1<RecCount;r1++)//赋予初值,false表示不可删除该属性值
for(a1=0;a1<AttCount;a1++)
flagtab[r1][a1]=false;
if((delrec=new bool[RecCount])==0)
return false;
for(r1=0;r1<RecCount;r1++)
delrec[r1]=false;
int DelAttNum;//统计属性的删除数目,避免删除所有属性的情况。
//检查每个可能去掉的属性值
for(r1=0;r1<RecCount;r1++)//对所有样例
{
DelAttNum=0; //for every sample,initialize it to zero
for(a1=0;a1<AttCount-1;a1++)//对r1样例的所有条件属性
{
RecCon=false;
for(r2=0;r2<RecCount;r2++)
if (r1!=r2)//对所有的其他样例
{
RecEqual=true;
for(a2=0;a2<AttCount-1;a2++)//不包括决策属性
if(a1!=a2)//假设去除a1属性后,比较其他属性值看是否存在冲突
if((!flagtab[r1][a2])&&(!flagtab[r2][a2]))
{//如果其他属性没有被删除,则比较 mu对样例r1的a1属性值判断是否可以删除
if(tab[r1][a2]!=tab[r2][a2])
{
RecEqual=false;//两行不等
break;
}
}
if(RecEqual)//两行条件属性相等
if(tab[r1][AttCount-1]!=tab[r2][AttCount-1])
{ //决策属性不等
RecCon=true;//有冲突
break;
}
}//r2的循环
if(!RecCon && DelAttNum<AttCount-2) //无冲突且避免删除全部属性,该规则的该属性的可以去掉
{
flagtab[r1][a1]=true;
DelAttNum++;
}
}//end for a1,列循环结束
}
return true;
}
void ValReductionOne::DelRep()
{//将得到的约简结果化简,除去相同的规则,并在第一条记录记录下它代表的数目,既是相同的数目
bool RecEqual;//行相等标志,true相等,初值
int r1,r2;//行循环变量
int a1;//列循环变量
int m,m1;
if((same_rec=new int[RecCount])==0)
{
AfxMessageBox("内存分配错误!");
return;
}
if((same_att=new int[RecCount])==0)
{
AfxMessageBox("内存分配错误!");
return;
}
for(r1=0;r1<RecCount;r1++)
same_rec[r1]=0;
for(r1=0;r1<RecCount;r1++)
same_att[r1]=0;
for(r1=0;r1<RecCount;r1++)
if(!delrec[r1])//该行没有被删除 为false
{
m1=m=0;
for(r2=0;r2<RecCount;r2++)
if(r2!=r1)
{
RecEqual=true;//两行相等
for(a1=0;a1<AttCount-1;a1++)//对所有属性
if((!flagtab[r1][a1])&&(!flagtab[r2][a1]))
{//r1样例a1属性和r2样例a1属性都没有被删除
if(tab[r1][a1]!=tab[r2][a1])
{
RecEqual=false;
break;
}
}
else if(((flagtab[r1][a1])&&(!flagtab[r2][a1]))||((!flagtab[r1][a1])&&(flagtab[r2][a1])))
{//r1样例a1属性被删除和r2样例a1属性没有被删除,或者是r1样例a1属性没有被删除,r2样例a1属性被删除
RecEqual=false;
break;
}
if(RecEqual)//该两行条件属性全相等
{
m1++;
if(tab[r1][AttCount-1]==tab[r2][AttCount-1])
{
delrec[r2]=true;
m++;
}
}
}//r2循环结束
same_rec[r1]=m;//和r1相等的规则数
same_att[r1]=m1;
}
}
bool ValReductionOne::Run(char *s,char *r)
{
if(RunOne(s)!=1) //读文件
return false;
clock_t finish,start;
start = clock(); //时钟计时开始
DelRep2();
if(!CheckAtt())
return false;
DelRep();
finish = clock();
CString str;
double duration;
duration = (double)(finish - start) / CLOCKS_PER_SEC;
str.Format (" 约简运行时间:%f 秒",duration);
AfxMessageBox(str);
Save_File(r);//保存文件
return true;
}
ValReductionOne::ValReductionOne()
{
}
ValReductionOne::~ValReductionOne()
{
int i,j;
for(i=0;i<RecCount;i++)
{
delete []tab[i];
delete []flagtab[i];
}
delete []tab;
for(j=0;j<AttCount;j++)
{
delete []datasign[j];
if (cuttab[j]!=NULL) delete []cuttab[j];
}
delete []cuttab;
delete []datatype;
delete []datasign;
delete []flagtab;
delete []delrec;
delete []same_rec;
delete []same_att;
}
void ValReductionOne::DelRep2()
{//比较初始的决策表,删去其中相同的记录,通过把该记录的删除标志置为true来实现
bool RecEqual;//行相等标志,true相等,初值
int r1,r2;//行循环变量
int a1;//列循环变量
if((delrec=new bool[RecCount])==0)
{
AfxMessageBox("内存分配失败!");
return;
}
for(r1=0;r1<RecCount;r1++)
delrec[r1]=false;
for(r1=0;r1<RecCount-1;r1++)
if(!delrec[r1])//该行没有被删除
for(r2=r1+1;r2<RecCount;r2++)
if(!delrec[r2])
{
RecEqual=true;//两行相等
for(a1=0;a1<AttCount;a1++)
{
if(tab[r1][a1]!=tab[r2][a1])
{
RecEqual=false;
break;
}
}
if(RecEqual)//该两行相等
delrec[r2]=true;//该行可以去掉
}//r2循环结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -