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的方法如下

最新文章

  1. C# 多線程&amp;BackgroundWorker概念入門教程
  2. JDK和IDE
  3. Could not find the Visual SourceSafe Internet Web Service connection information for the specified database Would you like to launch the Visual sourceSafe connection wizard?
  4. 多个Tomcat同时运行环境配置 - imsoft.cnblogs
  5. NOI考前乱写
  6. vb.net中常用键值
  7. android--email发送邮件,文本还有附件形式的邮件
  8. BNU 4067 求圆并
  9. rm -vf `ls |egrep -v "info_20130826-180233.31764|QueryParser.INFO"`
  10. 转:Loadrunner学习知多少--脚本录制下载操作
  11. 为什么要使用CMake?
  12. SQL中常用数学函数
  13. Java获取Window和Linux系统的项目ClassPath路径
  14. C#微信公众号开发--微信事件交互
  15. 使用命令行登陆数据库配置文件修改 解决ora12528
  16. hdu 1392 Surround the Trees 凸包裸题
  17. Java学习——加法器
  18. C#多线程的用法6-线程间的协作Mutex
  19. Java toString()方法的神奇之处
  20. 20155223 2006-2007-2 《Java程序设计》第一周学习总结

热门文章

  1. POJ 2584 T-Shirt Gumbo(二分图最大匹配)
  2. dns+nginx实现多虚拟主机
  3. Java发展的重大事故
  4. Linux下搭建FFmpeg开发调试环境
  5. 单线程 Redis 为什么这么快,看看这篇就知道了
  6. Error filterStart
  7. JDK源码阅读(7):ConcurrentHashMap类阅读笔记
  8. c语言用指针交换两个变量
  9. [FJ2021]D2T3题解
  10. Arc123 D