zoukankan      html  css  js  c++  java
  • 手写哈希

    struct my_hash{
        //unordered_map long long , int
        static const int BUFF=524287;
        static const int EDGE=200010;
        int fi[BUFF+1],k,ne[EDGE];
        long long b[EDGE];
        int c[EDGE];
        __attribute__((always_inline)) int& operator [](long long x){
            if (fi[x&BUFF]){
                for (int j=fi[x&BUFF]; j; j=ne[j])
                    if (b[j]==x) return c[j];
                ne[++k]=fi[x&BUFF];
                b[fi[x&BUFF]=k]=x;
                return c[k];
            }
            ne[++k]=0;
            b[fi[x&BUFF]=k]=x;
            return c[k];
        }
        void clear(){
            memset(c+1,0,k*sizeof(*c));
            k=0;
            memset(fi,0,(BUFF+1)*sizeof(*fi));
        }
    }mpp;
    struct my_hash{
        //stable in linux but slow
        static const int BUFF=524287; 
        int fi[BUFF+1];
        vector<int> ne,c;
        vector<long long> b;
        my_hash(){
            ne.emplace_back(0);
            c.emplace_back(0);
            b.emplace_back(0);
        };
        __attribute__((always_inline)) int& operator [](long long x){
            if (fi[x&BUFF]){
                for (int j=fi[x&BUFF]; j; j=ne[j])
                    if (b[j]==x) return c[j];
                fi[x&BUFF]=ne.size();
                ne.emplace_back(fi[x&BUFF]);
                b.emplace_back(x);
                c.emplace_back(0);
                return c.back();
            }
            fi[x&BUFF]=ne.size();
            ne.emplace_back(0);
            b.emplace_back(x);
            c.emplace_back(0);
            return c.back();
        }
        void clear(){
            ne.clear();
            b.clear();
            c.clear();
            memset(fi,0,(BUFF+1)*sizeof(*fi));
        }
    }mpp;
    template<class T1,class T2>
    struct my_hash{
        static const int BUFF=524287;
        static const int EDGE=200010;
        int fi[BUFF+1],k,ne[EDGE];//wei chu shi hua
        T1 b[EDGE];
        T2 c[EDGE];
        __attribute__((always_inline)) T2& operator [](const T1 &x){
            int temp=x&BUFF;
            if (fi[temp]){
                for (int j=fi[temp]; j; j=ne[j])
                    if (b[j]==x) return c[j];
                ne[++k]=fi[temp];
                b[fi[temp]=k]=x;
                return c[k]=*(new T2());
            }
          ne[++k]=0; b[fi[temp]
    =k]=x; return c[k]=*(new T2()); } void clear(){ k=0; memset(fi,0,(BUFF+1)*sizeof(*fi)); } };

     内存不泄漏版

    #include <bits/stdc++.h>
    using namespace std;
    template<class T1,class T2>
    struct my_hash{
        static const int BUFF=10503465;
        static const int EDGE=1000010;
        int fi[BUFF+1],k,ne[EDGE];//wei chu shi hua
        T1 b[EDGE];
        T2 c[EDGE];
        __attribute__((always_inline)) T2& operator [](const T1 &x){
            int temp=x&BUFF;
            if (fi[temp]){
                for (int j=fi[temp]; j; j=ne[j])
                    if (b[j]==x) return c[j];
                ne[++k]=fi[temp];
                b[fi[temp]=k]=x;
                T2 *p=new T2();
                c[k]=*p;
                delete p;
                return c[k];
            }
         ne[++k]=0; b[fi[temp]
    =k]=x; T2 *p=new T2(); c[k]=*p; delete p; return c[k]; } void clear(){ k=0; memset(fi,0,(BUFF+1)*sizeof(*fi)); } };

     另一种版本

    struct my_hash{
        static const int BUFF=8388607;
        static const int EDGE=10000010;
        int fi[BUFF+1],k,ne[EDGE];//wei chu shi hua
        T1 b[EDGE];
        T2 c[EDGE];
        __attribute__((always_inline)) T2& operator [](const T1 &x){
            int temp=x&BUFF;
            if (fi[temp]){
                for (int j=fi[temp]; j; j=ne[j])
                    if (b[j]==x) return c[j];
                ne[++k]=fi[temp];
                b[fi[temp]=k]=x;
                return c[k];
            }
         ne[++k]=0; b[fi[temp]
    =k]=x; return c[k]; } void clear(){ for (int i=1; i<=k; ++i) c[i]=T2(); k=0; memset(fi,0,(BUFF+1)*sizeof(*fi)); } };

    特化版比模板的快1/4左右,EDGE是总访问数。

  • 相关阅读:
    android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用
    android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
    子句判断、启动强度和去模糊化AForge.NET框架的使用(三)
    分享从网上收集的一些游戏资源,以RPG类为主
    android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度
    android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动
    Ajax实现评论的顶和踩功能
    Jelastic支持java的PaaS
    真心好用的VS扩展NuGet
    分享几篇文章(PDF版)
  • 原文地址:https://www.cnblogs.com/Yuhuger/p/9804144.html
Copyright © 2011-2022 走看看