算法设计6_随机化算法

随机化算法

在这里插入图片描述

在这里插入图片描述

随机算法的随机性(基本特征)

– 对于同一实例的多次执行, 效果可能完全不同

– 时间复杂性的一个随机变量

– 解的正确性和准确性也是随机的

数值随机化算法

随机数值算法

– 主要用于数值问题求解

– 算法的输出往往是近似解

– 近似解的精确度算法执行时间成正比

案例一 近似计算圆周率

用随机投点法近似计算圆周率

– 向方框内随机掷点$x=r(0,1), y=r(0,1) $

– 落在圆内概率$π/4 $

– 近似值 ≈ 圆内点数$c / 总点数 / 总点数 /总点数n$​,n越大,近似度越高

#include<iostream>
#include<random>
using namespace std;double moni(int n){random_device rd;mt19937 gen(rd());int k=0;for(int i=1;i<=n;i++){uniform_real_distribution<> dis(-1.0, 1.0);double x=dis(gen);double y=dis(gen);if(x*x+y*y<=1)k++;}return 4*k/double(n);
}
int n;
int main(){cin>>n;cout<<moni(n)<<endl;
}

经过对n的不同测试,得到的结果越来越精确,但是随着n数据规模的增大,算法执行时间增大,解的精确度也增大。

案例二计算定积分

在这里插入图片描述

同样是算法运行时间越长,得到的近似解越精确。

蒙特卡洛算法

Monte Carlo算法

– 主要用于求解需要准确解的问题

– 算法可能给出错误解

– 获得精确解概率算法执行时间成正比

在这里插入图片描述

在实际应用中常会遇到一些问题,不论采用确定性算法或随机化算法都无法保证每次都能得到正确的解答。蒙特卡罗算法则在一般情况下可以保证对问题的所有实例都以高概率给出正确解,但是通常无法判定一个具体解是否正确

设p是一个实数,且 1 / 2 < p < 1 1/2<p<1 1/2<p<1。如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的,且称 p − 1 / 2 p-1/2 p1/2是该算法的优势。

如果对于同一实例,蒙特卡罗算法不会给出2个不同的正确解答,则称该蒙特卡罗算法是一致的

对于一个一致的p正确蒙特卡罗算法,要提高获得正确解的概率,只要执行该算法若干次,并选择出现频次最高的解即可

在这里插入图片描述

有些蒙特卡罗算法除了具有描述问题实例的输入参数外,还具有描述错误解可接受概率的参数。这类算法的计算时间复杂性通常由问题的实例规模以及错误解可接受概率的函数来描述。

在这里插入图片描述

案例一主元素问题

T [ 1 : n ] T[1:n] T[1:n]是一个含有n个元素的数组。当{i|T[i]=x}|>n/2时,称元素x是数组T的主元素

#include <iostream>
#include <random>
#include <cmath>
using namespace std;const int N = 1e6 + 1;
int n;
int a[N];bool majority(int n, int &num) {random_device rd;mt19937 gen(rd());uniform_int_distribution<> dis(0, n - 1);int id = dis(gen);num = a[id];int k = 0;for (int i = 0; i < n; i++) {if (a[i] == num) k++;}return k > n / 2;
}bool majorityMC(int n, double e, int &num) {int k = ceil(log(1 / e) / log(2.0));for (int i = 0; i < k; i++) {if (majority(n, num)) {num = a[i]; // 这里需要更新num的值return true;}}return false;
}int main() {cin >> n;for (int i = 0; i < n; i++) cin >> a[i];double e = 0.001;int num;if (majorityMC(n, e, num))cout << "该数组的主元素为:" << num << endl;elsecout << "该数组没有主元素" << endl;
}

在这里插入图片描述

拉斯维加斯算法

一旦找到一个解, 该解一定是正确的

找到解的概率算法执行时间成正比

–增加对问题反复求解次数, 可使求解无效的概率任意小

在这里插入图片描述

它所作的随机性决策有可能导致算法找不到所需的解,但是找到一个解,这个解一定是正确的

在这里插入图片描述

p ( x ) p(x) p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率,一个正确的拉斯维加斯算法应该对所有输入x均有 p ( x ) > 0 p(x)>0 p(x)>0

在这里插入图片描述

针对该方程的解释,特别是 ( e ( x ) + t ( x ) ) (e(x)+t(x)) (e(x)+t(x))部分

  • 算法可能需要多次尝试才能成功,每次尝试都有一定的失败概率。
  • 每次失败后,算法需要重新开始,这增加了额外的时间开销。
  • 算法的平均运行时间取决于成功的概率 p ( x ) p(x) p(x)失败后需要重新开始的次数

案例一n后问题

在这里插入图片描述

舍伍德算法

–一定能够求得一个正确解

–确定算法的最坏与平均复杂性差别大时, 加入随机性, 即得到Sherwood算法

消除最坏行为与特定实例的联系,消除最差情况和平均情况下的差异

在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include <time.h> 
#include <stdlib.h>
#include<algorithm>
using namespace std;template<class Type>
Type select(Type a[], int n,int l, int r, int k){//左边界,右边界,第k位元素if(k<1||k>n){printf("Index out of bounds\n");exit(0);}n=n-1;while (true){if (l >= r)return a[l];//随机选择划分基准int i = l, j = l + rand() % (r - l + 1);//j选择为l到r的任意值[l,r]swap(a[i], a[j]);//与首元素交换位置j = r + 1;Type pivot = a[l];//以划分基准为轴做元素交换while (true){while (i<r&&a[++i] < pivot);while (j>l&&a[--j] > pivot);if (i >= j){break;}swap(a[i], a[j]);}//如果最后基准元素在第k个元素的位置,则找到了第k小的元素 if (j - l + 1 == k){return pivot;}	//a[j]必然小于pivot,做最后一次交换,满足左侧比pivot小,右侧比pivot大a[l] = a[j];a[j] = pivot;		//对子数组重复划分过程if (j - l + 1 < k){k = k - (j - l + 1);//基准元素右侧,求出相对位置 l = j + 1;}else{//基准元素左侧 r = j - 1;}}
}int main(){int n,k,r;while(cin>>n){cin>>k;int a[n];for(int i=0;i<n;i++)cin>>a[i];r=select<int> (a,n,0,n-1,k);cout<<r<<endl;}return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用mmdeploy框架C++预测mask并绘制最小外接矩形

目录 解决目标 逻辑思路 代码实现 第1部分 第2部分 解决目标 这段代码实现了&#xff0c;一个基于深度学习的图像检测程序。它使用mmdeploy框架&#xff0c;加载一个预训练的模型【实例分割模型】来检测图像中的物体。 逻辑思路 程序首先加载模型&#xff0c;然后&#…

Java --- JVM编译运行过程

目录 一.Java编译与执行流程&#xff1a; 二.编译过程&#xff1a; 1.编译器&#xff08;javac&#xff09;&#xff1a; 2.字节码文件&#xff08;.class&#xff09;&#xff1a; 三.执行过程&#xff1a; 1.启动JVM&#xff08;Java虚拟机&#xff09;&#xff1a; 2…

11.关于vim编辑器的简单配置

1. 说明 在linux系统中编辑文件内容的方式有很多种&#xff0c;比如直接在系统中暗中某些IDE&#xff0c;方便快捷&#xff0c;也可以直接在windows系统中编辑好文件后上传到linux系统中&#xff0c;这些方式对于编写内容较多的文件或者整个项目的文件还是非常适合的。不过有时…

qq空间管理小助手教程代码演示

headers {"Authorization": "Bearer YOUR_ACCESS_TOKEN","Content-Type": "application/json" }# 发布说说示例&#xff08; def post_moment(content):url "https://qzone-api.example.com/post_moment"data {"con…

【ArcGIS微课1000例】0133:二维建筑物依据高度生成三维模型

拓展阅读:【ArcGIS Pro微课1000例】0032:创建具有指定高程Z值的矢量数据 文章目录 一、二维面要素拉伸实现三维显示二、依据高度实现要素转3D一、二维面要素拉伸实现三维显示 打开ArcScene软件,加载实验配套数据0133.rar中的建筑物.shp数据,如下图: 数据属性表中的Z为建筑…

快速搭建SpringBoot3+Vue3+ElementPlus管理系统

快速搭建SpringBoot3Vue3管理系统 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09;创建项目并下载依赖--执行以下命令 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09; 创建项目并下载依赖–执行以下命令 创建项目 y…

基于Qt的文字处理软件(二)

这期文章我们进行主窗口的一些函数的定义&#xff0c;同时导入一些文字处理软件的状态栏会用到的图标。下面图片是图标导入到项目后的一个示例&#xff0c;图标可以到阿里矢量图标库里面找到。 一、导入图标资源: 1.首先在项目目录的位置创建一个images的文件,然后将收集好的图…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

信号的捕捉

目录 一、内核态与用户态的切换 二、 sigaction 参数介绍​编辑 三、 signal 四、某个信号在正在捕捉期间&#xff0c;该信号不允许再次被递达 五、可重入与不可重入函数&#xff08;描述函数的特性&#xff09; 六、volatile关键字 七、SIGCHLD信号 一、内核态与用户态的…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员&#xff0c;考试通常两部分&#xff1a;笔试和实验考试。 考试科目&#xff1a; HCIE-Datacom笔试考试内容&#xff1a; HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

可靠的人形探测,未完待续(I)

HI&#xff0c;there&#xff01;从紧张的项目中出来冒个泡&#xff01; 刚好想要验证一下mmWave在有人检测方面的应用&#xff0c;就看到了这个活动 - 瞌睡了有枕头属于是&#xff0c;活动策划好评&#xff01; 朋友曾关注汽车相关的技术领域&#xff0c;跟我吐槽过&#xff0…

Fastadmin地图插件在表单中的使用

表单中实现地图选择获取经纬度 1.Fastadmin后台安装地图选择插件地图位置(经纬度)选择插件 - 支持百度地图、高德地图、腾讯地图 – 基于ThinkPHP和Bootstrap的极速后台开发框架 2.腾讯地图开放平台后台创建应用创建KEY&#xff0c;配置逆地址解析额度。插件配置中配置腾讯地图…

如何防范顶级应用程序安全威胁

如今的网络攻击数量是五年前的两倍多。因此&#xff0c;掌握最新的应用程序安全威胁对于防止数据泄露、经济损失和声誉受损至关重要。您还需要实施强大的安全实践&#xff0c;以保护应用程序免受最常见和最危险的威胁。 顶级应用程序安全威胁......以及如何防范这些威胁 1. 注…

2024年超大跨径钢结构桥梁创新技术论坛暨钢桥联盟年度工作会议顺利召开

12月5日&#xff0c;由中交公路规划设计院有限公司、装配化钢结构桥梁产业技术创新战略联盟主办&#xff0c;保利长大工程有限公司、中交第二航务工程局有限公司、中交第二公路工程局有限公司、中交路桥建设有限公司、中交西安筑路机械有限公司、南京现代综合交通实验室、巨力锁…

配置服务器的免密登录

在服务器中配置别名和免密登录 如果没有生成过公钥和密钥 ssh-keygen然后就生成了公钥和密钥&#xff0c;下一步进入.ssh文件夹 cd .ssh/可以看到文件夹中会多出来三个文件 id_rsa&#xff1a;密钥id_rsa.pub&#xff1a;公钥known_hosts&#xff1a;A通过ssh首次连接到B&am…

计算c++11 lambada表达式的大小

lambada表达式是什么? 详解&#xff1a;lambada表达式详解 我们知道lambada其实是一个匿名函数 &#xff0c; 它属于 可调用对象 类型。在 C 中&#xff0c;lambda 表达式会生成一个隐式定义的类&#xff0c;这个类重载了 operator()&#xff0c;使得该对象可以像函数一样被…

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建&#xff0c;Linux发行版上的过程也类型&#xff0c;它主要使用到以下工具链&#xff1a; aarch64 架构的交叉…

React - useActionState、useFormStatus与表单处理

参考文档&#xff1a;react18.3.1官方文档 一些概念&#xff1a; React 的 Canary 和 Experimental 频道是 React 团队用于发布和测试新功能的渠道。 useActionState useActionState 是一个可以根据某个表单动作的结果更新 state 的 Hook。 const [state, formAction, isPe…

解决docker拉取镜像失败问题

下载镜像 [roottest-server-01 ~]# docker pull nginx Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 192.168.40.180:37356->54.227.20.253:443: read: connection reset by peer报错&#xff1a;E…

java Random随机数

Randoms是什么 在Java中&#xff0c;Random类是用于生成伪随机数的工具。它位于java.util包中。以下是一些使用Random类生成不同类型的随机数的方法&#xff1a; 1 创建 Random 类的实例 2 生成一个随机的int值&#xff08;范围从Integer.MIN_VALUE到Integer.MAX_VALUE&#…