1.什么是哈希表(hashtable)?为什么要发明哈希表?

首先回答第二个问题,在之前的数据结构中我们学习了数组,链表,二叉树等数据结构,记录在结构中的相对位置是随机的,和记录的关键字之前不存在确定的关系,因此,在结构中查找记录时需要进行一系列和关键字的比较。这类查找方法是建立在“比较”基础上。在顺序查找时,比较的结果为“=”与“≠”两种可能;在折半查找,二叉排序查找和B树查找时,比较结果为“<”,“=”和“>”三种可能。查找效率依赖于查找过程中进行的比较次数。哈希表就是为了减少比较次数,尽可能通过关键字更快的找出所需记录。

哈希表是通过一个对应关系f,使得每个关键字和结构中一个唯一的存储位置相对应。因此在查找时,只需要根据对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此,不需要进行比较便可直接取得所查记录。在此,我们称这个对应关系f为哈希(Hash)函数,按这种思想建立的表称为哈希表。

2.如上图所示,这里我们只是对关键字H做取余处理(即哈希方法f为取余),当我们的空间充足时,我们可以在每个对应的f(H)位置放置元素(哈希值相同可以按序将安插位置后移,两个关键字哈希值相同称之为冲突),当空间不足时该如何处理(这里其实不够准确,这里应该说的是哈希表的主链长度小于要放入的元素个数,要是真的内存或硬盘空间不足时,也只能通过通过物理扩容来解决,程序应该解决不了这样的问题)?我们在之前初步认识hashtable时已经了解到,在横向发展受到阻碍时,可以尝试纵向发展,即为该f(H)位置纵向添加链表,来解决哈希值相同的问题。

这里其实是将问题转移了,我们前面说到过,我们使用哈希表就是为了一次计算直接找到记录,这里又对该关键字的记录做串长处理,这不是又倒回去了吗?这里我的理解这就是一种平衡,当某个篮子(bucket)下的元素过多时,则必须对篮子进行扩容,在扩容后对现有的元素要进行重新哈希。因此,一个哈希表的好坏取决于其哈希方法的是否高明。

3.模板参数解释

Value为元素类型,Key为关键字类型,HashFcn是获取hashcode的方法,ExtractKey为获取key的方法,EqualKey为判断key值是否相同的方法,存放bucket的容器为vector。

4.实例

这里的实例的hashtable的value和key类型均为字符串类型,hash方法为自带的全特化方法,key值为value本身,key值判断相等与否为包装后的strcmp

从下图我们可以看到,自带的特化特化了多种类型的hash方法

对于参数为const char*类型的数据,获取其hashcode的方法如下

hashtable深度探索的更多相关文章

  1. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  2. Delphi深度探索-CodeSite应用指南

    Delphi深度探索-CodeSite应用指南 Delphi虽然为我们提供极其强大的调试功能,查找Bug仍然是一项艰巨的工作,通常我们写代码和调试代码的所消耗的时间是大致相同的,甚至有可能更多.为了减 ...

  3. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  4. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  5. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  6. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  7. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  8. Socket深度探索 4 PHP(转)

    [连载] Socket 深度探索 4 PHP (一) [连载] Socket 深度探究 4 PHP (二) [连载] Socket 深度探究 4 PHP (三)

  9. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

随机推荐

  1. Zabbix 4.4 离线安装 使用mariadb的踩坑,无法停止服务

    先分享一个网站,之前就没注意过有这个网站,不知道是啥时候开放的.里面分享了N多zabbix的模板. https://share.zabbix.com/ 报错如下 Unsupported charset ...

  2. MongoDB 集群 config server 查询超时导致 mongos 集群写入失败

    环境 OS:CentOS 7.x DB:MongoDB 3.6.12 集群模式:mongod-shard1 *3 + mongod-shard2 *3 + mongod-conf-shard *3 + ...

  3. 解决虚拟机linux系统全屏问题

    修改设置 1) 如下图右单击虚拟机名,选择[settings-],调出虚拟机设置界面. 2) 在设置界面选择[hardware]->[CD/DVD2(IDE)]->[Connection] ...

  4. 7-7 后缀式求值 (25分)的python实现

    exp=input().split() ls=list() def Cal(a,b,i): if i=="+": return a+b elif i=="-": ...

  5. sui Mobile 试玩

    .... 突然就用上这东西还不熟悉就写了一个页面而已 <a class="open-popup button pull-right create-actions" id=&q ...

  6. Python 深拷贝和浅拷贝的区别

    python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用  ...

  7. [bzoj5418]屠龙勇士

    很显然,每一步所选的剑和怪物都是确定的,可以先求出来(不用写平衡树,直接用multiset即可,注意删除要删指针,以下假设第i次攻击用ki攻击的剑,攻击第i只怪)  首先判断无解,即如果存在ai使得g ...

  8. [atAGC045C]Range Set

    首先我们可以把所有位置都变为1,因此不妨假设$a\le b$ 一个字符串$s$合法当且仅当:将其中每一段长度不小于$a$的0变成1后,存在一段1的长度都不小于$b$ 证明:我们称$S_{a,b}$为通 ...

  9. [loj3366]嘉年华奖券

    联系绝对值的几何意义/分类讨论,不难发现若$n$张奖券上的数从小到大依次为$a_{i}$,则收益为$\sum_{i=1}^{\frac{n}{2}}a_{i+\frac{n}{2}}-a_{i}$ 假 ...

  10. SpringCloud微服务实战——搭建企业级开发框架(二十二):基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能

    多租户技术的基本概念:   多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且 ...