算法设计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…

【Makefile】编译日志之输出重定向符号 >

用法1 make all >& compilelog.txt make all > compilelog.txt这两个编译命令在功能上有一些细微的区别&#xff0c;主要在于标准输出和标准错误的处理方式。 make all >& compilelog.txt 这个命令会将标准输出&#xff08;stdout&#xff09;和标准错误&a…

使用 `typing_extensions.TypeAlias` 简化类型定义:初学者指南

使用 typing_extensions.TypeAlias 简化类型定义&#xff1a;初学者指南 什么是 TypeAlias&#xff1f;安装 typing_extensions示例代码&#xff1a;如何使用 TypeAlias示例 1&#xff1a;为简单类型定义别名示例 2&#xff1a;为复杂类型定义别名示例 3&#xff1a;结合 Union…

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…

pytest 的简单介绍

官方文档&#xff1a;pytest 文档 1. pytest 概述 pytest 是一个功能强大的 Python 测试框架&#xff0c;旨在简化单元测试和功能测试的编写与执行。它不仅支持简单的单元测试&#xff0c;还能进行更复杂的测试&#xff0c;如数据驱动的测试、并发测试等。pytest 支持自动化发…

【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…

力扣--LCR 134.Pow(x,n)

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.2610…

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报&#xff08;2024年12月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…

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

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

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

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

element plus table组件多选获取数据id

首先给table加上 selection-change"handleSelectionChange"事件 示例 <el-table selection-change"handleSelectionChange" stripe:data"data?.slice((currentPage3 - 1) * pageSize3, currentPage3 * pageSize3)" style"width: 100%…

信号的捕捉

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

UTS 2022 致命问题修复:达梦数据库,记录数支持100万条

UTS 数据传输系统升级说明 升级内容&#xff1a; 致命问题修复 达梦数据库作为数据源&#xff1a; 当单个时间戳的记录数超过 10,000 条时&#xff0c;系统读取可能出现问题&#xff0c;已针对该场景优化数据处理逻辑&#xff0c;提升读取性能与稳定性。当单个时间戳值的重复…

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

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

【Linux】NUMA如何梆核

在 NUMA&#xff08;非统一内存访问&#xff09;架构中&#xff0c;“绑核” 通常是指将特定的 CPU 核心&#xff08;或者 NUMA 节点&#xff09;与特定的内存区域绑定&#xff0c;以提高内存访问的局部性&#xff0c;减少跨节点的内存访问延迟。这个操作通常用于性能优化&…

vue实现页面自动滚动,鼠标悬浮暂停,移开继续

1、给div一个id <div class"kb_nei_new_left" id"chartsContainer">2、定义一个自动滚动的方法 autoSroll(Id) {// flag 为true时停止滚动var flag false;// 定时器var timer;function roll() {var h -1;timer setInterval(function () {flag …

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

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