汉诺塔算法 蒙特卡诺算法
汉诺塔
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着N片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
试想一下,如果我们要将最大的圆盘移动到最右边的柱子上。我们需要把除此圆盘的其他圆盘先移动到中间的柱子上。因此这个问题就变成了如何将 N-1 个圆盘移动到中间的柱子上。很容易我们就想到了递归的方法。
将 N 个圆盘从左边柱子移动到右边柱子:
- [递归的]将 N-1 个圆盘从左边柱子移动到中间柱子。
- 将最大的圆盘从左边柱子移动到右边柱子。
- [递归的]将 N-1 个圆盘从中间柱子移动到右边柱子。
算法实现
def hanoi(height, left='left', right='right', middle='middle'):if height:hanoi(height - 1, left, middle, right)print(left, '=>', right)hanoi(height - 1, middle, right, left)hanoi(3) |
计数 1 的位数
当你写下一个正整数的二进制数形式时,有没有想要探究一下这个二进制数里有多少位数为1呢?
例如:99 = 0b1100011
一个明显的解法即是去获得一个单位掩码,遍历这个二进制数 X & (1 << k) 并返回非零的结果,这种方式将0的位数与1的位数都计算在内。
有没有更好的方式可以只计数1的位数而完全忽略0的位数呢?你可以有自己更多美妙的想法,但是我们并不需要它们。
算法实现
def count_of_1bits(value): n = 0 while value: value &= value - 1 n += 1 return n |
埃拉托色尼筛选法
埃拉托色尼筛选法是一个很漂亮的示例算法。
在 i7 CPU(单线程)处理器下它可以在1s之内生成10^9以内的所有素数,因此,当这种筛选算法被应用的时候,它的速度是非常惊人的。
而我用了最基础的版本(未进行分割),仅仅只是删除了在数组中的偶数。
算法实现
import numpy as np def eratosthenes(n): n = (n + 1) >> 1 p = np.ones(n, dtype=np.int8) i, j = 1, 3 while i < n: if p[i]: p[j * j >> 1::j] = 0 i, j = i + 1, j + 2 return p.sum() |
蒙特卡洛法
蒙特卡洛方法又称统计模拟法,随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法。是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。
早在17世纪,人么就知道用事件发生的“频率”来决定事件的“概率”。这也是蒙特卡洛法的基本思想。当样本数量足够大时,我们可以用频率去估计概率。这也是求圆周率π的常用方法。
求圆周率π
在只有一个随机数生成器的情况下如何估计π的大小?
当我们在(-1, 1)的范围内随机选择一个坐标(x, y)时,每个坐标点被选中的概率相等。则坐标落在直径为1的正方形中的圆的概率为:
由切比雪夫不等式可知,在生成大量随机点的前提下我们能得到尽可能接近圆周率的值。
算法实现
import numpy as np def pi(n, batch=1000): t = 0 for i in range(n // batch): ### 随机获取坐标 p = np.random.rand(batch, 2) ### 计算坐标平方和 p = (p * p).sum(axis=1) ### 平方和小于1的即为落在圆中的点 t += (p <= 1).sum() return 4 * t / n |
测试
firstPi = pi(10 ** 3) secondPi = pi(10 ** 6) thirdPi = pi(10 ** 8) print(firstPi) print(secondPi) print(thirdPi) |
汉诺塔算法 蒙特卡诺算法相关推荐
- 函数(2)——4.兔子数列5.汉诺塔6.综合案例-RSA算法7.综合案例-体测成绩判定2021.11.16
4.兔子数列(斐波那契数列) 一对兔子在出生两个月后,每个月能生出一对小兔子.现有一对刚出生的兔子,如果所有兔子都不死,那么一年后共有多少对兔子? 分析 n=1,兔子=1对: n=2,兔子=1对: n ...
- 用java编写汉诺塔问题_数据结构与算法之汉诺塔问题(Java递归)
汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 要求:1)大的盘在下面,小的盘在上面 2)一次只能移动一个盘子 个人思路:先 ...
- 【离散数学中的数据结构与算法】十 汉诺塔
汉诺塔也是经典的算法问题 文章目录 1 汉诺塔问题 1 汉诺塔问题 法国数学家卢卡斯(Edouard Lucas)在1883年提出了一个数学游戏: 传说在世界中心贝拿勒斯(印度北部)的圣庙里,一块黄铜 ...
- 算法- 分治算法(实现汉诺塔)
package Algorithm.dac;public class Hannoitower {public static void main(String []args){hannoiTower(5 ...
- 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)
第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...
- 汉诺塔细讲(内含邻近,循环。以及作者对汉诺塔,以及分治算法的小感悟,注释)
小伙伴们大家好,今天是我第一次尝试去发文写作,有不好之处请多多包含. 什么是汉诺塔呢? 其实大家已经很熟悉他了(而且这是我的第一个递归题目) 注意:本章统一是将从第一根柱子转移到第三根柱子 汉诺塔(T ...
- 轻松理解汉诺塔问题(图解java描述)
引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...
- 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现
一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...
- 汉诺塔问题及最长数组子串问题源码
问题源于在大二的数据结构老师交流的一个经典问题,在大学即将毕业之际,将大学中碰到一些问题,和自己的思考供大家参考 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根 ...
最新文章
- 算法学习:最小圆覆盖
- 初学微信小程序 TodoList
- 安装阴阳师出现错误“选择的驱动器或UNC共享不存在或不能访问“怎么解决?
- COCO数据集annotation标注信息详解======转载!
- SQL语言基础:SQL中的数据完整性约束用法
- 构建执法阅读笔记06(总结)
- iptables -F 后断开连接
- 几个极速版自动阅读项目的autojs脚本
- XP框架开启debug模式_推荐一个兼容性强完美支持XP框架的安卓模拟器,一直在用!...
- 加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)
- 关于打印机状态的获取
- opencv获取灰度图像的像素值
- 技术分析中的五种常见指标
- 解决webpack打包、编译、热更新Node内存不足问题
- 产品嘚吧嘚系列:大学城020产品模式研讨
- OpenCV for Python之图像RIO与泛洪填充
- SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject
- 【面试常问】谈谈你对多态的理解
- StringRedisTemplate报NullPointerException
- python语言单词接龙_Python单词接龙小程序