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)

    链地址法

    公共溢出区法

  • 相关阅读:
    一般处理程序使用Session的方法
    EF Code First教程-03 数据库迁移Migrator
    EF Code First教程-02 约定配置
    EF Code First教程-01 创建一个简单的Code First程序
    构造方法后面加上了:base
    sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
    使单元格td内部都是超链接
    设计模式~简单工厂模式(Factory)
    jQuery重置form表单的方法
    当编辑器中出现很一条一条的点时
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338371.html
Copyright © 2011-2022 走看看