散列文件的存储——‘桶’
来源:互联网 发布:java获取服务器ip地址 编辑:程序博客网 时间:2024/06/14 03:27
散列文件的存储单位称为桶(Bucket)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。
例如:设散列函数为Hash(Key)=Key mod 7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图:
散列文件内容示意图
为简化起见,散列文件的存储单位以内存单元表示。
函数InsertToHashTable(int NewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值1;否则返回值0。
采用的散列函数为Hash(NewElemKey)=NewElemKey % P,其中P为设定的基桶数目。
函数中使用的预定义符号如下:
#include<stdio.h>#include<malloc.h>#define NULLKey -1/*散列桶的空闲单元标识*/#define P 7/*散列文件中基桶的数目*/#define ITEMS 3/*基桶和溢出桶的容量*/typedef struct BucketNode {/*基桶和溢出桶的类型定义*/ int KeyData[ITEMS]; struct BucketNode *Link;}BUCKET;BUCKET Bucket[P];/*基桶空间定义*/int InsertToHashTable(int NewElemKey){ /*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*/ /*设插入第一个元素前基桶的所有KeyData[]、Link域已分别初始化为NULLKEY、NULL*/ int Index; /*基桶编号*/ int i, k; BUCKET *s, *front, *t; /*(1)*/ Index = NewElemKey % P; for (i = 0; i<ITEMS; i++) /*在基桶查找空闲单元,若找到则将元素存入*/ if (Bucket[Index].KeyData[i] == NULLKey) { printf("存储成功!"); Bucket[Index].KeyData[i] = NewElemKey; break; } if (i >ITEMS)//基桶已满,存入失败 return 0; /*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/ front = &Bucket[Index];//将基桶的地址给临时变量front,用于申请新的地址连接 t = Bucket[Index].Link;//溢出桶的地址,就是已经申请过溢出桶了。 if (t != NULL)/*有溢出桶*/ { printf("有溢出桶!"); while (t != NULL) { for (k = 0; k < ITEMS; k++) if (t->KeyData[k] == NULLKey) /*在溢出桶链表中找到空闲单元*/ { t->KeyData[k] = NewElemKey; break; }/*if*/ if (k==ITEMS)//溢出桶也满了 t = t->Link; else break; } /*while*/ }/*if*/ if (t=NULL) /*申请新溢出桶并将元素存入*/ { printf("溢出桶申请成功!"); s = (BUCKET *)malloc(sizeof(BUCKET)); if (!s) return -1; s->Link = NULL; for (k = 0; k < ITEMS; k++) s->KeyData[k] = NULLKey; s->KeyData[0] = NewElemKey; front->Link=s;//将申请的溢出桶与基桶连接 } /*if*/ return 0;}int main(){ int a[22] = { 15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453 }; for (int i = 0; i < 22; i++) InsertToHashTable(a[i]); return 0;}
阅读全文
1 0
- 散列文件的存储——‘桶’
- PHP Session文件的散列存储及过期删除
- 列式存储的 parquet文件底层格式
- Hash散列存储
- 散列存储方法
- 学习笔记——列存储
- 数据存储—读写内部存储的文件数据
- Android——文件的存储
- 数据存储—文件的基本操作
- 修正STM32F103ZE的散列文件
- [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
- 读取存储在MsSql下的文件,配合使用DataGrid的模板列。
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
- Java中的散列存储
- 散列存储(链表法)
- 什么是数据库散列存储?
- 数据存储的行存储和列存储
- 数据结构——线性表——散列存储结构——哈希表知识点总结
- Hibernate5总结
- git 场景 :从一个分支cherry-pick多个commit
- python 判断字符串时是否是json格式方法
- cnpm run dev启动报错,解决办法
- Android开发基础,保存用户输入的用户名和密码
- 散列文件的存储——‘桶’
- mybatis批量插入数据
- dubbo
- java反射原理,动态加载(软件版本升级)
- Fusioncharts API参考方法(Functions)总结
- 控制精灵移动
- 慢SQL熔断方案
- JAVA并发处理注意事项
- XShell+Xmanager实现在XShell中显示远程服务器的图形界面