集合相等问题
来源:互联网 发布: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,故该算
法的时间复杂度为。
- 集合相等问题
- 集合相等问题
- 集合相等问题 oj
- sdut_java_集合相等问题
- 集合相等问题
- 集合相等问题
- 集合相等问题
- 集合相等问题
- 蒙特卡罗算法解决两集合相等问题
- Java sdut acm 1791 集合相等问题
- Java -- Sdut acm 1791 集合相等问题
- 集合相等问题 sdut1791 (set简单用法)
- 集合相等
- 集合相等问题(java sort排序数组长度问题)
- 1767相等元素问题
- 相等元素问题
- 字符串相等问题
- PHP相等的问题
- 微信小程序中的动态设置导航条
- 第八届蓝桥杯第10题k倍区间
- Objective-C学习之NSDate简单使用说明
- 前后台获取当前用户城市【根据IP获取城市】
- 二维数组列最小值
- 集合相等问题
- 解决ubuntu16.04软件中心闪退问题
- C语言的变长参数 va_arg
- redis初学
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 动态规划入门(三)
- ajax 省份地区三级联动
- 西部数据移动硬盘识别不了
- Qt之LiteIDE中漂亮的几款QSS