原文地址:http://blog.csdn.net/liema2000/article/details/6118423

//////////////////////////////////////////////////////////////////////////
/*
* 文件名称:FAST apriori.cpp

* 摘 要:采用位运算提高算法的效率

* 将每一项抽象为数值,通过与运算判断是否存在,abcde为16,8,4,2,1换成2进制,各占一个位置,互相不干扰。局限于字母。换算的比较字符可以是a-z任意字符。

*/////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <string.h>

typedef struct
{
char item[10]; //数据项
int min_supp_count;//最小支持度数
} C_Node; //候选集

typedef struct
{
char item[10]; //数据项
int min_supp_count;//最小支持度数
} L_Node; //频繁集

char D[10][10];
L_Node L[100];
C_Node C[100];
int min_supp_count=2;
int num=100;
void InPut()
{
strcpy(D[1],"abe");
strcpy(D[2],"bd");
strcpy(D[3],"bc");
strcpy(D[4],"abd");
strcpy(D[5],"ac");
strcpy(D[6],"bc");
strcpy(D[7],"ac");
strcpy(D[8],"abce");
strcpy(D[9],"abc");
}//end of InPut

int * DB=new int[num];

void suppDB()
{
int m='e';
int n;
int k;
for (int i=1;i<=9;i++)
{
n=strlen(D[i]);
DB [i]=0;
for (int j=0;j<n;j++)//将每一项生成一个数值,如abe=16+8+1=25,bd=8+2=10
{
k=1;
DB [i]+=k<<(int)(m-D[i][j]);
}
}
}

void check_supp(int num,int no)
{
int i,j,k,m;
int check;
m='e';

for(i=1;i<=num;i++)
{
check=0;
C[i].min_supp_count=0;
for (j=0;j<no;j++)
{
k=1;
check+=(int)(k<<(m-C[i].item[j]));
}
for (j=1;j<=9;j++)
{
if (check==(check&DB[j]))
{
C[i].min_supp_count+=1;//子集存在,支持度数加1
}
}
}

}

void C1()
{
//功能:扫描数据集D生成1项候选集C1
//输入:数据集D
//输出1项候选集C1
//初始条件 数据集D 非空
strcpy(C[1].item,"a");
strcpy(C[2].item,"b");
strcpy(C[3].item,"c");
strcpy(C[4].item,"d");
strcpy(C[5].item,"e");

C[0].min_supp_count=5; //1 项候选集的个数,在本算法中,用C[0].min_supp_count来保存候选集Cn的个数

check_supp(5,1);

} //end of C1()

void Cn( int n)
{
//用频繁集Ln-1为基础,通过连接得到n项候选集Cn

int i,j,k,p,num;
int no=0,temp=0;

C[0].min_supp_count=0; //初始化

num=L[0].min_supp_count; //num是Ln-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)//满足联结条件
{
no++;

for(p=0;p<=n-2;p++)
C[no].item[p]=L[i].item[p];
C[no].item[p]=L[j].item[p-1];
C[no].min_supp_count=0;
C[0].min_supp_count+=1;
}//end if2
}//end for2
num=C[0].min_supp_count;
check_supp(num,n);//测试支持度
}//end of Cn()

void Ln(int n)
{
int i,j,k;
j=0;
L[0].min_supp_count=0;

for(i=1;i<=C[0].min_supp_count;i++) //for 1
{
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;

} //end if

}//end for1

L[0].min_supp_count=j; //保存数据的个数
printf("频繁项目集L%d如下:\n",n);
k=L[0].min_supp_count;
if(k!=0)
{
for(i=1;i<=k;i++)
{
printf("{");
for(j=0;j<n;j++)
printf(" %c ",L[i].item[j]);
printf("} 支持度:%d\n",L[i].min_supp_count);

}//for

}
else
printf("项目集为空\n");

}//end of Ln(int n)

void main()
{
int n=1;
InPut();
suppDB();
C1();//初始化,生成1项候选集C1
Ln(1);//得到1项频繁集L1
while(L[0].min_supp_count!=0)
{
n+=1;
Cn(n);
Ln(n);
}
}

效果图:

Apriori算法-位运算-C语言的更多相关文章

  1. java加密解密算法位运算

    一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...

  2. LeetCode | 289. 生命游戏(原地算法/位运算)

    记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...

  3. js的位运算(其它语言也通用)

    左移运算符(<<) 该运算符有2个运算数,a<<b,将a左移相当于a乘以2的b次方,2个运算符要求是整数,或可以转换成整数的. 如:1<<2 =4 "1& ...

  4. 0x01 基本算法-位运算 a^b

    #include<bits/stdc++.h>using namespace std;int power(int a, int b, int p){    int ans = 1%p;   ...

  5. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  6. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  7. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  8. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  9. 深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

    布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运 ...

随机推荐

  1. BGP多线单IP技术实现形式以及其他双线对比

    自从电信与网通分离之后,北方网通与南方电信网络的互联瓶颈问题一直没有得到很好的解决,这个问题也严重困扰广大的ICP服务商.ICP也只能根据自己网站主流用户群是在南方还是在北方,服务重点是在南方还是北方 ...

  2. innodb更改行格式,系统盘占用急剧升高

    #大表引擎修改后,数据量较myisam引擎表大很多,对存储的行格式修改后,数据量减小. #备库修改时,由于服务器时间较早,系统盘20G,突然收到/磁盘空间占比89%的报警,立即将修改中断,恢复正常 # ...

  3. JavaFX基础学习之OkHttp/Gson2

    222 package application; import java.io.IOException; import java.net.URL; import java.util.ResourceB ...

  4. 移动端ios电话号码

    <meta name="format-detection" content="telephone=no"> <meta http-equiv= ...

  5. bit、byte、k

    bit(位/比特位):一个二进制数据0/1 byte(字节):简称B:1byte=8bit:一个英文字符占用1byte,一个汉字占用2byte k:1K=1024B M:1M=1024K

  6. JAVA中方法的定义与使用(课堂学习归纳)

    组合数,百度词条是这样解释的:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数(Combination) 对于计算组合数,需要一定的工作量,计算机可以很 ...

  7. 变更mysql数据库文件目录 Linux

    本次需要将mysql默认的数据库文件路径/var/lib/mysql 改为新挂载的目录/data/mysql上,需要做以下修改 1.停止mysql服务 service mysqld stop 2.复制 ...

  8. Revenge of GCD HDU5019

    Description In mathematics, the greatest common divisor (gcd), also known as the greatest common fac ...

  9. SQL防漏洞注入攻击小结

    3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:false-有注入攻击现有:  8public bool Proces ...

  10. 微信小程序跳转页面

    小程序页面有2种跳转,可以在wxml页面或者js中: 1,在wxml页面中: <navigator url="../index/index">跳转到新页面</na ...