2017-04-06 3 views
0

나는 [11, 15, 10, 19, 9, 1, 2, 16] 의 정수 목록을 가지고 있으며 올바른 답을 얻을 수 없다.Java를 사용하여 표준 편차를 계산 하시겠습니까?

내 코드 :

static double Q2(ArrayList<Integer> input) { 
    Collections.sort(input); 

    ArrayList<Double> input2 = new ArrayList<>(); 
    double sum = 0; 
    double sum2 = 0; 
    double sd = 0; 

    for (int i = 0; i < input.size(); i++) { 
     sum = sum + input.get(i); 
    } 

    double mean = sum/input.size(); 

    for (int i = 0; i < input.size(); i++) { 
     input2.add((Math.pow((input.get(i) - mean), 2))); 
    } 

    for (int i = 0; i < input2.size(); i++) { 
     sum2 = sum2 + input2.get(i); 
    } 

    double mean2 = sum2/input2.size(); 

    sd = Math.sqrt(mean2); 

    return sd; 

예상 출력해야한다 : 5.998697775350913

내 출력은 다음과 같습니다

6.010407640085654이 많은 감사, 시간 내 주셔서 감사합니다.

+3

코드를 사용하여 올바른 결과를 얻었습니다. http://ideone.com/XmTDb2 – jyotesh

+0

코드를 단순화했습니다. http://ideone.com/hWTBgi. 결과는 5.998697775350913 – Zefick

+0

입니다. 입력 한 내용에 문제가있는 것 같습니다. 귀하가 여기에 게시 한 목록과 같은지 확인하십시오. – sirandy

답변

3

비록 수학적으로 정확하지만 이것은 계산적으로 SD를 계산하는 끔찍한 방법입니다. 입력을 먼저 정렬 할 필요가 없습니다. 제곱 된 편차를 저장하기 위해 두 번째 배열을 작성할 필요가 없습니다. 당신은 당신이 하나의 루프에 들어가서 그냥 그들을 추가 할 수 있습니다. z * z를 계산하는 대신 Math.Pow를 호출 할 필요가 없습니다.

모두 수정하면 가능한 한이 접근법을 향상시킬 수 있습니다. 그러나 더 좋은 접근법은 online algorithm을 사용하는 것입니다. 이는 한 번에 수행 할 수 있습니다.

마지막으로 사람들이 SD를 계산하도록 요청할 때 실제로 샘플 SD가 아니라 인구 SD를 원한다는 것을 알고 있어야합니다.이 경우 SD의 편차 제곱을 (n-1)로 나누어야합니다. n의.