文章目录

  • 题目描述
  • 思路分析
    • 蒙特卡罗知识回顾
      • 概述
      • 基本概念
    • 具体问题具体分析
  • 具体代码的运行
  • 分析与总结

题目描述

给定两个集合S和T,设计一个判定S和T是否相等的蒙特卡罗算法

思路分析

蒙特卡罗知识回顾
概述
  • 对于某些问题来说,近似解是没有意义的。使用蒙特卡洛算法能求得问题的一个解,这个解未必是正确的,正确解的概率依赖于算法所用时间。
  • 问题来了:是单次实现的运算结果还是多次实现的运算结果
  • 样例:主元素问题和素数问题
基本概念
  • 蒙特卡洛算法的正确和优势:如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于P,则称该蒙特卡洛算法是P正确的,且称p是该算法的优势。
  • 偏假性和偏真性:
    • 前提:设MC(x)是某个判定问题的蒙特卡洛算法。
    • 偏真性:当MC返回true时,解总是正确的;当她返回False是,有可能产生错误的解。简而言之,就是返回正确的解一定是对的,但是错误的解有可能不对。
    • 偏假性:与上面相反。
  • 一致性:对于同一个实例,如果重复调用蒙特卡洛算法所得到的结果是相互独立的,则称该算法是一致的。
具体问题具体分析
  • 判定两个集合是否相等,需要具有如下的作用:

    • 判定长度是否相等,
    • 从一个集合中随机抽取一个元素,在另外一个集合中,一定要有。
  • 判定长度是否相等,这里并不涉及到概率,所以这里默认两个的集合的长度是相等的。
  • 根据结果来看:
    • 如果返回false,这个结果一定正确,故整个算法是偏假的。
    • 如果返回true,结果不一定对,不一定错,而且问题的概率是取决于整个数组的长度,并不是固定的,而且随机性很大
  • 设想:先将数组中的元素进行排序,如果响应的概率和运算时间就会大大改变,只要随机数一个索引值,判定这两个数字是否相等就行。

具体代码的运行

#include<iostream>
#include<algorithm>
#include<time.h>
#include<cstdlib>using namespace std;/*描述:单独一次参数:num是数组元素a是第一个数组的首地址b是第二个数组的首地址返回:一次算法的计算结果
*/
bool MC(int num, int* a, int* b) {srand((unsigned)time(NULL));//从0到num之间随机一个数字int index = (rand() % num);//直接判定两个是否相等return a[index] == b[index];
}/*描述:多次蒙特卡罗算法的运算结果参数:times次数num是数组元素a是第一个数组的首地址b是第二个数组的首地址返回:多次运算的最终结果
*/
bool MCMultiple(int times, int num, int* a, int* b) {for (int i = 0; i < times; ++i){//这里是找了很多次,都是true,但是不一定是正确的结果//只要找到一个错误的结果,就是错误if (!MC(num, a, b)) {//如果返回false,说明一定是对的return false;}}//返回为truereturn true;
}int main(){int aNum = 0,bNum = 0;while (1) {cout << "请输入两个的数组的长度" << endl;cin >> aNum >> bNum;if (aNum != bNum){cout << "两个集合不相等" << endl;}//创建对应的数组int* a = new int[aNum];int* b = new int[bNum];cout << "请输入第一个数组的元素" << endl;for (int i = 0; i < aNum; ++i){cin >> a[i];}sort(a, a + aNum);cout << "请输入第二个数组的元素" << endl;for (int i = 0; i < bNum; ++i){cin >> b[i];}sort(b, b + bNum);//调用蒙特卡罗算法int times = 0;cout << "请输入逆要调用的次数" << endl;cin >> times;if (MCMultiple(times, aNum, a, b)) {cout << "两个集合相同" << endl;}else {cout << "两个集合不相同" << endl;}}return 0;
}

分析与总结

  • 首先一定要理解的偏真性和偏假性,这在多次蒙特卡洛中有很重要的作用。如果算法是偏真的,只要遇到假,就进行for循环;如果算法是偏假的,主要遇到真,就进行for循环。不一定正确的,就是循环,一定正确的,就跳出循环。

算法设计与分析——蒙特卡罗算法判定两个集合是否相等相关推荐

  1. 算法设计与分析——蒙特卡罗算法(简单、通俗、易懂)C++

    算法设计与分析--蒙特卡罗算法(简单.通俗.易懂) 虽然都是文字描述,但都是较为通俗的语言,相信你看完应该能理解 在实际应用中会遇到一些问题,不论采用确定性算法还是随机性算法,都无法保证每次能到到正确 ...

  2. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

  3. 计算机算法设计与分析教学大纲,算法设计与分析的教与学(教学大纲)

    原标题:算法设计与分析的教与学(教学大纲) 课程代码:**** 课程负责人: **** 课程中文名称:算法设计与分析 课程英文名称:Designand Analysis of Algorithms 课 ...

  4. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感

    <算法设计与分析基础>是一本由Anany levitin著作,清华大学出版社出版的胶版纸图书,本书定价:49.00元,页数:409,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助 ...

  5. 算法设计与分析 ——插入排序算法与归并排序算法比较

    插入排序算法与归并排序算法比较 实验目的 通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性. 实验内容 分别编写函数实现插入排序算法和归并排序算法: 利用随机函数产生大量数据存入数组 ...

  6. 算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

    YI时间|外刊|MM-DFW|机器学习系列 点击上方蓝字,关注给你写干货的松子茶 分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之.一个问题能够用分治法求解的要素是 ...

  7. 算法设计与分析python_Python算法设计与分析

    内容提要 本书内容包括算法初步.排序算法.查找.双指针问题.哈希算法.深度优先搜索算法.广度优先搜索算法.回溯算法.动态规划.贪心算法.分治算法.并查集.最短路径算法和数论算法等常见算法.每个算法都做 ...

  8. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  9. 【算法设计与分析】算法的时间复杂度(介绍O渐近上界,Ω渐近下界,θ准确的界)

    什么是时间复杂度? 我们先看看一些函数的渐近表达式: 关于时间复杂度的基本要点: 时间复杂度反映的是随着问题规模的变大,计算所需的时间的增长速度,与系数的多少关系不大 算法的渐近时间复杂度,简称时间复 ...

最新文章

  1. golang中字符串内置函数整理
  2. SQL调优--记一次表统计信息未及时更新导致查询超级慢
  3. 我的世界服务器背景音乐修改,我的世界怎么添加背景音乐 修改添加bgm音乐方法...
  4. 一文搞懂JAVA与GO垃圾回收
  5. usb协议规范_USB连接标准接口简述发布
  6. heartbeat与keepalived对比
  7. Python通过多帧静态图像制作GIF动态图像
  8. python里的pip有什么用_python的pip有什么用
  9. cblas_sgemm cblas.h
  10. 教育部计算机考研大纲,2021考研计算机大纲计算机组成原理部分考查内容
  11. 计算机设计类毕业论文,计算机设计论文范文
  12. 格式化移动硬盘或者U盘,并设置为NTFS格式
  13. 基于C++的钻石金字塔问题算法设计
  14. 【网络】把路由器用作交换机的方案
  15. 【数组练习题】计算一下牧场中的草丛数量(详细代码)
  16. 不做ui了 转行做什么_ui设计师是做什么的 想转行可以吗
  17. iOS 代理(Delegate)
  18. 产品经理知识框架+求职面经——快手,字节跳动,
  19. 表单提交后跳转指定链接
  20. Deep Face Super-Resolution with Iterative Collaboration论文阅读笔记

热门文章

  1. jgit_JGit入门
  2. mysql完整性约束
  3. python实现公钥密码ElGamal算法
  4. 2022/11/27一周总结
  5. [C语言]左值和右值
  6. 我讨厌这个绿油油的头像!我用opencv换一下背景
  7. x58和x79服务器性能,革了X58的命!新旗舰X79究竟改变了啥?
  8. asus prime x299大师系列主板安装win10 蓝屏问题的解决方法
  9. 移联名商:移动互联网分水岭,中国联通笑纳3G大礼
  10. idea创建一个springboot多模块项目之springcloud简单项目测试