您的位置:首页 > 其它

表验证

2015-10-26 14:18 155 查看
通常,我们需要比较表来验证他们是否相同,或者找出相异的元素,因此表验证问题实际上就是把一个表的每个关键字作为待查关键字,对另一个表进行重复查找,这里可以用随机表和有序表来设计表验证算法,假设有两个表list1和list2,其关键字分别为list[i].key, 0<=i<=n和list2[i].key,0<= j<=m,在验证中,需报告三种以下的情况:

关键字为list1[i].key的记录出现在第一个表(list1)中,但在第二个表(list2)中,没有与之相同的关键字记录。

关键字为list2[j].key的记录出现在第二个表(list2)中,但在第一个表(list1)中,没有与之相同的关键字记录。

list1[i].key=list2[j].key, 但这两个记录至少有另外一个域不匹配。

随机排列,其验证表整个算法的时间复杂度为O(mn).

代码实现:

//随机验证表算法
void verify1(element list1[],element list2[],int n,int m)
{
int i,j;
int marked[MAX_SIZE];
for(i=0;i<m;i++)
{
marked[i]=false;
}
for(i=0;i<n;i++)
{
//调用顺序查找
if((j=seqsearch(list2,list1[i].key,m))<0)
{b
printf("%d is not in list 2\n",list1[i].key);
}
else
{
marked[j]=true;
}
}
for(i=0;i<m;i++)
{
if(!marked[i])
{
printf("%d is not in list1\n",list2[i].key);
}
}
}


如果在验证前先对列表排序,那么该函数在最坏情况下渐进时间复杂度O(tsort(n)+tsort(m)+m+n), 其中tsort(n)是将list1中的n个记录进行排序所需的时间,排序算法中,可以用快排对其排序,而快排的时间复杂度为O(nlogn),故其整个算法时间复杂度为O(max[nlogn,mlogm]).

代码实现:

//快排的比较函数
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

//有序表验证算法
void verify2(element list1[],element list2[],int n,int m)
{
int i,j;
//快速排序算法排序
qsort(list1,n,sizeof(element),cmp);
qsort(list2,m,sizeof(element),cmp);
while(i<n&&j<m)
{
if(list1[i].key<list2[i].key)
{
printf("%d is not in list 2\n",list1[i].key);
}
else if(list1[i].key==list2[i].key)
{
i++,j++;
}
else
{
printf("%d is not in list 1\n",list2[j].key);
j++;
}
}
for(;i<n;i++)
printf("%d is not in list 2\n",list1[i].key);
for(;j<m;j++)
printf("%d is not in list 1\n",list2[j].key);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  表验证