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

📄 m-in.cpp

📁 数据隐私保护K-匿名问题的动态多次发布类似m-invarience算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					for(j=0;j<buc[tmp3].dnum;j++)
					{
						if(strcmp(buc[tmp3].dis[j].disease,distable[choose[i]].disease)==0)
						{
							for(k=0;k<tmp1;k++)
							{
								distable[choose[i]].pnum--;
								buc[tmp3].dis[j].people[buc[tmp3].dis[j].pnum++]=distable[choose[i]].people[distable[choose[i]].pnum];
								remain--;
								if(distable[choose[i]].pnum==0)
									remain_dis--;
							}
						}
					}
				}
			}
		}
	}
}
void split(void)
{
	int i,j,k,g,h,tmp,tmp2;
	int id=1,min,max,minzip,maxzip,zip,znum;
	bool flag1,flag2,flagzip,flagznum;
	FILE *fptr;
	FILE *fptr2;
	
	char old[20];
	char newfile[20];
	//printf("发布人员文件名称\n");
	//scanf("%s",old);
	//printf("匿名结果文件名称\n");
	//scanf("%s",newfile);
	
	itoa(fnum,newfile,10);
	strcat(newfile,"ggg.txt");
	fnum++;
	if((fptr=fopen(newfile,"w"))==NULL)
		printf("result 失败\n");
	if((fptr2=fopen("r.txt","w"))==NULL)
		printf("匿名结果失败\n");
	//for(i=0;i<bnum;i++)																	//确定桶内虚拟元素个数
	{
		if(buc[i].flag==true)
			if(buc[i].cnum>buc[i].dis[0].pnum)
				buc[i].flag=false;
	}
	
	for(i=0;i<bnum;i++)																	//桶内元素排序
	{
		if(buc[i].flag==true)
		{
			for(j=0;j<buc[i].dis[0].pnum;j++)
			{
				for(k=0;k<buc[i].dnum;k++)
				{
					for(g=1;g<buc[i].dis[k].pnum;g++)
					{
						for(h=buc[i].dis[k].pnum-1;h>=g;h--)
						{
							if(buc[i].dis[k].people[h]==-1)
							{
								buc[i].dis[k].people[h]=buc[i].dis[k].people[h-1];
								buc[i].dis[k].people[h-1]=-1;
							}
							else if(np[buc[i].dis[k].people[h]].zip>150000&&np[buc[i].dis[k].people[h]].zip<160000)
							{
								if(np[buc[i].dis[k].people[h-1]].zip>150000&&np[buc[i].dis[k].people[h-1]].zip<160000)
								{
									if(np[buc[i].dis[k].people[h]].age<=np[buc[i].dis[k].people[h-1]].age)
									{
										tmp=buc[i].dis[k].people[h];
										buc[i].dis[k].people[h]=buc[i].dis[k].people[h-1];
										buc[i].dis[k].people[h-1]=tmp;
									}
									else if(np[buc[i].dis[k].people[h]].age==np[buc[i].dis[k].people[h-1]].age)
										if(np[buc[i].dis[k].people[h]].zip<=np[buc[i].dis[k].people[h-1]].zip)
										{
											tmp=buc[i].dis[k].people[h];
											buc[i].dis[k].people[h]=buc[i].dis[k].people[h-1];
											buc[i].dis[k].people[h-1]=tmp;
										}
								}
								else
								{
									tmp=buc[i].dis[k].people[h];
									buc[i].dis[k].people[h]=buc[i].dis[k].people[h-1];
									buc[i].dis[k].people[h-1]=tmp;
								}
							}
							else
							{
								if(np[buc[i].dis[k].people[h-1]].zip<150000||np[buc[i].dis[k].people[h-1]].zip>160000)
									if(np[buc[i].dis[k].people[h]].zip<=np[buc[i].dis[k].people[h-1]].zip)
										{
											tmp=buc[i].dis[k].people[h];
											buc[i].dis[k].people[h]=buc[i].dis[k].people[h-1];
											buc[i].dis[k].people[h-1]=tmp;
										}
							}
						}
					}
				}
			}
		}
	}
	for(i=0;i<bnum;i++)																	//对桶内元素进行处理
	{
		if(buc[i].flag==true)
		{
			flag1=false;
			flag2=true;
			flagzip=false;
			flagznum=false;
			
			
			for(j=0;j<buc[i].dis[0].pnum;j++)
			{
				tmp=buc[i].cnum;
				for(k=0;k<buc[i].dnum;k++)
				{
					if(flag1==false)
						if(buc[i].dis[k].people[j]==-1)
						{
							flag1=true;
							tmp--;
							if(tmp==0)
								break;
						}
					else
					{
						g=j;
						while(buc[i].dis[k].people[g]==-1)
							g++;
						if(g!=j)
						{
							buc[i].dis[k].people[j]=buc[i].dis[k].people[g];
							buc[i].dis[k].people[g]=-1;
						}
						tmp--;
						if(tmp==0)
							break;
						
					}

				}
			}
			for(j=0;j<buc[i].dis[0].pnum;j++)
			{
				min=10000;
				max=0;
				minzip=900000;
				maxzip=0;
				znum=1;
				tmp=0;
				while(buc[i].dis[tmp].people[j]==-1)
					tmp++;
				zip=np[buc[i].dis[tmp].people[j]].zip/10000;
				for(k=0;k<buc[i].dnum;k++)
				{
					if(buc[i].dis[k].people[j]!=-1)
						if(zip!=np[buc[i].dis[k].people[j]].zip/10000)
						{
							flag2=false;
							break;
						}
				}
				zip=np[buc[i].dis[tmp].people[j]].zip;
				for(k=0;k<buc[i].dnum;k++)
				{
					if(buc[i].dis[k].people[j]!=-1)
					{
						if(np[buc[i].dis[k].people[j]].age<min)
							min=np[buc[i].dis[k].people[j]].age;
						if(np[buc[i].dis[k].people[j]].age>max)
							max=np[buc[i].dis[k].people[j]].age;
						if(flag2==true)
						{
							tmp=caculate_digit(zip,np[buc[i].dis[k].people[j]].zip);
							if(znum<tmp)
								znum=tmp;
						}
						else
						{
							if(np[buc[i].dis[k].people[j]].zip<minzip)
								minzip=np[buc[i].dis[k].people[j]].zip;
							if(np[buc[i].dis[k].people[j]].zip>maxzip)
								maxzip=np[buc[i].dis[k].people[j]].zip;
						}
					}
					np[buc[i].dis[k].people[g]].flag=true;
				}
				if(min>max-2)
					max=max+3;
				for(k=0;k<buc[i].dnum;k++)					//打印
				{
					if(flag2==true)
					{
						if(buc[i].dis[k].people[j]==-1)
							fprintf(fptr,"%d c \t \t %s\n",id,buc[i].dis[k].disease);
						else
							fprintf(fptr,"%d %s %d %d %s\n",id, np[buc[i].dis[k].people[j]].name,np[buc[i].dis[k].people[j]].age, np[buc[i].dis[k].people[j]].zip, buc[i].dis[k].disease);
						tmp=10;
						tmp2=znum;
						while(tmp2!=1)
						{
							tmp*=10;
							tmp2--;
						}
						fprintf(fptr2,"%d [%d-%d] %d",id, min, max, zip/tmp);
					//	printf("%d [%d-%d] %d",id, min, max, zip/tmp);
						tmp2=znum;
						while(tmp2!=0)
						{
							fprintf(fptr2,"*");
							//printf("*");
							tmp2--;
						}
						fprintf(fptr2,"%s\n",buc[i].dis[k].disease);
						//printf("%s\n",buc[i].dis[k].disease);
					}
					else
					{
						if(buc[i].dis[k].people[j]==-1)
							fprintf(fptr,"%d c \t \t %s\n",id,buc[i].dis[k].disease);
						else
							fprintf(fptr,"%d %s %d %d %s\n",id, np[buc[i].dis[k].people[j]].name,np[buc[i].dis[k].people[j]].age, np[buc[i].dis[k].people[j]].zip, buc[i].dis[k].disease);
						fprintf(fptr2,"%d [%d-%d] %dk-%dk %s\n",id, min, max, minzip/1000, maxzip/1000, buc[i].dis[k].disease);
					//	printf("%d [%d-%d] %dk-%dk %s\n",id, min, max, minzip/1000, maxzip/1000, buc[i].dis[k].disease);
					}
				}
				id++;
				if(id==173)
				{
					int bb=100;
				}
			}
		}
	}
}

int hash(int key)		//hash的映射函数
{
	int result;
	result=key/100;
	return result;
}
int f(int num)			//hash的key计算函数
{
	int i,j,result=0,tmp=1;
	char c[20];
	for(i=0;i<num;i++)
	{
		tmp=1;
		strcpy(c,SA[i].disease);
		for(j=0;j<strlen(c);j+=2)
		{
			result=result+(c[j]+100)*(c[j+1]+100)+(SA[i].disease[j]+10000)/(SA[i].disease[j+1]+100);
			//tmp*=(SA[i].disease[j]+SA[i].disease[j+1]+200);
		}
	}
	for(i=0;i<num;i++)
	{
		for(j=num-1;j>=i;j--)
		{
			if((SA[i].disease[0]+SA[i].disease[3]+200)>(SA[j].disease[0]+SA[j].disease[3]+200))
			{
				strcpy(c,SA[i].disease);
				strcpy(SA[i].disease,SA[j].disease);
				strcpy(SA[j].disease,c);
			}
		}
	}
	strcpy(SA[num].disease,SA[0].disease);
	for(i=1;i<num;i++)
		strcat(SA[num].disease,SA[i].disease);
	result+=num*num+tmp;
	return result;
}

int searchhash(int key, char disease[])//查找hash表
{
	int pos,i,result=-1;
	bool flag=false;
	pos=hash(key);
	
	if (hashtable[pos].flag==false)
		return result;
	else
	{
		for(i=0;i<50;i++)
		{
			if(hashtable[pos].flag==true)
				if(strcmp(hashtable[pos].disease,disease)==0)
				{
					result=hashtable[pos].bnumber;
					flag=true;
					break;
				}
			pos++;
		}
	}
	if(flag==false)
		result=-2;
	return result;
	
}
void inserthash(int key, char disease[],int bnumber)//插入hash表
{
	int pos=0;
	pos=hash(key);
	if (searchhash(key, disease)==-1)
	{
		strcpy(hashtable[pos].disease,disease);
		hashtable[pos].bnumber=bnumber;
		hashtable[pos].flag=true;
	}
	else if(searchhash(key, disease)==-2)
	{
		while(hashtable[pos].flag==true)
			pos++;
		strcpy(hashtable[pos].disease,disease);
		hashtable[pos].bnumber=bnumber;
		hashtable[pos].flag=true;
	}
}

int hashdisease(char dis[])		//hash的映射函数
{
	int i,j,result=0;
	for(i=0;i<strlen(dis);i++)
		result+=dis[i]+100;
	result=result/10;
	return result;
}
int searchdis(char dis[])		//查找hash表
{
	int pos,i,result=-1;
	bool flag=false;
	pos=hashdisease(dis);
	if (hashdis[pos].flag==false)
		return result;
	else
	{
		for(i=0;i<50;i++)
		{
			if(hashdis[pos].flag==true)	
				if(strcmp(hashdis[pos].disease,dis)==0)
				{
					result=hashdis[pos].dnumber;
					flag=true;
					break;
				}
			pos++;
		}
	}
	if(flag==false)
		result=-2;
	return result;
}
void insertdis(char dis[], int dnumber)	//插入hash表
{
	int pos=0;
	pos=hashdisease(dis);
	if (searchdis(dis)==-1)
	{
		strcpy(hashdis[pos].disease,dis);
		hashdis[pos].dnumber=dnumber;
		hashdis[pos].flag=true;
	}
	else if(searchdis(dis)==-2)
	{
		while(hashdis[pos].flag!=false)
			pos++;
		strcpy(hashdis[pos].disease,dis);
		hashdis[pos].dnumber=dnumber;
		hashdis[pos].flag=true;
	}
}

void create_tree(void)
{
	tree a,b,c,d,e;
	a=new t_node;
	strcpy(a->disease,"感冒");
	strcpy(dislist[0].disease,"感冒");
	dislist[0].height=3;
	dislist[0].T=a;
	
	b=new t_node;
	strcpy(b->disease,"支气管炎");
	strcpy(dislist[1].disease,"支气管炎");
	dislist[1].height=3;
	dislist[1].T=b;
	
	a->father=new t_node;
	b->father=a->father;
	c=a->father;
	strcpy(c->disease,"呼吸感染");
	
	a=new t_node;
	strcpy(a->disease,"肺炎");
	strcpy(dislist[2].disease,"肺炎");
	dislist[2].height=3;
	dislist[2].T=a;
	
	b=new t_node;
	strcpy(b->disease,"肺结核");
	strcpy(dislist[3].disease,"肺结核");
	dislist[3].height=3;
	dislist[3].T=b;

	a->father=new t_node;
	b->father=a->father;
	d=a->father;
	strcpy(d->disease,"肺部疾病");
	
	c->father=new t_node;
	d->father=c->father;
	c=c->father;
	strcpy(c->disease,"呼吸系统疾病");

	a=new t_node;
	strcpy(a->disease,"胃炎");
	strcpy(dislist[4].disease,"胃炎");
	dislist[4].height=3;
	dislist[4].T=a;
	
	b=new t_node;
	strcpy(b->disease,"胃癌");
	strcpy(dislist[5].disease,"胃癌");
	dislist[5].height=3;
	dislist[5].T=b;

	a->father=new t_node;
	b->father=a->father;
	d=a->father;
	strcpy(d->disease,"胃部疾病");

	a=new t_node;
	strcpy(a->disease,"肠炎");
	strcpy(dislist[6].disease,"肠炎");
	dislist[6].height=3;
	dislist[6].T=a;
	
	b=new t_node;
	strcpy(b->disease,"肠癌");
	strcpy(dislist[7].disease,"肠癌");
	dislist[7].height=3;
	dislist[7].T=b;

	a->father=new t_node;
	b->father=a->father;
	a=a->father;
	strcpy(a->disease,"肠部疾病");

	a->father=new t_node;
	d->father=a->father;
	a=a->father;
	strcpy(a->disease,"消化系统疾病");

	c->father=new t_node;
	a->father=c->father;
	root=a->father;
	strcpy(root->disease,"呼吸和消化系统疾病");

	a=new t_node;
	strcpy(a->disease,"沙眼");
	strcpy(dislist[8].disease,"沙眼");
	dislist[8].height=3;
	dislist[8].T=a;
	
	b=new t_node;
	strcpy(b->disease,"角膜炎");
	strcpy(dislist[9].disease,"角膜炎");
	dislist[9].height=3;
	dislist[9].T=b;
	
	a->father=new t_node;
	b->father=a->father;
	c=a->father;
	strcpy(c->disease,"眼部疾病");

	a=new t_node;
	strcpy(a->disease,"鼻息肉");
	strcpy(dislist[10].disease,"鼻息肉");
	dislist[10].height=3;
	dislist[10].T=a;
	
	b=new t_node;
	strcpy(b->disease,"中耳炎");
	strcpy(dislist[11].disease,"中耳炎");
	dislist[11].height=3;
	dislist[11].T=b;

	d=new t_node;
	strcpy(d->disease,"喉炎");
	strcpy(dislist[12].disease,"喉炎");
	dislist[12].height=3;
	dislist[12].T=d;

	a->father=new t_node;
	b->father=a->father;
	d->father=a->father;
	a=a->father;
	strcpy(a->disease,"耳鼻喉疾病");

	a->father=new t_node;
	c->father=a->father;
	c=a->father;
	strcpy(c->disease,"五官疾病");
	c->father=root;

	a=new t_node;
	strcpy(a->disease,"唇裂");
	strcpy(dislist[13].disease,"唇裂");
	dislist[13].height=3;
	dislist[13].T=a;
	
	b=new t_node;
	strcpy(b->disease,"牙瘤");
	strcpy(dislist[14].disease,"牙瘤");
	dislist[14].height=3;
	dislist[14].T=b;
	
	d=new t_node;
	a->father=d;
	b->father=a->father;
	strcpy(d->disease,"口腔疾病");
	d->father=c;

	a=new t_node;
	strcpy(a->disease,"神经衰弱");
	strcpy(dislist[15].disease,"神经衰弱");
	dislist[15].height=3;
	dislist[15].T=a;
	
	b=new t_node;
	strcpy(b->disease,"失眠");
	strcpy(dislist[16].disease,"失眠");
	dislist[16].height=3;
	dislist[16].T=b;
	
	a->father=new t_node;
	b->father=a->father;
	c=a->father;
	strcpy(c->disease,"神经科");
	c->father=new t_node;
	c=c->father;
	strcpy(c->disease,"神经疾病");
	c->father=root;
}
int caculate(char a[], char b[])
{
	int i,d1,d2,distance,num=0;
	tree t1,t2;
	bool flag=false;
	for (i=0;i<disnum;i++)
	{
		if(strcmp(dislist[i].disease,a)==0)
		{
			d1=i;
			if(flag==true)
				break;
			else
				flag=true;
		}
		if(strcmp(dislist[i].disease,b)==0)
		{
			d2=i;
			if(flag==true)
				break;
			else
				flag=true;
		}
	}
	if(dislist[d1].height<dislist[d2].height)
	{
		i=d1;
		d1=d2;
		d2=i;
	}
	i=dislist[d1].height;
	t1=dislist[d1].T;
	t2=dislist[d2].T;
	while(i!=dislist[d2].height)
	{
		i--;
		t1=t1->father;
	}
	while(t1!=t2)
	{
		t1=t1->father;
		t2=t2->father;
	}
	while(t1!=root)
	{
		num++;
		t1=t1->father;
	}
	distance=maxheight-num;
	return distance;
}
int caculate_digit(int i, int j)	//计算邮编
{
	int result=4;
	if((i/1000)==(j/1000))
	{
		result--;
		if((i/100)==(j/100))
		{
			result--;
			if((i/10)==(j/10))
				result--;
		}
	}
	return result;
}

⌨️ 快捷键说明

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