[Data Mining]APriori算法C++实现

本文详细介绍了如何使用C++编程实现数据挖掘中的经典算法——APriori,该算法主要用于发现频繁项集和关联规则。通过理解APriori的基本原理,我们可以构建一个有效的C++程序来处理大量交易数据,找出其中的频繁购买组合。
摘要由CSDN通过智能技术生成
// stdafx.h

#ifndef __STDAFX_H__
#define __STDAFX_H__

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <map>

#include <cstring>
#include <cassert>
#include <cstdlib>
#include <cctype>
#include <cstdio>

using namespace std;

#define PAUSE	pause();
#define STOP	while (true) { pause(); }

#endif


// stdafx.cpp

#include "stdafx.h"



// assist.h

#ifndef __ASSIST_H__
#define __ASSIST_H__

#include "stdafx.h"

void pause(void); // 中断暂停
void sort_unique(string& str); // 将一个字符串排序后去重

#endif

// assist.cpp

#include "stdafx.h"
#include "assist.h"

void pause(void)
{
	system("pause>nul");
}

void sort_unique(string& str)
{
	sort(str.begin(), str.end()); // 排序
	string::iterator old_end = str.end(); // 去重
	string::iterator new_end = unique(str.begin(), str.end());
	str.erase(new_end, old_end);
}



// ItemSet.h

#ifndef __ITEM_SET_H__
#define __ITEM_SET_H__

struct CItemSet // 项集
{
	string m_seq; // 用string保存项的序列,将string当成整型数组用
	// 项集中的元素统统去重并按字典序升序排列

	// 构造函数
	CItemSet(void) {} // 默认空的构造函数
	CItemSet(string seq): m_seq(seq) {} // 直接用string构造
	CItemSet(const CItemSet& obj): m_seq(obj.m_seq) {} // 复制构造函数

	void split_dot_blank(char* buff); // 对输入的m_seq进行解析去掉分隔符得到数字序列
	friend istream& operator>>(istream& in, CItemSet& obj); // 输入
	friend ostream& operator<<(ostream& out, const CItemSet& obj); // 输出
	
	// 比较运算符,满足STL的协议
	bool operator==(const CItemSet& oth) const;
	bool operator<(const CItemSet& oth) const;

	int size() const; // 返回项集中项的个数

	bool isEmpty(void) const; // 项集是否为空
	bool isInside(const CItemSet& oth) const; // 项集this是否包含于项集&oth中	

	// 两个剪枝
	bool operator%(const CItemSet& oth) const; // 判断this和oth是否拥有相同的前缀
	bool split_appear(vector<CItemSet>& set_list) const; // k + 1项集的所有k项子集是否都出现在项集集合set_list中
	// 实际中set_list将传入计算出的k频繁项集集合

	CItemSet sub_set_at(int i) const; // 将项集中的第i个项拆出来单独形成一个{ ai }项并返回

	CItemSet operator+(const CItemSet& oth) const; // 集合并
	CItemSet operator-(const CItemSet& oth) const; // 集合减
};

#endif

// ItemSet.cpp

#include "stdafx.h"
#include "assist.h"
#include "ItemSet.h"

void CItemSet::split_dot_blank(char* buff)
{		
#define	IN		0	// 在数字序列中
#define	OUT		1	// 不在数字序列中
	
	char str_num[1024]; // 存放输入序列中的数字部分
	int flag = OUT; // 刚开始初始化为在序列外
	
	char seq_buff[1024]; // 用于暂存映射好的seq
	int k = 0;
	
	// i指示seq,j指示str_num
	for (int i = 0, j = 0; i <= strlen(buff); i++) {
		if (!ispunct(buff[i]) && !isspace(buff[i]) && buff[i] != '\0') { // 如果为数字
			if (flag == OUT) {
				flag = IN; // 从序列外到序列内表示新的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值