0

0

什么是哈希hash 算法

php中文网

php中文网

发布时间:2016-06-08 17:29:29

|

1538人浏览过

|

来源于php中文网

原创

哈希(Hash)表

一般的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查

记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个

对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也

叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如

何确定哈希函数和解决冲突是关键。

1.哈希函数的构造方法

直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)

如:人口数字统计表

地址 1 2 3 ... 100
年龄 1 2 3 ... 100
人数 67  3533 244 ... 4

数字分析法:取关键字的若干数位组成哈希地址

如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。   

81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537

平方取中法:关键字平方后取中间几位数组成哈希地址

折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍

去进位)作为哈希地址。

除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。

           H(k)=k mod p  p
随机数法:H(k)=rondom(k)。

2.处理冲突的方法

假设地址集为0..n-1,由关键字得到的哈希地址为j(0
字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,...k

0
H3...。怎样得到Hi呢?

开放定址法:Hi=(H(k)+di) mod m  (H(k)为哈希函数;m为哈希表长;di为增量序列)

当di=1,2,3,... m-1 时叫线性探测再散列。

当di=12,-12,22,-22,32,-32,...,k2,-k2时叫二次探测再散列。

当di=random(m)时叫伪随机探测序列。

例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38

,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。

再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均为不同的哈希函数。

链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。

建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。

3.哈希表的查找

例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[0..15]:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  14 01 68 27 55 19 20 84 79 23 11 10      

当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。

当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记

录。

5.5 查找第k小元素

查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。

程序如下:

program kspv;
const n=7;
type
arr=array[1..n] of integer;
var
b:arr;
i,k:integer;
function p(s,t:integer):integer;
var i,j,t1,x:integer;
begin
  i:=s;j:=t;x:=b[i];
  repeat
   while (b[j]>=x) and (j>i) do j:=j-1;
    if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
   while (b[i]     if i   until i=j;
  b[i]:=x;
  p:=i;
end;
function find(s,t,k:integer):integer;
var p1,q:integer;
begin
if s=t then find:=b[s] else
  begin
   p1:=p(s,t);
   q:=p1-s+1;
   if k end;
end;
begin
write('input data:');
for i:=1 to n do read(b[i]);readln;
write('input k:');read(k);
write('output data:');
writeln('kthsmall:=',find(1,n,k));
end.

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号