[算法导论][练习题]2.3

告别U盘!在Ubuntu 22.04上从零搭建PXE网络装机服务器(支持UEFI/Legacy双启动) 本文详细介绍了在Ubuntu 22.04上搭建PXE网络装机服务器的完整流程,支持UEFI/Legacy双启动模式。通过配置DHCP、TFTP和HTTP服务,实现无需U盘的高效批量系统部署,解决传统安装方式的介质依赖、版本控制和时间成本问题,显著提升机房维护和设备部署效率。 阅读详情

2.3-1

使用图2-4作为模型,说明归并排序再数组A=<3,41,52,26,38,57,9,49>A=<3, 41, 52, 26, 38, 57, 9, 49>A=<3,41,52,26,38,57,9,49>上的操作


答:
[39263841495257][ 3 \quad 9 \quad 26 \quad 38 \quad 41 \quad 49 \quad 52 \quad 57 ][39263841495257]
↑\uparrow↑
[3264152∣9384957][ 3 \quad 26 \quad 41 \quad 52 | 9 \quad 38 \quad 49 \quad 57 ][3264152∣9384957]
↑\uparrow↑
[341∣2652∣3857∣949][ 3 \quad 41 | 26 \quad 52 | 38 \quad 57 | 9 \quad 49 ][341∣2652∣3857∣949]
↑\uparrow↑
[3∣41∣52∣26∣38∣57∣9∣49][ 3 | 41 | 52 | 26 | 38 | 57 | 9 | 49 ][3∣41∣52∣26∣38∣57∣9∣49]

2.3-2

重写过程MERGE,使之不使用哨兵,而是一旦数组L或R的所有元素均被复制回A就立即停止,然后把另一个数组的剩余部分复制回A。


答:
伪代码1:

MERGE(A, p q, r)
	n1 = q - p + 1
	n2 = r - q
	let L[1 .. n1] and R[1 .. n2] be new arrays
	for i = 1 to n1
		L[i] = A[p + i - 1]
	for j = 1 to n2
		R[j] = A[q + j]
	i = 1
	j = 1
	for k = p to r
		if L[i] <= R[j]
			A[k] = L[i]
			i = i + 1
		else
			A[k] = R[j]
			j = j + 1		
		if i > n1 or j > n2
				break
	while i <= n1
		A[k] = L[i]
		i = i + 1
		k = k + 1
	while j <= n2
		A[k] = R[j]
		j = j + 1
		k = k + 1

伪代码2:

MERGE(A, p q, r)
	n1 = q - p + 1
	n2 = r - q
	let L[1 .. n1] and R[1 .. n2] be new arrays
	for i = 1 to n1
		L[i] = A[p + i - 1]
	for j = 1 to n2
		R[j] = A[q + j]
	i = 1
	j = 1
	for k = p to r
		if i > n1
			A[k] = R[j]
			j = j + 1
		else if j > n2
			A[k] = L[i]
			i = i + 1
		else if L[i] <= R[j]
			A[k] = L[i]
			i = i + 1
		else
			A[k] = R[j]
			j = j + 1

2.3-3

使用数学归纳法证明:当nnn刚好是2的幂时,以下递归式的解是T(n)nlog2nT(n)nlog_2nT(n)nlog2​n。
T(n)={2若n=22T(n2)若n=2k,k>1T(n) = \begin{cases} 2 & \text{若}n=2 \\ 2T(\frac{n}{2}) & \text{若}n=2^k,k>1 \end{cases}T(n)={22T(2n​)​若n=2若n=2k,k>1​


证明:
(1)当n=21n=2^1n=21时,T(n)=2=2log22T(n)=2=2log_22T(n)=2=2log2​2。即当n=21n=2^1n=21时,T(n)=nlog2nT(n)=nlog_2nT(n)=nlog2​n成立。
(2)假设当n=2kn=2^kn=2k时,T(n)=nlog2nT(n)=nlog_2nT(n)=nlog2​n成立。即T(n)=T(2k)=2klog2k=2kkT(n)=T(2^k)=2^klog_2k=2^kkT(n)=T(2k)=2klog2​k=2kk。
(3)当n=2k+1n=2^k+1n=2k+1时,
T(n)=T(2k+1)T(n)=T(2^k+1)T(n)=T(2k+1)
=2T(2k+12)+2k+1=2T(\frac{2^k+1}{2})+2^{k+1}=2T(22k+1​)+2k+1
=2T(2k)+2k+1=2T(2^k)+2^{k+1}=2T(2k)+2k+1
=2×2kk+2k+1=2\times2^kk+2^{k+1}=2×2kk+2k+1
=2k+1k+2k+1=2^{k+1}k+2^{k+1}=2k+1k+2k+1
=2k+1(k+1)=2^{k+1}(k+1)=2k+1(k+1)
=2k+1log22k+1=2^{k+1}log_22^{k+1}=2k+1log2​2k+1
=nlog2n=nlog_2n=nlog2​n
即,当$n=2^{k+1}时,
T(n)=nlog2nT(n)=nlog_2nT(n)=nlog2​n成立。

综上所述,当nnn刚好是2的幂时,以下递归式的解是T(n)=nlog2nT(n)=nlog_2nT(n)=nlog2​n。
T(n)={2若n=22T(n2)若n=2k,k>1T(n) = \begin{cases} 2 & \text{若}n=2 \\ 2T(\frac{n}{2}) & \text{若}n=2^k,k>1 \end{cases}T(n)={22T(2n​)​若n=2若n=2k,k>1​

2.3-4

我们可以把插入排序表示为如下的一个递归过程。为了排序A[1..n]A[1 .. n]A[1..n],我们递归地排序A[1..n−1]A[1 .. n-1]A[1..n−1],然后把A[n]A[n]A[n]插入已排序地数组A[1..n−1]A[1 .. n-1]A[1..n−1]。为插入排序的这个递归版本的最坏情况运行时间写一个递归式。


答:
T(n)={Θ(1)若n=1,T(n−1)+Θ(n)若n>1。 T(n) = \begin{cases} \Theta(1) & \text{若}n=1, \\ T(n-1) + \Theta(n) & \text{若}n>1。 \end{cases} T(n)={Θ(1)T(n−1)+Θ(n)​若n=1,若n>1。​

2.3-5

回顾查找问题(参见联系2.1-3),注意到,如果序列AAA已排好序,就可以将该序列的重点与vvv进行比较。根据比较的结果,原序列中有一半就可以不用再做进一步的考虑了。二分查找算法重复这个过程,每次将序列剩余部分的规模减半。为二分查找写成迭代或递归的伪代码。证明:二分查找的最坏情况运行时间为Θ(log2n)\Theta(log_2n)Θ(log2​n)。


答:
迭代伪代码:

BINARY-SEARCH-ITERATION(A, low, high, v)
	while low ≤ high
		middle = (low + high) / 2
		if v < A[middle]
			high= middle - 1
		else if v > A[middle]
			low = middle + 1
		else
			return middle
	return NIL

迭代C#代码:

private static int BinarySearchIteration(int[] array, int low, int high, int v)
{
	while (low <= high)
	{
		int middle = (low + high) / 2;
		if (v < array[middle])
		{
			high = middle - 1;
		}
		else if (v > array[middle])
		{
			low = middle + 1;
		}
		else
		{
			return middle;
		}
	}

	return -1;
}

递归伪代码:

BINARY-SEARCH-RECURSION(A, low, high, v)
	if low > high
		return NIL

	middle = (low+ high) / 2
	if(v < A[middle])
		return BINARY-SEARCH-RECURSION(A, low, middle - 1, v)
	else if(v > A[middle])
		return BINARY-SEARCH-RECURSION(A, middle + 1, high, v)
	else
		return middle

递归C#代码:

private static int BinarySearchRecursin(int[] array, int low, int high, int v)
{
	if(low > high)
	{
		return -1;
	}

	int middle = (low + high) / 2;
	if(v < array[middle])
	{
		return BinarySearchRecursin(array, low, middle - 1, v);
	}
	else if(v > array[middle])
	{
		return BinarySearchRecursin(array, middle + 1, high, v);
	}
	else
	{
		return middle;
	}
}

证明二分查找的最坏情况运行时间为Θ(log2n)\Theta(log_2n)Θ(log2​n):
每次我们将vvv与中间元素进行比较时,搜索范围都将继续进行。此时,搜索范围减半。故运行时间的递归式为:
T(n)={Θ(1)若n=1T(n)=T(n2)+Θ(1)若n>1 T(n) = \begin{cases} \Theta(1) & \text{若}n=1 \\ T(n) = T(\frac{n}{2}) + \Theta(1) & \text{若}n>1 \end{cases} T(n)={Θ(1)T(n)=T(2n​)+Θ(1)​若n=1若n>1​
此递归式的解为Θ(log2n)\Theta(log_2n)Θ(log2​n)。

2.3-6

注意到2.1节中的过程INSERTION-SORT的第5~7行的while循环采用一种线性查找来(反向)扫描已排好序的子数组A[1..j−1]A[1 .. j-1]A[1..j−1]。我们可以是哟个二分查找(参见联系2.3-5)来把插入排序的最坏情况总运行时间改进到Θ(nlog2n)\Theta(nlog_2n)Θ(nlog2​n)吗?


答:
在最坏情况中,待排序的元素是按与要求相反的顺序排布的。插入排序算法INSERTION-SORT,在插入第j个元素的迭代中需要做两个步骤:首先,通过线性查找来(反向)扫描已排好序的子数组A[1..j−1]A[1 .. j-1]A[1..j−1];然后将A[1..j−1]A[1 .. j-1]A[1..j−1]中的元素逐个向后移动一个位置。如果使用二分查找,仅仅是改变了查找过程的运行时间,但未改变移动过程的运行时间。
而移动过程的总运行时间依然是Θ(n2)\Theta(n^2)Θ(n2),因此,我们无法使用二分查找来把插入排序的最坏情况总运行时间改进到Θ(nlog2n)\Theta(nlog_2n)Θ(nlog2​n)。

我们也可以通过计算得出类似的结论。

为了简化问题,我们假设将目标数字与数组中某个下标的元素进行对比的时间为1,而移动一个元素的时间也为1。但是,我们不考虑类似操作下标这种不太重要的时间,也不考虑将目标数组放置到数组的指定位置的时间。

在原来的INSERTION-SORT算法中,对于要插入的第kkk个元素,在该次迭代中,比较所需要的运行时间为k−1k-1k−1,移动所需要的运行时间也为k−1k-1k−1,所需要的运行时间为2(k−1)2(k-1)2(k−1)。
所以,总运行时间为
∑k=1n(k−1)+(k−1)\sum_{k=1}^{n}(k-1)+(k-1)k=1∑n​(k−1)+(k−1)
=∑k=1n2(k−1)=\sum_{k=1}^{n}2(k-1)=k=1∑n​2(k−1)
=n(n−1)=n(n-1)=n(n−1)

在改进后的INSERTION-SORT算法中,对于要插入的第kkk个元素,在该次迭代中,比较所需要的运行时间为log2klog_2klog2​k,移动所需要的运行时间仍然为k−1k-1k−1。
所以,总运行时间为
∑k=1nlog2k+(k−1)\sum_{k=1}^{n}log_2k+(k-1)k=1∑n​log2​k+(k−1)
=n(n−1)2+log2(n!)=\frac{n(n-1)}{2} + log_2(n!)=2n(n−1)​+log2​(n!)

因为n(n−1)2\frac{n(n-1)}{2}2n(n−1)​的增长速度大于nlog2nnlog_2nnlog2​n,我们无法使用二分查找来把插入排序的最坏情况总运行时间改进到Θ(nlog2n)\Theta(nlog_2n)Θ(nlog2​n)。

通过下图,我们也可以直观地看出这一情况:
在这里插入图片描述

*2.3-7

描述一个运行时间为Θ(nlog2n)\Theta(nlog_2n)Θ(nlog2​n)的算法,给定nnn个整数的集合SSS和另一个整数xxx,该算法能确定SSS中是否存在两个其和刚好为xxx的元素。


答:
首先,使用归并排序算法对集合SSS进行排序,运行时间为Θ(nlog2n)\Theta(nlog_2n)Θ(nlog2​n)。
其次,对于排序后的集合SSS中的元素中的每一个元素sis_isi​(i=1..ni = 1 .. ni=1..n),使用二分查找算法在S[i+1..n]S[i+1 .. n]S[i+1..n]中查找是否有元素si′s_i^{'}si′​符合si′=x−sis_i^{'}=x-s_isi′​=x−si​,这个过程的运行时间是Θ(log2n)\Theta(log_2n)Θ(log2​n)。如果找到了,就返回该元素的位置,如果没有找到,则继续下一次迭代。

所以,总的运行时间为:
T(n)=Θ(nlog2n)+n⋅Θ(log2n)=Θ(nlog2n) T(n) = \Theta(nlog_2n)+n\cdot\Theta(log_2n)=\Theta(nlog_2n) T(n)=Θ(nlog2​n)+n⋅Θ(log2​n)=Θ(nlog2​n)

因此,该算法能确定SSS中是否存在两个其和刚好为xxx的元素。

Java云上香云祭祀线上祭祀系统小程序源码 云上香云祭祀线上祭祀系统”,不仅是一种祭祀方式的创新,更是对传统文化的一次深情致敬。它让我们明白,无论时代如何变迁,对亲人的怀念与尊重永远不会改变。在这个特别的平台上,让我们共同守护那份跨越时空的爱与思念,让心灵得以安放,让生命之树常青。🌳。 阅读详情

相关推荐

深入剖析:功率放大电路设计精髓——从理论到实践

输入信号首先被调制(通常是PWM脉宽调制)成高频开关信号,驱动功率开关管(MOSFET),再通过LC低通滤波器滤除高频分量,还原出放大的音频信号。在靠近功放板电源引脚处放置足够容量的电解电容(如100uF - 1000uF)和高频瓷片电容(如0.1uF)并联进行电源去耦,抑制低频和高频干扰,防止低频振荡(Motorboating)和高频自激。,堪称电子世界里的“能量转换器”。当输入信号在零附近(即两个器件切换导通的区域)时,由于器件的开启电压(Vbe或Vgs)不为零,输出波形会出现明显的衔接不流畅的失真。

Zihan2558的博客 1696

5道题(18春腾讯)

法1:我最直接的想法 #include<iostream> using namespace std; int main() { long long int n, m; cin >> n >> m; long long int sum = 0; int flag = -1;//flag为-1表示为负,为1表示为正 long long int coun...

ShenHang_的博客 312

基于STM32的多普勒雷达测速

基于多普勒雷达传感器,以STM32单片机为主控芯片,根据不同模块检测距离的不同,使用不同多普勒雷达传感器实现对远近距离车辆行驶速度及方向的测量。 1、基础知识 无线电探测和测距,是用无线电(电磁波)方法发现目标并测定其空间位置的装置。随着雷达技术的发展,现代雷达不仅可以对目标进行定位,还可以测量目标的速度、对目标进行成像甚至测量目标的大小和材料特性。所有利用雷达波来检测物体速度的原理,其理论基础皆源自于“多普勒效应”,...

weixin_52801934的博客 6315

算法导论2.3练习答案

2.3-1使用图2-4作为模型,说明归并排序在数组A=<3,41,52,26,38,57,9,49>上的操作。 2.3-2重写过程MERGE,使之不使用哨兵,而是一旦数组L或R的所有元素均被复制回A就立即停止,然后把另一个数组的剩余部分复制回A。 使用哨兵的MERGE见文章:C语言实现归并排序 无哨兵版: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <strin

游吟焰火的博客 956

如何区分Info与CoWoS封装?

这篇文章主要从Info、CoWoS封装的定义、Interposer的种类以及Info、CoWoS封装的种类三方面进行了介绍,希望读者能够有所收获

wangyubo1的博客 7938

【智能模型系列】基于Unity和MediaPipe【手部追踪+手势识别】系统开发指南

在本文中,我将详细介绍一个基于MediaPipe的Unity手势识别系统,该系统能够识别多种常见手势(如拳头、点赞、胜利手势等),并提供完整的事件系统来处理手势状态变化。这个系统非常适合用于VR/AR交互、手势控制游戏或任何需要自然用户界面的应用场景。

纯技术流日常开发商业开发记录总结等 583

《算法导论》第三版第2章 算法基础 练习&思考题 个人答案

第2章 算法基础 2.1 插入排序 2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A=&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;31, 41, 59, 26, 41, 58&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;上的执行过程。 思路:仔细研究插入排序代码即可,无需思路,注意A中先后存在两个41,在排序过程中及排序后这两个41的先后顺序仍然不变,即插入排序具

张劲声的博客 6292

蓝桥杯 stm32 PWM 测量频率

参考 数据手册:比赛 的板子 上面有两个信号发生器,如下图。通过 扭动 可变电阻 (R40, R39), 来实现 PWM 频率的改变。PA15PB4。PA15,PB4分别使用TIM2_CH1TIM3_CH1来对频率进行捕获。

wuyiyu_的博客 2931

算法导论 2.3-1 归并排序数据操作示例

使用图2-4作为模型,说明归并排序在数组A=<3, 41, 52, 26, 38, 57, 9, 49>上的操作。

madaxin的博客 412

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月,中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》(银办发〔2021〕146 号),规范金融机构合理应用开源技术,提高应用水平和自主可控能力,促进开源技术健康可持续发展。前期,为助力成员单位做好开源技术应用与发展工作,北京金融科技产业联盟开源专委会组织了金融业开源技术应用、创新等方面的案例征集,现对部分优秀案例进行宣传,发挥先进典型示范引领作用。申报单位:中国农业银行股份有限公司技术领域:云原生、无服务器架构(Serverless)、DevOps。

银行信息系统应用架构详解 2392

从被秒封到稳过Cloudflare!Canvas/WebGL/WebRTC多维度浏览器指纹隐身全实战

反爬和反反爬,本质上是一场持续的博弈,没有100%的隐身,只有不断升级的伪装。网上很多教程只给了个基础的噪声代码,却没讲透反爬的检测逻辑,导致你用了还是被封。这套方案的核心,不是简单的API重写,而是站在反爬的角度,模拟真实用户的所有特征,保证所有指纹的一致性、合理性、完整性。目前这套方案我用了半年,跑了上千万次请求,稳过国内国外99%的主流反爬平台,没有出现过一次因为指纹关联导致的批量封禁。大家有什么更狠的反爬场景,或者更好的伪装技巧,欢迎评论区一起交流。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1193

第二章 2.3 设计算法

2.3-1 使用图2-4作为模型,说明归并排序在数组A=<3,41,52,26,38,57,9,49>上得操作。{3,41}{26,52}{38,57}{9,49} {3,26,41,52}{9,38,49,57} {3,9,26,38,41,49,52,57}2.3-2重写过程MERGE,使之不使用哨兵,而是一旦数组L或R的所有元素均被复制回A就立刻停止,然后把另一个数组的剩余部分复制回A

u012889441的博客 882

从苏宁电器到卡巴斯基(第二部)第01篇:我在卡巴的日子 I

聊聊行业薪酬 我相信不论是谁,如果是入职一家新的公司,那么他最想知道的一件事情就是待遇情况了。这里既包含每月实际能到手多少钱,又包括五险一金是否齐全以及是按照高标准还是低标准缴纳。另外,如果是入职IT公司,还会在意年终奖有多少,毕竟某些富裕的IT企业,每到年末就会以此制造新闻来博取大家的关注,以彰显自身的实力。 一言以蔽之,待遇问题也就是年收入究竟会有多少,也是我们进入职场的人喜欢相互打听的问题。比如我研究生那届最厉害的一位同学,签了A公司的算法岗位,年薪30W+(税前,下同),在当时的我看来就是天价了

Gleam的专栏 1225

算法导论 练习题 3.2-2

苦海无涯闯进来 489

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

算法导论 练习题 3.2-7

苦海无涯闯进来 407

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【算法导论】3.2练习题答案

3.2-1 证明:若f(n)f(n)f(n)和g(n)g(n)g(n)是单调递增的函数,则函数f(n)+g(n)f(n) + g(n)f(n)+g(n)和f(g(n))f(g(n))f(g(n))也是单调递增的,此外,若f(n)f(n)f(n)和g(n)g(n)g(n)是非负的,则f(n)∗g(n)f(n)*g(n)f(n)∗g(n)是单调递增的。 解:设n1,n2n_1, n_2n1​,n2​...

Rebirth_F的博客 1132

算法导论 练习题 4.2-3

在行列末尾添加0,直到规模达到最接近的2的n次方。 证明等看完后面再做。

苦海无涯闯进来 1318

算法导论之2.3-7练习题

题目:给出一个Θ(nlgn)时间的算法。判断在集合S中,是否存在两个元素的和为x。 算法导论的教师手册解法如下: 1.对集合S排序。 2.创建集合T = {z : z = x − y ,y ∈ S}。 3.对集合T排序。 4.去除S和T中的重复元素。 5.按照从小到大顺序或者从大到小顺序合并两个集合 6.对于合并以后的集合而言,当且仅当集合中的相邻位置出现相等元素,则存在,否则

踩风火轮的乌龟 1275

算法导论 练习题 3.2-3

由于n>=1,2的n次方永远大于n! n>1 n!永远小于n的n次方 所以后面两个小问题得证。

苦海无涯闯进来 761

算法导论 练习题 2.3-3

首先,T(2)=2lg2=2 设T(k)=klgk 其中k为2的幂 T(2k) = 2T(k)+2k = 2klgk+2k = 2k(lgk+1) =2klg2k 得证。

苦海无涯闯进来 544

算法导论3.2练习题

3.2练习题答案

细心归纳,所得丛心 2006

算法导论 练习题 4.3-2

要证明T(n)=O(lgn): T(2)=1 满足条件 设T(n-1)满足条件 则T(n)=T(n/2)+1 得证

苦海无涯闯进来 1261

算法导论 练习题 17.2-3

1

苦海无涯闯进来 1745

算法导论 练习题 2.3-6

#include <stdio.h>int halfSearch(int a[],int p,int r,int key) { int q=(p+r)/2; while(a[q]!=key && a[p]<key && a[r]>key) { q=(p+r)/2; if(a[q]>key) { r=q-1

苦海无涯闯进来 641

算法导论 练习题 8.3-2

1

苦海无涯闯进来 1002

算法导论 练习题 2.3-2

#include <stdio.h> #include <stdlib.h>//合并两个有序数组[p,q],[q+1,r] //p<=q<r void merge(int a[],int p,int q,int r) { int n1=q-p+1; int n2=r-q; int *t1=(int *)malloc(sizeof(int)*n1); int *t2=(i

苦海无涯闯进来 449

算法导论 练习题 3.1-2

1、当a>0 取n0>=max(1,a)任一常量,c1=1,c2=2的b次方,则 01*n的b次方2*n的b次方 2、当a 取n01=1,c2=4的b次方(2的b次方的平方),则 0c1*n的b次方2*n的b次方 3、当a=0 显然成立。

苦海无涯闯进来 722
上一篇: [算法导论][算法实现与分析]归并排序
下一篇: [算法导论][算法实现与分析]冒泡排序
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值