Apriori算法是数据挖掘中的算法之一,关联规则Apriori算法的示例程序的全部源代如下(C语言实现),仅供参考。
#include
#include
#include
#include
#define
ITEM_NAME_LENGTH 20
#define
MIN_SUPPORT
2
//数据结构定义
struct
ITEMSET
{
char
itemName[ITEM_NAME_LENGTH];
struct
ITEMSET *next;
};
struct
TRANSACTION
{
unsigned
int tranID;
struct
ITEMSET *itemPoint;
struct
TRANSACTION *next;
};
struct
BIGITEMSET
{
struct
ITEMSET *itemPoint;
unsigned
int count;
struct
BIGITEMSET *next;
};
//数据库
char
*tran1[3]={"1","3","4"};
char
*tran2[3]={"2","3","5"};
char
*tran3[4]={"1","2","3","5"};
char
*tran4[2]={"2","5"};
struct
TRANSACTION *tranHead;
struct
BIGITEMSET
*bigHead;
struct
BIGITEMSET
*test;
struct
BIGITEMSET
*subSetHeadC1,*subSetHeadC2;
//函数声明
void
AprioriGen(void);
void
DispalyTransaction(void);
void
CreateTransactionLink(void);
void
GetBigItem1Set(struct TRANSACTION *head);
void
CompositorBigItem1Set(struct BIGITEMSET *head);
int
HaveThisItem(struct BIGITEMSET *head,char itemName[]);
struct
ITEMSET *CreateItemsetLink(char *tran[],int number);
void
AddNodeToHeadLink(struct BIGITEMSET *head,struct BIGITEMSET
*add);
struct
BIGITEMSET *GetSetsSubSet(unsigned int k_1,struct
BIGITEMSET
*setLink);
void
DeleteNodeLowerMinSupport(struct BIGITEMSET *head,unsigned int
minSupport);
void
RecordSupportCounter(struct BIGITEMSET *iHead,struct
TRANSACTION *tHead,int cN);
//主程序
void
main()
{
CreateTransactionLink();
DispalyTransaction();
AprioriGen();
free(tranHead);
free(bigHead);
printf("\n铵任意键退出");
getch();
return;
}
//函数功能:建立一个事务集合
struct
ITEMSET *CreateItemsetLink(char *tran[],int number)
{
struct
ITEMSET *head,*p,*r;
int
i;
p=(struct
ITEMSET *)malloc(sizeof(struct ITEMSET));
head=p;
p->next=NULL;
r=p;
for(i=0;i
{
p=(struct
ITEMSET *)malloc(sizeof(struct ITEMSET));
strcpy(p->itemName,tran[i]);
p->next=NULL;
r->next=p;
r=r->next;
}
return
head;
}
//函数功能:建立数据库
void
CreateTransactionLink(void)
{
struct
TRANSACTION *p,*q;
p=(struct
TRANSACTION *)malloc(sizeof(struct TRANSACTION));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
tranHead=p;
p->next=NULL;
q=p;
p=(struct
TRANSACTION *)malloc(sizeof(struct TRANSACTION));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
p->itemPoint=CreateItemsetLink(tran1,3);
p->tranID=1;
p->next=NULL;
q->next=p;
q=q->next;
p=(struct
TRANSACTION *)malloc(sizeof(struct TRANSACTION));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
p->itemPoint=CreateItemsetLink(tran2,3);
p->tranID=2;
p->next=NULL;
q->next=p;
q=q->next;
p=(struct
TRANSACTION *)malloc(sizeof(struct TRANSACTION));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
p->itemPoint=CreateItemsetLink(tran3,4);
p->tranID=3;
p->next=NULL;
q->next=p;
q=q->next;
p=(struct
TRANSACTION *)malloc(sizeof(struct TRANSACTION));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
p->itemPoint=CreateItemsetLink(tran4,2);
p->tranID=4;
p->next=NULL;
q->next=p;
}
//函数功能:显示数据集合的所有信息
void
DispalyTransaction(void)
{
struct
TRANSACTION *p;
struct
ITEMSET *r;
p=tranHead->next;
r=tranHead->next->itemPoint->next;
printf("数据库如下:\n");
while(p)
{
printf("事务
ID号:
- 该事务的项目:
",p->tranID);
while(r)
{
printf("%3s",r->itemName);
r=r->next;
}
printf("\n");
p=p->next;
if(p)
r=p->itemPoint->next;
}
}
//函数功能:从数据库获取大项目集1项目集
void
GetBigItem1Set(struct TRANSACTION *head)
{
struct
TRANSACTION *tempTran;
struct
ITEMSET
*tempItem;
struct
BIGITEMSET *p,*q;
p=(struct
BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
bigHead=p;
q=p;
p->next=NULL;
p->itemPoint=NULL;
tempTran=head->next;
tempItem=head->next->itemPoint->next;
while(tempTran)//遍历整个数据集
{
while(tempItem)//遍历整个事务集
{
p=(struct
BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));
if(p==NULL)
{
printf("\nNot enough memory\n");
return;
}
if(!HaveThisItem(bigHead,tempItem->itemName))//如果还没在此项目,加到大项目中
{
p->itemPoint=(struct ITEMSET
*)malloc(sizeof(struct ITEMSET));
if(p->itemPoint==NULL)
{
printf("\nNot enough memory\n");
return;
}
strcpy(p->itemPoint->itemName,tempItem->itemName);
p->next=NULL;
p->itemPoint->next=NULL;
AddNodeToHeadLink(bigHead,p);
}
tempItem=tempItem->next;
}
tempItem=tempTran->itemPoint->next;
tempTran=tempTran->next;
}
CompositorBigItem1Set(bigHead);
}
//函数功能:判断项目是否在已有项目集中
int
HaveThisItem(struct BIGITEMSET *head,char itemName[])
{
struct
BIGITEMSET *p;
struct
ITEMSET
*q;
p=head->next;
while(p)
{
q=p->itemPoint;
while(q)
{
if(strcmp(q->itemName,itemName)==0)
return
1;
q=q->next;
}
p=p->next;
}
return
0;
}
//函数功能:在已有项目集中加入一个新的项目
void
AddNodeToHeadLink(struct BIGITEMSET *head,struct BIGITEMSET
*add)
{
struct
BIGITEMSET *p,*q;
p=head;
q=head->next;
while(q)
{
p=q;
q=q->next;
}
p->next=add;
}
//函数功能:对项目集进行排序,小到大
void
CompositorBigItem1Set(struct BIGITEMSET *head)
{
char
itemName[ITEM_NAME_LENGTH];
struct
BIGITEMSET *p,*q;
p=head->next;
q=head->next->next;
while(q)
{
while(q)
{
if(strcmp(q->itemPoint->itemName,p->itemPoint->itemName)<0)
{
strcpy(itemName,q->itemPoint->itemName);
strcpy(q->itemPoint->itemName,p->itemPoint->itemName);
strcpy(p->itemPoint->itemName,itemName);
}
q=q->next;
}
p=p->next;
q=p->next;
}
}
//函数功能:删除支持数小于最小支持数的结点
void
DeleteNodeLowerMinSupport(struct BIGITEMSET *head,unsigned int
minSupport)
{
struct
BIGITEMSET
*p,*q;
p=head;
q=head->next;
while(q)
{
if(q->count
{
p->next=q->next;
free(q);
q=p->next;
continue;
}
p=p->next;
q=q->next;
}
if(q=NULL)
p->next=NULL;
}
//函数功能:对项目支持数进行计数
void
RecordSupportCounter(struct BIGITEMSET *bHead,struct
TRANSACTION *tHead,int cN)
{
struct
TRANSACTION *p;
struct
BIGITEMSET
*r,*s;
struct
ITEMSET *m;
unsigned
int i;
int
count0=0,count1=0,count2=0,count3=0;
r=bHead->next;
while(r)//先对每个记录清零
{
r->count=0;
r=r->next;
}
r=bHead->next;
switch(cN)
{
case
1:
while(r)//对大项集中每一项都有要对数据集进行完全遍历
{
p=tHead->next;
while(p)//对数据集进行完全遍历
{
m=p->itemPoint->next;
while(m)//对事件完全遍历
{
if(strcmp(m->itemName,r->itemPoint->itemName)==0)
r->count++;
m=m->next;
}
p=p->next;
}
r=r->next;
}
break;
case
2:
while(r)//对大项集中每一项都有要对数据集进行完全遍历
{
p=tHead->next;
while(p)//对数据集进行完全遍历
{
m=p->itemPoint->next;
while(m)//对事件完全遍历
{
for(i=0;iitemPoint->itemName);i++)
{
if(r->itemPoint->itemName[0]==m->itemName[i])
count0++;
if(r->itemPoint->itemName[1]==m->itemName[i])
count1++;
}
m=m->next;
}
if((count0==count1)&&(count0!=0))
count2++;
count0=0;
count1=0;
p=p->next;
}
if(count2)
r->count=count2;
else
r->count=0;
count0=0;
count1=0;
count2=0;
r=r->next;
}
break;
case
3:
while(r)//对大项集中每一项都有要对数据集进行完全遍历
{
p=tHead->next;
while(p)//对数据集进行完全遍历
{
m=p->itemPoint->next;
while(m)//对事件完全遍历
{
for(i=0;iitemPoint->itemName);i++)
{
if(r->itemPoint->itemName[0]==m->itemName[i])
count0++;
if(r->itemPoint->itemName[1]==m->itemName[i])
count1++;
if(r->itemPoint->itemName[2]==m->itemName[i])
count2++;
}
m=m->next;
}
if((count0==count1)&&(count1==count2)&&(count0!=0))
count3++;
count0=0;
count1=0;
count2=0;
p=p->next;
}
if(count3)
r->count=count3;
else
r->count=0;
count0=0;
count1=0;
count2=0;
count3=0;
r=r->next;
}
r=bHead->next;
s=r->next;
while(s)
{
if(strcmp(r->itemPoint->itemName,s->itemPoint->itemName)==0)
{
r->next=s->next;
free(s);
s=r->next;
continue;
}
r=r->next;
s=s->next;
}
if(s)
r->next=NULL;
break;
default:
break;
}
}
//函数功能:获取K-1子集
struct
BIGITEMSET *GetSetsSubSet(unsigned int k_1,struct
BIGITEMSET
*setLink)
{
struct
BIGITEMSET *head,*p,*q,*r,*s;
struct
ITEMSET *m;
int
i;
p=(struct
BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));
if(p==NULL)
{
printf("\nNot enough memory\n");
return
NULL;
}
head=p;
p->next=NULL;
q=p;
r=setLink->next;
s=r;
switch(k_1)
{
case
1:
while(r)
{
while(s)
{
if(r->itemPoint->itemName[0]itemPoint->itemName[0])
{
p=(struct
BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));
if(p==NULL)
{
printf("\nNot enough memory\n");
return NULL;
}
p->next=NULL;
m=(struct
ITEMSET *)malloc(sizeof(struct ITEMSET));
if(m==NULL)
{
printf("\nNot enough memory\n");
return NULL;
}
m->next=NULL;
m->itemName[0]=r->itemPoint->itemName[0];
m->itemName[1]=s->itemPoint->itemName[0];
for(i=2;i
m->itemName[i]='\0';
p->itemPoint=m;
q->next=p;
q=p;
}
s=s->next;
}
r=r->next;
s=r;
}
return
head;
case
2:
while(r)
{
while(s)
{
if(r->itemPoint->itemName[1]itemPoint->itemName[1])
{
p=(struct
BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));
if(p==NULL)
{
printf("\nNot enough memory\n");
return NULL;
}
p->next=NULL;
m=(struct
ITEMSET *)malloc(sizeof(struct ITEMSET));
if(m==NULL)
{
printf("\nNot enough memory\n");
return NULL;
}
m->next=NULL;
m->itemName[0]=r->itemPoint->itemName[0];
m->itemName[1]=r->itemPoint->itemName[1];
m->itemName[2]=s->itemPoint->itemName[1];
for(i=3;i
m->itemName[i]='\0';
p->itemPoint=m;
q->next=p;
q=p;
}
s=s->next;
}
r=r->next;
s=r;
}
return
head;
default:
return
NULL;
}
}
void
AprioriGen(void)
{
GetBigItem1Set(tranHead);
RecordSupportCounter(bigHead,tranHead,1);
printf("\n项集C1的项目如下:\n");
test=bigHead->next;
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}
DeleteNodeLowerMinSupport(bigHead,MIN_SUPPORT);
printf("项集L1的项目如下:\n");
test=bigHead->next;
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}printf("\n");
subSetHeadC1=GetSetsSubSet(1,bigHead);
RecordSupportCounter(subSetHeadC1,tranHead,2);
test=subSetHeadC1->next;
printf("项集C2的项目如下:\n");
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}
DeleteNodeLowerMinSupport(subSetHeadC1,MIN_SUPPORT);
test=subSetHeadC1->next;
printf("项集L2的项目如下:\n");
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}printf("\n");
subSetHeadC2=GetSetsSubSet(2,subSetHeadC1);
RecordSupportCounter(subSetHeadC2,tranHead,3);
test=subSetHeadC2->next;
printf("项集C3的项目如下:\n");
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}
DeleteNodeLowerMinSupport(subSetHeadC2,MIN_SUPPORT);
test=subSetHeadC2->next;
printf("项集L3的项目如下:\n");
while(test)
{
printf("项目:%5s",test->itemPoint->itemName);
printf("
支持度:M\n",test->count);
test=test->next;
}printf("\n");
}
运行结果如下: