- 哈希:算法思想,将数据根据哈希算法映射成键值,根据键值来写入伙查找数据,以实现查找数据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;
}