2013-08-06 2 views
1

텍스트 파일에 1000 개의 통계 데이터가 있다고 가정합니다. 첫 번째 열은 색인의 수를 나타내고 두 번째 열은 그 값을 나타냅니다. 색인은 반복 될 수 있으며 해당 값은 다를 수 있습니다. 인덱스의 발생과 각각의 값의 합계를 계산하고 싶습니다.유사한 인덱스 값의 합

색인 생성에 대한 결과를 제공하는 코드를 작성하지만 해당 값 합계를 제공하지 못합니다.

내 텍스트 파일을 가정이 너무 this-

#index value 
    4  0.51 
    5  0.13 
    5  0.53 
    5  0.25 
    6  0.16 
    6  0.16 
    7  0.38 
    4  0.11 
    3  0.101 
    4  0.32 
    4  0.2 ... and more 

같은 데이터 세트

지수 4 4 번과 해당 발생 문자를 구분있다 값의 합계가 = (0.51 + 0.11 + 0.32 + 0.2) = 1.14

01 23,516,

마찬가지로

지수 5 2 배 값 발생 = (0.13 + 0.53) = 0.66 등

내 코드 여기

내 코드 -

#include <iostream> 
#include <map> 
#include <fstream> 

using namespace std; 


int main() 
{ 
    map<double,double> index; 
    double number,value; 
    double total; 


    ifstream theFile ("a1.txt"); 
    while(theFile >> number >> value) 
    { 
     ++index[number]; 
     total +=value; 
    } 
    cout<<"index\t occurs\t total"<<endl; 


    for(auto loop = index.begin(); loop != index.end();++loop) 
    { 
     cout << loop->first << "\t " << loop->second << "\t \t "<< total<<endl; 
    } 
    return 0; 
} 

이 코드는 결과 -

을 생성합니다. 7백45경1천5백15조5백36억9천1백36만3천2백10
index occurs total 
3  1  2.851 
4  4  2.851 
5  3  2.851 
6  2  2.851 
7  1  2.851 

발생 수가 정확하지만 비록

합계 + = 값;

내가 찾고있는 출력을 생성하지 않습니다. 각 색인의 합계를 얻으려면 어떻게합니까? 각 인덱스 total 별도 필요한 반면

+4

귀하의 합계는 각 개별 색인 대신 전체 파일의 각 항목의 합계로 계산됩니다. '발생'열을 누적하는 것과 비슷한 방식으로 '합계'열을 누적하려고합니다. –

+0

@ChrisCooper : 어떻게 총 열을 축적 할 수 있습니까? 의사 코드를 도와 주시겠습니까? – aries0152

+0

나는 지금 대답을 쓰고있다. –

답변

2

총 합계는 현재 각 색인의 합계 대신 전체 파일에서 합계로 계산됩니다. '발생'열을 누적하는 것과 비슷한 방식으로 '합계'열을 누적하려고합니다.

#include <iostream> 
#include <map> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    map<double, double> index; 
    double number, value; 
    map<double, double> total; 

    ifstream theFile ("a1.txt"); 
    while(theFile >> number >> value) 
    { 
     ++index[number]; 
     total[number] += value; 
    } 

    cout << "index\t occurs\t total" << endl; 
    for(auto loop = index.begin(); loop != index.end();++loop) 
    { 
     cout << loop->first << "\t " << loop->second << "\t \t "<< total[loop->first] << endl; 
    } 
    return 0; 
} 

색인을 자체지도에 저장하는 것과 같은 방법으로 각 열을 자체지도에 저장합니다.

0

당신은 에 대한 total에 모든 인덱스를 value를 추가하고 있습니다.

인덱스 값과 일치하는 값의 벡터에 대한 인덱스 맵은 가장 간단하므로 별도의 단계에서 각 인덱스의 합계를 계산할 수 있습니다. 당신의 독서 루프의

몸은 관련 벡터의 요소의 합을 생산하는 인덱스의 모든 항목에 걸쳐 뭔가

index[ number ].push_back(value); 

같은 그런 루프가 될 수 있습니다. (힌트 - accumulate은 그 일반적인 이름입니다 ....)

편집 : 오, 그리고 분명히 각 벡터의 요소 수입니다.

+0

OP는 각 인덱스 (및 발생 횟수)에 대한 누적 합계에만 관심이 있으므로 각 인덱스에 대해 별도의 벡터가 필요하지 않습니다. 간단한 계산과 누적 합계만으로 충분합니다. – WhozCraig

7
  1. 인덱스 당 total이 필요합니다.
  2. 인덱스 당 count이 필요합니다.

이를위한 간단한 솔루션은 다음과 같은 구조를 사용하는 것입니다 : 당신이해야 읽을 당신의 number을 믿지 않는

struct per_index 
{ 
    int count; 
    double total; 
    per_index(): total(0), count(0) {} 
}; 

std::map<int, per_index> index; 

... 

index[number].count++; 
index[number].total += value; 

주 (또는 필요)를 double, 그리고 그것은 단지 double은 평등을 비교하는 데 어려움을 겪기 때문에 인생을 더욱 복잡하게 만듭니다. 따라서 numberint인데갔습니다. 코드에서 선언을 변경해야합니다.