📄 mushroomtestview.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
int i,j,k,num,count;
int no=0,temp=0;
CString strtemp;
N[0].id_i=0;
num=L[0].min_supp_count; //num是Ln-1项集的数据个数
// strtemp.Format("%s%d",strtemp,num);
//MessageBox(strtemp,NULL,MB_OK);
count=0;
for(i=1;i<=num;i++)
for(j=i+1;j<=num;j++) //for2
{
temp=1; //测试是否满足联结条件
if(n>2)//if 1
{
for(k=0;k<n-2;k++) //for3
{
if(L[i].item[k]!=L[j].item[k])
{ temp=0;
break; }//if 1
}//end for3
}//end if1
if(temp==1)//满足联结条件
{
// printf("in if 2 no=%d\n",no);
N[++count].id_i=i;
N[count].id_j=j;
}//end if2
}//end for2
N[0].id_i=count;
delete [] C;
C=new C_Node [count+1];
if(!C)
MessageBox("分配失败!");
C[0].min_supp_count=0; //初始化
for(i=1;i<=count;i++)
{
strcpy(C[i].item,L[N[i].id_i].item); //在这里,用字符串拷贝函数直接把L[i].item赋值给C[no].item
C[i].item[n-1]=L[N[i].id_j].item[n-2]; //L[j].item[n-2]赋值给C[no].item[n-1],
C[i].item[n]='\0'; //设置末尾标志位
C[i].min_supp_count=0;
C[0].min_supp_count+=1;
}
for(i=1;i<=num;i++)
for(j=i+1;j<=num;j++) //for2
{
temp=1; //测试是否满足联结条件
if(n>2)//if 1
{
for(k=0;k<n-2;k++) //for3
{
if(L[i].item[k]!=L[j].item[k])
{ temp=0;
break; }//if 1
}//end for3
}//end if1
if(temp==1)//满足联结条件
{
// printf("in if 2 no=%d\n",no);
no++;
}//end if2
}//end for2
num=C[0].min_supp_count;
check_supp(num,n);//测试支持度
}//end of Cn()
void CMushroomTestView::L1()
{
//////////////////////////////////////////////////////////////////////////////
//名称:L1()
//功能:以C1为基础,得到1项频繁集L-1
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
CString strValue,strtemp;
int n=1;
int i,j,k;
j=0;
L=new L_Node [27];
L[0].min_supp_count=0;//频繁集的个数,初始为0
for(i=1;i<=C[0].min_supp_count;i++)
{
if(C[i].min_supp_count>=min_supp_count)
{
j+=1;
strcpy(L[j].item,C[i].item);
L[j].min_supp_count=C[i].min_supp_count;
// strtemp.Format("%s%d%s%d","L[",j,"]=",L[j].min_supp_count);
// MessageBox(strtemp,NULL,MB_OK);
}
}//end for1
L[0].min_supp_count=j;///频繁集的个数,最后为j个
k=L[0].min_supp_count;
// nLargeCount++;
m_List_FreqItem.InsertItem(nLargeCount,strValue);
m_List_FreqItem.SetItemText(nLargeCount,0,"_____________");
m_List_FreqItem.SetItemText(nLargeCount,1,"______________");
if(k!=0)
{
for(i=1;i<=k;i++)
{
nLargeCount++;
strtemp="";
if(show_supp_count)
strtemp.Format("%s%d",strtemp,L[i].min_supp_count);
else
strtemp.Format("%s%f",strtemp,(float)L[i].min_supp_count/(float)nDbItemCount);
m_List_FreqItem.InsertItem(nLargeCount,strValue);
m_List_FreqItem.SetItemText(nLargeCount,0,L[i].item);
m_List_FreqItem.SetItemText(nLargeCount,1,strtemp);
UpdateWindow();
}//for
}//if
}//end of L1()
void CMushroomTestView::Ln(int n)
{
//////////////////////////////////////////////////////////////////////////////
//名称:Ln(int n)
//功能:以Cn为基础,得到n项频繁集L-n
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
CString strValue,strtemp;
int i,count=0;
Cn(n);
M[0].id=0;
for(i=1;i<=C[0].min_supp_count;i++) //for 1
if(C[i].min_supp_count >=min_supp_count)
M[++count].id=i;
delete [] L;
L=new L_Node [count+1];
if(!L)
MessageBox("分配失败!");
L[0].min_supp_count=count;
for(i=1;i<=count;i++) //for 1
{
strcpy(L[i].item,C[M[i].id].item);
L[i].min_supp_count=C[M[i].id].min_supp_count;
}//end for1
nLargeCount++;
m_List_FreqItem.InsertItem(nLargeCount,strValue);
m_List_FreqItem.SetItemText(nLargeCount,0,"_______________");
m_List_FreqItem.SetItemText(nLargeCount,1,"______________");
for(i=1;i<=count;i++)
{
nLargeCount++;
strtemp="";
if(show_supp_count)
strtemp.Format("%s%d",strtemp,L[i].min_supp_count);
else
strtemp.Format("%s%f",strtemp,(float)L[i].min_supp_count/(float)nDbItemCount);
m_List_FreqItem.InsertItem(nLargeCount,strValue);
m_List_FreqItem.SetItemText(nLargeCount,0,L[i].item);
m_List_FreqItem.SetItemText(nLargeCount,1,strtemp);
UpdateWindow();
}//for
}//end of Ln(int n)
void CMushroomTestView::Onparaset()
{
//////////////////////////////////////////////////////////////////////////////
//名称:Onparaset()
//功能:设置最小支持度数
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
UpdateData(true);
min_supp=m_min_supp;
if (min_supp<=0)
{
MessageBox("支持度为0,首先设置参数!");
}
UpdateData(true);
}
void CMushroomTestView::ClearItem()
{
//////////////////////////////////////////////////////////////////////////////
//名称:ClearItem()
//功能:清除列表显示的内容
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
m_List_FreqItem.DeleteAllItems ();
while(m_List_FreqItem.DeleteColumn (0));
UpdateWindow();
}
void CMushroomTestView::OnBnFreqItem()
{
//////////////////////////////////////////////////////////////////////////////
//名称:OnBnFreqItem()
//功能:用Apriori算法实现对字符蘑菇数据库的频繁集的发现
//作者:郭运凯(gyunkai@163.com)
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
int n=1;
CString strtemp;
clock_t start,stop,tick;
double timeused;
nLargeCount=0; //第一次,没有对nLargeCount进行初始化,造成程序的结果都无法输出
//问题看似很简单,但一不注意,就造成了错误
m_show_message="预处理中,请稍候……";
UpdateData(false);
while (!m_pSet->IsEOF())
{
m_pSet->MoveNext();
}
m_pSet->MovePrev();
nDbItemCount=(m_pSet->GetRecordCount());//得到数据库记录的总条数
m_total_num=nDbItemCount;
UpdateData(false);
min_supp_count=(int)(min_supp*nDbItemCount);//得到最小支持度数
m_min_supp_count=min_supp_count;
UpdateData(false);
//min_supp_count=(int)min_supp*nDbItemCount;//得到最小支持度数
//在这里,min_supp_count=0。原因是(int)是左结合的,在这里min_supp的值是0.3,变成整数后
//(int)min_supp 就是0,再乘以nDbItemCount。结果仍然是0,造成min_supp_count=0,使得所有
//的候选集都可以成为了频繁集
//对运算符不能想当然的去理解。把握不清的就加括号,提高表达式的优先级,避免错误的发生
m_show_message="开始处理,进行中……";
UpdateData(false);
// strtemp.Format("%s%d",strtemp,min_supp_count);
// MessageBox(strtemp,NULL,MB_OK);
HashDB();
start=clock();
ClearItem();
m_List_FreqItem.InsertColumn(0,"Item",LVCFMT_LEFT,100);
m_List_FreqItem.InsertColumn(1,"Support",LVCFMT_LEFT,100);
C1();//初始化,生成1项候选集C1
L1();//得到1项频繁集L1
/* Ln(2);
Ln(3);
Ln(4);
Ln(5);
Ln(6);
Ln(7);
Ln(8);
Ln(9);
Ln(10);
Ln(11);
Ln(12);
Ln(13);
Ln(14);*/
while(L[0].min_supp_count!=0)
{
n+=1;
Ln(n);
}
stop=clock();
tick=stop - start;
timeused=(double)tick/CLOCKS_PER_SEC;
// CLK_TCK
m_show_message="处理完毕";
UpdateData(false);
m_run_time=timeused;
UpdateData(false);
}
void CMushroomTestView::Onshowsupp()
{
// TODO: Add your control notification handler code here
show_supp_count=false;
}
void CMushroomTestView::Onshowsuppcount()
{
// TODO: Add your control notification handler code here
show_supp_count=true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -