이 백서의 주요 내용은 다음과 같이 Java 프로그래밍 이항 분포의 재귀 적 및 비 수수적인 구현입니다.
문제의 원천 :
섹션 1.1, 4 차 에디션, 섹션 1.1 : return (1.0 -p) * binomial (n -1, k, p) + p * binomial (n -1, k -1, p);
재귀 호출 수를 계산하십시오. 재귀 공식은 어떻게 여기에서 왔습니까?
이항 분포 :
정의 : N 독립 예/비 경험의 성공 시간 K의 불연속 확률 분포 K의 성공 확률은 p (n, p, k)로 표시됩니다.
확률 공식 : p (ξ = k) = c (n, k) * p^k * (1-p)^(nk)
여기서 c (n, k) = (nk)!/(k! * (nk)!), ξ ~ b (n, p)로 표시됩니다. 기대치 : eξ = np, 분산 : dξ = npq, 여기서 q = 1-p.
확률 통계에는 재귀 공식이 있습니다.
이것은 질문에서 재귀 적 형태의 원천입니다.
재귀 공식은 C (n, k) = c (n-1, k)+c (n-1, k-1) 실제 시나리오는 N 개인 중에서 K를 선택하는 것입니다. 얼마나 많은 조합이 있습니까? 1에서 n까지의 사람들을 순서대로 정리하십시오. Kth가 선택되지 않은 경우 나머지 N-1 인원에서 K를 선택해야합니다. Kth가 선택되면 나머지 N-1 인원에서 K-1을 선택해야합니다.
이 책에서 이항 분포의 재귀 구현 :
공개 정적 이중 이항 (int n, int k, double p) {count ++; // (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); }실험 결과 :
NKP 전화 번호 10 5 0.25 246720 10 0.25 243553830 15 0.25 2440764535
결과에서, 우리는이 재귀 방법을 호출 해야하는 횟수가 기하학적 재난이며, N에서 50에서 50을 고려하지 않더라도 알 수 있습니다.
이항 분포 재귀 구현 개선 :
개인 정적 긴 수 = 0; 개인 정적 이중 [] [] m; 개인 정적 이중 이중 이항 (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) {// 계산 결과를 저장하고 계산 한 경우 직접 사용하면 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; }} 반환 이항 (n, k, p); }실험 결과 :
NKP 전화 번호 10 5 0.25 10120 10 0.25 45230 15 0.25 120350 25 0.25 3204100 50 0.25 5205
실험 결과에서, 우리는 통화 수가 크게 줄어들고 알고리즘을 사용할 수 있음을 알 수 있습니다.
이항 분포의 비수체 적 구현 :
실제로, 재귀를 사용하는 대신, 결합 된 숫자와 팩토링을 직접 계산하는 것이 더 빠릅니다.
// 조합 수를 계산합니다. 공개 정적 이중 조합 (double n, double k) {double min = k; 이중 최대 = nk; 이중 t = 0; 이중 NN = 1; 이중 kk = 1; if (min> max) {t = min; Min = max; max = t; } while (n> max) {// 분모의 더 큰 부분의 요인은 nn = nn*n을 계산할 필요가 없습니다. N--; } while (min> 0) {// 작은 부분 kk = kk*min의 계승을 계산합니다. 민-; } 반환 nn/kk; } // 이항 분포 값을 계산합니다. 공개 정적 이중 이항 (int n, int k, double p) {double a = 1; 이중 B = 1; 이중 C = 조합 (n, k); while ((nk)> 0) {// (1-p) a = a*(1-p)의 (nk) 전력을 계산합니다. N--; } while (k> 0) {// p b = b*p의 k 전력을 계산합니다. 케이--; } 반환 c*a*b; }실험 결과 :
NKP 이항 분포 값 10, 5, 0.25 0.0583920043945312520, 10, 0.25 0.00992227527967770650, 25, 0.25 8.4491946690397E-5
이전 알고리즘과 비교하면 계산 결과가 정확하고 달리기 속도가 매우 빠릅니다.
요약
위의 것은 Java 프로그래밍 이항 분포의 재귀 및 비수체 구현 코드 예에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!