概率分析和随机算法

目录

雇佣问题

概率分析

随机算法 

生日悖论

随机算法

 概率分析

球与箱子

总结


雇佣问题

有n个候选人面试,如果面试者比目前雇佣者的分数高,评价更好,那么就辞掉当前雇佣者,而去聘用面试者,否则继续面试新的候选人。面试完n个人结束。

  best为到i个候选人中最佳面试者, a数组时候选人名单。

起始条件:best= a[0]; 聘用第一个面试者。

保持:if(best < a[i]) best = a[i]; 聘用面试者。

终止条件:当i == n 时,迭代终止。

代码:

#include "stdio.h"void main() {int best = 0;int n = 10;int a[10] = {0};for (size_t i = 0; i < n; i++){scanf("%d", &a[i]);if(best < a[i]) {best = a[i];}}}

 算法分析

代码

代价

面试

scanf("%d", &a[i]);

C1

雇佣

best = a[i];

C2

假如面试过程中有m个人被雇佣,则总的代价=O(c1*n + c2*m).(0<m<=n)

最坏情况分析

m=n时,总的代价最大,此时为O(c1*n + c2*n). 由于c1远小于c2,因此总代价为O(c2*n).

平均情况分析

求平均情况就是求m=1~n的所有可能的均值。在数学中求平均值可以转化为求一个参量的期望。那如何求这个期望值呢?

概率分析

一个面试者是否面试通过服从二项分布。

m个雇佣者的被雇佣的概率

Xi

0

第1个

第2个

第n个

P

0

1

1/2

1/n

E[X] = E[X1] + E[X2] + … +E[Xn] = 1+1/2+…+1/n = lnx + O(1).

随机算法 

代码:

#include "stdio.h"
#include "math.h"
#include <time.h>void permute_by_sorting(int p[10], int a[10]);
void swap(int *a, int *b);
void main() {int best = 0;int rank = 0;int n = 10;int a[10] = {5,2,3,1,4,9,8,10,7,6};int p[10] = {0};permute_by_sorting(p, a);for (size_t i = 0; i < n; i++){if(best < a[i]) {best = a[i];rank = i;}}printf("\nThe best hired man is %dth %d", rank, best);}void permute_by_sorting(int p[10], int a[10]) {int count = 10;srand(time(0));for (size_t i = 0; i < count; i++){p[i] = rand()%1000;printf("%d, ", p[i]);}printf("\n");for (size_t i = 0; i < count; i++){for (size_t j = i; j < count; j++){if(p[i] > p[j]) {swap(&p[i], &p[j]);swap(&a[i], &a[j]);}}printf("%d ", a[i]);}}void swap(int *a, int *b) {int temp;temp = *a;*a = *b;*b = temp;
}

输出结果:

随机排列数列

可以从输出结果看出,每次出现的优先级的数列不一样,是随机的。样本空间为n!种排列方式,也就是全排列方式,这样就形成了随机算法了,可以使用概率分析算法的性能,每次出现的排列的概率都是1/n!。

以下两行代码能够执行到的次数m的期望E(X)= O(lnx).

            best = a[i];rank = i;

生日悖论

问题描述:一个屋子里,必须要有多少人以上,才可以至少有生日相同的两个人?

随机算法

代码

#include "stdio.h"
#include "math.h"
#include <time.h>#define PERSON_NUM 40
void permute_by_sorting(int p[10]);void main() {int same_birthday_p1 = -1;int same_birthday_p2 = -1;int n = PERSON_NUM;int p[PERSON_NUM] = {0};permute_by_sorting(p);for (size_t i = 0; i < n; i++){for (size_t j = i+1; j < n; j++){if(p[j] == p[i]) {same_birthday_p1 = i;same_birthday_p2 = j;break;}}}printf("\nThe best hired man is %d and %d", same_birthday_p1, same_birthday_p2);}void permute_by_sorting(int p[PERSON_NUM]) {int count = PERSON_NUM;srand(time(0));for (size_t i = 0; i < count; i++){p[i] = rand()%365;printf("%d, ", p[i]);}}

PERSON_NUM设为10和40的输出结果: 

 概率分析

i人和j人两个生日相等且在r日的概率 P[r]= 1/365*1/365. 令n=365. P[r]=1/n*n.

而i人和j人生日相等的情况有1,2,3…,365种,所以P = P[r]*n = 1/n.

以下的代码中,最后执行了判断语句中的语句时,有X个人相同的期望值为E[X].

E[X]= k(k-1)/(2*n)  (PERSON_NUM = k, n = 365).

if(p[j] == p[i]) {same_birthday_p1 = i;same_birthday_p2 = j;break;
}

我在代码中将PERSON_NUM设为10和40的输出结果

PERSON_NUM

E(X)

结果

10

0.1232876712328767

没有相同生日的人

40

0.4931506849315068

有相同生日的人

房间中人数为40人时,出现生日相同的期望为1/2,而10人时期望仅为1/10.我输入两次得出生日的结果也与概率模型预期匹配。

球与箱子

问题描述:有b个箱子,往一个指定的箱子中投入球的概率为1/b,投出n个相同的求,指定箱子中有k个球,求k值的期望值。

k正好符合二项分布,b(n,1/b);  所以k的期望值E(K) = n/b.


总结

本文以雇佣问题,生日悖论和球与箱子问题入手,着重讲述如何使用概率方法分析随机算法。

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

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

相关文章

C# Web控件与数据感应之 填充 HtmlTable

目录 关于 HtmlTable HtmlTable与BaseDataList的区别 准备数据源 ​范例运行环境 FillTable 方法 设计与实现 模板样例输出 Automatic 模式填充 ​ DynamicRows 模式填充 StaticRows 模式填充 ​ 小结 关于 HtmlTable 数据感应也即数据捆绑&#xff0c;是…

电商行业为什么要分析竞争商品?详解竞争商品分析八个维度

在当今的电子商务领域&#xff0c;竞争日益激烈&#xff0c;消费者拥有几乎无限的选择。品牌和商家为了在这场竞争中获得优势&#xff0c;必须深入理解市场动态、消费者需求以及竞争对手的策略。分析竞争商品是实现这一目标的关键步骤。它不仅帮助商家揭示行业内表现优异商品的…

【机器学习基础】Python编程03:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

LW-DETR:实时目标检测的Transformer, Apache-2.0 开源可商用,实验超 YOLOv8

LW-DETR&#xff1a;实时目标检测的Transformer&#xff0c; Apache-2.0 开源可商用&#xff0c;实验超 YOLOv8 LW-DETR 架构实例化高效训练高效推理 目的与解法拆解ViT编码器和DETR解码器多级特征图聚合变形交叉注意力窗口注意力和全局注意力 论文&#xff1a;https://arxiv.o…

使用docker部署前后端

1.首先&#xff0c;已经默认拥有了一个拥有docker和docker compose的linux服务器。 本篇文章部署的是SpringBootVue前后端分离项目&#xff0c;用了docker compose&#xff0c;但不多。 2.数据库 使用命令&#xff08;表示拉取最新的MySQL) docker pull mysql:latest如果想指定…

64. UE5 RPG 创建新的双手攻击怪物

在上一篇文章中&#xff0c;我们实现了新的功能&#xff0c;现在可以创建多个普通攻击动画&#xff0c;并且可以根据你所使用的普通攻击动画&#xff0c;设置不同的攻击位置。比如&#xff0c;你使用武器&#xff0c;那么攻击位置需要从武器上获取&#xff0c;如果你没有持有武…

Python怎么安装gym:一份详尽的指南

Python怎么安装gym&#xff1a;一份详尽的指南 在Python的机器学习生态系统中&#xff0c;gym库是一个至关重要的组件&#xff0c;它为我们提供了用于开发和比较强化学习算法的标准环境。然而&#xff0c;安装gym可能并不总是那么直接&#xff0c;尤其是对于那些刚开始接触这个…

LangChain学习之四种Memory模式使用

1. 学习背景 在LangChain for LLM应用程序开发中课程中&#xff0c;学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能&#xff0c;遂做整理为后面的应用做准备。视频地址&#xff1a;基于LangChain的大语言模型应用开发构建和评估。 2. 四种memory模式 …

Qt Creator创建Python界面工程并打包为可执行exe文件

Qt Creator创建Python界面工程并打包为可执行exe文件_qtcreator创建python工程-CSDN博客

【QT】Qt Plugin开发

目录 插件是什么QT插件是什么 为什么要有插件开发插件开发优势插件和动态库区别 Qt PluginQT插件类型QT插件开发流程QT插件应用QT插件JSON文件 参考文章 插件是什么 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。…

C#中的as和is

在 C# 中&#xff0c;as 和 is 是用于类型转换和类型检查的操作符。 as 操作符&#xff1a; as 操作符用于尝试将一个对象转换为指定的引用类型或可空类型&#xff0c;如果转换失败&#xff0c;将返回 null。语法&#xff1a;expression as type示例&#xff1a; object obj &…

把文件从一台linux机器上传到另一台linux机器上

文章目录 1&#xff0c;第一种情况1.1 先测试2台机器是否可以互相通信1.2 对整个文件夹里面的所有内容进行传输的命令1.3 检查结果 2&#xff0c;第二种情况2.1&#xff0c;单个文件传输的命令 1&#xff0c;第一种情况 我这里有2台linux机器&#xff0c; 机器A&#xff1a;19…

高科技IT企业适合平滑替代FTP升级方案有哪些?

随着信息技术的飞速发展&#xff0c;传统的文件传输协议FTP已经逐渐不能满足现代企业的需求。特别是对于高科技IT企业来说&#xff0c;他们需要的不仅仅是一个简单的文件传输工具&#xff0c;而是一个能够提供高速、安全、稳定、易管理且兼容性强的解决方案。那么&#xff0c;在…

JFinal学习

JFinal 1、基于 JFinal 的 web 项目需要创建一个继承自 JFinalConfig 类的子类&#xff0c;该类用于对整个 web 项目进行配置。 JFinalConfig 子类需要实现六个抽象方法&#xff1a; 1&#xff09;configConstant(Constants me) 此方法用来配置 JFinal 常量值&#xff0c;如开…

数学建模 —— 聚类分析(3)

目录 一、聚类分析概述 1.1 常用聚类要素的数据处理 1.1.1 总和标准化 1.1.2 标准差标准化 1.1.3 极大值标准化 1.1.4 极差的标准化 1.2 分类 1.2.1 快速聚类法&#xff08;K-均值聚类&#xff09; 1.2.2 系统聚类法&#xff08;分层聚类法&#xff09; 二、分类统计…

QPainter::end: Painter ended with 2 saved states 如何解决

QPainter::end: Painter ended with 2 saved states 是一个警告信息&#xff0c;它表明 QPainter 对象在结束时还存在未恢复的状态栈。这通常发生在 QPainter 对象被销毁&#xff08;即调用其析构函数&#xff09;时&#xff0c;如果存在未通过 restore() 方法平衡掉的 save() …

AutoMQ 生态集成 Tigris

Tigris[1]是一个全球分布式的兼容 S3 的对象存储服务&#xff0c;它允许你存储和访问任意数量的数据&#xff0c;具有广泛的使用场景。Tigris 会自动且智能地将数据分布到靠近用户的位置&#xff0c;让用户无需担心数据复制和缓存复杂性。 你可以将 Tigris 用于多种场景&#x…

EEPROM 怎么选

选择合适的EEPROM型号需要考虑多个因素&#xff0c;包括容量、供应商、性能参数、价格、可用性和兼容性等。以下是一个详细的步骤指南&#xff0c;帮助您在众多品牌和型号中做出选择&#xff1a; 1. 确定基本需求 首先确定您的应用对EEPROM的基本需求&#xff1a; 容量&…

Python里cv2是什么包?怎么安装使用?

在Python中&#xff0c;cv2是OpenCV库的模块名。OpenCV&#xff08;全称Open Source Computer Vision Library&#xff09;是一个基于开源的计算机视觉库&#xff0c;它提供了大量的图像处理和计算机视觉算法&#xff0c;如图像滤波、边缘检测、图像分割、特征提取、目标检测等…

快速排序——AcWing785.快速排序

AcWing785.快速排序 题目描述 785. 快速排序 - AcWing题库 运行代码 #include <iostream> #include <algorithm> using namespace std; const int N 1e66; int q[N]; void quick_sort(int q[], int l, int r) {if (l > r) return;int m l r >> 1;//…