欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例

 更新時(shí)間:2018年01月24日 11:50:16   作者:ChuanjieZhu  
這篇文章主要介紹了Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要內(nèi)容是Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn),具體如下。

問(wèn)題來(lái)源:

算法第四版 第1.1節(jié) 習(xí)題27:return (1.0 - p) * binomial(N - 1, k, p) + p * binomial(N - 1, k - 1, p);
計(jì)算遞歸調(diào)用次數(shù),這里的遞歸式是怎么來(lái)的?

二項(xiàng)分布:

定義:n個(gè)獨(dú)立的是/非試驗(yàn)中成功次數(shù)k的離散概率分布,每次實(shí)驗(yàn)成功的概率為p,記作B(n,p,k)。

概率公式:P(ξ=K)= C(n,k) * p^k * (1-p)^(n-k)

其中C(n, k) = (n-k) !/(k! * (n-k)!),記作ξ~B(n,p),期望:Eξ=np,方差:Dξ=npq,其中q=1-p。

概率統(tǒng)計(jì)里有一條遞歸公式:

這個(gè)便是題目中遞歸式的來(lái)源。

該遞推公式來(lái)自:C(n,k)=C(n-1,k)+C(n-1,k-1)。實(shí)際場(chǎng)景是從n個(gè)人選k個(gè),有多少種組合?將著n個(gè)人按1~n的順序排好,假設(shè)第k個(gè)人沒(méi)被選中,則需要從剩下的n-1個(gè)人中選k個(gè);第k個(gè)選中了,則需要從剩下的n-1個(gè)人中選k-1個(gè)。

書(shū)中二項(xiàng)分布的遞歸實(shí)現(xiàn):

public static double binomial(int N, int k, double p) { 
    COUNT++; //記錄遞歸調(diào)用次數(shù) 
    if (N == 0 && k == 0) { 
      return 1.0; 
    } 
    if (N < 0 || k < 0) { 
      return 0.0; 
    } 
    return (1.0 - p) * binomial(N - 1, k, p) + p * binomial(N - 1, k - 1, p); 
  } 

實(shí)驗(yàn)結(jié)果:

n   k   p   調(diào)用次數(shù)
10  5  0.25  2467
20  10  0.25  2435538
30  15  0.25  2440764535 

由結(jié)果可以看出來(lái)這個(gè)遞歸方法需要調(diào)用的次數(shù)呈幾何災(zāi)難,n到50就算不下去了。

改進(jìn)的二項(xiàng)分布遞歸實(shí)現(xiàn):

private static long COUNT = 0; 
  private static double[][] M; 
   
  private static double binomial(int N, int k, double p) { 
    COUNT++; 
    if (N == 0 && k == 0) { 
      return 1.0; 
    } 
    if (N < 0 || k < 0) { 
      return 0.0; 
    } 
    if (M[N][k] == -1) { //將計(jì)算結(jié)果存起來(lái),已經(jīng)計(jì)算過(guò)的直接拿過(guò)來(lái)用,無(wú)需再遞歸計(jì)算 
      M[N][k] = (1.0 - p) * binomial(N - 1, k, p) + p * binomial(N - 1, k - 1, p); 
    } 
    return M[N][k]; 
  } 
 
  public static double Binomial(int N, int k, double p) { 
    M = new double[N + 1][k + 1]; 
    for (int i = 0; i <= N; i++) { 
      for (int j = 0; j <= k; j++) { 
        M[i][j] = -1; 
      } 
    } 
    return binomial(N, k, p); 
  } 

實(shí)驗(yàn)結(jié)果:

n    k   p   調(diào)用次數(shù)
10    5  0.25  101
20   10  0.25  452
30   15  0.25  1203
50   25  0.25  3204
100  50  0.25  5205

由實(shí)驗(yàn)結(jié)果可以看出調(diào)用次數(shù)大幅減小,算法可以使用。

二項(xiàng)分布的非遞歸實(shí)現(xiàn):

事實(shí)上,不利用遞歸,直接計(jì)算組合數(shù)和階乘,反而速度更快。

//計(jì)算組合數(shù) 
public static double combination(double N, double k) 
{ 
  double min = k; 
  double max = N-k; 
  double t = 0; 
 
  double NN=1; 
  double kk=1; 
   
  if(min>max){ 
    t=min; 
    min = max; 
    max=t; 
  } 
   
  while(N>max){//分母中較大的那部分階乘約分不用計(jì)算 
    NN=NN*N; 
    N--; 
  } 
   
  while(min>0){//計(jì)算較小那部分的階乘 
    kk=kk*min; 
    min--; 
  } 
   
  return NN/kk; 
} 
 
//計(jì)算二項(xiàng)分布值 
public static double binomial(int N,int k,double p) 
{ 
  double a=1; 
  double b=1; 
   
  double c =combination(N,k); 
   
  while((N-k)>0){ //計(jì)算(1-p)的(N-k)次方     
    a=a*(1-p); 
    N--; 
  } 
   
  while(k>0){ //計(jì)算p的k次方   
    b=b*p; 
    k--; 
  } 
   
  return c*a*b; 
} 

實(shí)驗(yàn)結(jié)果:

n   k  p      二項(xiàng)分布值
10,  5, 0.25  0.058399200439453125
20, 10, 0.25 0.009922275279677706
50, 25, 0.25  8.44919466990397E-5  

與前面的算法比對(duì),計(jì)算結(jié)果是正確的,而且運(yùn)行速度是非常之快的。

總結(jié)

以上就是本文關(guān)于Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    這篇文章主要介紹了Spring和SpringMVC父子容器關(guān)系初窺(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java split()使用方法解析

    java split()使用方法解析

    這篇文章主要介紹了java split()使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例

    在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例

    這篇文章主要為大家介紹了在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 解決java編譯錯(cuò)誤:程序包不存在的問(wèn)題

    解決java編譯錯(cuò)誤:程序包不存在的問(wèn)題

    出錯(cuò):Error:(3, 27) java: 程序包c(diǎn)om.aliyun.odps.udf不存在,遇到這樣的錯(cuò)誤問(wèn)題如何解決呢,下面小編給大家?guī)?lái)了java編譯錯(cuò)誤:程序包不存在的問(wèn)題及解決方法,感興趣的朋友一起看看吧
    2023-05-05
  • SpringBoot靜態(tài)資源配置原理(源碼分析)

    SpringBoot靜態(tài)資源配置原理(源碼分析)

    這篇文章主要介紹了SpringBoot靜態(tài)資源配置原理(源碼分析),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java添加Word文本水印和圖片水印

    Java添加Word文本水印和圖片水印

    這篇文章主要介紹了Java添加Word文本水印和圖片水印,文章圖文講解的很清晰,有對(duì)于這方面不懂得同學(xué)可以學(xué)習(xí)下
    2021-02-02
  • Java實(shí)現(xiàn)世界上最快的排序算法Timsort的示例代碼

    Java實(shí)現(xiàn)世界上最快的排序算法Timsort的示例代碼

    Timsort?是一個(gè)混合、穩(wěn)定的排序算法,簡(jiǎn)單來(lái)說(shuō)就是歸并排序和二分插入排序算法的混合體,號(hào)稱(chēng)世界上最好的排序算法。本文將詳解Timsort算法是定義與實(shí)現(xiàn),需要的可以參考一下
    2022-07-07
  • JVM致命錯(cuò)誤日志詳解(最新推薦)

    JVM致命錯(cuò)誤日志詳解(最新推薦)

    這篇文章主要介紹了JVM致命錯(cuò)誤日志詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Eclipse中改變默認(rèn)的workspace的方法及說(shuō)明詳解

    Eclipse中改變默認(rèn)的workspace的方法及說(shuō)明詳解

    eclipse中改變默然的workspace的方法有哪幾種呢?接下來(lái)腳本之家小編給大家介紹Eclipse中改變默認(rèn)的workspace的方法及說(shuō)明,對(duì)eclipse改變workspace相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    這篇文章主要介紹了Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論