散列表

什么是散列表

用于查找,通过对元素关键字key进行某种运算,直接求出元素的地址,就可以直接访问到元素了,无需像基于线性表、树结构的查找进行多次比较

  • 散列函数、散列地址:散列地址p=H(key),H为散列函数
  • 散列表:简单理解就是一个一维数组,散列地址就是数组的下标
  • 冲突、同义词:H(key1)=H(key2),key1!=key2,key1和key2为同义词

解决冲突的方法

  1. 开放地址法(数组所有未被占的位置都开放):发生冲突,找下一个空散列地址,Hi=(H(key)+d)%m
    • 线性探测:d=1,2,3,4,5...m-1
      • 优点:散列表未填满,就可以找到不冲突地址
      • 缺点:二次聚集现象,两个第一个散列地址不同的key争夺同一个后继散列地址
    • 二次探测:d=1²,-1²,2²,-2²...(m/2)²,(-m/2)²
      • 优点:没有二次聚集现象
      • 缺点:可能找不到不冲突的地址,比如d=3就找不到
    • 伪随机探测:d=伪随机数序列
      • 优点:没有二次聚集现象
      • 缺点:可能找不到不冲突的地址
  2. 链地址法
    • 把具有相同散列地址的key放在一个单链表中,数组中存链表的头指针
posted @ 2020-10-14 09:45  肥斯大只仔  阅读(270)  评论(0编辑  收藏  举报