rt,蒟蒻去看了看 [洛谷日报第39期]比STL还STL?——pbds,里面在讲hash_table
时有说:
其中cc开头为拉链法,gp开头为探测法,个人实测探测法稍微快一些。
于是蒟蒻去自己试了试,测试代码:
#include<bits/extc++.h>
void test(){
std::vector<std::string>test;
__gnu_pbds::gp_hash_table<std::string,bool>hash_table1;
__gnu_pbds::cc_hash_table<std::string,bool>hash_table2;
std::map<std::string,bool>mp;
std::unordered_map<std::string,bool>unmp;
int n;
std::cout<<"测试数据组数:";
std::cin>>n;
std::cout<<"数据生成中..."<<std::endl;
srand(time(0));
for(int i=1;i<=n;i++){
int len=rand()%1000+1;
std::string tmp;
for(int j=1;j<=len;j++)
tmp+=rand()%93+33;
test.push_back(tmp);
}
std::cout<<"数据生成完毕,测试插入所需时间..."<<std::endl;
std::cout<<"gp_hash_table: ";
clock_t st=clock();
for(auto i:test)
hash_table1[i]=1;
std::cout<<clock()-st<<"ms"<<std::endl;
hash_table1.clear();
std::cout<<"cc_hash_table: ";
st=clock();
for(auto i:test)
hash_table2[i]=1;
std::cout<<clock()-st<<"ms"<<std::endl;
hash_table2.clear();
std::cout<<"map: ";
st=clock();
for(auto i:test)
mp[i]=1;
std::cout<<clock()-st<<"ms"<<std::endl;
mp.clear();
std::cout<<"unordered_map: ";
st=clock();
for(auto i:test)
unmp[i]=1;
std::cout<<clock()-st<<"ms"<<std::endl;
unmp.clear();
test.clear();
system("pause");
}
int main(){
test();
return 0;
}
最终结果(2次):(开了O2)
怎么看都好像是拉链法快一点啊,而且无论是__gnu_pbds::gp_hash_table
,__gnu_pbds::cc_hash_table
还是std::map
速度都差不多,而std::unordered_map
却要快很多(数据随机情况下)
蒟蒻求解/kk