首页 > 编程语言 >数据结构与算法分析——C语言描述(第5章 散列)

数据结构与算法分析——C语言描述(第5章 散列)

时间:2022-10-03 19:56:01浏览次数:73  
标签:HashVal TableSize int C语言 关键字 Key 数据结构 散列

目录
本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。
散列表的实现常常叫作散列(hashing)。散列是一种以常数平均时间执行插入、删除和查找的技术。

5.1 一般想法

理想的散列表数据结构只不过是一个含有关键字的具有固定大小的数组。
我们把表的大小记作Table-Size,并将其理解为散列数据结构的一部分而不仅仅是浮动于全局的某个变量。通常的习惯是让表从\(0\)到Table-Size\(-1\)变化。

散列函数(hash function)——将每个关键字映射到从\(0\)到Table-Size\(-1\)这个范围中的某个数,并且放到适当的单元中。

不过一对一对映射是不可能的——单元的数目是有限的,而关键字实际上是无穷无尽的。因此,我们寻找一个散列函数,该函数要在单元之间均匀地分配关键字。

剩下的问题是如何解决当两个关键字散列映射到同一个值的冲突(collision)以及如何确定散列表的大小。

5.2 散列函数

如果输入的关键字是整数,则一般合理的方法就是直接返回Key mod TableSize的结果,除非Key碰巧具有某些不理想的性质。解决方法:保证表的大小是素数——当输入的关键字是随机整数时,散列函数不仅算起来简单而且关键字的分配也很均匀。
如果输入的关键字是字符串——

散列函数返回类型:

typedef unsigned int Index;

第一种方法是把字符串中字符的ASCII码值加起来,但此时对表的大小有要求,取决于字符串的最大字符长,否则无法实现均匀分配。

第一种方法:

Index
Hash( const char *Key, int TableSize )
{
	unsigned int HashVal = 0;
	while( *Key != '\0' )
		HashVal += *Key++;
	return HashVal % TableSize;
}

第二种方法是把字符串中字符在字母表中的位置乘以权重加起来,但此时理论上3个字符有\(26^3=17576\)种可能的组合,实际上3个字母的不同组合数只有2851种,对表的大小依然有要求(不能过大)。

第二种方法:

Index
Hash( const char *Key, int TableSize )
{
	return ( Key[ 0 ] + 27 * Key[ 1 ] + 729 * Key[ 2 ] ) % TableSize;
}

第三种方法是计算\(\sum_{i=0}^{KeySize-1}{Key[KeySize-i-1]·32^i}\),并将结果限制在适当的范围内。程序根据Horner法则计算一个(32的)多项式函数(这里之所以用32代替27,是因为用移位代替乘法)。下述程序中while循环里的加法还可以用按位异或来代替。

第三种方法:

Index
Hash( const char *Key, int TableSize )
{
	unsigned int HashVal = 0;
	while( *Key != '\0' )
		HashVal = ( HashVal << 5 ) + *Key++;
	return HashVal % TableSize;
}

在关键词特别长时,一般不使用所有的字符。(只使用奇数位置/偶数位置/……)
设计思想:用计算散列函数节省下的时间来补偿由此产生的对均匀分布的函数的轻微干扰。

剩下的主要编程细节是解决冲突的消除问题。这里讨论其中最简单的两种:分离链接法开放定址法

5.3 分离链接法(separate chaining)

5.4 开放定址法(open addressing)

标签:HashVal,TableSize,int,C语言,关键字,Key,数据结构,散列
From: https://www.cnblogs.com/kirin-dev/p/Data-Structures_Chapter-5.html

相关文章

  • 【C语言_13】多维数组
    1.什么是多维数组?   C语言中的多维数组(multidimensionalarray)其实就是使用数组作为数组的元素。n维数组的元素是n-1维数组。例如,二维数组的每个元素都是一维数......
  • 数据结构应用题
    数据结构应用题考点数组数组的存储结构一维数组A[0...n-1]为例,存储关系\[LOC(ai)=LOC(a0)+(i)×L(0≤i<n)\]L是每个数组元素所占存储单元多维数组对于多维数组,有两......
  • C语言——数据的存储(总结)
    一.数据类型    基本类型    打印类型所占大小(字节)char     字符型    %c  1short    短整型    %d    2int ......
  • 02 线性表 | 数据结构与算法
    1.线性表线性表的定义特点:存在唯一一个被称为第一个的数据元素存在唯一一个被称为最后一个的数据元素除了第一个元素之外,其他的数据元素都有唯一一个直接前驱除......
  • 01 入门 | 数据结构与算法
    1.数据数据:数据是指对客观事物进行记录并且可以可以鉴别的抽象符号数据元素:数据的基本单位,在计算机当中作为一个整体考虑数据对象:具有相同性质的数据元素的集合数据......
  • C语言与汇编
    C变量C语言是如何把各种类型的变量转换成对应的汇编语言呢?高级语言更容易被工程师理解,而汇编语言这样的低级语言,则更容易被机器解读。这是因为汇编语言里的大部分内容都......
  • 数据结构相关基本概念和术语
    数据结构相关基本概念和术语目录数据结构相关基本概念和术语数据(Data)数据元素(DataElement)数据项(DataItem)数据对象(DataObject)数据结构(Datastructure)四类基本结构集合线......
  • C语言入门—明明的随机数
    题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的......
  • 【C语言】经典猜数字游戏
    ​​#include<stdio.h>​​​​#include<stdlib.h>​​​​#include<time.h>​​​​voidmenu()​​​​{​​​​printf("**********\n");​​​​printf("*****......
  • 专升本C语言笔记-2022-10-2
    变量名命名规则:1.变量名只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。               2.第一个字母必须是字母或者下划线开头。 ......