或没有然后的#include“stdafx.h中”之前包含的头文件
选择每个文件,安ALT + F7,然后检查C + +设置不预编译头设置
// AprioriView.cpp : implementation of the CAprioriView class//
#include "stdafx.h"
#include "Apriori.h"
#include "time.h"
#include "AprioriSet.h"
#include "AprioriDoc.h"
#include "AprioriView.h"
#include "SetPara.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__
#endif
/////////////////////////////////////////////////////////////////////////////
// CAprioriView
IMPLEMENT_DYNCREATE(CAprioriView, CRecordView)
BEGIN_MESSAGE_MAP(CAprioriView, CRecordView)
//{{AFX_MSG_MAP(CAprioriView)
ON_BN_CLICKED(IDC_Bn_FreqItem, OnBnFreqItem)
ON_COMMAND(ID_Parameter, OnParameter)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAprioriView construction/destruction
CAprioriView::CAprioriView()
: CRecordView(CAprioriView::IDD)
{
//{{AFX_DATA_INIT(CAprioriView)
m_pSet = NULL
nAllFreqItem=0
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CAprioriView::~CAprioriView()
{
}
void CAprioriView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX)
//{{AFX_DATA_MAP(CAprioriView)
DDX_Control(pDX, IDC_List_FreqItem, m_List_FreqItem)
//}}AFX_DATA_MAP
}
BOOL CAprioriView::PreCreateWindow(CREATESTRUCT&cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs)
}
void CAprioriView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_aprioriSet
CRecordView::OnInitialUpdate()
GetParentFrame()->RecalcLayout()
ResizeParentToFit()
}
/////////////////////////////////////////////////////////////////////////////
// CAprioriView printing
BOOL CAprioriView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo)
}
void CAprioriView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CAprioriView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CAprioriView diagnostics
#ifdef _DEBUG
void CAprioriView::AssertValid() const
{
CRecordView::AssertValid()
}
void CAprioriView::Dump(CDumpContext&dc) const
{
CRecordView::Dump(dc)
}
CAprioriDoc* CAprioriView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAprioriDoc)))
return (CAprioriDoc*)m_pDocument
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAprioriView database support
CRecordset* CAprioriView::OnGetRecordset()
{
return m_pSet
}
/////////////////////////////////////////////////////////////////////////////
// CAprioriView message handlers
void CAprioriView::OnBnFreqItem()
{
// TODO: Add your control notification handler code here
int nFieldCount=m_pSet->GetODBCFieldCount()
int nDbCount
CString strValue
CString strIntToString=""
clock_t start,stop,tick
double timeused
int nLargeCount=0
int nListFreqItemCount=0
start=clock()
ClearItem()
m_List_FreqItem.InsertColumn(0,"Item",LVCFMT_LEFT,100)
m_List_FreqItem.InsertColumn(1,"Count",LVCFMT_LEFT,100)
if (nItemCount<=0)
{
MessageBox("请先进行参数设置",NULL,MB_OK)
return
}
FindLargeItem()
for(int k=1LargeItemCount[k-1]!=0k++)
{
AprioriGen(k,1)
for(int mm=0mm<CandLargeItemCount[k]mm++)
{
nCountCand[mm]=0
}
m_pSet->MoveFirst()
nDbCount=0
while(!m_pSet->IsEOF())
{
TransGenCand(k,nDbCount)
//统计计数
for(int jj=0jj<nTransCandCountjj++)
for(int jj1=0jj1<CandLargeItemCount[k]jj1++)
{
if(TransGenCandFreq[jj].Find(CandLargeItem[k][jj1])!=-1)
{
nCountCand[jj1]++
break
}
}
nDbCount++
m_pSet->MoveNext()
}
ShowFreqItem(k)
}
stop=clock()
tick=stop - start
timeused=(double)tick/CLK_TCK
strIntToString=""
strIntToString.Format("%s%f",strIntToString,timeused)
MessageBox(strIntToString,NULL,MB_OK)
}
void CAprioriView::ClearItem()
{
//清除列表显示的内容
m_List_FreqItem.DeleteAllItems ()
while(m_List_FreqItem.DeleteColumn (0))
UpdateWindow()
for(int kk=0kk<nMaxSizekk++)
LargeItemCount[kk]=0
for(int kk1=0kk1<nMaxSizekk1++)
for(int kk2=0kk2<nMaxSizekk2++)
LargeItem[kk1][kk2]=""
}
void CAprioriView::AprioriGen(int nCandFreqItem, int nMinSupp)
{
//由L(k-1)生成C(k)
CString strTemp1,strTemp2,strRightTemp1,strRightTemp2
CString strTemp,strLeftTemp1,strLeftTemp2
int nstrTemp1,nstrTemp2
int nCandFreqItemCount=0
strTemp1=""
strTemp2=""
strRightTemp1=""
strRightTemp2=""
strTemp=""
strLeftTemp1=""
strLeftTemp2=""
nstrTemp1=0
nstrTemp2=0
nAllFreqItem=nAllFreqItem + LargeItemCount[nCandFreqItem-1]
for(int i1=0i1<LargeItemCount[nCandFreqItem-1]i1++)
{
//strTemp1=strCandFreqItem[i1]
strTemp1=LargeItem[nCandFreqItem -1][i1]
nstrTemp1=strTemp1.ReverseFind(',')
strRightTemp1=strTemp1.Right(strTemp1.GetLength ()-nstrTemp1-1)
strLeftTemp1=strTemp1.Left(nstrTemp1)
for(int j1=i1+1j1<LargeItemCount[nCandFreqItem-1])
{
//strTemp2=strCandFreqItem[j1]
strTemp2=LargeItem[nCandFreqItem-1][j1]
nstrTemp2=strTemp2.ReverseFind (',')
strRightTemp2=strTemp2.Right(strTemp2.GetLength ()-nstrTemp2-1)
strLeftTemp2=strTemp2.Left(nstrTemp2)
if((strLeftTemp1==strLeftTemp2)&&(strRightTemp1<strRightTemp2))
{
strTemp=strTemp1+','+strRightTemp2
if(Prune(nCandFreqItem,strTemp))
{ CandLargeItem[nCandFreqItem][nCandFreqItemCount++]=strTemp
j1++
}
else
{
j1++
}
}
else
break
}
}
CandLargeItemCount[nCandFreqItem]=nCandFreqItemCount
}
void CAprioriView::SubItemGen(int strSubItemCount,CString strSubItem)
{//对每个事务分解成单个项目
CString strTemp1
CString strTempSubItem[10]
CString strReverse
int nSubItemCount
int nstrRightTemp1
int nTempCount
strTemp1=strSubItem
nSubItemCount=0
while((nstrRightTemp1=strTemp1.ReverseFind(','))!=-1)
{
nTempCount=strTemp1.GetLength() - nstrRightTemp1 - 1
strTempSubItem[nSubItemCount++]=strTemp1.Right( nTempCount)
strTemp1=strTemp1.Left(nstrRightTemp1)
}
strTempSubItem[nSubItemCount++]=strTemp1
for(int i2=0i2<nSubItemCount/2i2++)
{
strReverse=strTempSubItem[nSubItemCount-i2-1]
strTempSubItem[nSubItemCount- i2-1]=strTempSubItem[i2]
strTempSubItem[i2]=strReverse
}
for(int i1=0i1<nSubItemCounti1++)
{
DbItem[strSubItemCount][i1]=strTempSubItem[i1]
}
DbItemCount[strSubItemCount]=nSubItemCount
}
void CAprioriView::FindLargeItem()
{
//显示1-频繁项目集
int nFieldCount=m_pSet->GetODBCFieldCount()
int nCount=0
int nFreqItem[100]
int nDbCount=0
CString strInit
CString strValue
CString strIntToString
// 初始化候选项目集
for(int nInitCount=0nInitCount<nItemCountnInitCount++)
{
strInit=""
strInit.Format("%s%d",strInit,nInitCount+1)
CandLargeItem[0][nInitCount]='I'+strInit
}
//初始化数组
for(int ii=0ii<nItemCountii++)
nFreqItem[ii]=0
m_pSet->MoveFirst ()
while(!m_pSet->IsEOF())
{
for(int j=1j<nFieldCountj++){
m_pSet->GetFieldValue(j,strValue)
SubItemGen(nDbCount++ ,strValue)
for(int i=0i<nItemCounti++)
if(strValue.Find(CandLargeItem[0][i])!=-1)
nFreqItem[i]++
}
m_pSet->MoveNext()
}
nDbItemCount=nDbCount
for(int i1=0i1<nItemCounti1++)
{ strIntToString=""
if(double(nFreqItem[i1])/double(nDbItemCount)>=dItemSupp)
{
LargeItem[0][nCount]=CandLargeItem[0][i1]
m_List_FreqItem.InsertItem(nCount,strIntToString)
m_List_FreqItem.SetItemText(nCount,0,LargeItem[0][nCount])
strIntToString=""
strIntToString.Format("%s%d",strIntToString,nFreqItem[i1])
m_List_FreqItem.SetItemText(nCount,1,strIntToString)
nCount++
}
}
LargeItemCount[0]=nCount
}
void CAprioriView::OnParameter()
{
// TODO: Add your command handler code here
CSetPara dlg
dlg.m_ItemCount =10
dlg.m_Item_Supp=0.2
int ren=dlg.DoModal()
nItemCount=dlg.m_ItemCount
dItemSupp=dlg.m_Item_Supp
}
BOOL CAprioriView::Prune(int nCandFreqItemCount,CString strCandFreqItem)
{
CString strTemp1
CString strTempSubItem[nMaxSize]
CString strReverse
CString strSubCandFreqItem[nMaxSize]//分解候选项目
CString strSubTemp=""
CString strSubTemp1
int nSubFreqItemCount=0//统计分解候选项目的个数
int nSubItemCount
int nstrRightTemp1
int nTempCount
int nPruneCount=0
strTemp1=strCandFreqItem
nSubItemCount=0
while((nstrRightTemp1=strTemp1.ReverseFind(','))!=-1)
{
nTempCount=strTemp1.GetLength() - nstrRightTemp1 - 1
strTempSubItem[nSubItemCount++]=strTemp1.Right( nTempCount)
strTemp1=strTemp1.Left(nstrRightTemp1)
}
strTempSubItem[nSubItemCount++]=strTemp1
for(int i2=0i2<nSubItemCount/2i2++)
{
strReverse=strTempSubItem[nSubItemCount-i2-1]
strTempSubItem[nSubItemCount- i2-1]=strTempSubItem[i2]
strTempSubItem[i2]=strReverse
}
for(int i3=nSubItemCount-1i3>=0i3--)
{
strSubTemp1=strTempSubItem[i3]
strSubTemp.Empty()
for(int i4=0i4<nSubItemCounti4++)
if(strSubTemp1!=strTempSubItem[i4])
{
strSubTemp=strSubTemp+strTempSubItem[i4]+','
}
strSubCandFreqItem[nSubFreqItemCount++] = strSubTemp.Left(strSubTemp.GetLength()-1)
}
for(int i5=0i5<nSubFreqItemCounti5++)
{
for(int i6=0i6<LargeItemCount[nCandFreqItemCount-1]i6++)
if(strSubCandFreqItem[i5].Find(LargeItem[nCandFreqItemCount-1][i6])>=0)
nPruneCount++
}
if(nPruneCount==nSubItemCount)
{
return TRUE
}
return FALSE
}
void CAprioriView::TransGenCand(int nCandFreqItem,int nCurrentCount )
{
CString strTransTemp
CString strTransTemp1
nTransCandCount=0
int nCurrentTempCount=nCurrentCount
int a[nMaxSize]
int nCount=0
a[nCount]=0
//初始化数组
for(int nTransCand=0nTransCand<nMaxSizenTransCand++)
{TransGenCandFreq[nTransCand]=""
}
do{
if((a[nCount]-nCount) <= (DbItemCount[nCurrentTempCount]- nCandFreqItem -1))
{
if(nCount==nCandFreqItem)
{
strTransTemp=""
for(int jj=0jj<nCandFreqItemjj++)
strTransTemp=strTransTemp+DbItem[nCurrentTempCount][a[jj]]+','
strTransTemp1=""
strTransTemp1=strTransTemp+DbItem[nCurrentTempCount][a[nCandFreqItem]]
TransGenCandFreq[nTransCandCount++]=strTransTemp1
// MessageBox(strTransTemp1)
a[nCount]++
continue
}
nCount++
a[nCount]=a[nCount-1]+1
}
else
{
if(nCount==0) return
a[--nCount]++
}
}while(1)
// for(int ll=0ll<nTransCandCountll++)
// MessageBox(TransGenCandFreq[ll],NULL,MB_OK)
}
void CAprioriView::ShowFreqItem(int nScanCount)
{ CString strIntToString=""
CString strValue
CString strjj3[2]
int nLargeCount=-1
int nLargeItemCount=0
//以下为求频繁项目集
int k,nListFreqItemCount
k=nScanCount
nListFreqItemCount=LargeItemCount[k-1]
m_List_FreqItem.InsertItem(0,strValue)
m_List_FreqItem.SetItemText(0,0,"-----------")
m_List_FreqItem.SetItemText(0,1,"-----------")
for(int jj2=0jj2<CandLargeItemCount[k]jj2++)
if(double(nCountCand[jj2])/double(nDbItemCount)>=dItemSupp)
{
LargeItem[k][nLargeItemCount++]=CandLargeItem[k][jj2]
nLargeCount++
strjj3[1]=strIntToString
strjj3[0]=CandLargeItem[k][jj2]
strIntToString=""
strIntToString.Format("%s%d",strIntToString,nCountCand[jj2])
strjj3[1]=strIntToString
m_List_FreqItem.InsertItem(nLargeCount,strValue)
m_List_FreqItem.SetItemText(nLargeCount,0,LargeItem[k][nLargeItemCount-1])
m_List_FreqItem.SetItemText(nLargeCount,1,strIntToString)
UpdateWindow()
}
//复制频繁项目个数
LargeItemCount[k]=nLargeItemCount
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)