📄 mushroomtestview.cpp
字号:
// MushroomTestView.cpp : implementation of the CMushroomTestView class
//////////////////////////////////////////////////////////////////////////////
//名 称:MushroomTest
//原有功能:用Apriori算法实现对字符蘑菇 数据库的频繁集的发现
// 改进了子集测试的方法,可以快速的测试子集的存在性
// 用两种不同的显示形式来显示结果
// 提供数据库的主要参数信息
//
//新增功能:
// 利用动态内存分配技术来进行处理,用预先分配内存的数组来存储符合要求的记录的地址
// 并对其进行计数,最后再分配内存,进行处理时,利用原来的数组存储的地址信息获得记录
// 下来,既能对动态的数据进行处理,又可尽量避免浪费内存空间,在时间和空间中取得一个
// 较优的平衡
//
//当前版本: 1.2
//作 者:郭运凯(gyunkai@163.com)
//日期:2006.06.17-17
//
//取代版本: 1.1
//作 者:郭运凯(gyunkai@163.com)
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MushroomTest.h"
#include "MushroomTestSet.h"
#include "MushroomTestDoc.h"
#include "MushroomTestView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView
IMPLEMENT_DYNCREATE(CMushroomTestView, CRecordView)
BEGIN_MESSAGE_MAP(CMushroomTestView, CRecordView)
//{{AFX_MSG_MAP(CMushroomTestView)
ON_BN_CLICKED(IDC_Bn_FreqItem, OnBnFreqItem)
ON_BN_CLICKED(IDC_para_set, Onparaset)
ON_BN_CLICKED(IDC_show_supp, Onshowsupp)
ON_BN_CLICKED(IDC_show_supp_count, Onshowsuppcount)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView construction/destruction
CMushroomTestView::CMushroomTestView()
: CRecordView(CMushroomTestView::IDD)
{
//{{AFX_DATA_INIT(CMushroomTestView)
m_pSet = NULL;
m_min_supp = 0.2f; //初始化最小支持度为0.2
m_total_num = 0; //记录的总条数
m_min_supp_count = 0; //最小支持度数
m_show_message = _T(""); //显示状态信息
show_supp_count=true; //显示结果中以最小指出度数来显示
m_run_time = 0.0; //运行时间
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CMushroomTestView::~CMushroomTestView()
{
delete [] DB;//释放内存
delete [] C;//释放内存
delete [] L;//释放内存
}
void CMushroomTestView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMushroomTestView)
DDX_Control(pDX, IDC_List_FreqItem, m_List_FreqItem);
DDX_Text(pDX, IDC_min_supp, m_min_supp);
DDV_MinMaxFloat(pDX, m_min_supp, 0.15f, 1.f);
DDX_Text(pDX, IDC_total_num, m_total_num);
DDX_Text(pDX, IDC_min_supp_count, m_min_supp_count);
DDX_Text(pDX, IDC_show_message, m_show_message);
DDX_Text(pDX, IDC_run_time, m_run_time);
//}}AFX_DATA_MAP
}
BOOL CMushroomTestView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CMushroomTestView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_mushroomTestSet;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView printing
BOOL CMushroomTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMushroomTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMushroomTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView diagnostics
#ifdef _DEBUG
void CMushroomTestView::AssertValid() const
{
CRecordView::AssertValid();
}
void CMushroomTestView::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CMushroomTestDoc* CMushroomTestView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMushroomTestDoc)));
return (CMushroomTestDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView database support
CRecordset* CMushroomTestView::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CMushroomTestView message handlers
void CMushroomTestView::HashDB()
{
//////////////////////////////////////////////////////////////////////////////
//名称:HashDB
//功能:对数据库进行扫描,得到数据库的各个记录的信息,为
// 数字化测试子集做基础
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
int m='z';
int n;
int k;
long i;
char D[24];
CString strtemp;
DB=new int[nDbItemCount+1];//用来保存对数据库扫描后得到的信息数值
if(!DB)
MessageBox("初始化失败!");
m_pSet->MoveFirst();
i=1;
while (! m_pSet->IsEOF())
{
strtemp= m_pSet->m_item1 + m_pSet->m_item2+ m_pSet->m_item3 + m_pSet->m_item4 +
m_pSet->m_item5 + m_pSet->m_item6 + m_pSet->m_item7 + m_pSet->m_item8 +
m_pSet->m_item9 + m_pSet->m_item10 + m_pSet->m_item11 + m_pSet->m_item12 +
m_pSet->m_item13 + m_pSet->m_item14 + m_pSet->m_item15 + m_pSet->m_item16 +
m_pSet->m_item17 + m_pSet->m_item18 + m_pSet->m_item19 + m_pSet->m_item20 +
m_pSet->m_item21 + m_pSet->m_item22 + m_pSet->m_item23;
/*strtemp= m_pSet->m_item1 + m_ps + m_pset->m_item3 + m_pset->m_item4;
m_pset->m_item5 + m_pset->m_item6 + m_pset->m_item7 + m_pset->m_item8 +
m_pset->m_item9 + m_pset->m_item10 + m_pset->m_item11 + m_pset->m_item12 +
m_pset->m_item13 + m_pset->m_item14 + m_pset->m_item15 + m_pset->m_item16 +
m_pset->m_item17 + m_pset->m_item18 + m_pset->m_item19 + m_pset->m_item20 +
m_pset->m_item21 + m_pset->m_item22 + m_pset->m_item23;*/
//在对 m_pSet 进行整体修改(局部查找替换)时,不留意,把S小写了,造成23处错误,即m_pset 无法识别
//essageBox(strtemp);
n=strlen(strtemp);
strcpy(D,strtemp);
DB [i]=0;
for (int j=0;j<n;j++)
{
k=1;
DB[i]+=k<<(int)(m-D[j]);
}
m_pSet->MoveNext();
// strtemp.Format("%s%d%s%d","DB[",i,"]=",DB[i]);
// MessageBox(strtemp,NULL,MB_OK);
i++;//注意 在这里要对i加1,原来的程序中由于循环时自动对其加1,现在的循环
//中没有对其修改的表到式,导致了i一直是1,使DB[i]无法在新的地址保存新的值
}
}
void CMushroomTestView::check_supp(int num,int no)
{
//////////////////////////////////////////////////////////////////////////////
//名称:check_supp(int num,int no)
//功能:数字化测试子集,num是要测试的记录的总条数
// no子集的长度
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
CString strtemp;
int k,m;
long i,j;
int check;
m='z';
for(i=1;i<=num;i++)//for1
{
check=0;
C[i].min_supp_count=0;
for (j=0;j<no;j++)//for2
{
k=1;
check+=(int)(k<<(m-C[i].item[j]));
}//end for2
for (j=1;j<=nDbItemCount;j++)//for3
{
if (check==(check&DB[j]))
{
C[i].min_supp_count+=1;//子集存在,支持度数加1
}
}//end for3
//strtemp.Format("%s%d%s%s%s%d","C[",i,"]=",C[i].item," ",C[i].min_supp_count);
// MessageBox(strtemp,NULL,MB_OK);
}//end for1
}//end check_supp(int num,int no)
void CMushroomTestView::C1()
{
//////////////////////////////////////////////////////////////////////////////
//名称:C1()
//功能:初始化候选集数组,并测试1项候选集的支持度数
//日期:2006.06.16-17
/////////////////////////////////////////////////////////////////////////////
C=new C_Node [27];
strcpy(C[1].item,"a");
strcpy(C[2].item,"b");
strcpy(C[3].item,"c");
strcpy(C[4].item,"d");
strcpy(C[5].item,"e");
strcpy(C[6].item,"f");
strcpy(C[7].item,"g");
strcpy(C[8].item,"h");
strcpy(C[9].item,"i");
strcpy(C[10].item,"j");
strcpy(C[11].item,"k");
strcpy(C[12].item,"l");
strcpy(C[13].item,"m");
strcpy(C[14].item,"n");
strcpy(C[15].item,"o");
strcpy(C[16].item,"p");
strcpy(C[17].item,"q");
strcpy(C[18].item,"r");
strcpy(C[19].item,"s");
strcpy(C[20].item,"t");
strcpy(C[21].item,"u");
strcpy(C[22].item,"v");
strcpy(C[23].item,"w");
strcpy(C[24].item,"x");
strcpy(C[25].item,"y");
strcpy(C[26].item,"z");
C[0].min_supp_count=26; //1 项候选集的个数,在本算法中,用C[0].min_supp_count来保存候选集Cn的个数
check_supp(26,1);
} //end of C1()
void CMushroomTestView::Cn(int n)
{
//////////////////////////////////////////////////////////////////////////////
//名称:Cn(int n)
//功能:用频繁集Ln-1为基础,通过连接得到n项候选集Cn,并测试n项候选集的支持度数
//日期:2006.06.16-17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -