PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/10/01 23:38:43
Name Nocoment
Subject c++ 언어 질문입니다.
분할과 정복방식으로 '배열의 연속부분의 최대합'을 구하는 프로그램을 바꿔봤는데

이게 맞는지 잘 몰라서 여쭤봅니다.

#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;

const int MAX = 100000;

void AddSum(int& Sum, int& MaxSum, int L[], int first, int last){
        if(first <= last){        // 입력받은 첫번재숫자부터 마지막숫자까지 if이하문 수행
                int mid = (first + last) / 2;        //mid는 입력받은 수의 개수의 중간값
                if(Sum>=0) Sum += L[first];        // Sum이 0보다 크거나같으면 Sum에 현재배열값 덧셈
                else Sum = L[first];                // Sum이 0보다 작으면 현재배열값을 Sum에 입력
                if(MaxSum<=Sum) MaxSum = Sum;        // Sum이 MaxSum보다 크면 Sum의 값을 MaxSum에 입력
                AddSum(Sum, MaxSum, L, first+1, mid);
                AddSum(Sum, MaxSum, L, mid+1, last);        
        }
}

int main(){
        int L[MAX];                // 10만개 integer배열 생성
        int i, n;
        double start, finish;
        ifstream fin;
        fin.open("2.txt");                // txt파일 입력
        fin >> n;                        // 입력할 숫자개수 입력
//        cin >> n;
        for(i=0; i<n; i++)
//                cin >> L[i];
                fin >> L[i];                // 배열에 숫자 입력
        fin.close();
        cout << "입력한 숫자의 갯수 : " << n << endl;

        start = clock();                // 프로그램 시작시간 입력
        int MaxSum = -9999;        // MaxSum 초기화
        
        int Sum = 0;        // Sum 초기화
        AddSum(Sum, MaxSum, L, 0, n-1);
        finish = clock();  //프로그램 끝난시간 입력

        cout << "연속된 수의 최대합 : " << MaxSum << endl; //연속된 수의 최대합 출력
        cout << "수행 시간 : " << ((finish - start)/(double)CLK_TCK) << " sec" << endl;;  //프로그램 수행시간 출력

        return 0;
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
와후-만세
08/10/01 23:45
수정 아이콘
재미있네요. 병렬 컴퓨팅에 쓰일만한 좋은 알고리즘이 되진 못하겠고, 그냥 같은 아이디어를 분할정복 안 쓰고 하는게 낫겠네요.
연습삼아 하신거죠?
알고리즘의 정확성은 증명이 되네요.
꿀호떡a
08/10/01 23:46
수정 아이콘
알고리즘은 맞는 것 같은데, 결과적으로는 Divide and Conquer를 하는 의미가 별로 없겠네요.

main 안에 100000짜리 배열을 잡는건 좀 위험해 보이네요; 큰 배열은 왠만하면 전역으로 선언하는 편이 좋습니다.

(아악 1분 15초ㅠㅠ)
Nocoment
08/10/01 23:49
수정 아이콘
저도 이게 분할과 정복을 하나 안하나 그게 그거 같습니다. 여기서는 수행시간을 더 줄이는 방법이 없는 거겠죠?
와후-만세
08/10/01 23:51
수정 아이콘
분할정복을 해서 여러개의 프로세서를 이용하여 매우 효율적으로 계산하는 방법은 있습니다.(N/logN개의 프로세서를 이용하여 log N 시간)
그리고 입력의 크기가 N이라고 한다면, 수행시간의 하한이 O(N)이므로 한 개의 프로세서를 이용해서 더 이상 줄일 수 있는 방법은 없습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
42915 클래식음악 제목이면서 여자들이 겉에 입는 얇은 옷;; [6] nuzang2492 08/10/02 2492
42914 만화와 어시에 대해 질문입니다. [1] 김규동2022 08/10/02 2022
42912 영어해석.. [2] 무적탱크1706 08/10/02 1706
42910 맛있는 초밥집 추천! [13] 전투형나메크2637 08/10/02 2637
42909 미분 질문입니다.... [10] 나는몰라1861 08/10/02 1861
42908 상쾌한? 음악엔 뭐가 있을까요 ^^; [8] OnlyJustForYou1849 08/10/02 1849
42907 방금 전 라디오스타 보신분.. [7] withme_2572 08/10/02 2572
42906 곧 그녀의 생일이예요. (PGR 형, 누님들 도와주세요) [6] Malakit2119 08/10/02 2119
42905 심각해요... [8] 비야레알1815 08/10/01 1815
42904 c++ 언어 질문입니다. [4] Nocoment2624 08/10/01 2624
42903 여성 3인조 그룹을 찾습니다. [7] 도라지3067 08/10/01 3067
42902 인터넷 해지에 대해서 질문드립니다 [5] 회전목마1825 08/10/01 1825
42901 영작 질문좀-_-; [2] 집에가는길1539 08/10/01 1539
42899 스포츠마사지 2급 or 3급을 따고 싶은데요 .. 일반인이구요 PT트레이너2108 08/10/01 2108
42898 정수론 질문입니다. [3] ElleNoeR2068 08/10/01 2068
42897 FM관련 질문입니다. [6] 굿바이키스2845 08/10/01 2845
42896 pic 마이컴 질문입니다. 지니-_-V1691 08/10/01 1691
42895 유기화학 실험중 분별증류에 대한 질문입니다. [2] 구름지수~7200 08/10/01 7200
42894 게임을 찾습니다. [3] yO、1765 08/10/01 1765
42892 음악 질문입니다. (오늘 저녁 라디오) [5] Zakk Wylde2029 08/10/01 2029
42891 공부에 도움되는 선물 어떤게 좋을까요 [4] 행복했던...2272 08/10/01 2272
42889 초등학교5학년 과외를 하게 되었습니다. [1] worcs2665 08/10/01 2665
42888 겨울에 축구,풋살 할 때 뭐 입고들 하시나요? [4] 구리더3790 08/10/01 3790
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로