码迷,mamicode.com
首页 > 其他好文 > 详细

散列表(哈希表)

时间:2015-07-20 19:47:24      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:线性表   hash   pascal入门   存储   

1、按先后顺序存储在A[i]中,查找需要O(n),如果用二分查找,需要O(logn)
2、定义一个一维数组A[1..1353],使得A[key]=key,这样,查找只需O(1)就可以了,但空间开销比较大

思考:有什么办法使得查找时间快,占用空间小

哈希表基本原理

哈希表的基本原理是使用一个下标范围比较大的数组A来存储元素,设计一个函数h,对于要存储的线性表的每个元素node,取一个关键字key,算出一个函数值h(key),把h(key)作为数组下标,用A[h(key)]这个数组单元来存储node。也可以简单理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方。

技术分享

哈希函数的构造

构造哈希函数有两个标准:简单和均匀
哈希函数的关键字一般是整数或者字符串
最常用的哈希函数:除余法,即h(key)=key mod m。m为素数,可以使得较好保证分布均匀。


function hash(key:integer):integer;
begin
  exit(key mod m);
end;

冲突的处理——拉链法

采用分离链接技术构造哈希表,把哈希值相同的关键字串成链表,即哈希值为x的所有元素存储在以head[x]为表头的单链表中。

技术分享

哈希表的基本操作

const
  maxn=10000;//哈希表容量
  limit=1007;//哈希函数的模
type
  node=record       //哈希表元素类型
    key,next:integer;
  end;
var
  head:array[1..limit] of integer;
  hash:array[1..maxn] of node;
  i,j,n,m,tot,key:integer;

元素插入

procedure insert(key:integer);
begin
  inc(tot);
  hash[tot].key:=key;
  hash[tot].next:=head[key mod limit];
  head[key mod limit]:=tot;
end;

元素查找

function find(key:integer):boolean;
var
  tmp:integer;
begin
  tmp:=head[key mod limit];
  while tmp<>-1 do
    begin
      if hash[tmp].key=key then exit(true);
      tmp:=hash[tmp].next;
    end;
  exit(false);
end;

版权声明:本文为博主原创文章,未经博主允许不得转载。

散列表(哈希表)

标签:线性表   hash   pascal入门   存储   

原文地址:http://blog.csdn.net/boyxiejunboy/article/details/46969691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!