表验证
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).
代码实现:
如果在验证前先对列表排序,那么该函数在最坏情况下渐进时间复杂度O(tsort(n)+tsort(m)+m+n), 其中tsort(n)是将list1中的n个记录进行排序所需的时间,排序算法中,可以用快排对其排序,而快排的时间复杂度为O(nlogn),故其整个算法时间复杂度为O(max[nlogn,mlogm]).
代码实现:
关键字为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); }
相关文章推荐
- pageContext对象的用法
- AES 加密及兼容
- CocoaPods 最近的一点小变化
- 2.12 主成分分析(上)
- Hadoop的配置文件
- Hive 安装教程
- android 水平progressBar动态加载
- android 水平progressBar动态加载
- careercup sumarry
- 简明 Vim 练级攻略
- 强制360浏览器选用IE9内核,以便支持HTML5,jquery2.0
- hdu5504 GT and sequence
- FLV封装原理
- burpsuite安装
- [UI界面]-UIImage的拉伸
- 杭电acm1860
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- unity3d 调用Start 注意
- 二叉树的实现
- C#字符串格式化(摘抄的,留下来用用)