前几天写了Apriori算法之后效率很差,在网上查了很多资料,另外的最大模式挖掘算法一般有FP-Growth 和 Ecalt 算法,这两种效率比较高而FP-Growth算法构建FP-Tree的过程非常复杂,后来在网上找到了另外一种效率更优化且结构更简单的算法,那就是北大邓志鸿老师的PPV算法,看了论文以后觉得这确实是一个好的算法,因此打算加以实现。在实现的第一步就卡住了。在构造PPV-TREE/ FP-TREE 的第一步都是要统计每个事务的频度并且对项集中按照频度进行排序,虽然只是简单的两句话,可是当实现的时候就没有说的这么简单了。我也用了一天的时间来实现这第一步。。。。。确实有些事不动手不知道难。在如何实现的问题上也经过了很多的思考,最初打算用map 来实现,后来为了锻炼下就改用了Trie树的方式,如果数据大最好的方式应该是map/reduce的成名函数 wordCount。好了下面直接上代码.完整PPV-GROWTH代码
#ifndef TRIE_H
#define TRIE_H
#include <fstream>
class trie{
public:
trie(std::string fname,char spl):filename(fname), sp(spl),root(NULL){}
~trie();
void insert(std::string);
int search(std::string);
void openfile();
std::string getFname();
char getsp();
private:
struct node{
char key;
int count;
node();
node *child[26];
};
node *root;
std::ifstream in;
std::string filename;
char sp;
};
#endif //end tire define
#include <iostream>
#include <cassert>
#include "trie.h"
using namespace std;
trie::node::node()
{
count = 0;
for(int i = 0; i<26; ++i)
child[i] = NULL;
}
trie::~trie()
{
if(in)
in.close();
delete root;
}
void trie::openfile()
{