void AM_Tree::insert(const map<int, double, item_cmp> &transaction)
{
int depth = 0;
double _util = 0;
double _clo_util = 0;
map<int, double, item_cmp> _util_list;
map<int, double, item_cmp>::const_iterator Tit = transaction.begin(); //iterator開始insert node
map<int, shared_ptr<Node>, item_cmp>::iterator Cit; //iterator指到root children
shared_ptr<Node> Nptr = root;
//handle item which is include in root->itemset
if(root->itemset.size() != 0)
{
map<int, double, item_cmp>::const_iterator Rit = transaction.find(root->itemset.back()); //指到目前root最大的item
while(Rit != transaction.end())
{
_util_list.insert(make_pair(Rit->first,Rit->second));
_util += Rit->second;
_clo_util += Rit->second;
Rit++;
}
}
//handle others
while(depth != transaction.size()-root->itemset.size())//here
{
if((Cit = Nptr->children.find(Tit->first)) != Nptr->children.end()) //node exist
Nptr = Cit->second;
else //node didn't exist
{
Nptr->children.insert(make_pair(Tit->first, make_shared<Node>(Node(Tit->first))));
Nptr = Nptr->children[Tit->first];
if(depth) //新node才有可能連到HeaderTable
HeaderTable[Tit->first].push_back(Nptr);
}
_util_list.insert(make_pair(Tit->first, Tit->second));
_clo_util += Tit->second; //plus IUTable clo_util
vector<int> index = root->itemset;
index.push_back(Tit->first);
IUTable[index].util += Tit->second + _util; //plus IUTable util
if(depth) {//第二個node以後才需要加clo_util
IUTable[index].clo_util += _clo_util;
map<int, double, item_cmp>::iterator It = _util_list.begin();
for(;It != _util_list.end();++It)
Nptr->util_list[It->first] += It->second;
}
++Tit;
++depth;
}
}
dm9pZCBBTV9UcmVlOjppbnNlcnQoY29uc3QgbWFwPGludCwgZG91YmxlLCBpdGVtX2NtcD4gJnRyYW5zYWN0aW9uKQp7CiAgICBpbnQgZGVwdGggPSAwOwoJZG91YmxlIF91dGlsID0gMDsKCWRvdWJsZSBfY2xvX3V0aWwgPSAwOwoJbWFwPGludCwgZG91YmxlLCBpdGVtX2NtcD4gX3V0aWxfbGlzdDsKCW1hcDxpbnQsIGRvdWJsZSwgaXRlbV9jbXA+Ojpjb25zdF9pdGVyYXRvciBUaXQgPSB0cmFuc2FjdGlvbi5iZWdpbigpOyAvL2l0ZXJhdG9y6ZaL5aeLaW5zZXJ0IG5vZGUKCW1hcDxpbnQsIHNoYXJlZF9wdHI8Tm9kZT4sIGl0ZW1fY21wPjo6aXRlcmF0b3IgQ2l0OyAvL2l0ZXJhdG9y5oyH5Yiwcm9vdCBjaGlsZHJlbgoJc2hhcmVkX3B0cjxOb2RlPiBOcHRyID0gcm9vdDsKCQoJLy9oYW5kbGUgaXRlbSB3aGljaCBpcyBpbmNsdWRlIGluIHJvb3QtPml0ZW1zZXQKCWlmKHJvb3QtPml0ZW1zZXQuc2l6ZSgpICE9IDApCgl7CQoJCW1hcDxpbnQsIGRvdWJsZSwgaXRlbV9jbXA+Ojpjb25zdF9pdGVyYXRvciBSaXQgPSB0cmFuc2FjdGlvbi5maW5kKHJvb3QtPml0ZW1zZXQuYmFjaygpKTsgLy/mjIfliLDnm67liY1yb2905pyA5aSn55qEaXRlbQoJCXdoaWxlKFJpdCAhPSB0cmFuc2FjdGlvbi5lbmQoKSkKCQl7CgkJCV91dGlsX2xpc3QuaW5zZXJ0KG1ha2VfcGFpcihSaXQtPmZpcnN0LFJpdC0+c2Vjb25kKSk7CgkJCV91dGlsICs9IFJpdC0+c2Vjb25kOwoJCQlfY2xvX3V0aWwgKz0gUml0LT5zZWNvbmQ7CgkJCVJpdCsrOwoJCX0KCX0KCS8vaGFuZGxlIG90aGVycwoJd2hpbGUoZGVwdGggIT0gdHJhbnNhY3Rpb24uc2l6ZSgpLXJvb3QtPml0ZW1zZXQuc2l6ZSgpKS8vaGVyZQoJewoJCWlmKChDaXQgPSBOcHRyLT5jaGlsZHJlbi5maW5kKFRpdC0+Zmlyc3QpKSAhPSBOcHRyLT5jaGlsZHJlbi5lbmQoKSkgLy9ub2RlIGV4aXN0CgkJCU5wdHIgPSBDaXQtPnNlY29uZDsKCQllbHNlIC8vbm9kZSBkaWRuJ3QgZXhpc3QKCQl7CgkJCU5wdHItPmNoaWxkcmVuLmluc2VydChtYWtlX3BhaXIoVGl0LT5maXJzdCwgbWFrZV9zaGFyZWQ8Tm9kZT4oTm9kZShUaXQtPmZpcnN0KSkpKTsKCQkJTnB0ciA9IE5wdHItPmNoaWxkcmVuW1RpdC0+Zmlyc3RdOwoJCQlpZihkZXB0aCkgLy/mlrBub2Rl5omN5pyJ5Y+v6IO96YCj5YiwSGVhZGVyVGFibGUKCQkJCUhlYWRlclRhYmxlW1RpdC0+Zmlyc3RdLnB1c2hfYmFjayhOcHRyKTsKCQl9CgkJX3V0aWxfbGlzdC5pbnNlcnQobWFrZV9wYWlyKFRpdC0+Zmlyc3QsIFRpdC0+c2Vjb25kKSk7CgkJX2Nsb191dGlsICs9IFRpdC0+c2Vjb25kOyAvL3BsdXMgSVVUYWJsZSBjbG9fdXRpbAoKCQl2ZWN0b3I8aW50PiBpbmRleCA9IHJvb3QtPml0ZW1zZXQ7CgkJaW5kZXgucHVzaF9iYWNrKFRpdC0+Zmlyc3QpOwoJCUlVVGFibGVbaW5kZXhdLnV0aWwgKz0gVGl0LT5zZWNvbmQgKyBfdXRpbDsgLy9wbHVzIElVVGFibGUgdXRpbAoJCWlmKGRlcHRoKSB7Ly/nrKzkuozlgItub2Rl5Lul5b6M5omN6ZyA6KaB5YqgY2xvX3V0aWwKCQkJSVVUYWJsZVtpbmRleF0uY2xvX3V0aWwgKz0gX2Nsb191dGlsOwoJCQltYXA8aW50LCBkb3VibGUsIGl0ZW1fY21wPjo6aXRlcmF0b3IgSXQgPSBfdXRpbF9saXN0LmJlZ2luKCk7CgkJCWZvcig7SXQgIT0gX3V0aWxfbGlzdC5lbmQoKTsrK0l0KQoJCQkJTnB0ci0+dXRpbF9saXN0W0l0LT5maXJzdF0gKz0gSXQtPnNlY29uZDsKCQl9CgkJKytUaXQ7CgkJKytkZXB0aDsKCX0KfQ==