Apriori算法的C/C#实现

数据结构的选取,还做得不太好,会继续改进,请大牛多多指点。

之后我会比较C#与C的Apriori程序,总结一些区别,谈谈面向对象编程在这个算法上的体现与数据结构的选择问题。

  1 #include <dos.h>
  2 #include <conio.h>
  3 #include <math.h>
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 
  7 #define ItemNumSize 2
  8 #define TranNumSize 100
  9 #define LISTINCREMENT 1
 10 #define OK 1
 11 #define TRUE 1
 12 #define FASLE 0
 13 #define ERROR 0
 14 #define MAX_ARRAY_DIM 100
 15 #define MAXSIZE  100
 16 typedef char ItemType;
 17 typedef int ElemType;
 18 float  minSupport,minConfidence;
 19 //动态内存分配,item用什么数据结构 动态数组,线性表好:数组是整体创建,整体删除的
 20 typedef struct  
 21 {
 22     ItemType *item;//项目
 23     int length;//当前项目个数
 24     int listsize;//当前分配的存储容量
 25 }SqList;
 26 //事务数组集合
 27 typedef struct
 28 {
 29     SqList r[MAXSIZE+1];
 30     int Length;
 31 }TranList;
 32 
 33 //初始化项目的线性表
 34 int InitListSq(SqList &L)
 35 {
 36     L.item=(ItemType * )malloc(ItemNumSize *sizeof(ItemType));
 37     if (!L.item)exit(OVERFLOW);//存储分配失败
 38     L.length=0;//空表长度为0
 39     L.listsize=ItemNumSize;//初始化存储容量
 40     return OK;
 41 }
 42 //初始化事务的线性表
 43 int InitListTran(TranList &TranL)//还有更好的动态分配方式初始化
 44 {
 45     for (int i=1;i<=TranNumSize;i++)
 46     {
 47         InitListSq(TranL.r[i]);
 48     }
 49     return OK;
 50 }
 51 //插入项目线性表
 52 int listInsertSq(SqList &L,int i,ItemType e)
 53 {
 54     //在线性表L中第i个位置之前插入新元素e
 55     //i的合法值为1<=i<=l.listlength+1
 56     ItemType *newbase,*q,*p;
 57     if(i<1||i>L.length+1)return ERROR;//i值不合法
 58     if (L.length>=L.listsize)//当前存储空间已满,添加分配
 59     {
 60         //重新分配内存空间
 61        newbase=(ItemType *)realloc(L.item,(L.listsize+LISTINCREMENT)*sizeof(ItemType));
 62        if (!newbase)exit(OVERFLOW);
 63        L.item=newbase;//新基址
 64        L.listsize+=LISTINCREMENT;//增加存储容量
 65     }
 66     q=&(L.item[i-1]);//q为插入位置
 67     for(p=&(L.item[L.length-1]);p>=q;--p)
 68         *(p+1)=*p;//插入位置,及之后的元素右移
 69     *q=e;
 70     ++L.length;
 71     return OK;
 72 }
 73 void main()
 74 {
 75     int c;
 76     ItemType e;
 77     SqList L;
 78     int sn;
 79     int ItemNum; //项目个数
 80     int trannum[20]={0}; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apriori算法的C语言实现可以使用以下步骤: 1. 读取输入数据集,并将每个事务转换为项集。 2. 初始化候选项集列表,包含输入数据集中的所有项。 3. 通过扫描数据集计算每个候选项集的支持度。 4. 根据最小支持度阈值筛选出频繁项集。 5. 使用频繁项集生成关联规则,并计算每个规则的可信度。 6. 根据最小支持度和最小可信度阈值筛选出强关联规则。 以下是一个简单的Apriori算法的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct Itemset { int *items; int support; }; void generateCandidates(struct Itemset *prevCandidates, int prevCount, struct Itemset *candidates, int *candidatesCount) { // 生成候选项集的代码实现 } void scanTransactions(struct Itemset *candidates, int candidatesCount, int *transactions, int transactionsCount) { // 扫描数据集计算支持度的代码实现 } void generateFrequentItemsets(struct Itemset *candidates, int candidatesCount, struct Itemset *frequentItemsets, int *frequentCount, int minSupport) { // 生成频繁项集的代码实现 } void generateAssociationRules(struct Itemset *frequentItemsets, int frequentCount, int minSupport, int minConfidence) { // 生成关联规则的代码实现 } int main() { int transactions[] = {1, 2, 3, 5, 3, 4, 5, 2, 5, 6, 8, 3, 4, 2, 8, 3, 2, 1, 9}; int transactionsCount = sizeof(transactions) / sizeof(int); int minSupport = 2; int minConfidence = 50; struct Itemset *candidates = NULL; int candidatesCount = 0; struct Itemset *frequentItemsets = NULL; int frequentCount = 0; // 生成候选项集和频繁项集的代码调用 generateCandidates(NULL, 0, candidates, &candidatesCount); scanTransactions(candidates, candidatesCount, transactions, transactionsCount); generateFrequentItemsets(candidates, candidatesCount, frequentItemsets, &frequentCount, minSupport); // 生成关联规则的代码调用 generateAssociationRules(frequentItemsets, frequentCount, minSupport, minConfidence); return 0;} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值