首页 > 编程语言 >数据结构与算法学习(07)查找(4)散列、哈希、字典——BUAA

数据结构与算法学习(07)查找(4)散列、哈希、字典——BUAA

时间:2024-05-26 12:31:05浏览次数:28  
标签:tmp 07 int BUAA 列表 地址 查找 哈希 散列

文章目录

查找(4)—— 散列(Hash)字典

介绍

本文为查找第四部分,主要是整理了本人上课时讲的内容,并给出了代码实现

散列函数的构造方法

直接地址法

H ( k ) = a k + b H(k) = ak + b H(k)=ak+b

数字分析法

基本思想:当关键字值的位数大于散列地址码的位数时,对关键值各位数字进行分析,从中取出与散列地址位数相同的位

在这里插入图片描述

在这里插入图片描述

适用范围:适用于当所有关键字值都已知的情况下。但在许多情况中,这是不可能实现的,所以这时候便不合适

平方取中法

在这里插入图片描述

适用范围:当关键字值中的每一位取值都不够分散,或者相对比较分散的位数小于散列地址所需要的位数的情况。

叠加法

基本思想:将关键字值分割成位数相同的几个部分(最后一个部分的位数如不够,不足位左边可以空缺),然后把这几个部分的叠加和(舍去进位)作为散列地址。

适用范围:在位数很多且位值分布比较均匀时可以采用

移位叠加法

在这里插入图片描述

舍去进位,179作为k的散列地址

折叠叠加法

在这里插入图片描述

基数转换法

在这里插入图片描述

除留余数法

H ( k ) = k   m o d   p H(k) = k\ mod\ p H(k)=k mod p

其中,若m为地址范围大小(或称表长),则p可为小于等于m的素数。一般为最接近m的素数

随机数法

H ( k ) = r a n d o m ( k ) H(k) = random(k) H(k)=random(k)

一些好的哈希函数**

针对字符串好的哈希函数
unsigned int hash(char *str)
{
    unsigned int h = 0;

    while (*str != '\0')
        h = (h << 5) + *str++;
    return h % TableSize;
}
unsigned int BKDRHash(const char *str)
{
    unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
    unsigned int hash = 0;

    while (*str)
    {
        hash = hash * seed + (*str++);
    }

    return (hash & 0x7FFFFFFF); // 处理负数情况
}

冲突的处理方法

开放地址法

D i = ( H ( k ) + d i )   m o d   m D_i = (H(k) + d_i) \ mod\ m Di​=(H(k)+di​) mod m

线性探测

d i = 1 , 2 , 3 , 4 , 5 , 6 , d_i = 1,2,3,4,5,6, di​=1,2,3,4,5,6,

二次探测

d i = 1 2 , − 1 2 , 2 2 , − 2 2 , d_i =1^2,-1^2,2^2,-2^2, di​=12,−12,22,−22,

伪随机

di 为伪随机序列

特点

负载因子——衡量散列表的饱满程度
α = n m m a x \alpha = \frac{n}{m_{max}} α=mmax​n​
n 代表散列表中实际存入的元素数,m 代表散列表中基本区的最大容量

α \alpha α 越大,散列表越满,一般来说小于1。

  1. “线性探测法”容易产生元素“聚集”的问题。
  2. “二次探测法”可以较好地避免元素“聚集”的问题,但不能探测到表中的所有元素(至少可以探测到表中的一半元素)。
  3. 只能对表项进行逻辑删除(如做删除标记),而不能进行物理删除。使得表面上看起来很满的散列表实际上存在许多未用位置

再散列法

D i = H i ( k ) D_i = H_i(k) Di​=Hi​(k)

D i D_i Di​ 为散列地址, H i ( k ) H_i(k) Hi​(k) 是不同的散列函数

链接地址法

在这里插入图片描述

代码实现
struct Node
{
    int data;
    struct Node *next;
} *Hashtable[tableSize];

// 查找并创建哈希表
struct Node *lookUp(int key, int create)
{
    unsigned int h = hash(key);
    struct Node *tmp = Hashtable[h];

    while (tmp != NULL)
    {
        if (tmp->data == key)
        {
            return tmp;
        }
        tmp = tmp->next;
    }
    if (create)
    {
        tmp = (struct Node *)malloc(sizeof(struct Node));
        tmp->data = key;
        tmp->next = Hashtable[h];
        Hashtable[h] = tmp;
    }
    return tmp;
}
说明
  1. 当散列出现冲突时,新插入的元素放在链表的头部,这样算法简洁,效率更高;
  2. 由于链表查找效率低,可使用一棵二叉查找树或另一个散列表来代替链表解决冲突。
特点
  1. 处理冲突简单,不会产生元素“聚集”现象,平均查找长度较小 。
  2. 适合建立散列表之前难以确定表长的情况 。
  3. 建立的散列表中进行删除操作简单
  4. 由于指针域需占用额外空间,当规模较小时,不如“开放地址法”节省空间

散列表的典型应用

符号表symbol),用于在数据值和动态符号(如变量名,关键码)集的成员间建立一种关联。符号表是编译系统中主要的数据结构,用于管理用户程序中各个变量的信息,通常编程系统使用散列表来组织符号表。

浏览器中维持最近使用的**页面踪迹、缓存最近使用过的域名及它们的IP地址。**

标签:tmp,07,int,BUAA,列表,地址,查找,哈希,散列
From: https://blog.csdn.net/cjh_cr7/article/details/139213132

相关文章

  • 数据结构与算法学习(06)查找(3)Trie树(C语言)——BUAA
    文章目录查找(3)——Trie树(C语言)介绍结构实现典型应用(字典树)代码实现优势查找(3)——Trie树(C语言)介绍本文为查找第三部分,主要是整理了本人上课时讲的内容,并给出了C语言代码实现结构实现键值由固定的字符序列组成(如数字或字母),如Huffman码、英文单词;对应结点的分层标记......
  • (免费领取源码)计算机毕业设计项目:07558基于Python的校园宿舍(开题答辩+程序定制+全套文
    摘要本论文主要论述了如何使用django开发一个校园宿舍管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园宿舍管理系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各......
  • 散列(哈希)及其练习题(基础)
    散列导入:有N个数和M个数,如何判断M个数中每个数是否在N中出现?思想:空间换时间创建hashtable,以N个数本身为索引(数组下标)构建boolhashtable输入x的过程中,hashtable[x]=True(若要计算出现次数,换成++)但终归是有局限性!数字只能是整数,还不能太大,等等。散列函数:平房区中法、取余......
  • Day 4 | 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、面试题 02.07.
    24.两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.两两交换链表中的节点.html思考需要设置一个虚拟头节点,方......
  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......
  • 贴片反射式红外光电传感器ITR8307
    红外光电传感器ITR8307ITR8307外形特性快速响应时间高灵敏度非可见波长薄紧凑型无铅该产品本身将保持在符合RoHS的版本内描述ITR8307/S18/TR8是一种光反射开关,它包括一个GaAsIR-LED发射器和一个NPN光电晶体管,该晶体管具有短距离的高光敏接收器,在红外范围内工作......
  • Day3 | 203.移除链表元素 、707.设计链表 、 206.反转链表
    203.移除链表元素建议:本题最关键是要理解虚拟头结点的使用技巧,这个对链表题目很重要。题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.移除链表元素.html思考设置一个虚拟的dummy节点,方便代码逻辑一致,不然要专门处理头节点。定义一个pre节点,作为cur节点的前驱......
  • 二叉树搜索树 洛谷P5076
    洛谷P1827#include<bits/stdc++.h>usingnamespacestd;intn,root,cnt,opt,x;structnode{intvalue,left,right,size,num;node(intl,intr,ints,intv):left(l),right(r),size(s),value(v),num(1){}node(){}}t[10010];voidu......
  • 【日记】今天好困(407 字)
    正文4T硬盘降价了,好心动。虽然只降了10块钱…….为什么硬盘这么贵啊!哼。柜面上杂事好多。虽然一天到晚见不到几个客户,但杂事就是很多。一个头两个大。也不知道从哪儿冒出来的这么多事。芒果干到了!还没去取,希望好吃w。今天真的好困好困,感觉从没这么困......
  • Luogu P5073
    题面简述:全局加、区间最大子段和。做这题之前请确保你会:线段树、凸包、闵可夫斯基和、如果没有修改或只有单点修改,那就是经典问题(这题现在似乎也成经典问题了):线段树节点上维护区间和\(\text{sum}\)、最大前缀和\(\text{ls}\)、最大后缀和\(\text{rs}\)、最大子段和\(\tex......