HahTable——拉链法实现的哈希表

本文介绍了哈希表在算法中的应用,特别是使用拉链法处理哈希冲突。这种方法适用于频繁的插入和删除操作,通过将同义词结点链接到同一单链表中。文章提供了拉链法的原理分析,并附有相应的代码实现及运行结果展示。
摘要由CSDN通过智能技术生成

由于哈希表的查找高效性,在平时的算法中用的也是比较多。例如:字符串、单词个数的统计,只出现一次字符或者数字的统计,两个集合相同元素的查找等等,还有插入删除的高效(链地址法)都可以用哈希表来解决。缺点可能是需要占用额外的内存空间。
1 原理分析
处理哈希冲突的另一种方法是拉链法,也称为哈希桶。适用于经常进行插入和删除的情况。一方法参考:https://blog.csdn.net/qq_15000103/article/details/80270964
拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。
这里写图片描述
2 代码实现

//HashTable.h
#pragma once
#include<vector>
#include<utility>
#include<string>

template<class V>
struct HashNode
{
    V _v;//set->k;map->kv
    HashNode<V>* _next;
    HashNode(const V& v)
        :_v(v)
        , _next(NULL)
    {}
};
template<class K>
struct Hash
{
    size_t operator()(const K& key)
    {
        return key;
    }
};
template<>
struct Hash<string>//特化,使得缺省时,若调string,则调用此函数
{
    static size_t BKDRHash(const char * str)
    {
        unsigned int seed = 131; // 31 131 1313 13131 131313 
        unsigned int hash = 0;
        while (*str)
        {
            hash = hash * seed + (*str++);
        }
        return (hash & 0x7FFFFFFF);
    }

    size_t operator()(const string& key)
    {
        return BKDRHash(key.c_str());
    }
};

template<class K, class V, class KeyOfValue, class _HashFunc>//unordered_set<K,V>->HashTable<K,K>;unordered_map<K,V>->HashTable<K,pair<K,V>>
class HashTable;

template<class K, class V, class KeyOfValue, class _HashFunc>
struct _HashTableIterator//单向迭代器
{
    typedef HashNode<V> Node;
    typedef _HashTableIterator<K, V, KeyOfValue,_HashFunc> Self;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值