散列表(Hash table)

来源:互联网 发布:java 设置特定时间 编辑:程序博客网 时间:2024/04/30 07:49

散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。在理的情况下,无须进行任何比较就可以找到待查关键字,查找的期望时间为O(1)。

1.散列表的基本概念
散列是一种重要的存储方法,也是一种常见的查找方法。
散列表的基本思想是:
以结点的关键字K为自变量,通过一个确定的函数(映射)关系h,计算出对应的函数值h(k),然后把这个值解释为结点的存储地址,将这个结点存入h(k)所指的存储地址上。在查找时,根据要查找的关键字用同一函数h计算出地址,再到相应的单元里去取要找的结点。因此,散列表又称为关键字-地址转换法,用散列方法存储的线性表成为散列表(Hash table),又称为哈希表、杂凑表。上述函数h成为散列函数,h(k)成为散列地址。
通常散列表的存储空间是一个一维数组,散列地址是该数组的下标。在不致引起混淆的情况下,将这个一维数组简称为散列表。

这里写图片描述

2.散列表的冲突现象
两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上,该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(Synonym)。
冲突不可能完全避免。只能做到在设计h时尽可能使冲突最少,同时还需要确定解决冲突的方法,使发生冲突的同义词能够存储到散列表中。

3.解决冲突的方法
(1)开放地址法
(2)拉链法

4.散列函数的构造方法
(1)散列函数的选择
散列函数的选择有两条标准:①简单、②均匀
(2)常见的散列函数
①平方取中法
②除留余数法
③相乘取整法
④随机函数法

原创粉丝点击