⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apriorisets.cpp

📁 data mining description
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*----------------------------------------------------------------------  File     : AprioriSets.cpp  Contents : apriori algorithm for finding frequent sets  Author   : Bart Goethals  Update   : 1/6/2003   ----------------------------------------------------------------------*/#include "stdafx.h"#include <time.h>#include <algorithm>#include <iostream>#include <time.h>using namespace std;#include "AprioriSets.h"AprioriSets::AprioriSets(){  data=0;  minsup=0;  remap=0;  relist=0;  trie = new Item(0);  verbose = false;  countType = 1;}AprioriSets::~AprioriSets(){  if(data) delete data;  if(trie) {    trie->deleteChildren();    delete trie;  }  if(remap) delete remap;  if(relist) delete relist;}void AprioriSets::setData(char *fn, int type){  data = new Data(fn, type);}int AprioriSets::setOutputSets(char *fn){  setsout.open(fn);  if(!setsout.is_open()) {    cerr << "error: could not open " << fn << endl;    return -1;  }  return 0;}int AprioriSets::generateSets(){  int total=0, pass=0;  bool running = true;  while(running) {    clock_t start;    int generated=0, nodes=0, tnr=0, pruned;    pass++;    cout << pass << " " << flush;    if(pass>2) {      start = clock();      generated = generateCandidates(pass);      nodes = pruneNodes(pass);      if(verbose) cout << generated << " [" << (clock()-start)/double(CLOCKS_PER_SEC) << "s] " << flush;    }    start = clock();    tnr = countCandidates(pass);    if(verbose) {      if(pass == 1) cout << trie->getChildren()->size() << " ";      cout << tnr << " [" << (clock()-start)/double(CLOCKS_PER_SEC) << "s] " << flush;    }    if(pass==1 && setsout.is_open()) printSet(*trie,0,0);     start = clock();    pruned = pruneCandidates(pass);    if(verbose) cout << pruned << " [" << (clock()-start)/double(CLOCKS_PER_SEC) << "s]\n" << flush;    if(pass==1) ReOrder(); // Reorder all items    total += pruned;    if(pruned <= pass) running = false;  }  cout << endl;  return total;}int AprioriSets::generateCandidates(int level){  int *tmp = new int[level];  int generated = generateCandidates(level, trie->getChildren(), 1, tmp);  delete [] tmp;  return generated;}int AprioriSets::generateCandidates(int level, set<Item> *items, int depth, int *current){  if(items == 0) return 0;  int generated = 0;  set<Item>::reverse_iterator runner;  if(depth == level-1) {    for(runner = items->rbegin(); runner != items->rend(); runner++) {      current[depth-1] = runner->getId();      set<Item> *children = runner->makeChildren();      for(set<Item>::reverse_iterator it = items->rbegin(); it != runner; it++) {	current[depth] = it->getId();	if(level<=2 || checkSubsets(level,current, trie->getChildren(), 0, 1)) {	  children->insert(Item(it->getId()));	  generated++;	}      }    }  }  else {    for(runner = items->rbegin(); runner != items->rend(); runner++) {      current[depth-1] = runner->getId();      generated += generateCandidates(level, runner->getChildren(), depth+1, current);    }  }  return generated;}bool AprioriSets::checkSubsets(int sl, int *iset, set<Item> *items, int spos, int depth){  if(items==0) return 0;  bool ok = true;  set<Item>::iterator runner;  int loper = spos;  spos = depth+1;  while(ok && (--spos >= loper)) {    runner = items->find(Item(iset[spos]));    if(runner != items->end()) {      if(depth<sl-1) ok = checkSubsets(sl, iset, runner->getChildren(), spos+1, depth+1);    }    else ok=false;  }  return ok;}int AprioriSets::pruneNodes(int level){  return pruneNodes(level,trie->getChildren(),1);}int AprioriSets::pruneNodes(int level, set<Item> *items, int depth){  if(items == 0) return 0;  int nodes = 0;  if(depth==level) nodes = items->size();  else {    for(set<Item>::iterator runner = items->begin(); runner != items->end(); ) {      int now = pruneNodes(level, runner->getChildren(), depth+1);      if(now) {	nodes += now;	nodes++;	runner++;      }      else {	runner->deleteChildren();	set<Item>::iterator tmp = runner++;	items->erase(tmp);      }    }  }  return nodes;}int AprioriSets::countCandidates(int level){  int trans=0;  // count all single items  if(level==1) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -