我希望unordered_multimap :: equal_range是在平均的常複雜,但以下情況不與正線性增長預期: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'行註釋掉的時間。這可能是花費時間的「插入」。一般來說,要弄清爲什麼散列表行爲不當,查看'bucket_count'和每個存儲桶中元素的數量 - 你希望這個例子是均勻分佈的,但是我想你可能碰到了'max_bucket_count'。我希望不會。 – 2012-07-17 09:45:30
您應該始終分析一個優化版本。如果用'-O3'編譯,你會得到什麼? – 2012-07-17 10:01:30
與-O3 100.000比10.000慢30倍 - 所以它更好但不好看 – user1531083 2012-07-17 10:10:58