頻繁モードマイニングFP_growthアルゴリズム

6379 ワード

    ,       ,  !
#include #include #include #include #include #include #include using namespace std; typedef struct CSNode { // string item; // int count; // , , int parent,firstchild,nextsibling; // , , int next; }; typedef struct sortNode { string s; int count; }; typedef struct headNode { string s; int count; int next; }; bool operator < (const headNode & a,const headNode & b) { return a.count > b.count; } bool operator < (const sortNode & a ,const sortNode & b) { return a.count > b.count; } int events,min_spt; map freqD; vector > D; vector headTable; vector Tree; void read_proc_data() { int n; string str; map tmpmap; vector > tmpD; cin>>min_spt>>events; for(int i=0; i>n; vectoritems; for(int j=0; j>str; items.push_back(str); tmpmap[str]+=1; } tmpD.push_back(items); } for(map::iterator it=tmpmap.begin(); it!=tmpmap.end(); it++) { if((*it).second>=min_spt) { headNode t; t.s=(*it).first; t.count=(*it).second; t.next=-1; headTable.push_back(t); } } sort(headTable.begin(),headTable.end()); for(int i = 0 ; i < events; i++) { vector Di; for(vector::iterator it=tmpD[i].begin(); it!=tmpD[i].end(); it++) { if(tmpmap[(*it)]>=min_spt) { sortNode t; t.s = (*it); t.count=tmpmap[(*it)]; Di.push_back(t); } } sort(Di.begin(),Di.end()); D.push_back(Di); } } int find_index(string str) { for(int i=0; i=len) return; if(p==-1) { CSNode root; root.count=1; root.item=D[i][j].s; root.nextsibling=-1; root.firstchild=-1; if(parent==0) root.parent=-1; else root.parent=parent; int index = find_index(D[i][j].s); root.next=headTable[index].next; Tree.push_back(root); p=Tree.size()-1; headTable[index].next=p; Tree[parent].firstchild=p; } else { int q; while(p!=-1) { if(Tree[p].item==D[i][j].s) { Tree[p].count++; break; } q=p; p=Tree[p].nextsibling; } if(p==-1) { CSNode root; root.count=1; root.item=D[i][j].s; root.nextsibling=-1; root.firstchild=-1; if(parent==0) root.parent=-1; else root.parent=parent; int index = find_index(D[i][j].s); root.next=headTable[index].next; Tree.push_back(root); p=Tree.size()-1; headTable[index].next=p; Tree[q].nextsibling=p; } } setNode(p,Tree[p].firstchild,i,j+1,len); } void creat_PT_Tree() { CSNode root; root.count=0; root.item=""; root.next=-1; root.parent=-1; root.nextsibling=-1; root.firstchild=-1; Tree.push_back(root); for(int i=0; i tmp) { for(int i=0;i tmp; for(map::iterator it= freqD.begin(); it!=freqD.end(); it++) { tmp.push_back((*it).first); } for(int i = 0; i < tmp.size(); i++) for(int j = i+1; j tmpset; for(int k=0; k::iterator it = tmpset.begin(); it!=tmpset.end(); it++) { str.append(*it); } if(str.length()!=a.length() && str.length()!=b.length()) { bool flag=false; flag = judge_exist(str,tmp); if(!flag) { freqD[str]=freqD[a]>freqD[b]?freqD[b]:freqD[a]; tmp.push_back(str); } } } for(map::iterator it= freqD.begin(); it!=freqD.end(); it++) { if((*it).second>=min_spt) cout<=0; i--) { int p = headTable[i].next; int count=Tree[p].count; string str=Tree[p].item; while(p!=-1) { int q=Tree[p].parent; while(q!=-1) { string s=""; int t = q; while(t!=-1) { string subs=Tree[t].item; s=subs.append(s); freqD[s]++; t=Tree[t].parent; } q=Tree[q].parent; } p=Tree[p].next; } cout<=0; i--) { int p = headTable[i].next; while(p!=-1) { int q=p; while(q!=-1) { cout<::iterator it = D[i].begin(); it!=D[i].end(); it++) { cout<::iterator it = headTable.begin(); it!=headTable.end(); it++) { cout<

テストデータを次に示します.
2 5
6 M O N K E Y
6 D O N K E Y
4 M A K E
5 M U C K Y
6 C O O K I E

データの説明は前編と同じですが、ちなみに私のコード実行環境はCodeblocksで、実行には何の問題もなく、実行問題があるので自分で解決します.意見があれば、私とコミュニケーションしてください.
転載先:https://www.cnblogs.com/Chinese-Coder-Clarence/articles/2548959.html