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

夜间灯光遥感数据介绍及下载汇总 阅读详情

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的元素。

STK与Matlab连接报错?手把手教你解决mexConnect函数执行问题(附完整避坑指南) 本文针对STK与Matlab连接时常见的“mexConnect函数执行”报错,提供了完整的诊断与解决方案。文章深入剖析了错误根源在于路径冲突或文件损坏,并手把手指导用户通过定位STK连接器文件、正确配置Matlab路径(包括使用addpath命令)以及执行初始化测试三步走策略,彻底解决问题。同时附上版本兼容性检查、安装避坑指南及构建稳健工作流的建议,帮助用户建立可靠的STK-Matlab联合仿真环境。 阅读详情

相关推荐

Wordpress实战之第二章安装wordpress 软件需要的软件

使用下载并安装phpstudy面版工具 wget -O install.sh?https://notdocker.xp.cn/install.sh?&& sudo bash install.sh 2.安装成功如下 ==============运行状态========================= webpanel stop phpstudy running =================...

安全参透之旅 611

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

POWER(十一)charge pump原理

电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。

zhlwsh的博客 2811

算法导论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

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

《算法导论》第三版第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

在鸿蒙中使用AVPlayer完成视频的播放【坚果派】

播放的全流程包含:创建AVPlayer,设置播放资源和窗口,设置播放参数(音量/倍速/缩放模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。5.准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置缩放模式、音量等。8.退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。6.视频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。今天我们来看一下视频如何正常播放。

坚果的博客 4056

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

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

madaxin的博客 412

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

【图像超分】论文精读:Enhanced Deep Residual Networks for Single Image Super-Resolution(EDSR和MDSR)

最近对超分辨率的研究随着深度卷积神经网络 (DCNN) 的发展取得了进展。特别是,残差学习技术表现出更好的性能。在本文中,我们开发了一个增强的深度超分辨率网络(EDSR),其性能超过了当前最先进的 SR 方法。我们模型的显着性能改进是由于通过删除传统残差网络中不必要的模块进行优化。当我们稳定训练过程时,通过扩展模型大小可以进一步提高性能。我们还提出了一种新的多尺度深度超分辨率系统(MDSR)和训练方法,该方法可以在单个模型中重建不同缩放因子的高分辨率图像。所提出的方法在基准数据集上比最先进的方法表现出更好的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7924

第二章 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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法导论 练习题 3.2-2

苦海无涯闯进来 489

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

算法导论 练习题 3.2-7

苦海无涯闯进来 407

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【算法导论】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、付费专栏及课程。

余额充值