关于pbds里的hash_table
  • 板块灌水区
  • 楼主Untitled0
  • 当前回复13
  • 已保存回复13
  • 发布时间2021/11/12 08:40
  • 上次更新2023/11/4 00:50:19
查看原帖
关于pbds里的hash_table
393767
Untitled0楼主2021/11/12 08:40

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

2021/11/12 08:40
加载中...