📄 disone.cpp
字号:
// DisOneDoc1.cpp: implementation of the CDisOneDoc class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RSet.h"
#include "fstream.h"
#include "DisOne.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDisOne::CDisOne()
{
infotable=NULL;
att_val=NULL;
interval=NULL;
formulas=NULL;
matrix=NULL;
cut=NULL;
new_table=NULL;
pAttName=NULL;
pDataType=NULL;
pStringTable=NULL;
}
CDisOne::~CDisOne()
{
int i; //循环变量
if(interval!=NULL)
{
for(i=0;i<iAttNum;i++)
delete []interval[i];
delete []interval;
}
if(infotable!=NULL)
{
for(i=0;i<iRecordNum;i++)
delete []infotable[i];
delete []infotable;
}
if(att_val!=NULL)
{
for(i=0;i<iAttNum;i++)
delete []att_val[i];
delete []att_val;
}
if(cut!=NULL)
{
for(i=0;i<iAttNum;i++)
delete []cut[i];
delete []cut;
}
if(new_table!=NULL)
{
for(i=0;i<iRecordNum;i++)
delete []new_table[i];
delete []new_table;
}
if(pAttName)
{
for(i=0;i<iAttNum+1;i++)
delete []pAttName[i];
delete[] pAttName;
}
if(pDataType)
{
for(i=0;i<iAttNum+1;i++)
delete []pDataType[i];
delete[] pDataType;
}
if(pStringTable)
{
for(i=0;i<iRecordNum;i++)
{
for(int j=0;j<iAttNum+1;j++)
delete[] pStringTable[i][j];
delete[] pStringTable[i];
}
delete[] pStringTable;
}
}
BOOL CDisOne::OnDisOne()
{
int matrix_row; //矩阵的行数
int matrix_col; //矩阵的列数
int i = load_table();
if(i==1)
{
get_att_val();
matrix_row=logic();
matrix_col=init_matrix(matrix_row);
findcuts(matrix_row,matrix_col);
make_new_table();
return TRUE;
}
return FALSE;
}
int CDisOne::get_att_val()
{
int i,j; //循环变量
int n; //记录数
att_val=new float * [iAttNum];
float * val=new float[iRecordNum+1];
for(i=0;i<iAttNum;i++)
{
n=get_rec_num(i,val);
try
{
att_val[i]=new float[n+1];
}
catch(CMemoryException * e)
{
::MessageBeep(MB_ICONHAND);
AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
e->Delete();
return -2;
}
for(j=0;j<n+1;j++)
att_val[i][j]=val[j];
}
selectsort(att_val);
interval=new float *[iAttNum];
for(i=0;i<iAttNum;i++)
{
interval[i]=new float[(int)att_val[i][0]];
interval[i][0]=att_val[i][0]-1;
for(j=1;j<att_val[i][0];j++)
interval[i][j]=(att_val[i][j]+att_val[i][j+1])/2;
}
delete val;
return 1;
}
int CDisOne::get_rec_num(int att, float *val)
{
int i,j; //循环变量
bool find=FALSE;
val[0]=0;
for(i=0;i<iRecordNum;i++)
{
for(j=0;j<val[0];j++)
if(infotable[i][att]==val[j+1])
{
find=TRUE;
break;
}
if(find==FALSE)
{
val[0]++;
val[(int)val[0]]=infotable[i][att];
}
find=FALSE;
}
return (int)val[0];
}
void CDisOne::selectsort(float **val)
{
int i,j,k; //循环变量
int mini=0;
float middle_val;
for(i=0;i<iAttNum;i++)
for(j=1;j<(int)val[i][0];j++)
{
mini=j;
for(k=j+1;k<(int)val[i][0]+1;k++)
if(val[i][k]<val[i][mini])
mini=k;
if(mini!=j)
{
middle_val=val[i][j];
val[i][j]=val[i][mini];
val[i][mini]=middle_val;
}
}
}
int CDisOne::logic()
{
int i,j,k,m; //循环变量
int count=0;
int recnum1,recnum2,distance;
float val1,val2;
for(i=0;i<iRecordNum-1;i++)
for(j=i+1;j<iRecordNum;j++)
if(infotable[i][iAttNum]!=infotable[j][iAttNum])
count++;
formulas=new float ** [count];
count=0;
for(i=0;i<iRecordNum-1;i++)
for(j=i+1;j<iRecordNum;j++)
if(infotable[i][iAttNum]!=infotable[j][iAttNum])
{
formulas[count]=new float * [iAttNum];
for(k=0;k<iAttNum;k++)
{
formulas[count][k]=new float[(int)interval[k][0]+1];
recnum1=search(infotable[i][k],k);
recnum2=search(infotable[j][k],k);
distance=abs(recnum2-recnum1);
formulas[count][k][0]=(float)distance;
if(recnum1<recnum2)
for(m=1;m<distance+1;m++)
{
val1=att_val[k][recnum1];
val2=att_val[k][recnum1+1];
formulas[count][k][m]=(val1+val2)/2;
recnum1++;
}
if(recnum1>recnum2)
for(m=1;m<distance+1;m++)
{
val1=att_val[k][recnum2];
val2=att_val[k][recnum2+1];
formulas[count][k][m]=(val1+val2)/2;
recnum2++;
}
}
count++;
}
return count;
}
int CDisOne::init_matrix(int rows)
{
int i,j,k,m; //循环变量
int cols=0; //定义矩阵的行数列数
bool find=FALSE;
int num=0; //矩阵列数
matrix=new int * [rows];
for(i=0;i<iAttNum;i++)
num+=(int)interval[i][0];
for(i=0;i<rows;i++)
{
matrix[i]=new int[num];
for(j=0;j<iAttNum;j++)
for(k=0;k<(int)interval[j][0];k++)
{
if((int)formulas[i][j][0]==0)
matrix[i][cols]=0;
if((int)formulas[i][j][0]>0)
{
for(m=0;m<(int)formulas[i][j][0];m++)
if(interval[j][k+1]==formulas[i][j][m+1])
{
matrix[i][cols]=1;
find=TRUE;
break;
}
if(find==FALSE)
matrix[i][cols]=0;
find=FALSE;
}
cols++;
}
cols=0;
}
for(i=0;i<iAttNum;i++)
cols+=(int)interval[i][0];
for(i=0;i<rows;i++)
for(j=0;j<iAttNum;j++)
delete []formulas[i][j];
for(i=0;i<rows;i++)
delete []formulas[i];
delete []formulas;
return cols;
}
void CDisOne::findcuts(int rows, int cols)
{
int i,j; //循环变量
int * cuts=new int[cols+1]; //定义断点
cuts[0]=0; //设置断点的初始个数
int num;
int remains; //未处理的矩阵元素个数
int maxvalue;//含1最多的列
int minvalue; //在含1最多的列相等的情况下,求行的最小值
int maxnum; //含1最多的列中1的个数
int maxcol=0;
int **maxcols=new int*[cols];
for(i=0;i<cols;i++)
maxcols[i]=new int[2];
int * countcols=new int[cols]; //各列中含1的个数
int * countrows=new int[rows];
//初始化各列1的总和以及各行1的总和
for(i=0;i<cols;i++)
{
countcols[i]=0;
for(j=0;j<2;j++)
maxcols[i][j]=0;
}
for(i=0;i<rows;i++)
countrows[i]=0;
for(i=0;i<cols;i++)
for(j=0;j<rows;j++)
if(matrix[j][i]==1)
countcols[i]++;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
if(matrix[i][j]==1)
countrows[i]++;
do
{
maxnum=0;
maxvalue=0;
remains=0;
//先选列值为1总和最多的断点,
//当有两列以上都为最多时,看行的总数
//选取行总数最少的断点
for(i=0;i<cols;i++)
if(maxvalue<countcols[i])
maxvalue=countcols[i];
for(i=0;i<cols;i++)
if(countcols[i]==maxvalue)
maxnum++;
if(maxnum==1)//只有一列1的总数最多
{
for(i=0;i<cols;i++)
if(countcols[i]==maxvalue)
maxcol=i;
}
else if(maxnum>1)//1的总数最多的列不止一个
{
num=0;
maxcols[num][0]=maxnum;
for(i=0;i<cols;i++)
if(countcols[i]==maxvalue)
{
num++;
maxcols[num][0]=i;
}
//判断行总数最少的列
num=1;
int num1=0;
for(i=0;i<maxnum;i++)
{
for(j=0;j<rows;j++)
if(matrix[j][maxcols[num][0]]==1)
num1+=countrows[i];
//行为1的数放在maxcols[num][1]中
maxcols[num][1]=num1;
num++;
num1=0;
}
num=1;
maxvalue=0;
for(i=0;i<maxnum;i++)
{
if(maxvalue<maxcols[num][1])
maxvalue=maxcols[num][1];
num++;
}
num=1;
minvalue=maxvalue;
for(i=0;i<maxnum;i++)
{
if(minvalue>maxcols[num][1])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -