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

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

比如在复习 程序语言的时候    对编译程序的处理过程和文法分析 有了全新的了解 作为一个半路出家  没学过程序语言这门课的我来说   有一种醍醐灌顶的感觉   以前在看 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这些......

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

原文地址:https://www.cnblogs.com/qinning/p/10850443.html

时间: 2024-10-19 00:20:30

查找--------哈希表的原理的相关文章

哈希表的原理与实现

[转自]:http://my.oschina.net/chape/blog/132533 目录[-] 哈希表的原理与实现 一致性 hash 算法 基本场景 hash 算法和单调性 consistent hashing 算法的原理 虚拟节点 小结 分布式哈希算法 哈希函数 哈希表 分布式哈希表 哈希表的工作原理与常用操作 基础操作 应用举例 哈希表的原理与实现 一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较key啊,呵呵. 大家都知道,在所

哈希表工作原理 (并不特指Java中的HashTable)

1. 引言         哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用.  哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一.         哈希表又叫做散列表,分为“开散列” 和“闭散列”.考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅

哈希表工作原理

1. 引言        哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一.        哈希表又叫做散列表,分为“开散列” 和“闭散列”.考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅指“闭

哈希表数据结构原理

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) 提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教 用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度 下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历 对于每次向哈希

【Python算法】哈希存储、哈希表、散列表原理

哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中. 查找时再根据要查找的关键字采用同样的函数计算出哈希地址,然后直接到相应的存储单元中去取要找的数据元素即可. 哈希表的应用: 哈希表(hash table)是实现字典操作的一种有效的数据结构. 尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n). 然而实际应用中,散

(转载)查找三 哈希表的查找

查找三 哈希表的查找 目录 要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表. 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key,则其值存放在 f(key) 的存储位置上.由此,不需比较便可直接取得所查记录. 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较. 冲突 若 key1 ≠ key2

查找三 哈希表的查找

要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表. 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key,则其值存放在 f(key) 的存储位置上.由此,不需比较便可直接取得所查记录. 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较. 冲突 若 key1 ≠ key2 ,而 f(key1) = f

哈希表(散列)HashTable实现

最近刷Leetcode发现凡是找字符串中重复字符或者数组中找重复数据的时候就不知道从何下手了. 所以决定学习一下哈希表解题,哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,但是数据查找十分麻烦:二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果.hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便. 定义hash数据结构,我采用的解决冲突的方法是分离链接法. //单链表结构 typedef struct listno