最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

問題來源:

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

二項分布:

定義:n個獨立的是/非試驗中成功次數(shù)k的離散概率分布,每次實驗成功的概率為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)計里有一條遞歸公式:

這個便是題目中遞歸式的來源。

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

書中二項分布的遞歸實現(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); 
  } 

實驗結(jié)果:

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

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

改進的二項分布遞歸實現(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) { //將計算結(jié)果存起來,已經(jīng)計算過的直接拿過來用,無需再遞歸計算 
      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); 
  } 

實驗結(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

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

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

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

//計算組合數(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){//分母中較大的那部分階乘約分不用計算 
    NN=NN*N; 
    N--; 
  } 
   
  while(min>0){//計算較小那部分的階乘 
    kk=kk*min; 
    min--; 
  } 
   
  return NN/kk; 
} 
 
//計算二項分布值 
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){ //計算(1-p)的(N-k)次方     
    a=a*(1-p); 
    N--; 
  } 
   
  while(k>0){ //計算p的k次方   
    b=b*p; 
    k--; 
  } 
   
  return c*a*b; 
} 

實驗結(jié)果:

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

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

總結(jié)

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

相關(guān)文章

  • Java基礎(chǔ)Map集合詳析

    Java基礎(chǔ)Map集合詳析

    這篇文章主要介紹了Java基礎(chǔ)Map集合詳析,主要通過介紹Map集合的常用方法、Map的獲取方法的一些相關(guān)資料展開內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • 自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼

    自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼

    這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • jvm垃圾回收之GC調(diào)優(yōu)工具分析詳解

    jvm垃圾回收之GC調(diào)優(yōu)工具分析詳解

    這篇文章主要為大家介紹了jvm垃圾回收之GC調(diào)優(yōu)工具的分析詳解,在進行JVM?GC性能調(diào)優(yōu)之前,需要使用某些工具獲取到當(dāng)前應(yīng)用的狀態(tài)信息
    2022-01-01
  • 詳解Java Spring AOP

    詳解Java Spring AOP

    這篇文章主要為大家介紹了Java Spring AOP,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • java Socket UDP實例詳解

    java Socket UDP實例詳解

    這篇文章主要介紹了java Socket UDP實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java雙端隊列之ArrayDequeue原理講解

    java雙端隊列之ArrayDequeue原理講解

    這篇文章主要為大家介紹了java雙端隊列之ArrayDequeue原理講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 淺談IDEA2018打包可執(zhí)行jar包的流程

    淺談IDEA2018打包可執(zhí)行jar包的流程

    這篇文章主要介紹了淺談IDEA2018打包可執(zhí)行jar包的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot集成JPA持久層框架,簡化數(shù)據(jù)庫操作

    SpringBoot集成JPA持久層框架,簡化數(shù)據(jù)庫操作

    JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化規(guī)范。主要是為了簡化持久層開發(fā)以及整合ORM技術(shù),結(jié)束Hibernate、TopLink、JDO等ORM框架各自為營的局面。JPA是在吸收現(xiàn)有ORM框架的基礎(chǔ)上發(fā)展而來,易于使用,伸縮性強。
    2021-06-06
  • SpringBoot使用JSch操作Linux的方法

    SpringBoot使用JSch操作Linux的方法

    JSch是一個Java庫,它提供了SSH(Secure?Shell)的Java實現(xiàn),允許Java程序通過SSH協(xié)議連接到遠程系統(tǒng)(如Linux),這篇文章主要介紹了SpringBoot使用JSch操作Linux,需要的朋友可以參考下
    2023-11-11
  • Java中串行接口調(diào)用優(yōu)化方式

    Java中串行接口調(diào)用優(yōu)化方式

    這篇文章主要介紹了Java中串行接口調(diào)用優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

武宣县| 江油市| 汽车| 湘潭市| 岑巩县| 丰台区| 万盛区| 长宁县| 临夏县| 扬州市| 新乡市| 景德镇市| 祁阳县| 金川县| 海林市| 定南县| 汕尾市| 托克逊县| 多伦县| 江源县| 革吉县| 梧州市| 杭州市| 循化| 始兴县| 固原市| 钟山县| 安吉县| 治多县| 水城县| 襄汾县| 陵川县| 娄烦县| 临武县| 辽中县| 盐源县| 吕梁市| 分宜县| 保山市| 北川| 阜阳市|