07_哈希

本文详细介绍了哈希函数的概念,以及四种常见的哈希冲突解决方法:开放定址法、再散列函数、链地址法和公共溢出区法。此外,还深入剖析了链式哈希的结构定义和API实现,包括插入、删除和搜索操作。最后,提及一致性哈希和虚拟节点在哈希表优化中的应用。
摘要由CSDN通过智能技术生成

哈希

在这里插入图片描述
什么是哈希:
哈希:hash;就是散列函数
在这里插入图片描述

1 哈希冲突的4种处理方法:

  • 1.开放定址法:也叫线性探测法;
    在这里插入图片描述

一次探测缺点就是数据会集中在一块,解决方法就是平方探测(二次探测),避免堆积
在这里插入图片描述
正数:代表向右探测
负数:代表向左探测

  • 2.再散列函数(哈希)法:
    在这里插入图片描述

  • 3.链地址法:
    只要数据有冲突就头插在同一个下标下

  • 公共溢出区法:
    一个基本表,一个溢出表;将有冲突的数据放入溢出表。
    缺点是当数据过大,基本表太小时,溢出表的规格将会很大

2 链式哈希

在这里插入图片描述

结构定义:
#define HASHSIZE 12
typedef struct Node
{
	int data;
	struct Node* next;
}Node, * PNode;


typedef struct Head
{
	//struct Node *arr[HASHSIZE];//指针数组(存放指针的数组)
	struct Node arr[HASHSIZE];//数组arr中存放Node本身
}Head, * PHead;
API实现
void Init_listhash(PHead ph)
{
	//assert
	for (int i = 0; i < HASHSIZE; i++)
	{
		//ph->arr[i].data;// 不使用
		ph->arr[i].next = NULL;
	}
}

bool Insert_hash(PHead ph, int key)//头插
{
	int hash = key % HASHSIZE;

	//创建新节点
	struct Node* pnewnode = (Node*)malloc(sizeof(Node) * 1);
	assert(pnewnode != NULL);
	pnewnode->data = key;

	//插入
	pnewnode->next = ph->arr[hash].next;
	ph->arr[hash].next = pnewnode;

	return true;
}

bool Del_Hash(PHead ph, int key)
{
	int hash = key % HASHSIZE;

	struct Node* p = &ph->arr[hash];
	for (p; p->next != NULL; p = p->next)
	{
		if (p->next->data == key)
		{
			//此时p->next 指向的这个节点就是我们要删除的那个节点
			struct Node* q = p->next;
			p->next = q->next;
			free(q);
			q = NULL;

			return true;
		}
	}
	return false;
}

struct Node* Search(PHead ph, int key)
{
	int hash = key % HASHSIZE;

	struct Node* p = ph->arr[hash].next;
	for (p; p != NULL; p = p->next)
	{
		if (p->data == key)
		{
			return p;
		}
	}

	return NULL;
}

void Show_Hash(PHead ph)
{
	for (int i = 0; i < HASHSIZE; i++)
	{
		printf("%3d: ", i);
		struct Node* p = ph->arr[i].next;
		for (p; p != NULL; p = p->next)
		{
			printf("%d ", p->data);
		}
		printf("\n");
	}

}

3 一致性哈希和虚拟节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值