集合相等问题

来源:互联网 发布:Centos安装jdk 编辑:程序博客网 时间:2024/06/09 23:26

实验十五    集合相等问题

1、问题描述:
 ?       给定2个集合S和T,试设计一个判定S和 T是否相等的蒙特卡罗算法。
 
2、题目分析:
 题目要求用蒙特卡罗算法进行求解,随机选择集合S中的元素与集合T中的元素进行比较,若随机选择很多次都能从集合T中找到与之对应的相等,则集合S和T相等。
 
3、算法设计:
a. 蒙特卡罗算法Majority对从集合S中随机选择的数组元素x,测试集合T中是否有
与之相等的元素:若算法返回的结果为true,则集合T中有与x相等的元素;若返回false,
则集合T中不存在与x相等的元素,因而集合S和 T不相等。
b. 算法MajorityMC重复调用次算法Majority,调用过程中若Majority
返回true则继续调用,否则可以判定集合S和 T不相等(MajorityMC返回false)。
c. 主函数调用算法MajorityMC:若返回true,则集合T和集合S相等;若返回false,
则集合S和 T不相等。
 
4、源程序:

#include<stdio.h>
#include<stdlib.h> 
#include<math.h>
#include <time.h>

bool Majority(int *S,int *T,int n)
{
 int i,j,x;
 bool k;
 time_t t; 
 //利用随机函数rand求0—n-1的随机数i
    srand((unsigned)time(&t)); 
 i=rand()%(n)-1;
 x=S[i];
 k=0;
 for(j=0;j<n;j++)
 {
  if(T[j]==x)
   k=1;
 }
 return k;
}

bool MajorityMC(int *S,int *T,int n)
{//重复次调用算法Majority
 int k;
 double e;
 e=0.00001;
//利用函数ceil求
 k=(int)ceil(log(1/e));
 for(int i=1;i<=k;i++)
 {
  if(!Majority(S,T,n))
   return 0;
 }
 return 1;
}

main()
{
 int i,n;
 int S[100000],T[100000];
 scanf("%d",&n);
 for(i=0;i<n;i++)
  scanf("%d",&S[i]);
 for(i=0;i<n;i++)
  scanf("%d",&T[i]);
 if(MajorityMC(S,T,n))
  printf("YES");
 else printf("NO");
 return 0;
}

5、算法分析:
 蒙特卡罗算法Majority的时间复杂度为O(n);算法MajorityMC重复调用
 次算法Majority,时间复杂度为;主函数调用算法MajorityMC,故该算
 法的时间复杂度为。

0 0
原创粉丝点击