zoukankan      html  css  js  c++  java
  • 查找(五)——聊聊哈希

    我们之前的查找要么是顺序查找,要么是折半查找,要么是基于二叉树的查找

    然而,这些查找之中,元素在列表中的相对位置是随机的,与关键字之间并没有直接的关系,因此,在查找时需要通过比较来进行

    现在,我们有一种牺牲空间来换取时间的方法,通过固定元素在列表中的相对位置,在关键字和元素位置之间建立直接的关系,获得一种映射表,这就是哈希表

    所谓哈希法,就是通过建立元素位置和元素关键字之间的对应关系(即哈希函数),以后查找关键字时,就通过哈希函数来计算出元素的位置

    当然,在这一个过程中,通过哈希函数计算的位置可能会发生冲突,这种冲突发生于创建哈希表时和查找时

    以上可以总结了:

    一所谓哈希法实际上可以分为两部分:

        1.建立哈希函数

        2.如何处理冲突

    冲突分为两种情况:创建哈希函数时和查找时,这两种冲突情况的冲突是一样的,解决方案也是一样的

    一.建立哈希函数

      书上有五种方法,简直眼花缭乱,我最烦这种枯燥的教学,不传授思想,不传授为什么,直接摆公式,摆方法,

      其实这五种方法是一个意思,哪怕还有一百种方法也是一个意思,那就是:

      根据关键字有逻辑地得出尽可能不同,尽可能均匀的数字(地址)

      1.数字分析法

      2.平方取中法

      3.分段叠加法

      4.除数余留法

      5.伪随机数法

      我就不一个一个解释了,不知道的直接看书或者百度就行

    二.如何处理冲突

      所谓处理冲突嘛,不就是当不同的关键字通过哈希函数得出的地址是一样的(这个时候就冲突了),这个时候怎么处理,其实各种方法眼花缭乱也是一个意思,怎么样有逻辑地再找出一个不冲突的地址

      书上有四种方法:

      分别是:

      1.开放定址法,也称再散列法

      2.再哈希法(备用哈希函数)

      3.链地址法

      4.建立公共溢出区

    不多解释,

    三.哈希表的查找过程:

      1.首先通过关键字key计算出哈希函数对应的值H(key)

      2.如果H(key)为空,返回空,也就是找不到,否则,进入第三步

      3.如果找到的值等于key,返回key,也就是找到了,否则,进入第四步

      4.找到的值不等于key,那么,就进入冲突处理过程,这根据采取的冲突处理不同而不同!

    四.复杂度分析

      如果哈希表完全没有冲突,那么时间复杂度为O(1);

      实际上,总的时间复杂度=哈希函数的时间复杂度(这个通常为O(1))+处理冲突的时间复杂度*@

        @为发生冲突的概率

  • 相关阅读:
    iOS 的 XMPPFramework 简介
    Swift闭包
    Objective-C类成员变量深度剖析
    iOS Auto Layout
    iOS WIFI
    AppStore提审攻略
    iOS7 修改导航系统默认返回按钮文字及颜色
    iOS Block浅析
    Latency
    Charles抓包工具的使用
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/6135024.html
Copyright © 2011-2022 走看看