哈希桶的实现

2023-10-30

上一篇博客中介绍了用闭散列法的二次探测和开链法构造哈希表的原理即实现方式。
构造哈希表的闭散列法之二次探测地址:http://blog.csdn.net/qq_36221862/article/details/73488162

下面介绍另一种方法:
【开散列法】
开散列法又叫链地址法(开链法)。
开散列方法首先对关键码集合用某一个散列函数计算他们的存放位置。若设散列表地址空间的 所有位置是从0到m-1,则关键码集合中的所有关键码被划分为m个子集合,通过散列函数计算出来的 具有相同地址的关键码归于同一子集合。称同一子集合中的关键码互为同义词,每一个子集合称为 一个桶。通常各个桶中的表项通过一个单链表链接起来,亦称为同义词子表。所有桶号相同的表 项都链接在同一个同义词子表中,各链表的头结点组成一个向量,因此,向量的元素个数与可能 的桶数一致。桶号为i的同义词子表的表头结点是向量中的第i个元素。
设元素的关键码为37,25,14,36,49,68,57,11,散列表为HT[12],表的大小为12,散列函数为Hash(x) = x % 11;(11是小于等于m接近m的质数) Hash(37)=4 Hash(25)=3 Hash(14)=3 Hash(36)=3 Hash(49)=5 Hash(68)=2 Hash(57)=2 Hash(11)=0
采用开散列法处理冲突:

这里写图片描述

哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),在这里我们可以把每个key的位置看作是一个孔,孔里放了一个链表
相信大家可以看出来,使用一个数组来存放记录方法的哈希冲突太多,基于载荷因子的束缚,空间利用率不高,在需要节省空间的情况下,我们可以用哈希桶来处理哈希冲突。
哈希桶是使用一个顺序表来存放具有相同哈希值的key的链表的头节点,利用这个头节点可以找到其它的key

通常,每个桶中的同义词子表都很短,设有n个关键码通过某一个散列函数,存放到散列表中的m个桶 中,那么每一个桶中的同义词子表的平均长度为n/m。这样以搜索平均长度为n/m的同义词子表代替了 搜索长度为n的顺序表,搜索效率快的多。
应用链地址发处理溢出,需要增设链接指针,似乎增加了存储开销。事实上,由于开地址法必须保持 大量的空闲空间以确保搜索效率,如二次探查法要求装载因子a <= 0.5 而表项所占空间又比指针大 的多,所以使用链地址法反而比开地址法节省存储空间

代码如下:

HashBucket.cpp


template<class K, class V>
struct HashBucketNode
{
    pair<K, V> _kv;
    HashBucketNode<K, V>* _pNext;

    HashBucketNode(const K& key, const V& value)
        : _kv(pair<K,V>(key, value))
        , _pNext(NULL)
    {}
};

template<class K, class V>
class HashTable;

template<class K, class V, class Ref, class Ptr>
class _HashBucketIterator_
{
public:
    typedef _HashBucketIterator_<K, V, Ref, Ptr> Self;
    typedef HashBucketNode<K, V> Node;

public:
    _HashBucketIterator_()
        : _pNode(NULL)
        , _ht(NULL)
    {}

    _HashBucketIterator_(Node* pNode, HashTable<K, V>* ht)
        : _pNode(pNode)
        , _ht(ht)
    {}

    _HashBucketIterator_(const Self& it)
        : _pNode(it._pNode)
        , _ht(it._ht)
    {}

    Ref operator*()
    {
        return _pNode->_kv;
    }

    Ptr operator->()
    {
        return &(operator*());
    }

    Self& operator++()
    {
        _pNode = Next(_pNode);
        return *this;
    }

    Self operator++(int)
    {
        Self temp(*this);
        Next();
        return temp;
    }

    bool operator==(const Self& it)
    {
        return _pNode == it._pNode && _ht == it._ht;
    }

    bool operator!=(const Self& it)
    {
        return !(*this == it);
    }

private:
    Node* Next(Node* pNode)
    {
        Node* pNext  = pNode->_pNext;
        if(pNext)//如果下一个结点存在则返回它
        {
            return pNext;
        }
        else //否则找下一个不为空的桶
        {
            size_t BucketNo = _ht->_HashFun(_pNode->_kv.first)+1;
            size_t i = BucketNo;
            for( ;i<_ht->_table.size(); ++i)
            {
                pNext = _ht->_table[i];
                if(pNext)
                {
                    return pNext;
                }
            }
        }
        return NULL;//没找到
    }

private:
    Node* _pNode;
    HashTable<K, V> *_ht;
};

HashTable.cpp


                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈希桶的实现 的相关文章

  • 智能驾驶数据集 合集

    智能驾驶数据集 集合 智能驾驶图像数据 No 1 103 300张驾驶员行为标注数据 驾驶员行为标注数据 总数据量103 300张 车内摄像头拍摄 且采集多年龄段 多时段 多种驾驶行为 关键点标注准确率不低于95 手势矩形框 人脸属性信息标
  • C++左值和右值

    这里有个误区 左值不是 left value 而是 location value 可寻址的值 右值不是 right value 而是 read value 只可读的值 所以 变量地址可读可写的是左值 只可读的是右值
  • 我的 Python.color() (Python 色彩打印控制)

    我的CSDN主页 My Python 学习个人备忘录 我的HOT博 自学并不是什么神秘的东西 一个人一辈子自学的时间总是比在学校学习的时间长 没有老师的时候总是比有老师的时候多 华罗庚 我的 Python color Python 色彩打印

随机推荐

  • 如何快速构造两个hashCode相同的字符串

    这要从hashCode的源码说起 String类hashCode的代码如下所示 public int hashCode int h hash if h 0 value length gt 0 char val value for int i
  • 【建议收藏】自动化测试框架开发教程

    在自动化测试项目中 为了实现更多功能 我们需要引入不同的库 框架 首先 你需要将常用的这些库 框架都装上 pip install requests pip install selenium pip install appium pip in
  • java 实现复制文件到指定目录

    将resource下的目录及文件 复制一份到指定目录 代码实现 import cn hutool core io FileUtil import org springframework core io Resource import org
  • adb shell 出现 insufficient permissions for device 参考网址:http://hi.baidu.com/iceliushuai/blog/item/1e50

    adb shell 出现 insufficient permissions for device 参考网址 http hi baidu com iceliushuai blog item 1e506160c5d01f48eaf8f801 h
  • 归纳演绎出的世界观

    题目略有写宽泛 刚读完 世界观 第一部分的内容 信息量有点大 迫切需要写篇读书笔记理清思路 归纳 和 演绎 方法 什么是归纳 Inductive 和演绎 Deductive 很多对于归纳 演绎的观点都是错误的 错误的以为两者是对立的 要么是
  • Spring MVC Controller配置方式

    Spring MVC 入门示例http cuisuqiang iteye com blog 2042931中 配置Controller时使用的是URL对应Bean的方式在SpringMVC中 对于Controller的配置方式有很多种 如下
  • Python—re正则表达式

    1 首先需导入模块import re 2 在一串字符中 findall方法可以获取全部能够匹配的片段 并把结果放在一个列表中 书写方式 re findall 正则表达式 规定匹配规则 被匹配的对象 3 使用findall方法匹配普通字符 4
  • 求k个数组包含每个数组至少一个元素的最小范围(待字闺中,备忘)

    有k个有序的数组 请找到一个最小的数字范围 使得这k个有序数组中 每个数组都至少有一个数字在该范围中 例如 1 4 10 15 24 26 2 0 9 12 20 3 5 18 22 30 所得最小范围为 20 24 其中 20在2中 22
  • 主流微服务全链路监控系统之战

    问题背景 随着微服务架构的流行 服务按照不同的维度进行拆分 一次请求往往需要涉及到多个服务 互联网应用构建在不同的软件模块集上 这些软件模块 有可能是由不同的团队开发 可能使用不同的编程语言来实现 有可能布在了几千台服务器 横跨多个不同的数
  • 抖店评价有礼怎么设置

    随着电商行业的不断发展和竞争的加剧 如何吸引消费者 提高店铺的口碑成为了每个卖家关注的焦点 其中 抖音电商平台的礼貌评价功能受到广大卖家的青睐 那么 如何设置抖店评论才能有礼貌呢 我们一起来讨论一下吧 如何设置抖店评价礼貌度 首先 开启礼貌
  • 工具--Typora详解

    工具 Typora详解 零 文章目录 一 MarkDown 1 MarkDown是什么 Markdown 是一种轻量级标记语言 它允许人们使用易读易写的纯文本格式编写文档 Markdown 语言在 2004 由约翰 格鲁伯 英语 John
  • opengles reference card

    https www khronos org files opengles31 quick reference card pdf https www khronos org opengles sdk docs reference cards
  • mac系统ssh文件位置

    open ssh 转载于 https www cnblogs com thinkingthigh p 8874204 html
  • js的数字和字符串区分不开问题

    我们在开发的时候经常会出现 if this name 1 执行对应逻辑 但是就是在这个判断的时候 就是不知道该写成 if this name 1 执行对应逻辑 还是写成 if this name 1 执行对应逻辑 这是一个坑 代码调试时候遇
  • 第十四届蓝桥杯模拟赛(第三期)——Java版

    第一题 请找到一个大于 2022 的最小数 这个数转换成十六进制之后 所有的数位 不含前导 0 都为字母 A 到 F 请将这个数的十进制形式作为答案提交 public class Main public static void main S
  • MacBook m1pro在conda环境关于架构出现过的问题

    回想一下十月份的时候刚拿到电脑做了点啥 刚开始没有进行转换架构的虚拟环境的设置 导致好像是安装pyqt5 一直失败 总之查了半天 最后指向似乎是架构问题 然后利用https www bilibili com read cv13742031
  • vue3项目引入typescript总结

    tsconfig json详细配置 根选项 include 指定被编译文件所在的目录 exclude 指定不需要被编译的目录 extends 指定要继承的配置文件 files 指定被编译的文件 references 项目引用 是 TS 3
  • 使用python-pyhdfs连接hdfs时报错

    一 问题描述 raise ConnectionError e request request ConnectionError HTTPConnectionPool host a port 50075 Max retries exceeded
  • python爬虫js逆向学习(三)

    1 问题分析 1 1 查询条件设置后进行点击事件 可抓取到ajax请求的获取的数据包 1 2 对数据包请求过程进行分析 发现Formdata及respopnse都是加密的且formdata中的参数每次刷新后都不同 1 3 既然参数及相应数据
  • 哈希桶的实现

    上一篇博客中介绍了用闭散列法的二次探测和开链法构造哈希表的原理即实现方式 构造哈希表的闭散列法之二次探测地址 http blog csdn net qq 36221862 article details 73488162 下面介绍另一种方法