精华内容
下载资源
问答
  • 哈希表平均查找长度

    万次阅读 多人点赞 2017-08-13 10:53:31
    题目:关键字序列为:{38,25,74,63,52,48},哈希函数为H(k)=k%7,哈希表的长度为7,用线性探测和链地址法处理冲突,分别计算等概率情况下查找成功的平均查找长度。注:没给哈希表长度,给出装填因子时,可求哈希...

    题目:关键字序列为:{38,25,74,63,52,48},哈希函数为H(k)=k%7,哈希表的长度为7,用线性探测和链地址法处理冲突,分别计算等概率情况下查找成功的平均查找长度。

    注:没给哈希表长度,给出装填因子时,可求哈希表长度,
    可根据此公式装填因子=元素个数/表长推:表长=元素个数/装填因子。

    线性探测法

    这里写图片描述

    由上构造的哈希表如下:
    这里写图片描述

    等概率下查找成功的平均查找长度为:
    ASL=(1+3+1+1+2+4)/6=2

    链地址法
    这里写图片描述

    由上构造的哈希表如下:
    这里写图片描述

    等概率下查找成功的平均查找长度为:
    ASL=(1*4+2*2)/6=1.3

    展开全文
  • 哈希表平均查找长度可以为0吗,老师上课说可以,说是不用比较,但我感觉至少也要1啊
  • 哈希表(又名为是散列表) 散列是一个用于唯一标识对象并在一些预先计算的唯一索引(称为“密钥”)存储每个对象的过程。因此,对象以“键值”对的形式存储,这些项的集合被称为“字典”。可以使用该键值搜索每个...

    哈希表(又名为是散列表)
    散列是一个用于唯一标识对象并在一些预先计算的唯一索引(称为“密钥”)存储每个对象的过程。因此,对象以“键值”对的形式存储,这些项的集合被称为“字典”。可以使用该键值搜索每个对象。有多种不同的基于哈希的数据结构,但最常用的数据结构是哈希表。

    哈希表通常使用数组实现。

    哈希数据结构的性能取决于以下三个因素:

    哈希函数
    哈希表的大小
    碰撞处理方法
    下图展示了如何在数组中映射哈希。该数组的索引是通过哈希函数计算的。
    在这里插入图片描述
    今天主要讲一下哈希表平均查找长度ASL计算,也是常见面试题之一
    题目:关键字序列为:{30,25,80,63,52,48},哈希函数为H(k)=k%7,哈希表的长度为7,用线性探测和链地址法处理冲突,分别计算等概率情况下查找成功的平均查找长度。

    注:没给哈希表长度,给出装填因子时,可求哈希表长度,
    可根据此公式装填因子=元素个数/表长推:表长=元素个数/装填因子。

    线性探测法(通过数组保存)
    H(30)=30%7=2
    H(25)=25%7=4
    H(80)=80%7=3,和30冲突,往后移一位:4,又与25冲突,继续后移一位:5
    H(63)=63%7=0
    H(52)=52%7=3,后移三位为6
    H(48)=48%7=6,与52冲突,后移一位为0,再后移一位为1
    结果为:
    30 ——2
    25——4
    80——5
    63——7
    52——6
    48——1
    平均查找长度:查找次数和/数组个数
    (1+1+3+1+4+3)/6=2.2

    链地址法 (以链表形式存储)
    取模后值相同的在同一个链表中,即
    0——63
    1
    2
    3——30——80——52
    4——25
    5
    6——48
    等概率下查找成功的平均查找长度为:
    ASL=(14+21+3*1)/6=1.5

    展开全文
  • 题干太长了,这次不写题干了,主要说说散列表,又叫哈希表(hash table) 散列表是一种存储数据的方法,通过散列表,可以实现直接用关键字(key)访问数据所在位置。具体实现方法为使用散列函数(哈希函数)H(key),对...

    题干太长了,这次不写题干了,主要说说散列表,又叫哈希表(hash table)

    散列表是一种存储数据的方法,通过散列表,可以实现直接用关键字(key)访问数据所在位置。具体实现方法为使用散列函数(哈希函数)H(key),对每个关键字,都可以计算出一个地址。显然,不同的关键字可能有同一个地址,造成地址冲突,有解决这些地址冲突的方法。

    H(key)=address
    

    哈希函数有很多种构造方法,常用的有除留余数法等,除留余数法如下,memory_size为分配的存储区域的容量。

    H(key%memory_size)=address
    

    其他方法也能将关键字转成对应地址。

    如果两个不同键值计算出了相同的地址,就叫做发生了冲突,这些发生碰撞的不同关键字称为同义词,例如除留余数法,若memory_size=5,那么关键字6和11计算出的地址是相同的。

    产生冲突,就需要就解决冲突的方法。解决冲突有两大类方法,一是开放定址法,二是链接法。

    • 开放定址法:定义很抽象,大意就是采用某种规则,发生冲突后,重新计算地址进行试探。设第i次冲突时下一个试探地址是Hi,则数学公式是Hi=(H(key)+di)%m。我们的目的是确定重新计算的规则,也就是确定di的取值,来不停地计算试探地址,直到找到不冲突的地址或者超过试探次数限制。常用的开放定址法有常用的开放定址法有平方探测法等。
      平方探测法:di=0,12,-12,22,-22,···,k2,-k2,k<=m/2.依次试探上述取值,直到找到空闲地址或者试探超过m+1次。

    本题中就要使用平方探测法。

    #include <bits/stdc++.h>
    #define N 100000
    using namespace std;
    
    bool is_Prime(int n)    {
        if (n==1||n==0) return false;
        for (int i=2;i*i<=n;i++)
            if (n%i==0) return false;
        return true;
    }
    int ha[N];
    int main()  {
        int s,n,m,ans=0;
        scanf("%d%d%d",&s,&n,&m);
        while (!is_Prime(s))    s++;
        for (int i=0;i<n;i++)  {
            int flag=0,t=0;
            scanf("%d",&t);
            for (int j=0;j<=s;j++)  {
                int key=(t+j*j)%s;
                if (ha[key]==0)   {
                    ha[key]=t;
                    flag=1;
                    break;
                }
            }
            if (!flag)  printf("%d cannot be inserted.\n",t);
        }
        for (int i=0;i<m;i++)   {
            int t=0;
            scanf("%d",&t);
            for (int j=0;j<=s;j++)  {
                ans++;
                int tk=(t+j*j)%s;
                if (ha[tk]==t||ha[tk]==0)   break;
            }
        }
        printf("%.1f\n",1.0*ans/m);
        return 0;
    }
    
    展开全文
  • 散列技术时记录的存储位置和它的关键字之间建立的一个确定对应的关系f,使得每个关键字key对应一个存储位置f(key),查找时根据这个对应的关系找到给定值key的映射f(key),若查找集合中存储这个记录,则必定在f(key)...

    67e6843fa2ebb66d9b7cd2284e9a7051.png

    散列技术时记录的存储位置和它的关键字之间建立的一个确定对应的关系f,使得每个关键字key对应一个存储位置f(key),查找时根据这个对应的关系找到给定值key的映射f(key),若查找集合中存储这个记录,则必定在f(key)的位置上。

    常见散列方法:

    1.直接定址法

    f5b909144bc617bb3daada4848cd3b6c.png
    人数出生统计表

    其公式为:

    1ebddbd6bc2d1494744015cb6ec7b458.png

    2.数字分析法

    f245eed596fcda6b62ebfacafae0b0f4.png
    电话号码

    容易重复分布太集中的某分布均匀,可作为散列地址几个数字,例如电话号码的后四位

    3.平法取中法

    25975f72e4b4a528dd8abffcd83f2795.png
    取平方后结果的中间数值

    4.折叠法

    折叠法就是将关键字从左到右分割成位数相等的几个部分(注意最后一部分不够可以稍微短些);然后将部分叠加求和,并按散列表的表长,取后几位作为散列地址。

    1baa62bc0c5666fe4133ddd7f45cee1f.png

    5.除留余数法

    公式:

    7d1e911d7c4fb1936a9e79b14f8e508f.png
    除留余数法公式

    dab3cf5bc213a30f61b3112bfa477c75.png
    表1

    f152139f73efdc6c6c400b4e6c6457ce.png
    表2

    6.随机数法

    公式:

    9bcbbcfe67a3652a4e2b19d7bf7b67a2.png
    随机数法

    解决散列冲突的方法

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

    公式:

    589d67a2f103c220831ed814f46aeea0.png

    链地址法:

    关键字集合{12,67,56,16,25,37,22,29,15,47,48,34}表长为12,用散列函数

    f(key) = key mod 12,得到如下所示:

    0e03731ff3ccc2d52cf009309976494c.png
    链址法

    散列表的查找实现

    0.散列表结构和宏设计

    typedef int Status;
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 100 //存储空间初始分配量
    #define SUCCESS 1
    #define UNSUCCESS 0
    
    //定义散列表长为数组的长度
    #define HASHSIZE 12
    #define NULLKEY -32768
    
    typedef struct
    {
        //数据元素存储基址,动态分配数组
        int *elem;
        //当前数据元素个数
        int count;
    }HashTable;
    int m=0; /* 散列表表长,全局变量 */

    1.初始化散列表

    // 初始化散列表
    Status InitHashTable(HashTable *H)
    {
        int i;
        
        //① 设置H.count初始值; 并且开辟m个空间
        m=HASHSIZE;
        H->count=m;
        H->elem=(int *)malloc(m*sizeof(int));
        
        //② 为H.elem[i] 动态数组中的数据置空(-32768)
        for(i=0;i<m;i++)
            H->elem[i]=NULLKEY;
        
        return OK;
    }

    2.散列函数

    // 散列函数
    int Hash(int key)
    {
        //除留余数法
        return key % m;
    }

    3.插入关键字进散列表

    //插入关键字进散列表
    void InsertHash(HashTable *H,int key)
    {
        //① 求散列地址
        int addr = Hash(key);
        
        //② 如果不为空,则冲突
        while (H->elem[addr] != NULLKEY)
        {
            //开放定址法的线性探测
            addr = (addr+1) % m;
        }
        
        //③ 直到有空位后插入关键字
        H->elem[addr] = key;
    }

    4. 散列表查找关键字

    // 散列表查找关键字
    Status SearchHash(HashTable H,int key,int *addr)
    {
        //① 求散列地址
        *addr = Hash(key);
        
        //② 如果不为空,则冲突
        while(H.elem[*addr] != key)
        {
            //③ 开放定址法的线性探测
            *addr = (*addr+1) % m;
            
            //④H.elem[*addr] 等于初始值或者循环有回到了原点.则表示关键字不存在;
            if (H.elem[*addr] == NULLKEY || *addr == Hash(key))
                //则说明关键字不存在
                return UNSUCCESS;
        }
        
        return SUCCESS;
    }

    使用和打印

    int arr[HASHSIZE]={12,67,56,16,25,37,22,29,15,47
    int i,p,key,result;
    HashTable H;
    //1.初始化散列表
    InitHashTable(&H);
    //2.向散列表中插入数据
    for(i=0;i<m;i++)
        InsertHash(&H,arr[i]);
    //3.在散列表查找key=39
    key=39;
    result=SearchHash(H,key,&p);
    if (result)
        printf("查找 %d 的地址为:%d n",key,p);
    else
        printf("查找 %d 失败。n",key);
    //4.将数组中的key,打印出所有在散列表的存储地址
    for(i=0;i<m;i++)
    {
        key=arr[i];
        SearchHash(H,key,&p);
        printf("查找 %d 的地址为:%d n",key,p);
    }
    return 0;

    fb6e432d39fdde67c56d8d903025a05d.png
    散列表查找
    展开全文
  • 哈希表查找 平均查找长度 解析

    万次阅读 2012-05-03 15:23:12
    哈希表的装填因子 α 的定义如下:  α = 哈希表中元素个数 / 哈希表的长度 ...手工计算等概率情况下查找 成功 的平均查找长度公式  规则如下: ASLsucc=   其中 Ci 为置入每
  • 采用除留余数法实现哈希表的创建,任意采用一种处理冲突的方法解决冲突,计算哈希表平均查找长度。实现以下功能:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数定义为:H(key)=key MOD 13, 哈希...
  • 哈希表平均查找长度

    千次阅读 2017-08-03 15:34:17
    查找成功时的平均查找长度 查找不成功时的平均查找长度 http://www.doc88.com/p-903238204265.html
  • ”主要知识点查找表的检索机制平均查找长度折半查找表二叉排序树哈希表1 查找表的检索机制本章给出了三种类型的查找表,第一类是线性索引,记录关键字一般按序排列,以提高检索速度。对应检索采用基于比较检索方法。...
  • 如何计算哈希表查找失败时的平均查找长度

    千次阅读 多人点赞 2020-04-30 18:20:01
    1.请回答采用线性探测再散列和链地址法处理冲突构建的哈希表中,查找失败时的平均查找长度如何计算? 例:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79) 哈希函数为:H(key)=keyMOD13,哈希表长为m=15,设每个记录...
  • 题意:给出哈希表的大小size,若不为素数则一直执行size++直至为素数。 给出n个数,进行哈希表的插入...//哈希表查找 平均查找长度 int size,n,m; int has[100005]; void insert(int x) //二次探测正增量方式进行插入
  • #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;stdlib.h&gt; typedef struct //元素类型定义 ...typedef struct //哈希表类型定义 { DataType *data; int l...
  • 哈希表查找失败的平均查找长度

    千次阅读 2019-10-09 18:02:18
    “它是中所有可能散列到的位置上要插入新元素时为找到空桶的探查次数的平均值。” 理解: 1. 散列表中已经含有之前插入的元素。 即已经不空了,若为空的话再插入元素的时候查找空位置一次就可以找到。 2. 这...
  • 哈希表查找——成功和不成功时的平均查找长度

    万次阅读 多人点赞 2017-09-17 13:27:21
    哈希表查找——成功和不成功时的平均查找长度 以下求解过程是按照“计算机统考的计算方法”,不同的老师、教材在“处理冲突”上可能会有不同的方法,所以最主要的是掌握原理即可,对于考研的朋友最好掌握统考...
  • 有关HashMap(哈希表)的部分理解:HashMap是一个散列表,存储的是键值对(key-value),能够快速地查找所需的对象(O(1)时间复杂度)。HashMap有两个影响其性能的参数:“初始容量”-哈希表在创建时的容量;...
  • 哈希表查找不成功时的平均查找长度 哈希表查找不成功时的平均查找长度(zz)哈希表查找不成功怎么计算?解答:先建好表,然后可以算出每个位置不成功时的比较次数之和,再除以表空间个数! 例如:散列函数为hash(x)=...
  • 题图Pid=68670770在最近的学习过程中,发现身边很多朋友对哈希表的原理和应用场景不甚了解,处于会用但不知道什么时候该用的状态,所以我找出了刚学习Java时写的HashMap实现,并以此为基础拓展关于哈希表的实现原理...
  • 散列技术时记录的存储位置和它的关键字之间建立的一个确定对应的关系f,使得每个关键字key对应一个存储位置f(key),查找时根据这个对应的关系找到给定值key的映射f(key),若查找集合中存储这个记录,则必定在f(key)...
  • 哈希表查找不成功的平均查找长度

    千次阅读 2017-05-27 10:40:52
    1.查找失败的情况:哈希表中不存在这个元素才会查找失败 2.查找失败的判定;见书 3.因为所查找的数是不确定的,因此可以取遍哈希函数的所有取值,而每一个取值相当于入口,从入口开始查找,当满足失败判定时,确认...
  • 哈希表查找平均长度

    千次阅读 2018-08-11 22:24:55
    将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。...(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。 一、查找成功平均长度 通过公式计算出存放的位置,如果该位置已经...
  • 散列表的动态扩容解答+面试题一、散列表(哈希表、Hash 表)不同与之前我们介绍的线性表,所有的数据都是顺序存储,当我们需要在线性表中查找某一数据时,当线性表过长,需要查找的数据排序比较靠后的话,就需要花费...
  • ![图片说明](https://img-ask.csdn.net/upload/201602/09/1455031746_265651.png) 这个失败的长度是怎么计算出来的? 分子是怎么来的? 请大家具体讲讲~
  • 哈希表查找不成功时的平均查找长度计算和查找成功时的ASL 例如: 关键字集合 { 19, 01, 23, 14, 55, 68, 11, 82, 36 } 设定哈希函数 H(key) = key MOD 11 ( 表长=11 ) 查找成功次数: 1 1 2 1 3 6 2 5 1 ...
  • 本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者:Xuegui Chen哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法,但由于...一、哈希表概述哈希表的...
  • https://zhidao.baidu.com/question/214308488.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 437
精华内容 174
关键字:

哈希表平均查找长度