当前位置: 首页 > news >正文

2010年数据结构408

41题.(10分)

将关键字序列(7,8,30,11,18,9,14)散列存储到散列表中,散列表的存储空间是一个下标从0开始的一维数组,散列函数为:H(key)=(key×3)MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。

(1)请画出所构造的散列表。

(2)分别计算等概率情况下查找成功和查找不成功的平均查找长度。

41.【答案要点】

(1) 装载因子

​ =表中记录数 / 散列表长度

​ =数据总数 / 存储空间长度

​ =7 / 10


所以,构造的散列表为:

H(7)=(7×3)MOD 7=0

H(8)=(8×3)MOD 7=3

H(11)=(11×3)MOD 7=5

H(18)=(18×3)MOD 7=5

H(9)=(9×3)MOD 7=6

H(14)=(14×3)MOD 7=0

H(30)=(30×3)MOD 7=6

下标0123456789
关键字71408011301890

(2)

查找失败,是根据查找失败位置计算平均次数,散列函数 MOD 7,初始只需在 0~6 位置

查找成功的平均查找长度:ASL成功 = (1+1+1+1+2+3+3) / 7=12 / 7。

查找不成功的平均查找长度:AsL不成功 = (3+2+1+2+1+5+4) / 7=18 / 7


42 解答

(13分)设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0,x1…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C或c++或Java语言描述算法,关键之处给出注释。

(3)说明你所设计算法的时间复杂度和空间复杂度。

1) 算法的基本设计思想:

设Reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3 (p = 3)
个位置的过程如下:

Reverse(0,p-1) 得到cbadefgh;

Reverse(p,n-1) 得到cbahgfed;

Reverse(O,n-1) 得到defghabc。

注: Reverse中, 两个参数分别表示数组中待转换元素的始末位置。

注:这题直接最优解不比暴力解差

2) 使用 C 语言描述算法如下:

最优解:

#include <stdio.h>#include <stdlib.h>void reverse(int R[], int left, int right){int k = left, j = right, tmp;while(k < j){//交换 R[k]与 R[j]tmp = R[k];R[k] = R[j];R[j] = tmp;k++;//k 右移一个位置j--;//j 左移一个位置}}void LeftShift(intR[],intn,intp){//循环左移 p 个元素if(p > 0 && p < n) {reverse(R,0,n-1);//将全部元素逆置reverse(R,0,n-p-1);//将前 n-p 个元素逆置reverse(R,n-p,n-1);//将后 p 个元素逆置}}int main(){int A[8] = {1,2,3,4,5,6,7,8};printf("原数组元素分别为: ");for(int i = 0; i < 8; i++ ){printf("%d ",A[i]);}printf("\n");int p = 2;printf("循环前移 p = %d 个元素\n",p);LeftShift(A,8,p);printf("前移后数组元素分别为:");for(inti = 0; i < 8;i++){printf("%d ",A[i]);}return 0;}

暴力解:

  • 先将标号为1的部分全部移动到新建数组A中
  • 然后将标号2的内容移动到1的位置
  • 随后将A数组元素移动到2的位置即可
//创建一个tmp数组存储[p,n-1]和[0,p-1] 空间复杂度o(p)void Remove(int A[], int p, int n) {int tmp[n], k = 0;//0(n-p)for (int i = p;i < n; i++) {tmp[k++] = A[i];}//0(p)for (int i = 0;i < p; i++) {tmp[k++] = A[i];}for (int i = 0; i < n;i++){A[i] = tmp[i];}
}//写法2
void Remove(Sqlist &L,int p){int *array = (int *)malloc(sizeof(int)*p);//移动第一部分p个元素for(int i=0;i<p;++i){array[i] = L.data[i];}//将第二个部分内容往前for(int i=p;i<L.length;++i){L.data[i-p]=1.data[i];}//将A数组中的元素移动到2的位置for(int i=L.length-p;j=0;j<p;++i;++j){L.data[i]=array[j];}free(array);
}

相关文章:

  • Realistic fault detection of li-ion battery via dynamical deep learning
  • JimuReport积木报表 v1.6.5 版本发布—免费报表工具
  • AIOT数字孪生智慧工地一体化管理平台源码
  • Vue3 源码解读系列(五)——响应式
  • [Socket]Unix socket 运行权限问题
  • 关于跨域问题的个人理解
  • Vue 3.0 + vite + axios+PHP跨域问题的解决办法
  • 【数据结构】顺序表 | 详细讲解
  • 17. 机器学习——SVM
  • 专业的SRM系统全流程管理服务
  • iText v1.8.1(OCR截图文字识别工具)
  • centralwidget 不能布局
  • HarmonyOS 高级特性
  • SpringCloud Alibaba(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign
  • 「Verilog学习笔记」用优先编码器①实现键盘编码电路
  • .pyc 想到的一些问题
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Apache Pulsar 2.1 重磅发布
  • ECMAScript入门(七)--Module语法
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java小心机(3)| 浅析finalize()
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • NSTimer学习笔记
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring cloud gateway 源码解析(4)跨域问题处理
  • use Google search engine
  • Vim Clutch | 面向脚踏板编程……
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 翻译:Hystrix - How To Use
  • 给新手的新浪微博 SDK 集成教程【一】
  • 工作中总结前端开发流程--vue项目
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 利用DataURL技术在网页上显示图片
  • 你真的知道 == 和 equals 的区别吗?
  • 如何进阶一名有竞争力的程序员?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序设置上一页数据
  • 最近的计划
  • 数据库巡检项
  • ###C语言程序设计-----C语言学习(3)#
  • #define
  • (2)MFC+openGL单文档框架glFrame
  • (4)(4.6) Triducer
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .libPaths()设置包加载目录
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net Stream篇(六)
  • // an array of int
  • /proc/vmstat 详解
  • @AliasFor注解
  • @ConfigurationProperties注解对数据的自动封装
  • @Transient注解
  • []使用 Tortoise SVN 创建 Externals 外部引用目录