您现在的位置是:首页 >

散列冲突 查找 - 散列技术 - 处理冲突的方法(一)

火烧 2023-04-05 04:50:30 1089
查找 - 散列技术 - 处理冲突的方法(一)   处理冲突的方法  通常有两类方法处理冲突 开放定址 O e Addre i g 法和拉链 Chai i g 法 前者是将所有结点均存放在散列表T[ m

查找 - 散列技术 - 处理冲突的方法(一)  

  处理冲突的方法

  通常有两类方法处理冲突 开放定址(Open Addressing)法和拉链(Chaining)法 前者是将所有结点均存放在散列表T[ m

   ]中;后者通常是将互为同义词的结点链成一个单链表 而将此链表的头指针放在散列表T[ m ]中

   开放定址法

  ( )开放地址法解决冲突的方法

  用开放定址法解决冲突的做法是 当冲突发生时 使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列 沿此序列逐

  个单元地查找 直到找到给定的关键字 或者碰到一个开放的地址(即该地址单元为空)为止(若要插入 在探查到开放的地址 则可

  将待插入的新结点存人该地址单元) 查找时探查到开放的地址则表明表中无待查的关键字 即查找失败

  注意

  ①用开放定址法建立散列表时 建表前须将表中所有单元(更严格地说 是指单元中存储的关键字)置空

  ②空单元的表示与具体的应用相关

  【例】关键字均为非负数时 可用 来表示空单元 而关键字为字符串时 空单元应是空串

  总之 应该用一个不会出现的关键字来表示空单元

  ( )开放地址法的一般形式

  开放定址法的一般形式为 h i =(h(key)+d i )%m ≤i≤m

  其中

  ①h(key)为散列函数 d i 为增量序列 m为表长

  ②h(key)是初始的探查位置 后续的探查位置依次是h l h … h m 即h(key) h l h … h m 形成了一

  个探查序列

  ③若令开放地址一般形式的i从 开始 并令d = 则h =h(key) 则有

  h i =(h(key)+d i )%m ≤i≤m

  探查序列可简记为h i ( ≤i≤m )

  ( )开放地址法堆装填因子的要求

  开放定址法要求散列表的装填因子α≤l 实用中取α为 到 之间的某个值为宜

  ( )形成探测序列的方法

  按照形成探查序列的方法不同 可将开放定址法区分为线性探查法 二次探查法 双重散列法等

  ①线性探查法(Linear Probing)

散列冲突 查找 - 散列技术 - 处理冲突的方法(一)

  该方法的基本思想是

  将散列表T[ m ]看成是一个循环向量 若初始探查的地址为d(即h(key)=d) 则最长的探查序列为

  d d+l d+ … m … d

  即:探查时从地址d开始 首先探查T[d] 然后依次探查T[d+ ] … 直到T[m ] 此后又循环到T[ ] T[ ] … 直到探查到

  T[d ]为止

  探查过程终止于三种情况

  ( )若当前探查的单元为空 则表示查找失败(若是插入则将key写入其中);

  ( )若当前探查的单元中含有key 则查找成功 但对于插入意味着失败;

  ( )若探查到T[d ]时仍未发现空单元也未找到key 则无论是查找还是插入均意味着失败(此时表满)

  利用开放地址法的一般形式 线性探查法的探查序列为

lishixinzhi/Article/program/sjjg/201311/23680  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码