数据结构:5.哈希表

  • 哈希:算法思想,将数据根据哈希算法映射成键值,根据键值来写入伙查找数据,以实现查找数据O(1)时间复杂度
  • 哈希表,又称散列表,是一种基于键值存储的数据结构。其核心思想是通过哈希函数将任意长度的键映射为固定长度的索引,从而直接定位到存储位置,实现近乎O(1)时间复杂度的查找、插入和删除操作。
  • 哈希碰撞(哈希冲突):多个数据通过哈希算法映射成同样的键值,说明产生哈希冲突
  • 链地址法:数据产生哈希冲突通过在同一键值位置用链表实现多个数据的存储
  • 哈希函数是需满足以下要求:
    • 确定性:同一键总是产生相同哈希值
    • 高效性:计算速度快
    • 均匀性:键的哈希值应均匀分布,减少冲突
  • 时间复杂度:
    • 理想情况(无冲突):O(1)
    • 最坏情况(全冲突):O(n)
    • 平均情况:取决于负载因子和冲突解决策略
  • 空间复杂度:
      • O(n),但存在空槽浪费

下为哈希表的创建、打印、销毁及查找值,haxitable.h

cs 复制代码
#ifndef __HASHTABLE_H__
#define __HASHTABLE_H__

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef struct node
{
	int Data;
	struct node *pnext;
}Node_t;
//创建哈希表:
extern int InsertHashTable(int TmpData);
//打印哈希表
extern void ShowHashTable(void);
//查找值
extern int FindHaShTable(int TmpData);
//销毁哈希表
extern int DestroyHashTable(void);
#endif

hashtable.c

cs 复制代码
#include"hashtable.h"

static Node_t *pHashTable[10];

int InsertHashTable(int TmpData)
{
	int Index = 0;
	Node_t *pNewNode = NULL;
	Node_t **ppTmpNode = NULL;

	Index = TmpData % 10;
	for(ppTmpNode = &pHashTable[Index];*ppTmpNode!=NULL && TmpData>(*ppTmpNode)->Data;ppTmpNode = &(*ppTmpNode)->pnext);
	pNewNode = malloc(sizeof(Node_t));
	if(pNewNode == NULL)
	{
		perror("fail to malloc");
		return -1;
	}
	pNewNode->Data = TmpData;
	pNewNode->pnext = *ppTmpNode;
	*ppTmpNode = pNewNode;
	return 0;
}
void ShowHashTable(void)
{
	int i = 0;
	Node_t *pTmpNode = NULL;
	for(i = 0;i < 10;i++)
	{
		printf("%d:",i);
		pTmpNode = pHashTable[i];
		while(pTmpNode != NULL)
		{
			printf("%d ",pTmpNode->Data);
			pTmpNode = pTmpNode->pnext;
		}
		putchar('\n');
	}
	return;
}
int FindHaShTable(int TmpData)
{
	int Index = 0;
	Node_t *pTmpNode = NULL;
	
	Index = TmpData%10;
	pTmpNode = pHashTable[Index];
	while(pTmpNode != NULL)
	{
		if(pTmpNode->Data == TmpData)
			return 1;
		else if(pTmpNode->Data > TmpData)
			return 0;
		pTmpNode = pTmpNode->pnext;
	}
	return 0;
}
int DestroyHashTable(void)
{
	int x = 0;
	Node_t *pTmpNode = NULL;
	Node_t *pFreeNode = NULL;

	for(x = 0;x < 10; x++)
	{
		pTmpNode = pFreeNode = pHashTable[x];
		while(pTmpNode != NULL)
		{
			pTmpNode = pTmpNode->pnext;
			free(pFreeNode);
			pFreeNode = pTmpNode;
		}
		pHashTable[x] = NULL;
	}
	return 0;
}

main.c

cs 复制代码
#include"hashtable.h"

int main()
{
	int a = 0;
	srand(time(NULL));
	for(a = 0;a<50;a++)
	{
		InsertHashTable(rand()%100);
	}
	ShowHashTable();
	printf("要找哪个:");
	scanf("%d",&a);
	if(FindHaShTable(a))
		printf("%d存在\n",a);
	else
		printf("%d不存在\n",a);
	DestroyHashTable();
	return 0;
}
相关推荐
临床数据科学和人工智能兴趣组1 小时前
R语言中,列表是一种非常灵活的数据结构,它可以存储不同类型的对象,如向量、矩阵、数据框、甚至其他列表
数据结构·数据库·r语言·r语言-4.2.1·临床试验
我变成萤火虫2 小时前
2026 ICPC沈阳邀请赛Vp补题
数据结构·c++·算法·贪心算法·stl·排序算法·动态规划
神威难绷泪2 小时前
数据结构:二叉树
数据结构·二叉树
风起洛阳@不良使2 小时前
中级软考(软件攻城狮)第3章知识点——数据结构与数据运算(线性结构+非线性结构)
数据结构·算法·链表
索西引擎2 小时前
【数据结构】B树与B+树:结构性质、对比分析与磁盘优化机理
数据结构·b树
xx~t2 小时前
嵌入式学习22
数据结构·学习·算法·排序算法
我是苏苏2 小时前
C#基础:不写for循环的五种方式
数据结构·算法·c#
wuyk55511 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机
en.en..15 小时前
数据结构考点解析:逻辑闭环与存储循环辨析
数据结构
布莱克60517 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库