RUNNINGMEDIAN 질문입니다.

  • LiSA
    LiSA
    1. 제한시간내에 돌아가는 이유가 궁금합니다.
      문제에는 3초로 되있는데 제 컴퓨터에서는 교재에 있는 정답 코드도 10000을 넘어가면 3초가 넘어갑니다. 100000의 경우는 1분30초 정도 나오는것을 보면 사양의 문제는 아니라고 생각되어 질문을 합니다.

    2. priority_queue에서 vector와 deque의 속도차이의 이유를 잘 모르겠습니다.
      priority_queue> first;
      priority_queue> first;
      처음에는 deque로 했었는데 나중에 책과 비교해서 시간을 재보니 deque가 많이 느렸습니다. 예제의 마지막 케이스는 5배 이상 차이가.... deque는 앞뒤로 넣는것이 가능하여 더 효율적으로 동작한다고 생각했는데 시간차이가 이렇게 나는 이유가 궁금합니다.

    아래는 제출했던 코드입니다.

    #include <iostream>
    #include <queue>
    #include <deque>
    #include <vector>
    #include <time.h>
    
    #define MOD 20090711
    
    using namespace std;
    
    struct makeInput{
        int a, b, rng;
        makeInput(int _a, int _b):a(_a), b(_b), rng(1983){}
        int getNext(){
            int temp = rng;  
            rng = (rng*(long long)a+b)%MOD;
            return temp;
        }
    };
    
    class RUNNINGMEDIAN{
    public:
        void input();
        void getMedi();
        void Run();
    private:
        int count;
        int n, a, b;
        long long rng;
        long long result;
    
    };
    
    void RUNNINGMEDIAN::input(){
        result = 0;
        cin >> n >> a >> b;
    }
    
    
    void RUNNINGMEDIAN::getMedi(){
        priority_queue<int, deque<int>> first;
        priority_queue<int, deque<int>, greater<int>> second;
        makeInput m(a, b);
    
        for(int i=0;i<n;i++){
            if(first.size() == second.size())
                first.push(m.getNext());
            else 
                second.push(m.getNext());
    
            if(!second.empty() && (first.top() > second.top()) ){
                int a = first.top(), b = second.top();
                first.pop(); second.pop();
                first.push(b); second.push(a);
            }
    
            result = (result + first.top())%MOD;
        }
    }
    
    void RUNNINGMEDIAN::Run(){
        clock_t s, e;
        cin >> count;
        while(count--){
            input();
            s = clock();
            getMedi();
            cout << result << endl;
            e = clock();
            printf("%f sec\n",(float)(e-s)/CLOCKS_PER_SEC);
        }
    }
    
    int main(){
        RUNNINGMEDIAN().Run();
        return 0;
    }
    

    8년 전
3개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    혹시 debug 모드로 컴파일하지는 않으셨는가요? 표준 컨테이너에 여러가지 체크가 들어가서 느려질 수 있어요.


    8년 전 link
  • wookayin
    wookayin

    deque 가 vector 에 비해서 느린 건 당연합니다. priority_queue 의 내부 구현을 보면 앞뒤로 넣고 빼는 연산은 안 쓰고 뒤에만 넣고빼고를 하기 때문에 그냥 sequential한 배열인 vector 로도 충분하구요. 이쪽이 연산 오버헤드도 작고 메모리 연속성도 좋아서 캐시에 유리해서 더 빠를 것이라고 추정할 수 있습니다.


    8년 전 link
  • LiSA
    LiSA

    kcm1700 / 아... 처음알았습니다. ㅠㅠ 모드를 바꾸니까 바로 되네요!
    wookayin / 감사합니다. 설명을 보고 뭔가 안맞아 떨어져서 다시 찾아보니 priority_queue 자체를 잘못 이해해서 정렬방법을 이상하게 생각하고 있었습니다. ㅠ


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.