Mit6.006-problemSet03

news2024/11/17 16:42:33

3-1 哈希练习(Hash Practice)

(a)

按顺序插入整数keys A=[47, 61, 36, 52, 56, 33, 92]到尺寸为7的哈希表中,使用哈希函数 h ( k ) = ( 10 k + 4 ) m o d 7 h(k)=(10k+4)mod7 h(k)=(10k+4)mod7。哈希表的每个插槽,存储一个key(哈希到该插槽)的链表,后插入的追加到链表最后。所有key插入完成后,画一个哈希表的图。

(b)

假设哈希函数为: h ( k ) = ( ( 10 k + 4 ) m o d    c ) m o d    7 h(k)=((10k+4)\mod c)\mod7 h(k)=((10k+4)modc)mod7,c为某些整数。找到最小的c,从A中插入key时无碰撞发生。

解:根据pigeonhole原则,c<7时至少发生一个碰撞,因此串行地逐步增大c手动检测碰撞。如果c=7,那么47、61、33都哈希到5处。如果c=8,那么36、52、56、92都哈希到4。如果c=9,47、56都哈希到6。如果c=10,那么每个都哈希到4。如果c=11,那么47、36都哈希到1。如果c=12,那么56、92都哈希到0。如果c=13,没有碰撞。

A = [47, 61, 36, 52, 56, 33, 92]
for c in range(7, 100):
    hashes = [((10*k+4)%c)%7 for k in A]
    print('\t'.join([str(h) for h in hashes]))
    if len(set(hashes)) == 7:
        break

3-2 Dorm Hashing

MIT想分配2n个新学生到n个房间,编号0到n-1,在Pseudorandom Hall。每个MIT学生有一个ID:一个小于u的正整数,u>>2n。没有两个学生有相同的ID,但新学生被允许在学期开始后,选择他们自己的ID。

给定ID,MIT想很快的找到学生,因此将通过哈希他们的ID为一个房间号来分配学生到房间。为了不显得有偏见,在学期开始前(新学生选择他们ID前),MIT将在线发布一个哈希函数族H,学生选完ID后,MIT将随机地从H中选择一个统一的房间哈希函数。

新MIT学生Rony Stark和Tiri Williams想成为室友。

  • Rony和Tiri可以选择ID k1和k2,保证他们成为室友

  • 或证明这不可能,并计算他们可能成为室友的最大概率

(a)

H = { h a b ( k ) = ( a k + b ) m o d    n ∣ a , b ∈ { 0 , . . . , n − 1 } 且 a ≠ 0 } H=\{ h_{ab}(k)=(ak+b)\mod n|a,b\in\{0,...,n-1\}且a\neq0\} H={hab(k)=(ak+b)modna,b{0,...,n1}a=0}

解:Rony和Tiri可以选择任意两个ID k1、k2,让 k 1 ≡ k 2 m o d    n k_1\equiv k_2 \mod n k1k2modn,这不难找到。比如Rony可以选择 k 1 = 3 k_1=3 k1=3,Tiri可以选择 k 2 = 2 n + 3 k_2=2n+3 k2=2n+3。对于所有a、b a k 1 + b ≡ a k 2 + b m o d    n ak_1+b\equiv ak_2+b\mod n ak1+bak2+bmodn,因此Rony和Tiri被保证哈希到相同房间。

(b)

H = { h a ( k ) = ( ⌊ k n u ⌋ + a ) m o d    n ∣ a ∈ { 0 , . . . , n − 1 } } H=\{h_a(k)=(\lfloor\frac{kn}{u}\rfloor+a)\mod n|a\in\{0,...,n-1\}\} H={ha(k)=(⌊ukn+a)modna{0,...,n1}}

解:因为 u > > n u>>n u>>n ⌊ k n u ⌋ \lfloor\frac{kn}{u}\rfloor ukn对于绝大多数相邻的值k是相同的,比如Rony可以选择 k 1 = 1 k_1=1 k1=1,Tiri可以选择 k 2 = 2 k_2=2 k2=2,结果都是0。添加常数a,采取结果mod n,a的值是否一样不会影响结果,因为 ⌊ k n u ⌋ \lfloor\frac{kn}{u}\rfloor ukn总是一个0到n-1之间的整数,因此对于函数族中的任意函数,如果Rony和Tiri的ID有相同的哈希,他们将对函数族中所有函数拥有相同哈希。

(c)

H = { h a b ( k ) = ( ( a k + b ) m o d    p ) m o d    n ∣ a , b ∈ { 0 , . . . , p − 1 } 且 a ≠ 0 } H=\{ h_{ab}(k)=((ak+b)\mod p)\mod n|a,b\in\{0,...,p-1\}且a\neq0\} H={hab(k)=((ak+b)modp)modna,b{0,...,p1}a=0}

固定素数p>u(这是一个来自lecture4的统一哈希族)

解:对任意两个key,从统一哈希族中给定一个随机函数,它们碰撞的可能性至多为 1 m \frac {1}{m} m1,m为可能的哈希输出数量。因此,在这个情形中 1 n \frac {1}{n} n1是Rony和Tiri可以实现的最大的可能,不能保证它们是室友。

3-3 无论如何,寒冷并不可怕(The Cold is Not Bothersome Anyway)

冰芯是从深层冰川中钻出的长圆柱形塞子,这些塞子是堆积在一起并被压缩成冰的积雪。科学家可以将冰芯分成不同的切片,每个切片代表一年的沉积。对于下面每个场景,描述一个有效的算法来对从多个冰芯中收集的n个切片进行排序。验证你的答案。

(a)

每个冰芯给一个唯一的冰芯标识符用于记录,这是一个字符串( 16 ⌈ log ⁡ 4 ( n ) ⌉ 16 \lceil \log_4(\sqrt n) \rceil 16log4(n )⌉个ASCII字符)。通过冰芯标识符对切片排序。

解:每个字符串是一个连续 16 ⌈ log ⁡ 4 ( n ) ⌉ × 8 = O ( log ⁡ n ) 16 \lceil \log_4(\sqrt n) \rceil \times 8=\mathcal{O}(\log n) 16log4(n )⌉×8=O(logn)的bit。在word-RAM中,这些bit可以被解释为存储在固定数量的机器字中的整数( w ≥ lg ⁡ n w\ge \lg n wlgn),上边界是 2 16 ⌈ log ⁡ 4 ( n ) ⌉ × 8 < n 33 2^{16 \lceil \log_4(\sqrt n) \rceil\times8}<n^{33} 216log4(n )⌉×8<n33,因此我们可以通过基数排序对他们进行排序,耗时: Θ ( n + n log ⁡ n n 33 ) = Θ ( n ) \Theta(n+n\log_nn^{33})=\Theta(n) Θ(n+nlognn33)=Θ(n)

(b)

数据库中最深的冰芯高达800,000年。通过它们的年龄(切片形成后的年数)对切片进行排序。

解:年龄范围: [ 0 , 8 ∗ 1 0 5 ] [0,8*10^5] [0,8105],因此我们可以使用计数排序来对它们升序排列,最坏情形 Θ ( 8 ∗ 1 0 5 + n ) = Θ ( n ) \Theta(8*10^5+n)=\Theta(n) Θ(8105+n)=Θ(n)

(c)

每年降雪量的变化,会导致冰川在不同时间有不通的积累速度。对切片按厚度排序, m / n 3 m/n^3 m/n3处于[0,4],m是一个整数。

解:乘 n 3 n^3 n3,这些整数m的多项式边界: [ 0 , 4 n 3 ] [0,4n^3] [0,4n3],因此对它们进行基数排序,最坏情形 Θ ( n + n log ⁡ n n 3 ) = Θ ( n ) \Theta(n+n\log_nn^3)=\Theta(n) Θ(n+nlognn3)=Θ(n)

(d)

Elna of Northendelle发现水有记忆,但不能量化给定切片的存储。幸运地是,给定2个切片,她可以区分哪个有更多的存储(花费 O ( 1 ) \mathcal{O}(1) O(1),使用她的“双指算法”,用她的两个手指触碰切片)。通过存储对切片排序。

解:在切片中,仅有的辨别顺序信息的方式是通过比较,因此我们可以选择归并排序,耗时 Θ ( n log ⁡ n ) \Theta(n\log n) Θ(nlogn),在比较模型中,这是最优的。

3-4 pushing paper

Farryl Dilbin是一个Munder Difflin造纸公司中央仓库的叉车操作人员。她需要运送r reams的纸给客户。在仓库中有n箱纸,每箱1英尺宽,并排排列,覆盖着一堵n英尺的墙。每个箱子包含一个已知的正整数ream,没有两个箱子包含相同数量的ream。让 B = ( b 0 , . . . b n − 1 ) B=(b_0,...b_{n-1}) B=(b0,...bn1)代表每个箱子中有多少ream,箱子i位于从左到右第i英尺处,包含 b i b_i bi reams的纸,对于所有 i ≠ j , b i ≠ b j i\neq j,b_i\neq b_j i=jbi=bj。为了最小化她的工作,Pharryl想知道是否有一对相近的箱子 ( b i , b j ) (b_i,b_j) (bi,bj),意味着 ∣ i − j ∣ < n / 10 |i-j|<n/10 ij<n/10,满足订单r,意味着: b i + b j = r b_i+b_j=r bi+bj=r

(a)

给定B和r,描述一个期望 O ( n ) \mathcal{O}(n) O(n)时间的算法,来决定是否B包含一对相近箱子满足订单r。

解:对每个 b i b_i bi满足 r − b i = b j , b j ∈ B r-b_i=b_j,b_j\in B rbi=bj,bjB,若满足,则检查 ∣ i − j ∣ < n / 10 |i-j|<n/10 ij<n/10。因为每个箱子有唯一数量的ream,如果 b i b_i bi有匹配的,那么有唯一的 b j b_j bj。原生地,我们可以执行这个检查,通过比较 r − b i r-b_i rbi和所有 b j ∈ B − { b i } b_j\in B-\{b_i\} bjB{bi},每个 b i b_i bi耗时 O ( n ) \mathcal{O}(n) O(n),导致 O ( n 2 ) \mathcal{O}(n^2) O(n2)。我们可以对这个算法加速,通过首先将B中所有元素放到哈希表H,比如 ( b i , i ) (b_i,i) (bi,i),因此查询每个 r − b i r-b_i rbi可以很快完成。对每个 b i ∈ B b_i\in B biB,插入 b i b_i bi到H,映射i,花费期望摊还 O ( 1 ) \mathcal{O}(1) O(1)时间。现在B中所有值都存在于H中,因此对每个 b i b_i bi,检查 r − b i r-b_i rbi是否存在于H中,花费期望 O ( 1 ) \mathcal{O}(1) O(1)。那么,如果这么做了,H将返回j,用于测试与i的相邻程度,花费 O ( 1 ) \mathcal{O}(1) O(1)。构建哈希表,检查每个匹配花费期望 O ( n ) \mathcal{O}(n) O(n),因此这个算法执行时间:期望 O ( n ) \mathcal{O}(n) O(n)。这个暴力算法是正确的,我们检查每个 b i b_i bi和它仅有可能满足的伙伴,检查它是否离得够近。

(b)

现在假设 r < n 2 r<n^2 r<n2。描述一个最坏情形 O ( n ) \mathcal{O}(n) O(n)时间复杂度的算法,来决定B是否包含一组相邻对,满足订单r。

解:用元组 ( b i , i ) (b_i,i) (bi,i)取代B中的 b i b_i bi,来记录箱子原始顺序的索引。我们不知道 b i b_i bi在n的多项式内;但我们知道r是。如果 b i ≥ r b_i\ge r bir,那么它不是B中满足订单r的元组的一部分。因此执行B的线性扫描,移除所有 ( b i , i )   b i ≥ r (b_i,i)\ b_i\ge r (bi,i) bir,构建集合 B ′ B' B。现在 B ′ B' B中ream的个数 b i b_i bi,上边界都是 O ( n 2 ) \mathcal{O}(n^2) O(n2),因此我们可以通过他们的ream数 b i b_i bi B ′ B' B中的元组排序,使用基数排序最坏情形 O ( n + n log ⁡ n n 2 ) \mathcal{O}(n+n\log_nn^2) O(n+nlognn2),并将输出存到数组A中。

现在我们可以使用双指算法(与归并排序中的归并步骤相似)扫过有序链表来找到相加为r的元组(如果这个元组存在)。特别地,初始化索引 i = 0 , j = ∣ A ∣ − 1 i=0,j=|A|-1 i=0j=A1,重复下面过程,直到i=j。如果 A [ i ] = ( b k , k ) , A [ i ] . b = b k , A [ i ] . x = k A[i]=(b_k,k),A[i].b=b_k,A[i].x=k A[i]=(bk,k)A[i].b=bkA[i].x=k。有3种情形:

  • A[i].b+A[j].b=r:满足订单的元组已经找到,检查 ∣ A [ i ] . x − A [ j ] . x ∣ < n / 10 |A[i].x-A[j].x|<n/10 A[i].xA[j].x<n/10,返回true或false

  • A [ i ] . b + A [ j ] . b < r A[i].b+A[j].b<r A[i].b+A[j].b<r A [ i ] . b A[i].b A[i].b不会是满足订单的元组(对于 A [ k ] . b , k ∈ { i + 1 , . . . , j } A[k].b,k\in \{i+1,...,j\} A[k].bk{i+1,...,j}),因此提升i

  • A [ i ] . b + A [ j ] . b > r A[i].b+A[j].b>r A[i].b+A[j].b>r A [ j ] . b A[j].b A[j].b不会是满足订单的元组(对于 A [ k ] . b , k ∈ { i , . . . , j − 1 } A[k].b,k\in\{i,...,j-1\} A[k].bk{i,...,j1}),因此降低j

这个循环维持不变性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Eslint】vscode 配置 eslint 教程

文章目录 一、初始化配置二、文件配置2.1、.eslintrc.js 文件2.2、.eslintignore 文件2.3、settings.json 文件 一、初始化配置 操作步骤&#xff1a; 选择&#xff1a;上下方向键确定&#xff1a;enter 回车键退出&#xff1a;Ctrl c 安装&#xff1a;npm install -g eslint初…

Java高并发核心编程(JUC)—线程池详细笔记

线程池 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作 线程池作用&#xff1a; 降低资源消耗&#xff0c;减少了创建和销毁线程的次数&#xff0c;每个工作线程都可以被重复利用…

加密与解密 调试篇 动态调试技术

OllyDbg调试器的使用 CPU窗口 我们进行载入的时候 主要返回的是CPU窗口 是最主要的窗口 对应面板的C 反汇编窗口 我们先查看CPU窗口 打开后是有 5个面板 主要查看反汇编窗口 我们可以对这些列进行操作 操作都是进行双击地址&#xff1a; 显示被双击行地址的相对地址 再次双…

23种设计模式之代理模式(Proxy Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的代理模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

扩展磁盘大小

此虚拟机之前硬盘大小为40G&#xff0c;需扩展为500G 1.虚拟机设置中&#xff0c;扩展硬盘大小为500G 2.启动此虚拟机&#xff0c;查看当前磁盘大小 3.查看磁盘情况 可查看到当前磁盘大小总共537G&#xff0c;实际使用37G 4.对磁盘分区 刷新分区 查看磁盘情况&#xff0c;可查…

目标检测数据预处理——根据部件类别按照特定位置拼图,缩小学习空间

首先放效果图&#xff0c;更直观看到本片是要干嘛的&#xff1a; 如图&#xff0c;就是将大图划分为44宫格的&#xff0c;4个部件类的目标框按照固定位置拼图&#xff0c;其中head、body的大图为每个宫格一张图&#xff0c;hand、foot的小图为每个宫格22张图&#xff08;因为h…

LInux相关操作命令

目录 1、Linux用户和用户组管理 用户管理命令 系统管理 top命令 ps命令 kill命令 关机命令 重启命令 为什么学习命令 Linux刚面世是并没有图形界面&#xff0c;所有操作都靠命令完成&#xff0c;如磁盘操作、文件存取、目录操作、进程管理、文件权限等工作中&#xff…

react-naive工作原理

react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中&#xff0c;virtual dom 就像一个中间层&#xff0c;介于开发者描述的视图与实际在页面上渲染的视图之间。为了在浏览器上渲染出可交互的用户界面&#xff0c;开发者必须操作浏览器的Dom&#x…

系统分析师经典易错题,解题思路三

UML2.0包括14种图:分别如下:类图(class diagram),类图描述了一组类、接口、协作和他们之间的关系。在OO系统的建模中,最常见的图就是类图。类图给出了系统的静态设计视图,活动图的类图给出了系统的静态进程视图。对象图(object diagram)对象图描述了一组对象及它们之间…

linux centos 安装JDK、tomcat、nginx教程记录

一、安装jdk 1、查看linux系统的jdk位数&#xff08;64/32位&#xff09; 查看本机位数命令&#xff1a; sudo uname --m 2、进入jdk下载官网 Java Downloads | Oracle 现在默认是最新的jdk20 以为我是之前的项目&#xff0c;使用的是jdk1.8_181版本&#xff0c;所以我需要…

零基础自学网络安全/web安全,看这一篇就够了

作为一个安全从业人员&#xff0c;我自知web安全的概念太过于宽泛&#xff0c;我本人了解的也并不够精深&#xff0c;还需要继续学习。 但看到这个问题之后又想说说自己的看法&#xff0c;所以今天随手写写关于web安全的内容&#xff0c;希望对初次遇到web安全问题的同学提供帮…

Cadence+SPB16.2入门教程(上)

第1章焊盘制作 1.1用Pad Designer制作焊盘 Allegro中制作焊盘的工作叫Pad Designer,所有SMD焊盘、通孔焊盘以及过孔都用该工具来制作。 打开程序->Cadence SPB 16.2->PCB Editer utilities->Pad Designer,弹出焊盘制作的界面,如图1.1所示。 在Units下拉框中选择…

【CloudCompare教程】005:点云滤波处理大全

本文讲述基于cloudcompare软件的点云滤波方法及案例,包括:高斯滤波、低通滤波、双边滤波、统计滤波、CSF地面滤波等等。 文章目录 一、高斯滤波二、低通滤波三、双侧滤波四、统计滤波五、CSF地面滤波滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干…

5月22号软件资讯更新合集.....

DHorse v1.1.1 发布&#xff0c;基于 k8s 的发布平台 综述 DHorse 是一个简单易用、以应用为中心的云原生 DevOps 系统&#xff0c;具有持续集成、持续部署、微服务治理等功能&#xff0c;无需安装依赖 Docker、Maven、Node 等环境即可发布 Java 和 Node 应用&#xff0c;主要…

Telnet远程登录设备管理

Telnet远程登录原理 为了方便通过命令管理设备,可以使用Telnet协议对设备进行管理。 Telnet协议与使用Console接口管理设备不同,无需专用线缆直连设备的Console接口,只要IP地址可达、能够和设备的TCP 23端口通信即可。 支持通过Telnet协议进行管理的设备被称为Telnet服务器…

你还不知道~~这个是什么意思吗,还以为是作者写错了

文章目录 前言一、来个例子二、按位非~三、小知识 前言 主要是来学习一下js中运算符的相关的知识 一、来个例子 ~~(Math.random() * 10)看起来像是要获取随机数的。 我们先把括号内的东西粘到控制台看看&#xff1a; 结果&#xff1a; (Math.random() * 10) //4.47062635057…

面试冲冲冲

目录 一、数据库MYSQL 1.1 Oracle与Mysql的区别 1.2 Mysql索引 1.3 Mysql事务 1.4 Mysql存储引擎 1.5 B树 1.6 锁 1.7 优化 一、数据库MYSQL 1.1 Oracle与Mysql的区别 Oracle与Mysql的区别_oracle和mysql区别_顾优秀的博客-CSDN博客 浅谈MySQL和Oracle的区别_oracle…

都说聚合配送好,它到底能解决哪些同城配送难题?

自外卖经济兴起以来&#xff0c;即时配送一直呈现爆炸式增长。与该领域相关的商家、平台、骑手、用户数量和订单数量&#xff0c;也在保持着快速增长。其服务类别已从外卖扩展到人们生活的各个方面&#xff0c;需求增量稳步增长。 市场配送渠道虽多 配送问题仍是大难题 到目…

淘宝618活动节奏指南

一年一度的618活动又要开始啦&#xff0c;今天跟大家分享的是618活动时间节点&#xff0c;以及活动预热&#xff0c;活动期间&#xff0c;以及活动结束之后咱们应该做哪些事情。 这个是今年618活动的一个时间节点&#xff0c;和往年一样&#xff0c;主要分为预售&#xff0c;开…

代码随想录算法训练营day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

代码随想录算法训练营day48 | 198.打家劫舍&#xff0c;213.打家劫舍II&#xff0c;337.打家劫舍III 198.打家劫舍解法一&#xff1a;动态规划 213.打家劫舍II解法一&#xff1a;分别掐头和去尾&#xff0c;动态规划 337.打家劫舍III解法一&#xff1a;树的递归遍历动态规划 总…