느린 equal_range 그러나 n 개의 선형 적으로 확장되지 않습니다 다음은 예상대로 :unordered_multimap :: 나는 unordered_multimap :: equal_range 평균 상수 복잡성 것으로 기대
#include <iostream>
#include <tr1/unordered_map>
#include <cstdlib>
using namespace std::tr1;
using namespace std;
int main(){
int n;
cin >> n;
unordered_map<int, int> um;
for(int i=0; i<n; ++i){
um.insert(make_pair(i%100000, i));
pair<unordered_map<int, int>::iterator,unordered_map<int,int>::iterator > t = um.equal_range(i);
}
}
$ g++ testbr.cpp
$ time echo 10000 | ./a.out
real 0m0.065s
user 0m0.060s
sys 0m0.003s
$ time echo 100000 | ./a.out
real 0m4.492s
user 0m4.490s
sys 0m0.003s
인가 이 문제를 해결할 방법이 있습니까?
편집 : equal_range가 없으면 예상대로 조정됩니다.
또한 동일한 키 0 (와 항상 equal_range (0) 호출) 모든 요소를 삽입하는 경우 동일한 문서의 범위가 평균적으로 O (count (k))라고 말하는 부스트 문서에도 불구하고 예상대로 확장됩니다 ...?
'equal_range'행을 주석 처리 한 시간. 시간이 걸리는 것은'insert' 일 것입니다. 일반적으로 해시 맵이 왜 잘못되었는지 알아 내려면 각 버킷의 요소 수와 'bucket_count'를 살펴보십시오.이 예제가 고르게 분산 될 것으로 기대할 수 있지만 'max_bucket_count'를 눌렀을 것으로 생각됩니다. 나는 희망하지 않을 것이다. –
항상 최적화 된 빌드를 프로파일 링해야합니다. '-O3'로 컴파일하면 어떻게됩니까? –
-O3 100.000은 10.000보다 30 배 더 느립니다. 그렇기 때문에 좋지만 좋지는 않습니다. – user1531083