数据结构-散列

来源:互联网 发布:python append extend 编辑:程序博客网 时间:2024/05/16 23:52

  散列的基本思想就是映射,通过哈希函数将关键字信息映射到另外一个值,这个值保存了关键字信息的存储地址,查找的时候可以直接通过关键字获取查找的信息,而不需要进行复杂的搜索运算,查找的期望时间为O(1),保存了关键字信息的数据结构叫做散列表。例如数12,23,34,46,59,散列函数为数值的十位数字,则这5个值可以分别映射到1,2,3,4,5保存在散列表中,在查找数据时根据其映射值在表中可以直接得到消息。
  两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突。因为在散列表中一般映射值是作为表的下标来确定数据保存位置的,因此需要考虑映射值的范围。
  
  散列中需要考虑的两个问题:
  1、如何构造使结点“分布均匀”的散列函数?
  2、一旦发生冲突,用什么方法来解决?

  通常有两类方法处理冲突:开放定址(Open Addressing)法和拉链(Chaining)法。前者是将所有结点均存放在散列表T[0..m-1]中;后者通常是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表T[0..m-1]中。
  
  开放地址法
  用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。
 常用的探查技术有:线性探查法,二次探查法,双重散列法等。
 
  拉链法
  拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。
 这里写图片描述
 
参考:散列
   http://student.zjzk.cn/course_ware/data_structure/web/main.htm

0 0