数据结构-Hash总结(一):理论学习篇

转载请注明出处http://blog.csdn.net/yankai0219/article/details/8185796
零、学习方法
简要学习理论篇,进入程序学习篇,再回头学习理论篇和实践篇
一、基本概念
1.Hash定义
Hash定义:将任意长度输入,通过散列算法,变成固定长度输出,该输出就是散列值。
hash函数:就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash表:一种数据结构,既满足了数据的查找方便,同时不占用太多的内容空间。
2.Hash用途
1)哈希主要用于信息安全领域中的加密算法,把一些不同长度的信息转化成杂乱的128位的编码。
2)在海量数据处理中有广泛应用。
3.常见的Hash函数(散列算法)
1)除法散列法
2)平方散列法
3)斐波那契散列法
4.Hash表介绍
Hash表本质:归类方法。
Hash表:一种新的数据结构,兼有数组的易寻址和链表的易插入和删除的特点。
Hash表形象描述:如果有一堆书,就如同链表及线性表一样,杂乱无序,查找起来十分麻烦;
如果进行编号,采用二分法,很快就可以查到
如果可以按照工科、理科、文科进行分类,就可以更快的查到。
Hash表的实现:有多种实现,最常用的是拉链法。
5.举例说明Hash函数
在下面这一个字符串hash函数中,通过遍历字符串,经过表达式hash = 31*hash +*p,循环计算得到Hash值。
很多hash函数都是如此操作,只是其表达式(散列算法)有所不同。
unsigned int yk_simple_hash(char *str,int str_len)
{
        register unsigned int hash;
        register unsigned char *p;
        int i;

        for(hash = 0, i = 0, p = (unsigned char *)str; *p && i < str_len; p++,i++)
                hash = 31 * hash + *p;

        return (hash & 0x7FFFFFFF);
}

二、冲突相关
1.冲突定义假设哈希表的地址集为0~(n-1),冲突是指由关键字得到的哈希地址为j(0<=j<=n-1)的位置上已经有记录。在关键字得到的哈希地址上已经有记录,那么就称之为冲突
2.处理冲突:就是为该关键字的记录扎到另一个“空”的哈希地址。即在处理哈希地址的冲突时,若得到的另一个哈希地址H1仍然发生冲突,则再求下一个地址H2,若H2仍然冲突,再求的H3,直至Hk不发生冲突为止,则Hk为记录在表中的地址。
处理冲突的方法:
1)开放定址法
Hi=(H(key) + di) MOD m i=1,2,...k(k<=m-1)
其中H(key)为哈希函数;m为哈希表表长;di为增量序列。有3中增量序列:
1)线性探测再散列:di=1,2,3,...,m-1
2)二次探测再散列:di=1^2,-1^2,2^2,-2^2,....+-k^2(k<=m/2)
3)伪随机探测再散列:di=伪随机数序列
缺点:
我们可以看到一个现象:当表中i,i+1,i+2位置上已经填有记录时,下一个哈希地址为i,i+1,i+2和i+3的记录都将填入i+3的位置,这种在处理冲突过程中发生的两个第一个哈希地址不同的记录争夺同一个后继哈希地址的现象称为“二次聚集”,即在处理同义词的冲突过程中又添加了非同义词的冲突。但另一方面,用线性探测再散列处理冲突可以保证做到:只要哈希表未填满,总能找到一个不发生冲突的地址Hk。而二次探测再散列只有在哈希表长m为形如4j+3(j为整数)的素数时才可能。
即开放定址法会造成二次聚集的现象,对查找不利
      2)再哈希法
Hi = RHi(key),i=1,2,...k
RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到不发生冲突为止。这种方法不易产生聚集,但是增加了计算时间。
缺点:增加了计算时间。
3)链地址法(拉链法)
将所有关键字为同义词的记录存储在同一线性链表中。
  4)建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0...m-1]为基本表,每个分量存放一个记录,另设立向量OverTable[0....v]为溢出表。所有关键字和基本表中关键字为同义词的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
拉链法的优点:
①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点
拉链法的缺点:
拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度
三.查找:
从哈希表的查找过程可见:
1)虽然哈希表在关键字与记录的存储位置直接建立了直接映像,但是由于“冲突”的产生,使得哈希表的查找过程仍然是一个给定值和关键字进行比较的过程。因此仍需以平均查找长度作为衡量哈希表的查找效率的量度。
2)查找过程中需和给定值进行比较的关键字的个数取决于下列三个因素:哈希函数,处理冲突的方法和哈希表的装填因子。
在一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子。
装填因子=(表中填入的记录数)/(哈希表的长度). 装填因子越小,发生冲突的可能性就越小;反之,装填因子越大,表中已经填入的记录越多,再填记录时,发生冲突的可能性就越大,则查找时,给定值需与之进行比较的关键字的个数也就越多。
四 关于Hash使用与学习
首先一定要明白Hash表的拉链法。因为很多应用都是采用Hash表的拉链法。对于拉链法,我们可以理解为是一个链表的数组。1)数组的每一个元素都是一个链表。2)一个链表中的所有结点都具有相同的Hash值,其Hash值就是这个数组元素的下标。
其次,要学会Hash表初始化、插入元素、查找元素三大操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prism For WPF Login对话框又简单又合理的方案之一

一、前言 这是一篇极简的小短文。首先感谢站长和各位WPF大佬对我的指导&#xff0c;我学到了很多&#xff0c;还是关于利用Prism做Login对话框的事情&#xff0c;看到站长发过一篇《WPF Prism框架Region失效了&#xff1f;》&#xff0c;目前我有一个自认为更合适的解决方法&am…

html5 的支持

html5.js让IE&#xff08;包括IE6&#xff09;支持HTML5元素方法 微软的最新浏览器IE8及以下IE版本对HTML5标签的支持是有限的&#xff0c;我们可以通过在网页中添加脚本的方式来解决目前IE浏览器对HTML5支持的问题。 让IE&#xff08;包括IE6&#xff09;支持HTML5元素&#x…

求指教、。。。关于调用so文件

问题描述今天同事给我发来一个文件&#xff0c;说让我通过android调用里面的函数文件是&#xff1a;里面的内容是&#xff1a;call_so.cpp文件的内容&#xff1a;#pragma pack(1) //非常重要的申明&#xff0c;内存对齐的方法&#xff0c;影响sizeof()的结果#include <stdio…

数据结构-Hash总结(三):实践基础篇

转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8185847问题&#xff1a;1. hash算法主表实现为什么不直接用数组,而使用malloc动态申请?2. 另外每个桶的使用 线性队列 和 双向队列 以及 二级hash的区别以及好处是什么?答案:1.1&#xff09;hash表大小如果…

人类历史上最伟大的物理学家

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

DevToys - 开发人员的瑞士军刀

DevToys 是一个适用于开发人员的工具箱, 基于 UWP 开发, DevToys 旨在拥抱 Windows 生态系统, 免费并且开源, 拥有现代化的界面, 支持中文, 有深色/浅色主题可选, 并且它是离线化的, 所以你完全可以在无网络环境中使用。你可以使用它处理与开发相关的一些任务, 它提供 了14…

python写小猪佩奇_python之小猪佩奇

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 小猪佩奇 &#xff08;源码有点长&#xff09;# coding:utf-8 import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink") t.setup(840,500) t.speed(10) #鼻子 t.pu() t.goto(-…

PYHON中的切片

Python中的切片容易混淆&#xff0c;这里总结一下自己的看法 切片的语法 1 a [1,2,3,4] 2 x a[1:2] #实际上执行的是 a.__getitem__(slice(1,2,None)) 1 slice([start], stop[, step] 2 3 step的符号表示一种方向的含义 4 &#xff1a;从左向…

求字符串的不重复字符的最长子串长度的问题

题目: 已知一个字符串,只含有小写字母,求这个字符串的每个字符都不相同的最长子串的长度。 比如: abcd 结果是4 abcab 结果是3 思路: 用一个26个元素的整形数组表示一个字符串中是否含有某个字符。a~b分别映射到数组元素0~25。 用两个指针分别指向字符串的第一个和第…

ionic 中文 API CSS and javascript link

ionic 中文 API CSS ionic 中文 API javascript 转载于:https://www.cnblogs.com/xieyier/p/4036152.html

phpmyadmin的安装部署

系统环境&#xff1a;centos7php版本&#xff1a;5.3.27phpmyadmin版本&#xff1a;4.2.7.1IP:192.168.1.205数据库&#xff1a;mysql5.5.32本次部署使用nginx下载phpmyadmin&#xff1a;wget https://files.phpmyadmin.net/phpMyAdmin/4.2.7.1/phpMyAdmin-4.2.7.1-all-languag…

你和985硕博研究生,差了这些东西

全世界只有3.14 % 的人关注了爆炸吧知识明明都是在搞科研为什么别人的思路比你开阔&#xff1f;明明都是在写文章为什么别人的方向比你更新颖&#xff1f;今天小编就来推荐几个能拓展视野的公号快点收藏起来吧&#xff01;募格课堂ID&#xff1a;mugeketang推荐理由&#xff1a…

产品运行所需的信息检索失败_禁煤后用什么替代锅炉?看看三种热源运行费用对比就知道了...

山西是我国的煤炭大省&#xff0c;煤炭资源丰富&#xff0c;自然而然也是燃煤大省。在打赢蓝天保卫战的目标任务下&#xff0c;拆除燃煤锅炉&#xff0c;改用清洁能源产品是大势所趋。这样的市场背景下&#xff0c;显然可见的是&#xff0c;山西地区将会迎来一大波的燃煤锅炉改…

图像处理技术(三)白平衡

在现实生活中&#xff0c;同学们经常会出旅游、去景点打卡&#xff0c;拍照&#xff0c;发个朋友圈&#xff0c;如果遇到阴雨天、雾霾天或者沙尘天气&#xff0c;那拍照的效果&#xff0c;可是让人头疼。好不容易去北京故宫玩一次&#xff0c;这不&#xff0c;遇到这种天气&…

Android之使用AIDL时的跨进程回调—Server回调Client

首先建立在server端建立两个aidl文件 ITaskCallback.aidl 用于存放要回调client端的方法 package com.cmcc.demo.server; interface ITaskCallback { void actionPerformed(int actionId); } ITaskBinder.aidl 用于存放供给client端调用的方法package com.cmcc.demo.se…

Mac上Homebrew的使用 (Homebrew 使 OS X 更完整)

0 Homebrew是啥&#xff1f; “Homebrew installs the stuff you need that Apple didn’t.——Homebrew 使 OS X 更完整”。 Homebrew的官网[1]&#xff08;多语言版本&#xff09;简单明了地介绍了如何安装和使用这个工具&#xff0c;并提供了自己的Wiki。 1 安装Homebrew b…

Java泛型总结

Java泛型总结 Java泛型是JDK5引入的一个新特性&#xff0c;允许在定义类和接口的时候使用类型参数&#xff08;type parameter&#xff09;。声明的类型参数在使用的时候使用具体的类型来替换。泛型最主要的应用是在JDK5中的新集合类框架中。对于泛型概念的引入&#xff0c;开发…

mysql查看日志命令_面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!

之前我们搭建的ELK日志收集系统&#xff0c;主要是用来收集SpringBoot应用的日志。其原理是应用通过Logstash插件&#xff0c;使用TCP向Logstash传输日志&#xff0c;从而存储到Elasticsearch中去。但是有很多中间件的日志都是直接存储在文件中的&#xff0c;比如Nginx、Elasti…