HashTable和HashMap

来源:互联网 发布:个人之间借款 知乎 编辑:程序博客网 时间:2024/06/04 16:52

在平常的应用中,经常遇到一些需要查询某个元素的情况,一般来说就有3种不同复杂度的做法:

  1. 把元素简单放进线性表中,这样每次查询需要遍历一遍线性表,复杂度是O(n)的
  2. 把元素放进平衡树中,这样每次查询复杂度是O(logn)的
  3. 把元素放进hash表中,这样查询的均摊复杂度变为O(1)
    实际应用中一般不采用1,而采用2和3。平衡树的优点是查询稳定,缺点是查询次数多时较慢;hash表的优点是查询的平均时间短,缺点是某几次查询可能比较慢。具体根据实际情况来选择。

3种方法的原理比较:

  1. 一般线性表,所有元素分布在一条链上,通过遍历这条链来查询元素
  2. 平衡树,二分搜索的基本思想以及维护平衡性质来限制深度保证O(logn)的复杂度
  3. hash表,改进普通线性表的存储方式,使用某种分配机制使得元素尽量分布于不同的链上,从而只需遍历元素所在链即可。

HashTable的实现:
利用邻接表,然后设计一个散列函数,就可以得到HashTable的一个实现。散列函数的好坏决定了hash表的好坏。我这里选择对质数取模作为散列函数(选择非质数确实效率要下降不少)。
HashMap的实现:
有了HashTable,HashMap就不难了。HashMap相当于键的HashTable,再另外加上值的一个线性表,然后让地址对应起来即可,即可以由键来得到存对应值的地址。

实现得比较粗糙,将就着用吧~

template<typename T, int N, int SZ>struct HashTable {    T table[SZ];    int nxt[SZ];    int last[N];    int total;    HashTable(){ clear(); }    void clear() { mset(last, -1); total = 0; }    int add(T x) {        int pos = getMod(x);        table[total] = x;        nxt[total] = last[pos];        last[pos] = total ++;        return total - 1;    }    int find(T x) {        int pos = getMod(x), i = last[pos];        for (; ~i; i = nxt[i]) {            if (table[i] == x) break;        }        return i;    }    int getMod(string x) {        int n = x.length(), mm = 0;        up(i, n) {            mm = (mm * 128 + x[i]) % N;        }        return mm;    }    inline int getMod(ll x) {        return x % N;    }};template<typename T, typename T2, int N, int SZ>struct HashMap {    HashTable<T, N, SZ> ht;    T2 b[SZ];    HashMap() { clear(); }    void clear() { ht.clear(); up(i, SZ) b[i]=T2(); }    void insert(pair<T, T2> p) {        b[ht.add(p.first)] = p.second;    }    int find(T key) {        return ht.find(key);    }    T2 get(T key) {        return b[ht.find(key)];    }    T2& operator[] (T key) {        int ac = find(key);        if (~ac) return b[ac];        else return b[ht.add(key)];    }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 博士超期学信网的信息被删除怎么办 电脑账号删除后电脑开不了怎么办 lol不小心融错了皮肤怎么办 农村医保交费了没有录入系统怎么办 电动三轮车在泗阳被交警扣了怎么办 环评证实际的设备少报了怎么办 别人盗用了自己的社保卡怎么办 如果有人盗用社保卡信息住院怎么办 丈夫出轨生下孩子妻子该怎么怎么办 l老公偷着儿子消失了怎么办 老婆出轨怀孕现在流了他跑了怎么办 交通银行贷款资金户里面的钱怎么办 新车2个月出现好多小毛病怎么办 地上终末之日尸潮破坏房子怎么办 初一数学期未考试考了77分怎么办 生育服务单再婚婚史情况怎么办 我孩子的数学一直很差怎么办呀! 扶桑花的叶子出斑点发黄怎么办 高二的学生成绩下降特别大怎么办 六个月大的宝宝咳嗽伴有气喘怎么办 昨天奶用力吸今天好疼怎么办 律师把医院的医药费单子丢了怎么办 母亲是个不明事理的人怎么办 华西医院的就诊卡掉了怎么办 整形医院把我脸上疤痕被大了怎么办 牙齿缝里的东西很臭怎么办 五岁宝宝牙齿有空洞斑点怎么办 给别人担保贷款被起诉了怎么办 不小心在微信里登录江西移动怎么办 住院出院后医保卡在医院怎么办 医院门诊做完检查医生下班了怎么办 退税的发票勾选为抵扣的发票怎么办 买完邮轮票后护照换了怎么办? 朝阳医院挂号过了取号时间怎么办 苹果4的id密码忘了怎么办 ipad己停用5分钟后再试怎么办 手机上大智慧日线失真怎么办 安卓手机突然地图信号弱怎么办 魔兽争霸对战模式没有金币要怎么办 常州号码被标记了商铺的名字怎么办 车提档了不接收怎么办公司能收回吗