查找--------哈希表的原理

这段时间 在 准备软件设计师考试    目的是想复习一下  自己以前没怎么学的知识    在这个过程中  有了很大的收获  对以前不太懂得东西  在复习的过程中  有了很大程度的提高 

比如在复习 程序语言的时候    对编译程序的处理过程和文法分析 有了全新的了解 作为一个半路出家  没学过程序语言这门课的我来说   有一种醍醐灌顶的感觉   以前在看 javaweb技术内幕是  

对里面提的javac 的编译原理  看的真的是 云里雾里   哈哈哈   想想 也是醉了  最基础的程序语言 都没有看过  会想去理解javac 的编译原理

(编译程序 中间的处理过程 有 词法分析  语法分析  语义分析  中间代码生成  代码优化  目标代码生成   这次过程中   又有符号管理 和 出错处理 俩个过程贯穿其中    除此之外 还有汇编、解释程序系统等)

在 复习计算机网络的时候   对 SMTP 有了全新的认识  以前上课的时候只是粗略的学了一下  很多东西并没有搞懂   不知道  MIME是对 SMTP的 优化  传统的 SMTP 只能传输 ASCII类型的字符   MIME 及多用途Internet邮件扩充协议  它的最初的设定是为了增加邮件的功能  啊哈哈哈    还记得在 javaweb 中 的  这种 文传输类型吗   如   text/html  还有在文件上传的时候  添加的文件类型后缀 

 

*****************************************************

  正文    关于   哈希表   在 java 的 体系在 听的是 太多了  但是 对于  hash表    以前理解的并不是很多  只知道 这个很重要  在很多的地方 都听过  但是对于 底层的原理  自己 知道的真的是微乎其微 

哈希表  在 数据结构的位置  

 作用在  查找的篇章   关于查找   的内容在软件设计师的教材上如下 和  数据结构(严蔚敏篇的内容差不多)

静态查找有 顺序查找   折半查找   分块查找(索引查找 )

动态查找有  二叉排序树 二叉平衡树  B-树   B+ 树   .....

哈希表 的 设立  也是为了便于查找    哈希表放在了静态和 动态的查找的 最后  为什么》???

说明哈希表的重要性?   是的  

前面的不管是 静态查找 还是 动态查找  他们所记录在结构中的相对位置 是随机的 和记录的关键字之间不存在确定的关系  因此在查找的过程中  需要进行一系列的比较才能找到        要是理解这句话   差不多 就能明白 哈希表 设计的目的了吧    (前面的两种排序  如我们传统的排序  是在不确定里面数据的情况下  进行的比较   所以  它的查找时间 是和N 有关    而 哈希表 想要做的是  我能不能不进行比较你只要给我一个数据 我就知道 它在哈希表中的存储位置   )虽然他也没法做到  查询时间为 1    因为有冲突  

关于 哈希函数的构造方法  如 直接定址法  数字分析法  平方取中法  随机数法 除留余数法等 这里就不一一说明了  仅简绍一下直接定址法
   它的方法时    取关键字的某个线性函数值为哈希地址  即:
H(key)=key  或 H(key)=a*key+b
其中a b 为常数  (这种哈希函数叫做自身函数   )
列如 统计每一个省份的人口数   可以将每个省份的编码设为 关键字  哈希函数取关键字本身 H(key)=key
 
这里着重说明一下 在构造哈希函数方法的之前  首先要明确什么是 好的 哈希函数 
若对于关键字集合中的任一个关键字,经哈希函数映像到地址集合中任何一个地址的概率都是相等的 , 则称此类哈希函数为均匀的哈希函数。  简而言之 就是 使用哈希函数的关键字  能够均匀的分配到哈希表的每一个位置   从而避免冲突
 
处理冲突的方法 
1  开放定址法  

 


 2  链地址法   它和开发地址发 有本质的差别   前一个是  为了 避免冲突而设定   这一个 是 ”接受冲突”

 

三个因素 : 哈希函数   处理冲突的方法     哈希表的填装因子

*****************************************************************************************************************************************************

上面说的 哈希表的内容   有很多不足之处     要想对哈希表 有更加深入的了解  十分建议 去 看看数据结构的  查找 的  相关 概念  

 自己 在 学习java的时候   走了很多的弯路  很多知识 都是 不太了解   知其然  不知其所以然    这是因为 对 很多 计算机的 基础概念的理解不太深入   或者是根本就不了解   在这种前提下  还想不断的去学习最前沿的技术   这显然是 不太明智的      因为楼盖的再高  如果根基不稳的话  很容易塌的  这也是为什么  对于考计算机研究生  要考  数据结构  计算机网络   操作系统   组成原理等 知识  

 这也是为什么校招那么喜欢问 一些基础的知识   

因为对这些相对基础的知识不太了解的话  就很难去理解 那些已经封装好的东西  以及升华   比如   java虚拟机的知识  要是对计算机的底层 不太了解的话  理解java虚拟机的是相当吃力的  当然 远不止java这些......

所以 最后  希望 那些半路出家的 人   能一起去 学一点 这些 相对 底层的东西吧  虽然它们都相当枯燥 但是静下心去学 还是会有所收获的

猜你喜欢

转载自www.cnblogs.com/qinning/p/10850443.html