数据结构-哈希表(C语言)

哈希表的概念

哈希表就是:

将记录的存储位置与它的关键字之间建立一个对应关系,使每个关键字和一个唯一的存储位置对

应。

哈希表又称:“散列法”、“杂凑法”、“关键字:地址法”。

哈希表思想

基本思想是在关键字和存储位置之间建立一个哈希函数hash,使每一个存储位置和关键字对应

通常关键字的集合很大,因此经过哈希函数的变换后,可能会将不同的关键字映射到同一个地址

上。这种现象称作:“冲突”,具有相同函数值的关键字称作:“同义词”。

哈希表属性

哈希函数的值域是可以使用的地址空间,称作基本区域

基本区域的长度是哈希表的长度

同义词可以存放在基本区域中未占用的单元,也可以放在另外开辟的地方。(溢出区

哈希函数的构造

哈希函数的构造一般有下面几种方法:

1.直接定址法

hash(key) = key或hash(key) = a * key + b

直接定址法的构造有点像Python里面的字典

优点:不会产生冲突

缺点:空间效率不高

2.取余法

hash(key) = key % p

p < m,m是哈希表长。

优点:计算简单,适用范围大

缺点:需要选择一个合适的p,p的选择很困难

一般来说,p是不大于m的最大素数:

3.平方取中法

先计算关键字的平方,然后取平方后数的中间几位作为地址。

key = 2587

key ** 2 = 6692569

若取三位,则hash(2587) = 925。

处理冲突的方法:

1.开放定址法

当发生冲突时,在冲突位置的前后寻找可以存放记录的空闲单元。

当用此法时,需要预先设置一个探测序列d,沿着序列d寻找空闲单元。

数学描述公式为:

H = (hash(key) + d) % m

其中探测序列d有下面三种取法:

1.d = 1,2,3,4,.....,n

2.d = 1^{2} (-1)^{2} 2^{2} (-2)^{2} .... (n)^{2} (-n)^{2}

3.d = 随机数列

用的最多的是1和2

但是使用1的时候,会导致原本不冲突的非同义词也会产生冲突,这种现象叫作:“堆积”(聚

集)。

因此减少堆积可以使用2,但是2并不能保证可以全部使用表中空闲单元,容易造成浪费。

2.拉链法

将具有相同哈希地址的记录连接成一个单链表,然后用一个数组将n个单链表头指针存储起来。

3.再哈希法

当发生冲突时,再用另一个哈希函数计算地址。

4.溢出区法

建立一个额外的公共溢出区,用来存储冲突的记录

 

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

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

相关文章

KT148A语音芯片使用串口uart本控制的完整说明_包含硬件和指令举例

一、功能简介 KT148A肯定是支持串口的&#xff0c;有客户反馈使用一线还是不方便&#xff0c;比如一些大型的系统不适合有延时的操作&#xff0c;所以更加倾向于使用uart控制&#xff0c;这里我们也给出解决方案 延伸出来另外一个版本&#xff0c;KT158A 注意次版本芯片还是…

数据库表字段以表格形式写入Word

在项目的开发中&#xff0c;难免会有编写概要设计、详细设计文档的要求&#xff0c;而在这些文档中&#xff0c;不可避免的就是要把数据库表的字段信息以表格的形式体现出来。例如下面这种格式 表数量少点还可以一点点粘贴&#xff0c;多了的话真的会疯&#xff0c;所以自己编写…

如何在Linux上搭建本地Docker Registry并实现远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)镜像,不受本地局域网限制&#xff01; 1. 部署Docker Registry 使用官网安装方式,docker命令一键启动,该命令启动一个regis…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …

Linux:安装软件的两种方式rpm和yum

一、rpm方式 1、简单介绍 RPM是RedHat Package Manager的缩写&#xff0c;它是Linux上打包和安装的工具。通过rpm打包的文件扩展名是.RPM。这个安装包就类似Windows系统中的.exe文件。rpm工具实现Linux上软件的离线安装。 2、软件相关信息的查询命令 查询Linux系统上所有已…

网站被攻击怎么办

随着互联网的普及和网络攻击的日益增多&#xff0c;网站安全成为了众多企业和个人必须面对的重要问题。为了保护网站和用户数据的安全&#xff0c;内容分发网络&#xff08;CDN&#xff09;成为了一种有效的解决方案。本文将介绍CDN在保护网站安全、抵御网络攻击方面的作用和应…

uniapp-轮播图点击预览功能

实现效果 点击后打开预览图 实现代码 <swiper v-if"this.bannerList.length > 1" class"swiper" autoplay"true" duration"500" interval"2000" change"changeSwiper"><swiper-item class"swip…

Python爬虫进阶:提升爬虫效率

文章目录 一、单线程多任务异步协程二、线程池requests模块三、两个方法提升爬虫效率总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试…

利用SD存储介质扩展MAXQ20000的非易失性数据存储空间

SD存储卡是一种可移动存储介质&#xff0c;通常用于相机、手机、平板电脑等设备中存储照片、视频、音乐等数据。SD存储卡的全称为Secure Digital Memory Card&#xff0c;是由SD Card Association制定的一种标准格式。它具有体积小、存储容量大、读写速度快、价格低廉等优点。目…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅初步讨论添加、查看与删除网卡&#xff0c;有关…

AtCoder Beginner Contest 329 题解A~F

A - Spread 输入字符串&#xff0c;字符之间加上空格输出 B - Next 输出数组当中第二大的数 C - Count xxx 统计每个字符出现过的最长长度&#xff0c;再累加即可 #include<bits/stdc.h> #pragma GCC optimize("Ofast") #define INF 0x3f3f3f3f #define I…

【网络奇遇记】那年我与计算机网络的浅相知

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

Redis数据的持久化

Redis的持久化有两种方式&#xff1a; RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09; 目录 一、RDB 保存方式 2、rdb在redis.conf文件中的配置 二、AOF 1、保存方式 2、aof方式持久化在redis.conf文件中的配置 三、持久化建…

Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

rabbitMQ的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式 生产者 生产者发送消息到交换机&#xff08;logs&#xff09;,控制台输入消息作为生产者的消息发送 package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel;import java.util.Scanne…

java--俄罗斯方块

一、先看一下游戏运行时的画面 二、代码部分 1. Cell.java Cell.java&#xff1a; package demo1;import java.awt.image.BufferedImage; import java.util.Objects;/* 编写小方块类属性&#xff1a;行、列、每个小方格的图片方法&#xff1a;左移一格、右移一格、下落一格 编…

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置&#xff0c;实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代&#xff0c;各种云层出不穷&am…

贝锐蒲公英路由器X4C如何远程访问NAS?

在目前网盘前路坎坷的情况下&#xff0c;私人云盘已然是一种新的趋势&#xff01;那自己打造一个私有云盘&#xff0c;是否需要高成本或是高门槛呢&#xff1f;其实并不用&#xff01;蒲公英针对个人玩家打造了全方位的私有云解决方案。 &#xff08;1&#xff09;入门级玩家只…