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

📄 apriori.cpp

📁 apriori经典算法
💻 CPP
字号:
#include<iostream>
#include<string>
#include<math.h>
#include<ctype.h>
#include<fstream>//<fstream>文件流类库
using namespace std;


void main()
{
int i,j,i1,i2,i3,i4,i5,n,minsup,lie,hang,count,total,ls,m;
bool judge1;
bool judge2;
char linshi;
char buf1[70];
char buf[100][100];
char c1[10000][26];
char c2[10000][26];
int  l1[10000];
int  l2[10000];
int  a[10000];
char panduan[26];
char v[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};




for(i=0;i<10000;i++)
{
		l1[i]=0;
      for(n=0;n<26;n++)
	  {
    	c1[i][n]=0;
    	c2[i][n]=0;
	  }

}
for(i1=0;i1<100;i1++)
{
	for(i2=0;i2<100;i2++)
	{
		buf[i1][i2]=0;
	}
}
for(n=0;n<26;n++)
{
	a[n]=0;
}

//TXT文件内容导入
ifstream in;//文件输入流对象
string buffer;
in.open("关联规则挖掘数据集.txt");//"123.txt"为文件名,必须放在该程序的目录下
if(!in)
{
cout<<"文件打开失败"<<endl;
exit(0);
}
j=0;
i1=0;

while(getline(in,buffer))//从文件输入流对象in向buffer中读数据
{

	for(i=0;i<100;i++)
	{
       buf1[i]=0;
	}

  strcpy(buf1,buffer.c_str());
	for(i=0;i<70;i++)
	{
  buf[i1][i]=buf1[i];
//  cout<<buf[i1][i];
	}
//cout<<endl;

for(i=0;i<70;i++)
{
  if(isupper(buf[i1][i])) 
  buf[i1][i] = tolower(buf[i1][i]); 
  for(n=0;n<26;n++)
  {
	  if(buf[i1][i]==v[n])
	  {
		  if(a[n]==0)
		  {
		  l1[n]=l1[n]+1;
		  a[n]=1;
		  }
	  }
  }
}

for(n=0;n<10000;n++)
{
	a[n]=0;
}


	j++;

	for(n=0;n<26;n++)
{
//	cout<<l1[n]<<" ";
}
//cout<<endl;	
i1++;
}


//cout<<"总共"<<j<<"条字符串"<<endl;
hang=0;


cout<<"输入最小事物支持计数:";
cin>>minsup;

//原始数据采集
for(n=0;n<26;n++)
{
		if(l1[n]>=minsup)
	{
        c2[hang][0]=v[n];
        l2[hang]=l1[n];  
	hang++;
	}

}

for(n=0;n<hang;n++)
{	
   cout<<c2[n][0]<<" : "<<l2[n]<<endl;
}
cout<<"amount: "<<hang<<endl;
cout<<"======================================="<<endl;

//第1次连接
		
for(i1=0;i1<hang;i1++)
{
	for(i2=0;i2<hang;i2++)
	{
				c1[count*i1+i2][0]=c2[i1][0];
				c1[count*i1+i2][1]=c2[i2][0];
//			cout<<c1[count*i1+i2][0]<<"  "<<c1[count*i1+i2][1]<<endl;
	}
    	count++;
}
	total=(count-1)*i1+i2;


for(i1=0;i1<10000;i1++)
{
	l1[i1]=0;
	l2[i1]=0;
}

   count=0;



for(i1=0;i1<10000;i1++)
{
       for(i2=0;i2<26;i2++)
	   { 
             	c2[i1][i2]=0;

	   }
}



//   	  cout<<total<<endl;

hang=0;

for(i1=0;i1<total;i1++)
{
	judge1=true;
	for(i5=0;i5<hang;i5++)
	{
       if((c1[i1][0]==c2[i5][0] && c1[i1][1]==c2[i5][1]) || (c1[i1][0]==c2[i5][1] && c1[i1][1]==c2[i5][0]))
		   judge1=false;
	}
	if(c1[i1][0]!=c1[i1][1]&&judge1==true)
	{
          for(i2=0;i2<100;i2++)//取BUF行
		  {		 
  		         for(i4=0;i4<700;i4++)
				 {  
			   a[i4]=0;
				 }
              for(i3=0;i3<100;i3++)//取BUF行中的数据
			  {
				  if(buf[i2][i3]==c1[i1][0] && a[0]==0)
				  {
					  a[0]=1;
				  }
				  if(buf[i2][i3]==c1[i1][1] && a[1]==0)
				  {
					  a[1]=1;
				  }
			  }
				    if(a[0]==1 && a[1]==1)
					{
                       l1[i1]++;
					}
		  }
           if(l1[i1]>=minsup)
		   {
			   if(c1[i1][0]<c1[i1][1])
			   {
			     c2[hang][0]=c1[i1][0];
		     	 c2[hang][1]=c1[i1][1];
			   }
			   else
			   {
			     c2[hang][0]=c1[i1][1];
		     	 c2[hang][1]=c1[i1][0];
			   }
			     l2[hang]=l1[i1];
	      	//	 cout<<c2[hang][0]<<"  "<<c2[hang][1]<<" : "<<l2[hang]<<endl;
			      hang++;
		   }
	}
}

for(i1=0;i1<hang;i1++)
{
	for(i2=i1;i2<hang;i2++)
	{
         if(c2[i1][0]>c2[i2][0])
		 {
              linshi=c2[i1][0];
              c2[i1][0]=c2[i2][0];
			  c2[i2][0]=linshi;
			  linshi=c2[i1][1];
              c2[i1][1]=c2[i2][1];
			  c2[i2][1]=linshi;
			  ls=l2[i1];
			  l2[i1]=l2[i2];
			  l2[i2]=ls;
		 }
	}
}

for(i1=0;i1<hang;i1++)
{
	for(i2=i1;i2<hang;i2++)
	{
         if((c2[i1][0]==c2[i2][0]) && (c2[i1][1]>c2[i2][1]))
		 {
              linshi=c2[i1][1];
              c2[i1][1]=c2[i2][1];
			  c2[i2][1]=linshi;
			  ls=l2[i1];
			  l2[i1]=l2[i2];
			  l2[i2]=ls;
		 }
	}
}

for(i1=0;i1<hang;i1++)
{
    cout<<c2[i1][0]<<"  "<<c2[i1][1]<<" : "<<l2[i1]<<endl;
}
cout<<"amount: "<<hang<<endl;
cout<<"======================================="<<endl;


//2次以上连接循环

for(i1=0;i1<10000;i1++)
{
	l1[i1]=0;
	l2[i1]=0;
	for(i2=0;i2<26;i2++)
	{
		c1[i1][i2]=0;
	}
}
lie=2;

while(c2[0][0]!=0)
{

count=0;
for(i1=0;i1<hang;i1++)
{

	for(i2=(i1+1);i2<hang;i2++)
	{
	n=0;
		for(i3=0;i3<(lie-1);i3++)
		{
             if(c2[i1][i3]==c2[i2][i3])
				 n++;
		}
		if((n=(lie-1)) && (c2[i1][(lie-1)]!=c2[i2][(lie-1)]))
		{
			for(i3=0;i3<=lie;i3++)
			{
				if(i3!=lie)
				{
					c1[count][i3]=c2[i1][i3];
				}
				else
				{
					c1[count][i3]=c2[i2][(i3-1)];
				}

			}

			judge1=true;
			for(i3=0;i3<=lie;i3++)
			{
				for(i4=(i3+1);i4<=lie;i4++)
				{
					if((c1[count][i3]==c1[count][i4]) && (i3!=i4))
					{
						judge1=false;
					}
				}
			}
		if(judge1==true)
		{
			for(i3=0;i3<=lie;i3++)
			{
				for(i4=(i3+1);i4<=lie;i4++)
				{
					if(c1[count][i3]>c1[count][i4])
					{
					linshi=c1[count][i3];
					c1[count][i3]=c1[count][i4];
					c1[count][i4]=linshi;
					}
				}
			}
		}
		if(judge1==true)
		{
			for(i3=0;i3<count;i3++)
			{
				n=0;
                for(i4=0;i4<=lie;i4++)
				{
					if(c1[count][i4]==c1[i3][i4])
					{
						n++;
					}

				}
				if(n==(lie+1))
				{
					judge1=false;
				}
			}
		}



//Apriori性质剪枝

	    if(judge1==true)
		{
			m=0;
			for(i3=0;i3<=lie;i3++)
			{
				for(i4=1;i4<lie;i4++)
				{
					panduan[i4]=0;
				}	

				if(i3==0)
				{
					for(i4=1;i4<=lie;i4++)
					{
						panduan[(i4-1)]=c1[count][i4];
					}			   
				}
 	            else if(i3==lie)
				{
				    for(i4=0;i4<lie;i4++)
					{
						panduan[i4]=c1[count][i4];
					}
				}
				else
				{
				     for(i4=0;i4<i3;i4++)
					 {
						panduan[i4]=c1[count][i4];
					 }
					 for(i4=(i3+1);i4<=lie;i4++)
					 {
					    panduan[(i4-1)]=c1[count][i4];
					 }
				}

				judge2=false;
				for(i4=0;i4<hang;i4++)
				{
                	for(i5=0;i5<=lie;i5++)
					{
                         a[i5]=0;
					}

					for(i5=0;i5<lie;i5++)
					{
					    if(panduan[i5]==c2[i4][i5])
						{
							a[i5]=1;
						}
					}
					n=0;
			    	for(i5=0;i5<lie;i5++)
					{
                        n=n+a[i5];
					}
				    if(n==lie)
					{
				    	judge2=true;
					}

				}
			    if(judge2==true)
				{
				 m++;
				}
//			cout<<m<<endl;
			}

			if(m!=(lie+1))
			{
				judge1=false;
			}
		}
//Apriori性质剪枝结束


	    	if(judge1==true)
			{
/*				for(i3=0;i3<=lie;i3++)
				{
				cout<<c1[count][i3]<<"  ";
				}
				cout<<endl;
*/			count++;
			}
			else
			{
				for(i3=0;i3<=lie;i3++)
				{
					c1[count][i3]=0;
				}
			}
		}
	}
}

for(i1=0;i1<=10000;i1++)
{
	l1[i1]=0;
	l2[i1]=0;
}


for(i1=0;i1<count;i1++)
{ 
	 
	for(i2=0;i2<100;i2++)//取BUF行
	{
        n=0;
		for(i3=0;i3<=lie;i3++)
		{
			for(i4=0;i4<100;i4++)
			{
                if(c1[i1][i3]==buf[i2][i4])
				{
				    l1[i3]=1;
				}
			}
		} 
		for(i3=0;i3<=lie;i3++)
		{
			n=n+l1[i3];
		}
		if(n==(lie+1))
		{
			l2[i1]++;
		}
		for(i3=0;i3<=10000;i3++)
		{
            l1[i3]=0;
		}
	}
}

for(i1=0;i1<10000;i1++)
{
	l1[i1]=l2[i1];
	l2[i1]=0;
	for(i2=0;i2<26;i2++)
	{
		c2[i1][i2]=0;
	}
}

hang=0;

for(i1=0;i1<count;i1++)
{
	if(l1[i1]>=minsup)
	{
		l2[hang]=l1[i1];
	    for(i2=0;i2<=lie;i2++)
		{
        c2[hang][i2]=c1[i1][i2];
		}
		hang++;
	}
}

for(i1=0;i1<hang;i1++)
{
	for(i2=0;i2<=lie;i2++)
	{
    	cout<<c2[i1][i2]<<"  ";
	}
	    cout<<": "<<l2[i1]<<endl;
}
cout<<"amount: "<<hang<<endl;
cout<<"======================================="<<endl;

//cout<<"minsup:"<<minsup<<endl;

	for(i1=0;i1<10000;i1++)
{
	for(i2=0;i2<26;i2++)
	{
		c1[i1][i2]=0;
	}
	l1[i1]=0;
	l2[i2]=0;
}

lie++;
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -