1. 程式人生 > >演算法之二項分佈(c/c++版)

演算法之二項分佈(c/c++版)

二項分佈是數學的概念,定義及公式定理不在此說明.
注:遞迴版第三步及遞推都依賴於C(M-1,N-1)+C(M-1,N)=C(M,N)的變形
遞迴版:
(我給遞迴版註釋了1 2 3 是為了解析非遞迴版(遞推版)中同等的操作
1 2 3)方便我們理解是怎麼讓遞迴變成遞推的

double binomial(int N, int k, double p)
{
    // 1
    if (N < 0 || k < 0)
        return 0.0;
    // 2
    if (N == 0 && k == 0)
        return 1.0;
    // 3
return (1.0 - p) * binomial(N - 1, k, p) + p * binomial(N - 1, k - 1, p); }

遞迴版貌似很好理解,執行binomail(10,5,0.25)能通過,當我們用binomail(100,25,0.25),電腦似乎就不給力了,幾天幾夜恐怕也不會有結果,這時間複雜都有點捉急啊,那下面我們就用點小空間改成遞推吧
這裡寫圖片描述

非遞迴版(遞推版):

double binomial(int N, int k, double p)
{
    if (N < 0 || k < 0) return 0.0;
    double **ret = new
double*[N + 1]; for (int i = 0; i < N + 1; ++i) ret[i] = new double[k + 1]; //1完成遞迴版的2 ret[0][0] = 1.0; //2完成遞迴版的1 for (int i = 1; i < N + 1; ++i) ret[i][0] = (1.0 - p) * ret[i - 1][0]; for (int j = 1; j < k + 1; ++j) ret[0][j] = 0.0; //3完成遞迴版的3 for (int
i = 1; i < N + 1; ++i) for (int j = 1; j < k + 1; ++j) ret[i][j] = (1.0 - p) * ret[i - 1][j] + p * ret[i - 1][j - 1]; return ret[N][k]; }

嘗試binomial(100,50,0.25):
這裡寫圖片描述

相關推薦

演算法分佈(c/c++)

二項分佈是數學的概念,定義及公式定理不在此說明. 注:遞迴版第三步及遞推都依賴於C(M-1,N-1)+C(M-1,N)=C(M,N)的變形 遞迴版: (我給遞迴版註釋了1 2 3 是為了解析非遞迴版(遞推版)中同等的操作 1 2 3)方便我們理解

概率演算法_分佈和泊松分佈

本次函式有 1、階乘 2、計算組合數C(n,x) 3、二項概率分佈 4、泊松分佈 以下是歷史函式 ---------------以上是舊的-------------------------------------------------------

R語言開發分佈瞭解下

二項分佈模型用來處理在一系列實驗中只發現兩個可能結果的事件的成功概率,例如,擲硬幣總是兩種結果:正面或反面。我們可以使用二項式分佈估算在重複拋擲硬幣10次時正好準確地找到3次是正面的概率。在R中具有四個內建函式來生成二項分佈,如下: dbinom(x, size, prob

C++ Leetcode初級演算法叉樹篇

1.二叉樹的最大深度 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7],    3 / \ 9 20 /

演算法練習叉查詢樹 C++實現

/////////////////Tnode.h//////////////// class TNode { public: ////methods TNode(void); TNode(int data); ~TNode(void);

SPSS中八類常用非引數檢驗 分佈(Binomial)檢驗

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Leetcode中級演算法三數之和(15) C++

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

Leetcode中級演算法兩數相加(2)C++

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例:

統計與分佈伯努利分佈分佈

目錄 目錄 前文列表 伯努利分佈 二項分佈 前文列表 伯努利分佈 伯努利分佈(Bernoulli Distribution),是一種離散分佈,又稱為 “0-1 分佈” 或 “兩點分佈”。例如拋硬幣的正面或反面,物品有缺陷或沒缺陷,

【程式設計師眼中的統計學(6.2)】原創實現分佈演算法以及應用

package DistTools; /** * * @(#)GeoDist.java * @Description:描述:本演算法中在n次伯努利試驗中:試驗n次得到r次成功的概率、二項分佈的期望、二項分佈方差的具體實現。 * @Definitions:定義:在相互獨立事件中

分佈演算法(伯努利實驗)

二項分佈 問題描述: 二項分佈就是重複n次獨立的伯努利試驗。在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,並且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數

分佈演算法(遞迴)

關於用遞迴實現的二項分佈演算法 最近在看Sedgewick的《演算法》的時候有一題習題是關於改進用遞迴實現的二項分佈演算法。這裡我令服從二項分佈為$X\sim b(N,k,p)$,書本上習題給出

聚類演算法DBSCAN演算法:高維資料剪枝應用NQ-DBSCAN

一、經典DBSCAN的不足 1.由於“維度災難”問題,應用高維資料效果不佳 2.執行時間在尋找每個點的最近鄰和密度計算,複雜度是O(n2)。當d>=3時,由於BCP等數學問題出現,時間複雜度會急劇上升到Ω(n的四分之三次方)。 二、DBSCAN在高維資料的改進 目前的研究有

◮ R語言筆記(三): 分佈概率問題的求解

★這裡首先總體介紹一些統計學常用的R語言中的分佈函式: 正態分佈函式:norm() 泊松分佈函式:pois() 指數分佈函式:exp() Gamma分佈函式:gamma() 均勻分佈函式:unif() ★二項分佈函式:binom()     

伯努利分佈分佈、Beta分佈、多分佈和Dirichlet分佈與他們之間的關係,以及在LDA中的應用

  在看LDA的時候,遇到的數學公式分佈有些多,因此在這裡總結一下思路。 一、伯努利試驗、伯努利過程與伯努利分佈 先說一下什麼是伯努利試驗: 維基百科伯努利試驗中: 伯努利試驗(Bernoulli trial)是隻有兩種可能結果的單次隨機試驗。 即:對於一個隨機變數而言,P(X

雜湊學習演算法:基於hash的ANN框架

在上一節瞭解了ANN的背景,簡單介紹了hash的演算法,那基於hash的ANN框架是怎樣的呢? 框架圖 框架說明 基於hash的ANN主要有四個步驟,包括特徵提取、hash編碼(學習+編碼)、漢明距離排序、重排序。 1、特徵提取 有查詢影象和影象資料庫,需要對這兩類分別

伯努利分佈分佈、幾何分佈、超幾何分佈、泊松分佈

導語        對於任何一個學習概率論的童鞋來說,各種分佈都是很頭痛的一件事情,本篇主要討論的是離散型隨機變數. 伯努利分佈        伯努利分佈就

演算法叉樹分層遍歷

通過佇列實現二叉樹的分層遍歷,換行可以使用last和nLast兩個變數,每次新增新的最右節點記錄nLast,每次從佇列彈棧記錄一個節點node,node==last換行,把nLast賦值給last,用二維陣列遍歷。  ArrayList<ArrayList<Integer&

排序演算法:歸併排序

演算法分析:是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序

伯努利分佈分佈、多分佈、貝塔分佈、狄利克雷分佈、高斯分佈

伯努利分佈: 伯努利分佈(Bernoulli distribution)又名兩點分佈或0-1分佈,介紹伯努利分佈前首先需要引入伯努利試驗(Bernoulli trial)。 伯努利試驗是隻有兩種可能結果的單次隨機試驗,即對於一個隨機變數X而言: 伯努利試驗都可以表達為“是或否”