【数据结构】哈希表

散列表(也叫哈希表),是根据关键码值而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

哈希表的核心是合适的hash函数,数据范围,解决冲突的办法

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

冲突

对于不同的关键字可能得到相同的散列地址的现象称为冲突

比如哈希函数为Hash(key)=key%HashSize时就有可能出现冲突的情况。

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

数字分析法

cpp 复制代码
struct student
{
	int birthday;
	char name[10];
}

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

哈希结构

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

c 复制代码
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);
};

初始化哈希表

cpp 复制代码
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*));
		}
	}
}

插入

cpp 复制代码
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;
	}
}

查找

cpp 复制代码
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;
}
相关推荐
m0_547486667 分钟前
郑州轻工业大学《数据结构》期末试卷及答案2018-2022学年(AB卷)
数据结构·期末试卷·郑州轻工业大学
变量未定义~15 分钟前
字符串哈希匹配字符串
数据结构·算法·哈希算法
bnmoel35 分钟前
数据结构深度剖析栈与队列:结构、边界实现与进出操作全解析
c语言·数据结构·算法··队列
ChoSeitaku1 小时前
06_可变参数_递归_类和对象_封装
java·数据结构·算法
图码1 小时前
文本两端对齐算法详解:从LeetCode到实际应用
数据结构·图像处理·算法·leetcode·生成对抗网络·面试·职场和发展
liu****1 小时前
第16届国赛蓝桥杯大赛C/C++大学C组
c语言·数据结构·c++·算法·蓝桥杯
代码无bug抓狂人1 小时前
用回溯算法解决01背包
数据结构·算法
Odedipus1 小时前
二叉树的学习笔记
数据结构·笔记·学习
拂拉氏2 小时前
【知识讲解-题目讲解】:二叉树的前、中、后序遍历的三种实现(递归,非递归,Morris遍历)与二叉树oj题讲解(二叉树最近公共祖先,二叉树展开为链表)
数据结构·算法·leetcode·二叉树·遍历
ʚ希希ɞ ྀ2 小时前
打家劫舍----背包dp
数据结构·算法·leetcode