数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

简介: 数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

数字关键词的散列函数构造

一个“好”的散列函数一般应考虑下列两个因素

  1. 计算简单,以便提高转换速度;
  2. 关键词对应的地址空间分布均匀,以尽量减少冲突。

直接定址法

取关键词的某个线性函数值为散列地址,即 (a、b为常数)。

例如以年份(1990-2011)为关键词,那么就可以将散列函数构造成 image.png

除留余数法

散列函数为:

例如上篇里提到的:

地址 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
关键词 34 18 2 20 23 7 42 27 11 30 15

这里的散列函数就为:h(key) = key % 17

  • 此处p = TableSize = 17
  • 一般地,p取素数

选择素数p可以避免余数之间的相关性,降低哈希冲突的概率。如果选择合数作为模数,可能存在公因数,增加了冲突的概率。

数字分析法

分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址。

比如:取11位手机号码key的后4位作为地址,则散列函数为: (char *key)

即,手机号码为12345678910,其地址就为“8910”。

例子

关键词key是18位的身份证号码: image.png 根据分析,发现变化比较大的就是我们标红的六位,所以我们以他们六位来设计散列函数:

当key[18] = ‘X’时,

当key[18]为‘0’~‘9’时,

(以十进制来计算地址,所以最高位为10的5次方)

折叠法

把关键词分隔成位数相同的几个部分,然后叠加。

比如:56793542,拆分成三部分

,取后三位391,所以h(56793542) = 391

平方取中法

将一个数平方之后再取中间位数的值。

比如:56793542

所以h(56793542)=641

字符关键词的散列函数构造

ASCII码加和法

对字符型关键词key定义散列函数如下:




但是这种方法冲突比较严重,a3(97+3)、b2(98+2)、c1(99+1)的ASCII码值加起来都等于100,eat(101+97+116)和tea(116+101+97)的ASCII码值加起来都等于314.


进行一下简单的改进

前三字符移位



(这里用27进制计算地址,原因是包括空格在内的单个字符共有27个)


但是这种方法仍然容易冲突:string、street、strong、structure等等;


而且会造成空间浪费,理论上来说,前三字符所有可能性的组合为种,但经过统计得到,实际中的组合约3000种,,即空间利用率大约30%,浪费了70%的空间。

移位法

涉及关键词所有n个字符,并且分布得很好;

例如:h(“abcde”) = ‘a’ * + ‘b’ *  + ‘c’ *  + ‘d’ * 32 + ‘e’。

用这个计算方法需要乘10次,我们看一下比较快的计算方法:

h(“abcde”) = (((‘a’ * 32 + b) * 32 + c) * 32 + d ) * 32 + e,

用这种方法,在计算时就只需要乘4次

还有没有更巧妙的办法呢?

我们发现32是2的5次方,于是可以通过移位,也就是将一个数往左二进制移位五次,就相当于*32.

于是有:

Index Hash(const char *Key, int TableSize)
{
    unsigned int h = 0; /* 散列函数值,初始化为0  */
    while( *Key != '\0')
    {
        h = (h << 5) + *Key++;
    }
    return h % TableSize;
}

end



目录
相关文章
|
8天前
|
算法
计算机算法设计与分析(1-6章 复习笔记)
计算机算法设计与分析(1-6章 复习笔记)
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
11 1
|
5天前
|
算法 Java Go
斐波那契数列是一个非常经典的数学问题,在计算机科学中也经常被用作算法设计和分析的例子。
斐波那契数列是一个非常经典的数学问题,在计算机科学中也经常被用作算法设计和分析的例子。
|
16天前
|
存储 算法 Java
图像分析之连通组件标记算法
图像分析之连通组件标记算法
16 1
|
16天前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
16 1
|
9天前
|
人工智能 算法
计算机算法设计与分析 第3章 动态规划 (笔记)
计算机算法设计与分析 第3章 动态规划 (笔记)
|
9天前
|
算法 C++
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
|
9天前
|
算法
计算机算法设计与分析 第1章 算法概述 (笔记)
计算机算法设计与分析 第1章 算法概述 (笔记)
|
9天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
13天前
|
存储 算法 数据挖掘
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】

热门文章

最新文章