首页 > 编程语言 >算法思想之概率算法

算法思想之概率算法

时间:2024-09-13 09:46:29浏览次数:1  
标签:rand arr 概率 思想 随机化 算法 蒙特卡洛

概率算法

概率算法的基本概念

概率算法是一种算法,它利用概率论的原理来解决问题。这种算法通常用于解决复杂的问题,特别是在确定性算法难以求解或者效率较低的情况下。概率算法的一个重要特点是它不总是保证得到正确的结果,而是以一定的概率得到正确的结果。

概率算法可以分为两类:蒙特卡洛算法和拉斯维加斯算法。

  1. \1. 蒙特卡洛算法:这类算法总是在有限的时间内给出一个答案,但答案可能是错误的。算法的输出是一个随机变量,其期望值是问题的正确答案。通过多次运行算法并取平均值,可以提高结果的准确性。蒙特卡洛算法的一个典型应用是数值积分和全局优化。
  2. \2. 拉斯维加斯算法:这类算法要么给出一个正确的答案,要么报告失败。这种算法不会给出错误的答案,但可能需要非常长的时间来得到结果。拉斯维加斯算法的一个例子是随机化的快速排序算法。

蒙特卡洛算法

蒙特卡洛算法是一种基于随机样本来解决计算问题的方法。这种算法的核心在于通过生成大量随机数据来模拟或估计复杂系统的行为。

应用实例:圆周率的估计

一个经典的蒙特卡洛方法应用是估计圆周率(π)。方法如下:

  1. \1. 在一个边长为2的正方形内绘制一个内切圆。
  2. \2. 随机地在正方形内生成点。
  3. \3. 计算这些点中有多少点落在圆内。
  4. \4. 圆的面积与正方形的面积比是π/4,因此可以通过 (圆内点数/总点数) * 4 来估计π的值。

优点与缺点

优点:

  • • 简单易实现,适用于多种复杂度高的问题。
  • • 可以通过增加样本数量来提高结果的精确度。

缺点:

  • • 需要大量的随机样本来获得高精度的结果。
  • • 结果的精确度受随机性的影响。

拉斯维加斯算法

拉斯维加斯算法总是返回正确的结果或者报告失败,不会返回错误的结果。

应用实例:随机化快速排序

快速排序通常选择一个元素作为枢纽(pivot),然后根据这个枢纽将数组分为两部分。在随机化快速排序中,枢纽是随机选择的,这样可以减少算法的最坏情况运行时间。

优点与缺点

优点:

  • • 总是得到正确的结果。
  • • 通常比相应的确定性算法有更好的平均性能。

缺点:

  • • 在最坏的情况下可能需要非常长的时间。
  • • 实现复杂度可能较高。

代码实践

下面是使用Go语言实现的两个示例:一个是蒙特卡洛算法用于估计圆周率,另一个是使用随机化快速排序的拉斯维加斯算法。

1. 蒙特卡洛算法估计圆周率

package main

import (
 "fmt"
 "math/rand"
 "time"
)

func estimatePi(numPoints int) float64 {
 var insideCircle int
 rand.Seed(time.Now().UnixNano())
 for i := 0; i < numPoints; i++ {
  x := rand.Float64() * 2 - 1 // Generate a random x coordinate in [-1, 1]
  y := rand.Float64() * 2 - 1 // Generate a random y coordinate in [-1, 1]
  if x*x+y*y <= 1 {
   insideCircle++
  }
 }
 return 4 * float64(insideCircle) / float64(numPoints)
}

func main() {
 numPoints := 1000000
 pi := estimatePi(numPoints)
 fmt.Printf("Estimated Pi = %f\n", pi)
}

在这个示例中,我们随机生成了numPoints个点,并计算这些点中有多少点落在单位圆内。然后我们使用这个比例来估计圆周率。

2. 随机化快速排序

package main

import (
 "fmt"
 "math/rand"
 "time"
)

func quicksort(arr []int) []int {
 if len(arr) < 2 {
  return arr
 }
 rand.Seed(time.Now().UnixNano())
 pivotIndex := rand.Intn(len(arr))
 arr[pivotIndex], arr[len(arr)-1] = arr[len(arr)-1], arr[pivotIndex]
 pivot := arr[len(arr)-1]
 left := make([]int, 0)
 right := make([]int, 0)
 for _, v := range arr[:len(arr)-1] {
  if v <= pivot {
   left = append(left, v)
  } else {
   right = append(right, v)
  }
 }
 return append(append(quicksort(left), pivot), quicksort(right)...)
}

func main() {
 arr := []int{3, 6, 8, 10, 1, 2, 1}
 fmt.Println("Original array:", arr)
 sortedArr := quicksort(arr)
 fmt.Println("Sorted array:", sortedArr)
}

这个示例中,我们实现了一个随机化的快速排序算法。我们随机选择一个枢纽元素,然后根据这个枢纽将数组分为两部分,递归地对这两部分进行排序。

这两个示例展示了如何在Go语言中实现基于概率的算法,可以根据实际需要调整参数和实现细节。

总结

概率算法提供了一种在面对复杂问题时的有效工具,特别是在解析解难以得到或计算成本极高的情况下。通过适当的设计和参数调整,可以在实际应用中取得良好的效果。不过,需要注意的是,概率算法的结果通常具有一定的不确定性,因此在对精确度要求极高的应用中需要谨慎使用。

标签:rand,arr,概率,思想,随机化,算法,蒙特卡洛
From: https://www.cnblogs.com/zhifwu/p/18411643

相关文章

  • 操作系统实验——存储器的分配与回收算法实现
    1.实验内容:Exercise1:本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。Exercise2:采用最先适应法、最佳适应法、最坏适应法分配主存空间。Exercise3:当一个新作业要求装入主存时,必须查空闲区表,从中找出一个......
  • 洛谷P10504 守卫者的挑战 题解 概率DP
    题目链接:https://www.luogu.com.cn/problem/P10504状态\(f_{i,s,k}\)表示:当前正面临第\(i\)项挑战(此时第\(1\simi-1\)项挑战已完成,第\(i\)项挑战还没开始);目前已经挑战成功了\(s\)项(即第\(1\simi-1\)项挑战中共有\(s\)项挑战成功,\((i-1)-s\)项没挑战成功);......
  • 0910-0911 shell编程与基础算法(leetCode )
    栈的定义栈(Stack),也称为堆栈,它是一种特殊的线性表,只允许在表的一端进行插入和删除操作。允许在表操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈顶是动态变化的,它由一个称为栈顶指针(top)的变量指示。当表中没有元素时,称为空栈。栈的插入操作称为入栈或进栈,删除操作称为出栈或......
  • 从0开始的算法(数据结构和算法)基础(十)
    重新开始更新了,回学校处理事情半个月没有更新,大家勿怪啊。分治算法什么是分治的思想分治的字面意思是分而治之,将问题进行分化,从而进行处理,最后将结果进行合并。尽量的将问题分的不可以再分,分到和操作系统里面的原语是一样的,用较为多空间进行多线程的并行,节省时间运行。递......
  • 代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍
    513.找树左下角的值题目链接:513.找树左下角的值文档讲解︰代码随想录(programmercarl.com)视频讲解︰找树左下角的值日期:2024-09-12想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。Java代码如下://迭代classSolut......
  • datastructure与算法 orderedPair
    /**  Aninterfacethatdescribestheoperationsofasetofobjects.  @authorCharlesHoot,FrankM.Carrano  @version4.0*/publicinterfaceSetInterface<T>{  /**Getsthecurrentnumberofentriesinthisset.    @return Theintegernum......
  • 数据结构与算法chapter-0
    /**Aninterfaceformethodsthatreturntheperimeterandareaofanobject.@[email protected]*/publicinterfaceMeasurable{/**Getstheperimeter.@returnTheperimeter.*/publicdoublegetPerimeter()......
  • 图论篇--代码随想录算法训练营第五十七天打卡| 最小生成树问题
    题目链接:53.寻宝(第七期模拟笔试)题目描述:在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将所有岛屿联通起来(注意:这......
  • 985硕士,最近投了100多份大模型算法岗,没下文...
    我是丁师兄,专注于智能驾驶方向大模型落地,公众号:丁师兄大模型。大模型1v1学习,已帮助多名同学上岸国内外大厂今天给大家分享一下,从面试官的视角看,什么样的简历算一份优质的简历?以及如何快速把简历改好。为什么想讲这个呢?因为最近我也在集中面试嘛,看了N多份简历,大部分人的......
  • 图像处理-边缘检测算法的原理和实现
    概述边缘检测是图像处理中的一项重要任务,其原理是基于图像的梯度计算。梯度是函数的变化速率,图像中的边缘意味着像素灰度值的快速变化。常用的边缘检测算法有Sobel算子、Prewitt算子、Laplacian算子、Canny算子等。Sobel算子(滤波器)Sobel滤波器通过使用两个3x3卷积核(也称为掩......