⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mushroomtestview.cpp

📁 FAST apriori.cpp 基于数组和为运算的apriori算法实现,采用为运算来测试子集的存在性
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	/////////////////////////////////////////////////////////////////////////////
	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 + -