📄 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 + -