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

📄 fp_treeview.cpp

📁  关联规则fp算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	//////////////////////////重排表项 先构造一个vector///////////
		//tempArray从headTableArray COPY 项目的count项清0 
		tempArray.RemoveAll();
		tempArray.Copy(headTableArray);
		for(int k=0;k<headTableArray.GetSize();k++)
		{
			CHeadTable headTable;
			headTable=headTableArray.GetAt(k);
			headTable.setCount(0);
			tempArray.SetAt(k,headTable);
		}

		sortIterator=sortVector.begin();
		try
		{
			//创建实例
			m_Recordset.CreateInstance(_uuidof(Recordset));
			//将控件中的值保存到变量中,主要是保存SQL语句
			UpdateData(TRUE);
			//设定光标服务
			m_Connection->CursorLocation=adUseClient;
			//根据连接字符串开启数据连接,得到结果集
			m_Recordset->Open(m_strSQL.GetBuffer(0),m_Connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
			
			m_Recordset->MoveFirst();
			CString str,templeft,tempright;
			while(!m_Recordset->adoEOF)
			{
				_variant_t   varcheck;   
				varcheck=m_Recordset->GetCollect(_variant_t(m_strColName));
				if(varcheck.vt!=VT_NULL)
				{
					str=(char*)(_bstr_t)varcheck;	
					str.TrimLeft();
					str.TrimRight();
					int temp=0;

					char sign;
					if(str.Find(',')!=-1) sign=',';
					else if(str.Find('|')!=-1) sign='|';
					else if(str.Find(' ')!=-1) sign=' ';
					
					while(temp!=-1)
					{
						temp=str.Find(sign);
						
						if(temp==-1)
							templeft=str;
						else
							templeft=str.Left(temp);
					
						tempright=str.Right(str.GetLength()-temp-1);
						
						//检查item 修改tempArray
						int index=checkItem(headTableArray,templeft);
						if(index>=0)// item in Array count++
						{	
							CHeadTable headTable;
							headTable=tempArray.GetAt(index);
							headTable.setCount(headTable.getCount()+1);
							tempArray.SetAt(index,headTable);
						}	
					
						str=tempright;
					}//while end of temp
						
					//重排item表
					CString strBuffer="";
					BOOL signFlag=FALSE;
					
					for(int j=0;j<tempArray.GetSize();j++)
					{
						if(tempArray.GetAt(j).getCount()>0)
						{
							if(signFlag) strBuffer+=sign;
							int k=tempArray.GetAt(j).getCount();
							while(k)
							{
								if(k==1)
									strBuffer+=tempArray.GetAt(j).getItemName();
								else
									strBuffer+=tempArray.GetAt(j).getItemName()+sign;
								CHeadTable headTable;
								headTable=tempArray.GetAt(j);
								headTable.setCount(headTable.getCount()-1);
								
								tempArray.SetAt(j,headTable);
								k--;
							}
							signFlag=TRUE;
						}
					}
					sortVector.push_back(strBuffer);
					sortIterator++;
				}
				m_Recordset->MoveNext();
			} //the end of while of (adoEOF)
			m_Recordset->Close();
		}
		//捕获异常_com_error
		catch (_com_error &e)
		{
			GenerateError(e.Error(),e.Description());
		}
		//捕获其他异常
		catch(...){}

////////////////////////重排表排好了,验证一下///////////////////
		m_List2.ResetContent();
		sortIterator=sortVector.begin();
		while(sortIterator!=sortVector.end())
		{
			m_List2.AddString(*sortIterator);
			sortIterator++;
		}

	//////////////////////////////以下为构建FP树////////////
		sortIterator=sortVector.begin();
		CString str;
		while(sortIterator!=sortVector.end())
		{
			str=*sortIterator;
			str.TrimLeft();
			str.TrimRight();
	
			constructTree(str);//调用insertTree构建树
			sortIterator++;
		}
//////////////////////////////FP树构建好了遍历一下//////////////
		m_List3.ResetContent();
		for(int l=0;l<headTableArray.GetSize();l++)
		{
			CString str="";
			FPTNODE *p;
			p=headTableArray.GetAt(l).right;
			char buffer[20];
			if(p)
			{
				while(p)
				{
					str+=p->item+":"+(_itoa)(p->count,buffer,10)+" ";
					p=p->succ;
				}
				m_List3.AddString(str);	
			}
		}
	
		m_List5.ResetContent();//关键频繁项列表清空
		m_List4.ResetContent();//频繁项目集列表清空
		m_List6.ResetContent();//同步频繁项列表清空
		
		UpdateData(FALSE);
	}

}

int CFp_treeView::checkItem(CArray<CHeadTable,CHeadTable> &checkArray, CString item)
{
	for(int i=0;i<checkArray.GetSize();i++)
	{
		if(checkArray.GetAt(i).getItemName()==item)
			return i;
		else
			continue;
	}
	return -1;
}

void CFp_treeView::sortItem(int index,int count)
{
	BOOL flag=FALSE;
	for(int i=0;i<index;i++)//从表头到index 找到第一个比index小的 与其交换
	{	
		if(headTableArray.GetAt(i).getCount()<count)
		{
			CHeadTable headTable;
			headTable=headTableArray.GetAt(i);
			headTableArray.SetAt(i,headTableArray.GetAt(index));
			headTableArray.SetAt(index,headTable);
			flag=TRUE;
		}
		else 
			continue;
		if(flag) break;
	}

}

void CFp_treeView::constructTree(CString items)
{
	CString str,templeft,tempright;
	str=items;
	if(str.GetLength()==0)
		return;
	insertTree(fptree,str);
}

void CFp_treeView::insertTree(CTree &tree, CString items)
{
	CString str,templeft,tempright;
	str=items;
	
	int temp=0;
	char sign;
	if(str.Find(',')!=-1) sign=',';
	else if(str.Find('|')!=-1) sign='|';
	else if(str.Find(' ')!=-1) sign=' ';
	//取出第一个item
	temp=str.Find(sign);
	if(temp==-1)
		templeft=str;
	else
		templeft=str.Left(temp);
	
	if(str.GetLength()==templeft.GetLength())
	{
		tempright="";
		insertNode(tree,templeft,tempright);//插入本记录最后一个结点
		return;//递归终止
	}
	else
	{
		tempright=str.Right(str.GetLength()-temp-1);
		insertNode(tree,templeft,tempright);
	}
}

void CFp_treeView::insertNode(CTree &tree, CString item, CString items)
{
	//检查item 是否存在树的子结点与其同名
	BOOL sameItem;
	sameItem=FALSE;
	FPTNODE *p,*pre;
	p=tree.tree->firstchild;
	pre=p;

	if(p==NULL)
	{
		//先构造一个结点
		FPTNODE *node=new FPTNODE;
		node->count=1;
		node->item=item;
		node->firstchild=NULL;
		node->next_sibling=NULL;
		node->succ=NULL;
		node->parent=tree.tree;//care
	
		tree.tree->firstchild=node;

		fptree.tree->count++;
	
		//检查item在headTableArray中
		int index=checkItem(headTableArray,item);
		if(index>=0)// item in Array 
		{	
			if(headTableArray.GetAt(index).right)
			{
				FPTNODE *p;
				p=headTableArray.GetAt(index).right;
				while(p->succ)
				{
					p=p->succ;
				}
				p->succ=node;
			}
			else
			{
				CHeadTable headTable;
				headTable=headTableArray.GetAt(index);
				headTable.right=node;
				headTableArray.SetAt(index,headTable);
			}

		}

		if(items.GetLength()!=0)
		{
			CTree temptree;
			temptree.tree=node;
			insertTree(temptree, items);
		}
	}
	else
	{
		while(p)
		{
			if(p->item==item)
			{
				p->count++;
				sameItem=TRUE;
				fptree.tree->count++;
			}
			else
			{
				pre=p;
				p=p->next_sibling;
			}
			if(sameItem) break;
		}
		if(sameItem)//发现
		{
			if(items.GetLength()!=0)
			{
				CTree temptree;
				temptree.tree=p;
				insertTree(temptree, items);
			}
		}
		else//未发现
		{
			//先构造一个结点
			FPTNODE *node=new FPTNODE;
			node->count=1;
			node->item=item;
			node->firstchild=NULL;
			node->next_sibling=NULL;
			node->succ=NULL;
			node->parent=pre->parent;//care
			pre->next_sibling=node;

			fptree.tree->count++;
			
			//检查item在headTableArray中
			int index=checkItem(headTableArray,item);
			if(index>=0)// item in Array count++
			{	
				if(headTableArray.GetAt(index).right)
				{
					FPTNODE *p;
					p=headTableArray.GetAt(index).right;
					while(p->succ)
					{
						p=p->succ;
					}
					p->succ=node;
				}
				else
				{
					CHeadTable headTable;
					headTable=headTableArray.GetAt(index);
					headTable.right=node;
					headTableArray.SetAt(index,headTable);
				}

			}

			if(items.GetLength()!=0)
			{
				CTree temptree;
				temptree.tree=node;
				insertTree(temptree, items);
			}
		}
		
	}
}


//////////////////////////////从FP树中挖掘频繁项目集////////////
void CFp_treeView::OnTest1() 
{
	if(m_ButtonFlag==0)//没有选中列
		return;
	// TODO: Add your control notification handler code here
	clock_t start;
	start = clock();
	CString time="";
	char buffer[20];
	
	
	m_List4.ResetContent();
	CString str="";
	if(headTableArray.GetSize()>0)
		fpGrowth(fptree,headTableArray,str);

	time=_itoa((clock()-start),buffer,10);
	m_dmTime=_T("挖掘时间:\n"+time+"毫秒");

	m_Edit1=(_itoa)(m_List4.GetCount(),buffer,10);
	UpdateData(FALSE);
	
}


void CFp_treeView::fpGrowth(CTree &tree, CArray<CHeadTable,CHeadTable> &array, CString item)
{
	
	//判断tree是否是单枝树 单枝树的判定(很有技巧)
	BOOL singleFlag=TRUE;
	FPTNODE *p;
	p=array.GetAt(array.GetSize()-1).right;
	
	/*	
	if((array.GetSize()>1)&&(p->parent==tree.tree))
		singleFlag=FALSE;
		
	while(p!=tree.tree)
	{
		if(p->succ)			
		{
			singleFlag=FALSE;
			break;
		}
		else
			p=p->parent;
	}*/

		
	while(p!=tree.tree)
	{
		if(p->succ||(p->parent==tree.tree&&array.GetAt(0).right!=p))			
		{
			singleFlag=FALSE;
			break;
		}
		else
			p=p->parent;
	}


	if(singleFlag)
	{
		//m_List4.AddString("是单枝树用组合输出频繁项");
		CArray<CHeadTable,CHeadTable> keyItemArray,notkeyItemArray,keyItemset,notkeyItemset;
		FPTNODE *p;
		p=array.GetAt(array.GetSize()-1).right;
		while(p!=tree.tree)
		{
			if(findKeyitem(p->item))
			{
				CHeadTable headTable;
				headTable.right=NULL;
				headTable.setCount(p->count);
				headTable.setItemName(p->item);
				keyItemArray.Add(headTable);
				p=p->parent;
					
			}
			else
			{
				CHeadTable headTable;
				headTable.right=NULL;
				headTable.setCount(p->count);
				headTable.setItemName(p->item);
				notkeyItemArray.Add(headTable);
				p=p->parent;
			}
		}
			
		
		//关键项目组合
		{
			int buffer1[100];
			for(int i=1;i<=keyItemArray.GetSize();i++)
				comb(keyItemArray.GetSize(),i,buffer1,0,keyItemArray,keyItemset);
		}
		//关键项目组合
		{
			int buffer2[100];
			for(int i=1;i<=notkeyItemArray.GetSize();i++)
				comb(notkeyItemArray.GetSize(),i,buffer2,0,notkeyItemArray,notkeyItemset);
		}
		
	
		
		//输出单枝树频繁项
		if(findKeyitem(item))//关键项在后缀项上,全输出
		{
			char buffer[20];
			for(int i=0;i<keyItemset.GetSize();i++)
			{
				CString str;
				if(item.GetLength())
					 str=keyItemset.GetAt(i).getItemName()+","+item+":"+(_itoa)(keyItemset.GetAt(i).getCount(),buffer,10);
				else
					 str=keyItemset.GetAt(i).getItemName()+":"+(_itoa)(keyItemset.GetAt(i).getCount(),buffer,10);

				m_List4.AddString(str);
			}
			
			for(int j=0;j<keyItemset.GetSize();j++)//关键项和非关键项的组合输出
				for(int k=0;k<notkeyItemset.GetSize();k++)
				{
					CString str;
					if(item.GetLength())
						 str=keyItemset.GetAt(j).getItemName()+","+notkeyItemset.GetAt(k).getItemName()+","+item+":"+(_itoa)(minValue(keyItemset.GetAt(j).getCount(),notkeyItemset.GetAt(k).getCount()),buffer,10);
					else
						 str=keyItemset.GetAt(j).getItemName()+","+notkeyItemset.GetAt(k).getItemName()+":"+(_itoa)(minValue(keyItemset.GetAt(j).getCount(),notkeyItemset.GetAt(k).getCount()),buffer,10);
					m_List4.AddString(str);
					
				}

			for(int k=0;k<notkeyItemset.GetSize();k++)//非关键项组合输出(因为关键项在后缀项上)
			{
				CString str;
				if(item.GetLength())
					 str=notkeyItemset.GetAt(k).getItemName()+","+item+":"+(_itoa)(notkeyItemset.GetAt(k).getCount(),buffer,10);
				else
					 str=notkeyItemset.GetAt(k).getItemName()+":"+(_itoa)(notkeyItemset.GetAt(k).getCount(),buffer,10);

				m_List4.AddString(str);
			
			}

		}
		else//关键项不在头表,分二步输出
		{
			char buffer[20];
			for(int i=0;i<keyItemset.GetSize();i++)
			{
				CString str;
				if(item.GetLength())
					 str=keyItemset.GetAt(i).getItemName()+","+item+":"+(_itoa)(keyItemset.GetAt(i).getCount(),buffer,10);
				else
					 str=keyItemset.GetAt(i).getItemName()+":"+(_itoa)(keyItemset.GetAt(i).getCount(),buffer,10);

				m_List4.AddString(str);
			
			}
			
			for(int j=0;j<keyItemset.GetSize();j++)//关键项和非关键项的组合输出
				for(int k=0;k<notkeyItemset.GetSize();k++)
				{
					CString str;
					if(item.GetLength())
						 str=keyItemset.GetAt(j).getItemName()+","+notkeyItemset.GetAt(k).getItemName()+","+item+":"+(_itoa)(minValue(keyItemset.GetAt(j).getCount(),notkeyItemset.GetAt(k).getCount()),buffer,10);
					else
						 str=keyItemset.GetAt(j).getItemName()+","+notkeyItemset.GetAt(k).getItemName()+":"+(_itoa)(minValue(keyItemset.GetAt(j).getCount(),notkeyItemset.GetAt(k).getCount()),buffer,10);
					m_List4.AddString(str);
				}
		}
	
	}
	else
	{	
		//m_List4.AddString("分枝树先构建频繁模式基");
	
		int i=array.GetSize()-1;
		for(i;i>=0;i--)
		{
			CString str=array.GetAt(i).getItemName();
			CString suitem;				//后缀项
			CTree projectTree;
			
			CArray<CHeadTable,CHeadTable> projectArray;//新头表
			projectArray.RemoveAll();
			projectArray.Copy(headTableArray);
			for(int j=0;j<headTableArray.GetSize();j++)

⌨️ 快捷键说明

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