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. IDEA升级开源框架

    在开发过程中,我们经常会用到一些 GitHub或者Gitee上的开源框架来快速搭建我们的业务系统,但是当框架被我们大批量修改后,开源框架又有升级了.这时候升级框架就变得很麻烦,也不能直接直接进行合并, ...

  2. 动手个性化设置自己的 IntelliJ IDEA

    前言 IDEA 是一个智能开发工具,每个开发者的使用习惯不同,如何个性化自己的IDEA? 我们可以通过 Settings 功能来设置. Settings文件是 IDEA 的配置文件,通过它可以设置主题 ...

  3. IP基础 & 子网划分 & 路由寻址

    IP地址详解 IP地址概念 就像用身份证号码来区别毎个人一样,为了区别 网上的每台计算机,我们给因特网上的每一台计算机一个唯一的编号 ,我们把它称为IP地址 IP地址就是一个唯一标识 ,是一段网络编码 ...

  4. yum install hadoop related client

    yum list avaliable hadoop\* yum list installed yum repolist repo is in /etc/yum.repos.d yum install ...

  5. easyui comboBox的多选框之疑难杂症——逗号篇

    提笔写正文之前,首先要再次提醒一下自己,因为总是记不住,以至大神同事们都开始用"嫌弃"的眼光看自己了--         记得使用easyui中的combobox吗?效果是酱紫滴: ...

  6. 暑假算法练习Day6

    最近开始了实验室的生活,并且学习了bullet journal.希望接下来的每一天都能完成所有的任务. 1012 数字分类 (20 分) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数 ...

  7. 菜鸡的Java笔记 - java 线程的同步与死锁 (同步 synchronization,死锁 deadlock)

    线程的同步与死锁 (同步 synchronization,死锁 deadlock)        多线程的操作方法            1.线程同步的产生与解决        2.死锁的问题     ...

  8. silky微服务框架的服务治理介绍

    目录 服务治理的概念 服务注册与发现 负载均衡 超时 故障转移(失败重试) 熔断保护(断路器) 限流 RPC限流 HTTP限流 1. 添加配置 2. 注册服务 3.启用 AspNetCoreRateL ...

  9. liunx下安装mysql(8.0.27)

    一.软件下载: 1.通过官网下载: https://dev.mysql.com/downloads/repo/yum/ 本文使用的系统为centos7,基于RedHat7的版本 2.下载完成后文件 m ...

  10. [loj6278]数列分块入门2

    做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...