散列查找-(三)散列函数的构造方法

散列表/哈希表(C语言简单实现) 散列表/哈希表(C语言简单实现) 本文参考自《大话数据结构》 定义 通过某个函数f计算出记录的存储位置,而不需要通过比较,这就是一种新的存储技术——散列技术。 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 。在查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。 我们把这种对应关系f称为散列函数,又称为哈希函数。按照这个思路,采用散列技术将记录存储在一块连续的存储 阅读详情

 

 


1 数字关键词的散列函数构造

 

1.1 直接定址法

取关键词的某个线性函数值为散列地址,即
h(key) = a × key + b (a、b为常数)

地址 h(key)出生年月(key)人数(attribute)

0

1990

1285万

1

1991

1281万

2

1992

1280万

……

……

……

10

2000

1250万

……

……

……

21

2011

1180万

根据上表,得出散列函数的构造函数为:h(key)=key-1990

 

1.2 除留余数法

散列函数为:h(key) = key mod p
例: h(key) = key % 17

地址012345678910111213141516
关键词3418220  23742 2711 30 15 

一般,p 取素数,这里:p = Tablesize = 17

 

1.3 数字分析法

分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址
比如:取11位手机号码key的后4位作为地址:
散列函数为:h(key) = atoi(key+7) (char *key)

手机号133-0408-1767  地址是1767

 

如果关键词 key是18位的身份证号码:
在这里插入图片描述
用红线标出来的是变化比较大的的6位数字,这里就取这6位数字来组建散列函数
h1(key) = (key[6]-‘0’)×10^{^{4}} + (key[10]-‘0’)×10^{^{3}}+(key[14]-‘0’)×10^{^{2}}+ (key[16]-‘0’)×10^{^{1}}+ (key[17]-‘0’)

其他数字都不随机,

比如第一位只有1~5,代表中国的五大区

第七位只有1和2,毕竟3000年出生的人还要等一千年

第12位也只有1和2,因为一年12个月,两位数字的月数只有11和12

 

最后

当 key[18] = ‘x’时,身份证最后一位为X
h(key) = h1(key)×10 + 10

当 key[18] 为’0’~’9’时,身份证最后一位为数字
h(key) = h1(key)×10 + key[18]-‘0’

 

1.4 折叠法

把关键词分割成位数相同的几个部分,然后叠加
在这里插入图片描述

1.5 平方取中法

在这里插入图片描述

 


2 字符关键词的散列函数构造

 

2.1 一个简单的散列函数——ASCII码加和法

对字符型关键词key定义散列函数如下:
h(key) = ( Σkey[i] ) mod TableSize

问题:对于ASCII之和相同的字符串就会冲突,

比如

a3、 b2、c1;

eat、 tea;

他们加起来的值是一样的

 

2.2 简单的改进——前3个字符移位法

把字符串的前三个字符取出来,看成27进制种的个位数,十位数,百位数,为什么使用27,因为有26个字符,考录空格,就是27。
h(key)=(key[0]×27^{^{2}}+ key[1]×27 + key[2]) mod TableSize

问题:
1、仍然冲突:string、 street、strong、structure等等,前三个字符相同;

假设9个字符以内的有3000个英语单词,我们假设所有的字母(26个英文字母)排列组合有26^{_{3}} 种情况,散列表只用到30%。

2、空间浪费:3000/26^{_{3}} ≈ 30%

 

2.3 好的散列函数——移位法

涉及关键词所有n个字符,并且分布得很好:
这里就考虑这个字符串的所有位。把它看成是32进制数的每一位,为什么是32进制,后面会说。
在这里插入图片描述
快速计算:
h(“abcde”)=‘a’*32^{_{4}}+’b’*32^{_{3}}+’c’*32^{_{2}}+’d’*32+’e’

计算过程如下:
h = a
h = a * 32 + b
h = (a * 32 +b) * 32 + c
h = ((a * 32 + b) * 32 + c) * 32 + d
h = (((a * 32 + b) * 32 + c) * 32 + d) * 32 + e
h = h%TableSize
这里a * 32 == a<<5,左移5位相当于乘以32

快速计算C++代码如下:

Index Hash(const char *Key, int TableSize)
{
	unsigned int h = 0;		//散列函数值,初始化为0
	while (*Key != '\0')		//位移映射
		h = (h << 5) + *Key++;
	return h % TableSize;
}

快速计算Java代码如下:

public class Hash {

    String string;//要计算哈希值的字符串(小于等于5位)
    int tableSize= (int) Math.pow(26,5);//26的5次方的哈希表的空间
    int myhashCode=0;//初始的HashCode是0

    /*
    计算方法(散列函数,散列方法)
     */
    public int getHashCode( ){
        char[] chars=string.toCharArray();//字符串转char数组
        for (int i = chars.length-1; i>=0 ; i--) {
            myhashCode = (myhashCode<<5)+(chars[i]-'a');
        }
        return myhashCode%tableSize;
    }

    /*
    建立String的set方法
     */
    public void setString(String string) {
        this.string = string;
    }


}

 

public class MyController {
    public static void main(String[] args) {
        Hash hash=new Hash();
        hash.setString("abcde");
        hash.getHashCode();
        System.out.println("hash.tableSize = " + hash.tableSize);
        System.out.println("hashcode="+hash.myhashCode);

    }
}

控制台输出:

 

 

 

 

 

 

 

 

 

参考文章:https://blog.youkuaiyun.com/happyjacob/article/details/84878458

 

散列表查找失败平均查找长度 如果你看了很多其他博客然后都看不懂看到了这篇,你一定可以容易懂的!我佛了,这么简单的东西死板地讲套路不讲原理鬼看得懂啊,这种风气真的不行,我忍不住想骂一声垃圾,啥玩意儿,误人子弟! 要想知道 散列表查找失败的平均查找长度,就要知道什么叫做查找失败!举个栗子:8个数字 key%11 如下算好了: 散列地址 0 1 2 3 4 5 6 7 8 9 10 关键字 33 1 13 12 34 38 .. 阅读详情

相关推荐

数据结构笔记6 散列查找

散列表 目前已知的查找方法: 但是上述这几种方法对于长字符串的动态查找效果都不是很好。看下面的例子:

weixin_38091797的博客 3335

散列函数的构造方法

散列函数的构造方法

庾信平生最萧瑟 315

数据结构与算法之散列查找

散列表 下面是几种已知的查找方法,右边是他们的时间复杂度。 时间复杂度最好也只是O(N),有没有一种查找方式可以一找就找到呢,有,那就是散列查找散列查找的关键就是创建散列表。 散列表:是实现字典操作的一种有效数据结构。最坏查找时间为O(n),理论上可以达到的平均查询时间是O(1)。散列表是普通数组概念的推广,当实际存储的关键字数目比全部的可能关键字总数要小时,采用散列表就成为直接数组寻址的一种有...

来自蒟蒻LebronGod的博客 3977

数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符、移位法) 我们发现32是2的5次方,于是可以通过移位,也就是将一个数往左二进制移位五次,就相当于*32.,取后三位391,所以h(56793542) =种,但经过统计得到,实际中的组合约3000种,,即空间利用率大约30%,浪费了70%的空间。,理论上来说,前三字符所有可能性的组合为。

li13437542099的博客 2136

散列表查找成功和不成功时的平均查找长度

已知散列表长度为13,散列函数为H(key)=key % 11,处理冲突的方法为线性探测法,请画出依次插入关键字(10,8,40,27,21,57,46,23,19,56)以后的散列表,并计算查找成功和不成功时的平均查找长度。 解:散列表是哈希表的另一种叫法,散列函数为H(key)=key % 11用的是除留余数法,线性探测法就是当遇到冲突时,H(key)=(key+d )% 11,key为关键...

yincheng_917的博客 2万+

【数据结构】哈希查找(散列查找)

主要内容 前提 构造散列函数 数字分析法 平方取中法 折叠法 除留余数法 处理冲突 开放地址法 链地址法 散列查找 前提 如果在数据元素的存储位置和其关键字之间建立某种直接关系,那么在进行查找时,就无需逐个比较关键字或者只做少数次的比较,并按照直接关系由关键字找到相应的记录,这就是散列查找法(Hash Search)的思想。它通过对元素的关键字值进行某种运算,直接求出元素的...

春雪阁 1618

数据结构(C语言描述)散列表

1 集合的基本概念 集合是表示事物的最有效的数学工具之一。 下面讨论各种以集合为基础的抽象数据类型,并研究在计算机上实现的有效方法。 1.1 集合的定义和记号 集合是由元素(成员)组成的一个类。集合的成员可以是一个集合,也可以是一个原子。 同一个元素在一个集合中不能多次出现。 有时需要表示有重复元素的集合,这时允许同一个元素在集合中多次出现。这样的集合称为多重集合。 当集合中的原子具有线性序关系(或称全序关系)“<”时,称集合为有序集(全序集或线性序集)。“<”是集合的一个线性序,它有如下性质:

qq_740785701的博客 1599

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4871

散列技术-散列函数的构造方法

散列函数的构造方法 1、散列函数的选择有两条标准:简单和均匀。  简单指散列函数的计算简单快速;  均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集K随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。 2、常用散列函数  为简单起见,假定关键字是定义在自然数集合上。 (1)平方取中法  具

Code-lover's Learning Notes 1842

S32DS使用手把手教程:从零实现CAN通信配置

深入讲解S32DS使用过程中如何从零开始配置CAN通信,涵盖关键步骤与实用技巧,帮助开发者快速上手S32DS使用中的常见问题与调试方法。

weixin_42405592的博客 1126

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4494

查找算法之散列表

新星计划:数据结构与算法,学习笔记,创作打卡4!本文主要是查找算法之散列查找的详细介绍。

墨城烟柳ベ旧人殇的博客 2442

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 186

散列查找

散列查找

K_天道酬勤 7680

OCV/AOCV/SOCV的介绍和应用

library中的cell delay是在某个固定的PVT(operating condition)下仿真得出的。,cell的delay并不是一个固定值,而是一个随机值,遵循高斯分布或门特卡洛分布,在STA中用OCV来模拟这一『特征』。OCV全称on chip variation,用于描述不同管子间由于工艺偏差、电压降、温度变化引起的delay变化。,也用于描述工艺偏差引起的net厚度宽度的变化从而导致net的电容电阻变化。优点:设置起来比较简单粗暴,对于不那么先进的工艺可行!的影响,更贴合实际。

m0_61003348的博客 8980

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 295

散列(Hash)表查找

对于散列查找,应掌握散列表的构造、冲突处理方法(各种方法的处理过程)、查找成功和查找失败的平均查找长度、散列查找的特征和性能分析。

kusunoki的博客 2653

【升级U8+】不能将值 NULL 插入列 ‘VT_ID‘,表 ‘VoucherItems‘;列不允许有 Null 值。

不能将值 NULL 插入列 ‘VT_ID’,表 ‘UFDATA_006_2012.dbo.VoucherItems’;列不允许有 Null 值。INSERT 失败。

努力不懈的为广大客户提供优质的产品与真诚、贴心、专业的服务! 517

1.散列查找

选择合适的散列函数h(key),散列法的查找效率期望是常数O(1),它几乎与关键字的空间的大小n无关!也适用于关键字直接比较计算量大的问题;它是以较小的α为前提。因此,散列方法是一个以空间换时间的方法;散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适合于范围查找,或最大值最小值查找。对于开放地址法来说:1.散列表是一个数组,存储效率高,随机查找。2.散列表会存在“聚集”现象。3.关键字删除需要“懒惰删除”法,从而产生存储“垃圾”。

码明的博客 1574

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2795

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

散列表(哈希表)(散列函数构造、处理冲突、查找)

  前面介绍的查找是建立在比较的基础上,查找效率由比较次数决定,不仅与被查数据整体的存储结构有关,还与逻辑上可被查找的数据集合所含的数据个数有关,同时与待查记录在查找表中位置以及查找策略如查找方向有关。理想的查找是不经过任何比较就能根据所查关键吗直接得到待查记录所在的存储位置。散列查找技术就是朝该方向努力,它在关键码和存储位置之间建立一种对应关系,散列函数,由该函数可计算出关键码唯一的地址。在存储...

Unique-You的博客 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言数据结构与算法---散列表(哈希表)的查找

文章目录一. 散列表的基本概念二. 散列函数的构造方法1. 要求2. 方法三. 散列函数的实现 一. 散列表的基本概念 基本思想:记录的存储位置与关键字之间存在对应关系 优点:查找效率高 缺点:空间效率低 散列方法: 选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定 k 计算地址,将 k 地址单元中有关元素关键码进行对比,确定查找是否成功。 散列函数: 散列...

myjess’s blog 3844

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构(34)】7.4 散列表的查找

严蔚敏版【数据结构】1. 散列表的基本概念。2.散列函数的构造。3.散列函数处理冲突的方法:开地址法、链地址法。4.散列表的查找:散列表的查找效率分析

shangguanxiu的博客 5902

散列表查找(哈希表)

1、散列表(哈希表)的概述 (1)散列技术: 通过关键字直接找到记录的存储位置(此过程不需要进行比较)。 (2)存储位置=f(关键字): 每一个关键字对应一个存储位置,f成为散列函数,也叫哈希函数。 对于存储位置=f(关键字),我理解的就是:一元线性方程y=f(x),每一个x都能取得对应的y值,这里的x就相当于关键字,y相当于存储位置,这个一元线性方程就相当于哈希函数. (3)散列表查找步骤: 存放步骤:通过散列函数计算散列地址,把相关记录放到计算出来的散列地址中 查找步骤:通过散列函数计算散列地址,在这个

仟各的博客 3230
上一篇: 散列查找-(二)基本概念
下一篇: 散列查找-(四)处理Hash冲突的方法
a-bit
博客等级 码龄10年 16粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值