제한시간내에 돌아가는 이유가 궁금합니다.
문제에는 3초로 되있는데 제 컴퓨터에서는 교재에 있는 정답 코드도 10000을 넘어가면 3초가 넘어갑니다. 100000의 경우는 1분30초 정도 나오는것을 보면 사양의 문제는 아니라고 생각되어 질문을 합니다.
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 20090711usingnamespacestd;structmakeInput{inta,b,rng;makeInput(int_a,int_b):a(_a),b(_b),rng(1983){}intgetNext(){inttemp=rng;rng=(rng*(longlong)a+b)%MOD;returntemp;}};classRUNNINGMEDIAN{public:voidinput();voidgetMedi();voidRun();private:intcount;intn,a,b;longlongrng;longlongresult;};voidRUNNINGMEDIAN::input(){result=0;cin>>n>>a>>b;}voidRUNNINGMEDIAN::getMedi(){priority_queue<int,deque<int>>first;priority_queue<int,deque<int>,greater<int>>second;makeInputm(a,b);for(inti=0;i<n;i++){if(first.size()==second.size())first.push(m.getNext());elsesecond.push(m.getNext());if(!second.empty()&&(first.top()>second.top())){inta=first.top(),b=second.top();first.pop();second.pop();first.push(b);second.push(a);}result=(result+first.top())%MOD;}}voidRUNNINGMEDIAN::Run(){clock_ts,e;cin>>count;while(count--){input();s=clock();getMedi();cout<<result<<endl;e=clock();printf("%f sec\n",(float)(e-s)/CLOCKS_PER_SEC);}}intmain(){RUNNINGMEDIAN().Run();return0;}
deque 가 vector 에 비해서 느린 건 당연합니다. priority_queue 의 내부 구현을 보면 앞뒤로 넣고 빼는 연산은 안 쓰고 뒤에만 넣고빼고를 하기 때문에 그냥 sequential한 배열인 vector 로도 충분하구요. 이쪽이 연산 오버헤드도 작고 메모리 연속성도 좋아서 캐시에 유리해서 더 빠를 것이라고 추정할 수 있습니다.
LiSA
제한시간내에 돌아가는 이유가 궁금합니다.
문제에는 3초로 되있는데 제 컴퓨터에서는 교재에 있는 정답 코드도 10000을 넘어가면 3초가 넘어갑니다. 100000의 경우는 1분30초 정도 나오는것을 보면 사양의 문제는 아니라고 생각되어 질문을 합니다.
priority_queue에서 vector와 deque의 속도차이의 이유를 잘 모르겠습니다.> first;> first;
priority_queue
priority_queue
처음에는 deque로 했었는데 나중에 책과 비교해서 시간을 재보니 deque가 많이 느렸습니다. 예제의 마지막 케이스는 5배 이상 차이가.... deque는 앞뒤로 넣는것이 가능하여 더 효율적으로 동작한다고 생각했는데 시간차이가 이렇게 나는 이유가 궁금합니다.
아래는 제출했던 코드입니다.
9년 전