【数据结构】哈希表

2023-11-09

散列表(也叫哈希表),是根据关键码值而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
哈希表的核心是合适的hash函数,数据范围,解决冲突的办法

这里通过数字分析法设计哈希函数, 链地址法解决从冲突。

冲突

对于不同的关键字可能得到相同的散列地址的现象称为冲突
比如哈希函数为Hash(key)=key%HashSize时就有可能出现冲突的情况。

假设哈希表的大小是4个bit
1001和10001所对应的哈希地址是相同的
解决冲突的办法是建立一个链表存储这两个数据

数字分析法

struct student
{
	int birthday;
	char name[10];
}

对于一个班的学生,出生年月日的前几位的数据相差不大,如果用这几位数据做哈希表的地址那么出现冲突的概率很大,但是表示月份和日期的数字相差较大,用这几位数据做哈希表的地址出现冲突的概率就不是很大。或者将将年月日都作为哈希地址(年是一级地址,月是二级地址,日是三级地址)
在这里插入图片描述

哈希结构

这里没有用学生信息的那个例子,用的是数据的存储和查找,HashTable中的三级指针是因为哈希表地址按照数据的个位、十位、百位分成了三层。哈希表中存的是节点的指针。

struct Node
{
	int data;
	struct Node* next;	
};
Node* CreateNode(int data);
struct HashTable
{
	struct Node*** pArray[10];
	void initHash(HashTable**p);
	void insertData(HashTable* pTable,int data);
	Node* findDada(HashTable* p, int data);
};

初始化哈希表

void HashTable::initHash(HashTable** p)
{
	*p = new HashTable;
	
	for (int i = 0; i < 10; i++)
	{
		(*p)->pArray[i] = new Node * *[10];
		for (int j = 0; j < 10; j++)
		{
			(*p)->pArray[i][j] = new Node * [10];
			memset((*p)->pArray[i][j], 0, 10 * sizeof(Node*));
		}
	}
}

插入

void HashTable::insertData(HashTable* pTable, int data)
{
	//创建节点
	Node* node = CreateNode(data);
	//找位置
	int bai = data / 100 % 10;
	int shi = data / 10 % 10;
	int ge = data % 10;
	//插入
	Node* temp = NULL;
	if (pTable->pArray[bai][shi][ge] == NULL)
		pTable->pArray[bai][shi][ge] = node;
	else//冲突,链表尾插法解绝
	{
		temp = pTable->pArray[bai][shi][ge];
		while (temp->next)
			temp = temp->next;
		temp->next = node;
	}
}

查找

Node* HashTable::findDada(HashTable* p, int data)
{
	//数据按层拆分
	int bai = data / 100 % 10;
	int shi = data / 10 % 10;
	int ge = data % 10;
	//链表查找
	Node*temp = p->pArray[bai][shi][ge];
	while (temp)
	{
		if (data == temp->data)
			return temp;
		temp = temp->next;
	}
	return nullptr;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】哈希表 的相关文章

随机推荐

  • vi批量缩进

    进入vi后 点击v进入VISUAL模式 再使用上下箭头选择行 按 lt gt 操作缩进
  • Tegra X1性能解析

    摘要 它是一个名副其实的性能怪兽 虽然它的图形性能是iPad Air 2上搭载的A8X芯片的两倍 但是耗费的电量却相差不多 腾讯数码讯 编译 Hamish 今天英伟达抢在CES 2015大会召开前发布了新款移动芯片Tegra X1 这是一个
  • qt,设置窗体的颜色和样式

    在 Qt 中 可以使用 QPalette 类来设置窗体的颜色和样式 具体步骤如下 创建一个 QPalette 对象 使用 QColor 类来设置颜色 例如 QColor color 255 255 255 设置为白色 使用 QPalette
  • GD32E103首次烧写程序后J-link无法识别的解决方法

    原因 用的例程的时钟配置与电路板所用晶振频率不一致 导致第一次能识别单片机 烧写程序后 无法再次识别 解决方法 使用J Flash擦除 具体步骤 1 建立Falsh工程 此时BOOT0 0 如果不是复位状态 则无法连接目标板 此时需要将RE
  • 使用openssl命令方式生成公钥、私钥、证书

    以下是在 Windows 环境下使用 OpenSSL 命令生成这些文件的步骤 生成私钥 打开命令提示符 并导航到您希望保存私钥文件的目录 然后执行以下命令以生成私钥文件 例如 private key openssl genpkey algo
  • Java8 函数式编程

    函数式编程 这里 函数 应该理解为数学上的函数 即y f x 函数式编程的理解出发点 比如给Swing中Button添加监听器addListener Listener接口 为例 没有lambda表达式时一般都是通过匿名内部类new XXXL
  • JavaScript笔记_this指向

    this 指向问题 普通函数的this由调用规则来确定 而箭头函数的的this 本身没有this 取决于父作用域的this 代码执行后 箭头函数取决于父级作用域的this 只跟随父作用域的this改变而改变 普通函数的this取决于调用方式
  • Tomcat 无法访问,未发送任何数据

    问题描述 直接上图 解决 开启的Tomcat 的cmd窗口不要关闭 访问localhost 8080 试试 8080接口被其它服务占用了 修改8080接口 不要修改为1 1023端口和常用端口3306等 首先关闭Tomcat 双击shutd
  • 【Java】Java基础习题1

    这里写目录标题 1 编译Java应用程序源文件将产生相应的字节码文件 字节码文件的扩展名为 2 Java源程序文件的扩展名为 3 编译Java源代码 java 文件的工具为 4 执行Java字节码 class 文件的工具为 5 main方法
  • Spring Security的十一个拦截器

    目录 一 SecurityContextPersistenceFilter 二 LogoutFilter 三 AbstractAuthenticationProcessingFilter 四 DefaultLoginPageGenerati
  • 基于PaddleOCR的DBNet多分类文本检测网络

    目录 目的 模型网络结构对比 代码实现 1 数据集格式 2 配置文件调整 3 数据预处理 4 模型代码调整 5 添加多分类loss 6 修改db postprocess py 7 修改train py eval py infer det p
  • VS无法定位程序输入点于动态链接库

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 问题原因 前言 我们使用QtCreator创建的工程 使用visual studio 打开 前提是vs中安装了qt vsaddin msvc插件 VS无法定位程序输入点于动态链接库 一
  • 清除mac中自动记录的git用户名和密码

    应用程序 实用工具 双击钥匙串 右上角搜索github 右击选项删除
  • 陀螺研究院

    摘要 产业动态 由建行发起的价值30亿美元数字债券将推迟上市 15国正式签署RCEP 全球规模最大自贸协定达成 浙江省首个产业区块链赋能中心落地宁波江北 越南教育和培训部计划在2021年实施区块链技术颁发文凭 深圳市政务区块链专委会正式揭牌
  • pytorch代码实现之SAConv卷积

    SAConv卷积 SAConv卷积模块是一种精度更高 速度更快的 即插即用 卷积 目前很多方法被提出用于降低模型冗余 加速模型推理速度 然而这些方法往往关注于消除不重要的滤波器或构建高效计算单元 反而忽略了特征内部的模式冗余 原文地址 Sp
  • 图像处理(RGB分离)

    图像处理技术 RGB分离 最近学习了图像处理技术 第一个小工程做的事将一张图片的rgb分离 存为三张图片 就像PS中的RGB通道的三张图片一样 我们先准备两张24位真彩色图片 一张宽度像素为4的倍数 一张则不是 我们来看下它的文件头和信息头
  • js文字朗读

    var u new SpeechSynthesisUtterance function read text speed u text text u lang zh u rate speed speechSynthesis speak u
  • 游戏开发安卓知识杂谈系列:关于下载jdk

    想要下载jdk11 去oracle官网下载jdk 发现jdk13以下的版本需要账号登陆 但是去注册账号发现官网账号无法注册 找了半天 网上说Oracle自java SE 8的某个版本以后 需要进行付费才能下载 两个解决办法 找百度网盘或者第
  • webpack使用(5)之处理CSS

    一 需要引入的loader 1 style loader 主要负责创建style标签 并将标签塞入到文档中 2 css loader 主要负责css解析 3 less loader 负责解析less 二 如何引入css资源 1 安装配置st
  • 【数据结构】哈希表

    散列表 也叫哈希表 是根据关键码值而直接进行访问的数据结构 它通过把关键码值映射到表中一个位置来访问记录 以加快查找的速度 哈希表的核心是合适的hash函数 数据范围 解决冲突的办法 这里通过数字分析法设计哈希函数 链地址法解决从冲突 冲突