zoukankan      html  css  js  c++  java
  • 散列表(哈希表)

    构造散列函数的两个基本原则

    在这里插入图片描述

    直接定址法

    取关键字的某个线性函数值为散列地址,即f(key)=a*key+b。

    数字分析法

    数字分析法通常适合处理关键字位数比较大的情况。

    平方取中法

    平方取中法是将关键字平方之后取中间若干位数字作为散列地址。

    折叠法

    折叠法是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长取后几位作为散列地址。

    除留余数法

    此方法为最常用的构造散列函数方法,对于散列表长为m的散列函数计算公式为:
    f(key) = key mod p(p<=m)

    事实上,这个方法不仅可以对关键字直接取模,也可以通过折叠、平方取中后再取模。

    随机数法

    选择一个随机数,取关键字的随机函数值为它的散列地址,即:f(key) = random(key)。
    这里的random是随机函数,当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。

    视不同的情况采用不同的散列函数

    现实中,应该视不同的情况采用不同的散列函数,参考方向:
    ·计算散列地址所需的时间
    ·关键字的长度
    ·散列表的大小
    ·关键字的分布情况
    ·记录查找的频率

    处理散列冲突的方法

    开放定址法

    所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

    它的公式是:
    fi(key) = (f(key)+di) MOD m (di=1,2,…,m-1)

    可以修改di的取值方式,例如使用平方运算来尽量解决堆积问题:
    fi(key) = (f(key)+di) MOD m (di=1²,-1²,2²,-2²…,q²,-q²,q<=m/1)

    还有一种方法是,在冲突时,对于位移量di采用随机函数计算得到,我们称之为随机探测法:
    fi(key) = (f(key)+di) MOD m (di是由一个随机函数获得的数列)

    再散列函数法

    fi(key) = RHi(key) (i=1,2,3,…k)

    链地址法

    公共溢出区法

  • 相关阅读:
    tuple 元组及字典dict
    day 49 css属性补充浮动 属性定位 抽屉作业
    day48 选择器(基本、层级 、属性) css属性
    day47 列表 表单 css初识
    day 46 http和html
    day 45索引
    day 44 练习题讲解 多表查询
    day 40 多表查询 子查询
    day39 表之间的关联关系、 补充 表操作总结 where 、group by、
    day38 数据类型 约束条件
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338371.html
Copyright © 2011-2022 走看看