首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
有一组关键字为{77,28,38,41,45,1,9,31,
[问答题]
有一组关键字为{77,28,38,41,45,1,9,31,99,51,23,47,68,61}.1,请构造一个hash函数,形式为H(key)=key mod p,装填因子a=0.8,用链地址法解决冲突;2计算等概率情况下查找成功的平均查找长度;3计算等概率情况下查找失败的平均查找长度(空指针的比较不计入)。
添加笔记
求解答(26)
邀请回答
收藏(194)
分享
纠错
5个回答
添加回答
6
努力变强的王小姐
hhhh
发表于 2017-08-10 19:09:43
回复(0)
2
冷静。
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int main()
{
int key[14] = {77,28,38,41,45,1,9,31,99,51,23,47,68,61};
int remain[14];
int remain_conts = 0;
int temp;
int p = 0;
while(++p)
{
remain_conts = 0;
for (int i = 0; i < 14; i++)
{
temp = key[i]%p;
int j = 0;
for (; j < remain_conts; j++)
{
if (remain[j] == temp) break;
}
if (j == remain_conts)
{
remain[remain_conts++] = temp;
}
}
if (abs((float)remain_conts/p-0.8) < 0.1)
{
break;
}
}
cout<<p<<endl;
cout<<"对应的余数:"<<endl;
for (int i = 0; i< 14; i++)
{
cout<<key[i]%p<<endl;
}
return 0;
}
通过计算,p等于6,对应的余数为:5 4 2 5 3 1 3 1 3 3 5 5 2 1,共占5个表项,5/6约等于0.83
发表于 2018-08-05 18:11:20
回复(2)
2
没毛病
装填因子为0.8 元素个数为14个,那么表长为14/0.8=17.5,那么表长取18 :)我总感觉不太对:) 那p取18 hash函数为mod 18,对应的槽编号为{5 10 2 5 9 1 9 13 9 15 5 11 14 7},查找成功的比较次数为{1 1 1 2 1 1 2 1 3 1 3 1 1 1}查找14个数需要比较20次 查找成功平均查找长度为 20/14。链地址法,查找失败,每个元素都会比较一次,18次查找失败的总比较次数为元素总数14,失败平均查找长度为14/18
编辑于 2017-08-18 23:42:44
回复(6)
0
_Fan`Tasy
请参考Java HashMap源码
发表于 2018-04-11 01:35:10
回复(0)
0
细致的打工人追赶太阳
转天因子百度了一下是说实际占用空间/hash空间
通过如下代码发现i=11的时候跟题目要求的装填因子差不多。所以考虑用p=11,然后做后面的计算
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int arr[] ={77,28,38,41,45,1,9,31,99,51,23,47,68,61};
int main(){
int p[20];
for(int i = 11;i <= 20; i++){
memset(p,0,sizeof(p));
for(int j = 0;j < 14;j++)
p[arr[j]%i] = 1;
int l = 0;
for(int j = 0;j < i;j++)
l+=p[j];
cout<<i<<" "<<l<<" "<<1.0*l/i<<endl;
}
}
11 9 0.818182
12 9 0.75
13 9 0.692308
14 9 0.642857
15 8 0.533333
16 9 0.5625
17 10 0.588235
18 10 0.555556
19 9 0.473684
20 10 0.5
发表于 2017-09-01 22:06:32
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
C++
Java
Javascript
C#
Python
来自:
腾讯2017校招开发工...
上传者:
阿奻_
难度:
5条回答
194收藏
8693浏览
热门推荐
相关试题
从运行层面上来看,从四个选项选出不...
搜狐
Java
Python
测试
后端开发
人工智能/算法
数据
运维/技术支持
通信
芯片/半导体
硬件开发
评论
(147)
来自
搜狐2017校招研发工程...
介绍.Net和.Net的安全性。
华为
C#
评论
(1)
运行 ldd hello 可以得到...
百度
C++
评论
(3)
请问下列代码的输出是多少()
C语言
评论
(37)
来自
腾讯2017校招开发工程...
市场与销售的区别在哪里?
市场营销
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题