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. Jenkins MultiJob

    前提:项目有十几个服务每次发版/更新服务需要一个个去编译 目的:希望能够建立一个任务一次构建可以批量编译很多服务,并且需要输入一个参数指定编译的分支 需要插件: MultiJob 安装插件 1.在Je ...

  2. mysql流程控制结构case when

    一.case 使用场景 简单函数 CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement ...

  3. SQL告警,执行时间长?教你写一手好 SQL !

    博主(编码砖家)负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟.导出日志后分析,主要原因竟然是没有命中索引和没有分页处理 . 其实这是非常低级的错误, ...

  4. thread pool

    thread pool import concurrent.futures import urllib.request URLS = ['http://www.foxnews.com/', 'http ...

  5. (一)初识MySQL

    JavaEE:企业级Java开发  Web 前端(页面:展示,数据) 后台(连接点,连接数据库JDBC,链接前端(控制,控制视图跳转和给前端传递数据)) 数据库(存数据,Txt,Excel,word) ...

  6. 9组-Alpha冲刺-3/6

    一.基本情况 队名:不行就摆了吧 组长博客:https://www.cnblogs.com/Microsoft-hc/p/15546622.html 小组人数: 8 二.冲刺概况汇报 卢浩玮 过去两天 ...

  7. 美妙绝伦面向node引用-zico图标(逐浪矢量全真图标)1.9发布

    15年前,那个农村小伙初入广告行业被讥笑没有审美 于是他狠下决心,积极研发,缔就技术之核, 再后来,那些PPT和美工er们随便怎么自好,无法让其心怵. 因为他是中华人民共和国唯一具备web.cms.o ...

  8. K8S使用NodePort类型Service

    1.使用nodetype类型 1.1.第一种类型创建:直接在yaml中标记是nodePort apiVersion: v1 kind: Service metadata: name: nginx-se ...

  9. [hdu7082]Pty loves lcm

    先将问题差分,即仅考虑上限$R$(和$L-1$) 注意到$f(x,y)$增长是较快的,对其分类讨论: 1.若$y\ge x+2$,此时满足$f(x,y)\le 10^{18}$的$(x,y)$只有约$ ...

  10. pm2 重启策略(restart strategies)

    使用 PM2 启动应用程序 时,应用程序会在自动退出.事件循环为空 (node.js) 或应用程序崩溃时自动重新启动. 但您也可以配置额外的重启策略,例如: 使用定时任务重新启动应用程序 文件更改后重 ...