一个算法习题学习的好去处-有不同语言的实现

这不是个人传销,而是在学习过程中发现的一个比较好的地方,因此向大家推荐一下,希望能有所帮助~

虽然只有一个链接,但是这个链接的重量就在那里,不知道能发向首页不??

为了凑字数,下面给出了一篇在上述网站中的一个题目解析:

------------------------------

链接地址:http://openhome.cc/Gossip/AlgorithmGossip/MathPI.htm

From [email protected]

Algorithm Gossip: 蒙地卡羅法求 PI

說明

蒙地卡羅為摩洛哥王國之首都,該國位於法國與義大利國境,以賭博聞名。蒙地卡羅的基本原理為以亂數配合面積公式來進行解題,這 種以機率來解題的方式帶有賭博的意味,雖然在精確度上有所疑慮,但其解題的思考方向卻是個值得學習的方式。

解法

蒙地卡羅的解法適用於與面積有關的題目,例如求PI值或橢圓面積,這邊介紹如何求PI值;假設有一個圓半徑為1,所以四分之一 圓面積就為PI,而包括此四分之一圓的正方形面積就為1,如下圖所示:

如果隨意的在正方形中投射飛標(點)好了,則這些飛標(點)有些會落於四分之一圓內,假設所投射的飛標(點)有n點,在圓內的 飛標(點)有c點,則依比例來算,就會得到上圖中最後的公式。

至於如何判斷所產生的點落於圓內,很簡單,令亂數產生X與Y兩個數值,如果X^2+Y^2小於1就是落在圓內。

實作:C    Java    Python    Scala    Ruby    JavaScript    Haskell

  • C
#include <stdio.h> #include <stdlib.h> #include <time.h> 

#define N 50001

int main(void) {     srand(time(NULL)); 

int sum = 0;

int i;    for(i = 1; i < N; i++) {         double x = (double) rand() / RAND_MAX;         double y = (double) rand() / RAND_MAX;         if((x * x + y * y) < 1) {            sum++;         }    } 

printf("PI = %f\n", (double) 4 * sum / (N - 1));

return 0; } 
  • Java
import static java.lang.Math.*;public class MonteCarlo {    public static void main(String[] args) {        final int N = 50001;        int sum = 0;         for(int i = 1; i < N; i++) if(pow(random(), 2) + pow(random(), 2) < 1) {            sum++;        }        System.out.printf("PI = %f%n", 4.0 * sum / (N - 1));      }}
  • Python
from random import randomN = 50001print("PI =", 4 * len([1 for i in range(1, N)         if random() ** 2 + random() ** 2 < 1]) / (N - 1))
  • Scala
import java.lang.Math._val N = 50000printf("PI = %f%n", 4.0 * (for(i <- 1 to N   if(pow(random(), 2) + pow(random(), 2) < 1)) yield 1).size / N)
  • Ruby
N = 50000print "PI = ", 4.0 * (1...N).map {     rand ** 2 + rand ** 2 < 1 ? 1 : 0 }.reduce(:+) / N
  • JavaScript
Array.prototype.reduce = function(init, f) {    var value = init;    for(var i = 0; i < this.length; i++) {        value = f(value, this[i]);    }    return value;};

function range(n) {    var r = [];    for(var i = 0; i < n; i++) {        r[i] = i;    }    return r;}

var n = 50000;print(4 * range(n).map(function() {    var x = Math.random();    var y = Math.random();    return x * x + y * y < 1 ? 1 : 0;}).reduce(0, function(ac, elem) {    return ac + elem;}) / n);
  • Haskell
import System.Random

rand gen n= take n $ randomRs (0.0, 1.0) gen::[Float]

main = do    gen1 <- getStdGen    gen2 <- newStdGen    let n = 50000        ic = length [1 | (x, y) <-                  zip (rand gen1 n) (rand gen2 n), (x ** 2 + y ** 2) < 1]    print (4 * fromIntegral ic / fromIntegral n)
时间: 2024-12-22 16:07:45

一个算法习题学习的好去处-有不同语言的实现的相关文章

机器学习算法--集成学习

1. 个体和集成 集成学习通过构建并结合多个"个体学习器"来完成学习任务.个体学习器通常由一个现有的学习算法从训练数据产生,若集成中只包含同种类型的个体学习器,称为同质集成:若包含不同类型的个体学习器,为异质集成.同质集成中的个体学习器也成为"基学习器". 如何产生并结合"好而不同"的个体学习器,恰是集成学习研究的核心. 根据个体学习器的生成方式,目前的集成学习方法大致分为两大类: (1)个体学习器间存在强依赖关系,必须串行生成的序列化方法,代表

算法导论学习笔记 -(1)

一个ACM若菜,趁着ACM淡季,开始学习算法导论了,经过一年的ACM学习,逐渐的发现,学东西,深入才是王道,以前学习一个算法,总是看懂了就开始做题,到后来才发现很多题目,会算法,却不知道是用这个算法,这就是算法理解的不到位的后果,从今天开始,定下目标: 1.深入系统的学习算法, 2.学会纸上写伪代码,每章的代码自己先在纸上写一遍, 3.每节的学习笔记和算法都要写在博客上. 在博客上记录自己的学习笔记,方便以后温习.   欢迎各路大神路过指正错误之处. 现在,先写写书上的第一个算法,插入排序. 算

算法导论学习---红黑树具体解释之插入(C语言实现)

前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每一个结点附加颜色位和路径上的一些约束条件能够保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).以下会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通

2015/10/13 算法习题:最大子列和问题

已经正式开始学习数据结构和算法,先学了网易云课堂上的浙江大学的数据结构课,是陈越和何钦铭上的,了解了什么是数据结构和算法后,学习了一些时间空间复杂度分析的技巧,结合之前马虎掌握的学习,先从简单的题目入手学习. 题目是这样的: 给定了一个n个整数组成的序列,求它各个子列中,子列和最大的值. 输入:输入n个整数组成的序列 要求输出最大子列和. 示例: 输入: -2 11 -4 13 -5 -2 输出: 20 做出这题的难度不是很大,至少很容易可以做到暴力求解,然而暴力求解的时间复杂度是很大的. 我用

算法导论学习---红黑树详解之插入(C语言实现)

前面我们学习二叉搜索树的时候发现在一些情况下其高度不是很均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每个结点附加颜色位和路径上的一些约束条件可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).下面会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通的二

关于统计变换(CT/MCT/RMCT)算法的学习和实现

原文地址http://blog.sina.com.cn/s/blog_684c8d630100turx.html 刚开会每周的例会,最讨厌开会了,不过为了能顺利毕业,只能忍了.闲话不多说了,下面把上周学习的一个简单的算法总结一下,以备后面写毕业论文的时候可以参考一下. 一.Census Transform(CT)算法的学习 Census Transform 算法是Ramin Zabih 和 John Woodfill 于1994年在他们的论文<Non-parametric LocalTransf

快速排序中各种分区算法的学习

快速排序在很多教科书上被称为是起泡排序的改进,但这并不能帮我更好地理解快速排序,一直都是死记硬背,一考完试就很容易忘. 在算法设计与分析的书本上,起泡一般都归为蛮力法,而快排则是分治技术中的一种.快排的思路是: 1.选定一个"中轴" 2.进行分区 3.对分区的两个部分分别重复上述步骤 有了这么个分类,理解和记忆上都上了一个台阶.分治法的精髓就是把一个事情分成两个(或多个)小事情,再分别处理.只要能用这种思想处理的问题,都可以用分治法来试试. 快排的主函数代码可以这样写,相当典型的分治法

【算法导论学习-012】n个数随机等概率的抽样m个

算法法导论>P129页课后题5.3-7 suppose we want to create a random sample of the set {1,2,3,-,n}, thatis, an m-element subset S, where0≤m≤n, such that each m-subset is equally likely to be created. One waywould be to set A[i]=i for i=1,2,3,-,n, call RANDOMIZE-IN

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操