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

算法导论练习题2.1 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 算法导论-插入排序一、2.1插入排序二、练习2.1-22.1-32.1-4总结 一、2.1插入排序 二、练习 2.1-2 代码如下(示例): class Solution(object): def generate(self, A): """ :type numRows: int :rtype: List[List[int]] """ for j in 阅读详情

2.2-1

用Θ\ThetaΘ记号表示函数n3/1000−100n2−100n+3n^3 / 1000 - 100n^2 - 100n + 3n3/1000−100n2−100n+3。


答:
Θ(n3)\Theta(n^3)Θ(n3)

2.2-2

考虑排序存储在数组AAA中的nnn个数:首先找出AAA中的最小元素并将其与A[1]A[1]A[1]中的元素进行交换。接着,找出AAA中次最小元素并将其与A[2]A[2]A[2]中的元素进行交换。对AAA中前n−1n-1n−1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n−1n-1n−1个元素,而不是对所有nnn个元素运行?用Θ\ThetaΘ记号给出选择排序的最好情况与最坏情况运行时间。


答:

  • 伪代码:
SELECTION-SORT(A)
	n = A.length
	for i = 1 to n - 1
		minIndex = i
		for j = i + 1 to n
			if A[minIndex] > A[j]
				minIndex = j
		swap(A[i], A[minIndex])
  • c#代码
static void SelectionSort(int[] A)
{
	for(int i = 0; i < A.Length - 1; i++)
	{
		int minIndex = i;
		for(int j = i + 1; j < A.Length; j++)
		{
			if (A[minIndex] > A[j])
				minIndex = j;
		}

		int temp = A[i];
		A[i] = A[minIndex];
		A[minIndex] = temp;
	}
}
  • 该算法维持的循环不变式是“f循环迭代每次开始之前,数组A[1..i−1]A[1 .. i - 1]A[1..i−1]中的元素均为已排序好的元素”。
  • 当i==n−1i == n - 1i==n−1时,数组AAA中前n−2n - 2n−2个元素均已排好序,而剩余未排序的元素只有A[n−1]A[n - 1]A[n−1]和A[n]A[n]A[n]这两个元素了。在内层for循环体内对这两个未排序元素进行了比较,并且将较小的元素保存在A[n−1]A[n-1]A[n−1]了,同时也就将两者中的较大的元素保存在A[n]A[n]A[n]中了。这样,对于最后一次循环迭代(i==n−1i == n - 1i==n−1),会同时将数组AAA中最后两个一同排序。所以,选择排序只需要对前n−1n - 1n−1个元素而不是对所有nnn个元素运行。
  • 运行时间
    为选择排序算法SELECTION-SORT(A)中每一行的设定执行代价,即第kkk行的执行代价为ckc_kck​,每行代码的执行情况如下所示:
代码代价执行次数
SELECTION-SORT(A)
n = A.lengthc1c_1c1​111
for i = 1 to n - 1c2c_2c2​nnn
minIndex = ic3c_3c3​n−1n - 1n−1
for j = i + 1 to nc4c_4c4​∑j=2n(n−j+1)+1\sum_{j=2}^{n}(n-j+1)+1∑j=2n​(n−j+1)+1
if A[minIndex] > A[j]c5c_5c5​∑j=2n(n−j+1)\sum_{j=2}^{n}(n-j+1)∑j=2n​(n−j+1)
minIndex = jc6c_6c6​∑k=1n−1tk\sum_{k=1}^{n-1}t_k∑k=1n−1​tk​,其中tkt_ktk​为在k=ik=ik=i时此行的执行次数
swap(A[i], A[minIndex])c7c_7c7​n−1n-1n−1

T(n)=c1+c2n+c3(n−1)+c4(∑j=2n(n−j+1)+1)+c5∑j=2n(n−j+1)+c6∑k=1n−1tk+c7(n−1)T(n) = c_1 + c_2n + c_3(n - 1) + c_4(\sum_{j=2}^{n}(n-j+1)+1) + c_5\sum_{j=2}^{n}(n-j+1) + c_6\sum_{k=1}^{n-1}t_k + c_7(n-1)T(n)=c1​+c2​n+c3​(n−1)+c4​(j=2∑n​(n−j+1)+1)+c5​j=2∑n​(n−j+1)+c6​k=1∑n−1​tk​+c7​(n−1)
=c4+c52n2+(c2+c3+c7−c4+c52)n+(c1−c3+c4−c7)+c6∑k=1n−1tk=\frac{c_4+c_5}{2}n_2 + (c_2+c_3+c_7-\frac{c_4+c_5}{2})n+(c_1-c_3+c_4-c_7) + c_6\sum_{k=1}^{n-1}t_k=2c4​+c5​​n2​+(c2​+c3​+c7​−2c4​+c5​​)n+(c1​−c3​+c4​−c7​)+c6​k=1∑n−1​tk​
设a=c4+c52,b=c2+c3+c7−c4+c52,c=(c1−c3+c4−c7)a=\frac{c_4+c_5}{2}, b=c_2+c_3+c_7-\frac{c_4+c_5}{2}, c=(c_1-c_3+c_4-c_7)a=2c4​+c5​​,b=c2​+c3​+c7​−2c4​+c5​​,c=(c1​−c3​+c4​−c7​),则
T(n)=an2+bn+c+c6∑k=1n−1tkT(n) = an^2 + bn + c + c_6\sum_{k=1}^{n-1}t_kT(n)=an2+bn+c+c6​k=1∑n−1​tk​

最好情况即为原数组中的元素已经按从小到大的顺序排序,则对于minIndex=jminIndex = jminIndex=j这一句的执行因ifA[minIndex]>A[j]if A[minIndex] > A[j]ifA[minIndex]>A[j]判断不为真,而从来没用执行过。此时,当k=1,2,...n−1k = 1, 2, ... n-1k=1,2,...n−1时,tk=0t_k=0tk​=0,故
T1(n)=an2+bn+cT_1(n) = an^2 + bn + cT1​(n)=an2+bn+c
所以
Θ(T1(n))=Θ(n2)\Theta(T_1(n)) = \Theta(n^2)Θ(T1​(n))=Θ(n2)

最坏情况即为原数组中的元素已经按从大到小的顺序排序,则对于minIndex=jminIndex = jminIndex=j这一句的执行因ifA[minIndex]>A[j]if A[minIndex] > A[j]ifA[minIndex]>A[j]判断总是真,而一直都在执行。此时,当k=1,2,...n−1k = 1, 2, ... n-1k=1,2,...n−1时,tk=n−1,n−2,...1t_k=n-1, n-2, ... 1tk​=n−1,n−2,...1,故
T2(n)=an2+bn+c+∑k=1n−1(n−k)T_2(n) = an^2 + bn + c + \sum_{k=1}^{n-1}{(n-k)}T2​(n)=an2+bn+c+k=1∑n−1​(n−k)
=an2+bn+c+n(n−1)2=an^2+bn+c+\frac{n(n-1)}{2}=an2+bn+c+2n(n−1)​
=2a+12n2+2b−12n+c=\frac{2a+1}{2}n^2 + \frac{2b-1}{2}n+c=22a+1​n2+22b−1​n+c
设a′=2a+1,b′=2b−1a'=2a+1, b'=2b-1a′=2a+1,b′=2b−1,则
T2(n)=a′n2+b′n+cT_2(n)=a'n^2+b'n+cT2​(n)=a′n2+b′n+c
所以
Θ(T2(n))=Θ(n2)\Theta(T_2(n)) = \Theta(n^2)Θ(T2​(n))=Θ(n2)

综上所述,最好情况与最坏情况的运行时间均为Θ(T(n))=Θ(n2)\Theta(T(n))=\Theta(n^2)Θ(T(n))=Θ(n2)。

2.2-3

再次考虑线性查找问题(参见练习2.1-3)。假定要查找的元素等可能地为数组中地任意元素,平均需要检查输入序列的多少元素?最坏情况又如何呢?用Θ\ThetaΘ记号给出线性查找的平均情况和最坏情况运行时间。证明你的答案。


答:
线性查找算法伪代码:

LINEAR-SEARCH(A, v)
	for i = 1 to A.length
		if A[i] == v
			return i
	return NIL
代码代价执行次数
LINEAR-SEARCH(A, v)
for i = 1 to A.lengthc1c_1c1​n+1n+1n+1
if A[i] == vc2c_2c2​nnn
return ic3c_3c3​111
return NILc4c_4c4​111

线性查找算法的运行时间
T(n)=(n+1)+n+1+1T(n) = (n+1) + n + 1 + 1T(n)=(n+1)+n+1+1
=2n+3=2n + 3=2n+3

  • 在平均情况下,需要检查输入序列一半的元素。此时
    T1(n)=(n2+1)+n2+1+1T_1(n) = (\frac{n}{2} + 1) + \frac{n}{2} + 1 + 1T1​(n)=(2n​+1)+2n​+1+1
    =n+3= n + 3=n+3
    故,运行时间
    Θ(T(n))=Θ(n)\Theta(T(n)) = \Theta(n)Θ(T(n))=Θ(n)

  • 在最坏情况下,需要检查输入序列所有的元素。此时
    T1(n)=(n+1)+n+1+1T_1(n) = (n + 1) + n + 1 + 1T1​(n)=(n+1)+n+1+1
    =2n+3= 2n + 3=2n+3
    故,运行时间
    Θ(T(n))=Θ(n)\Theta(T(n)) = \Theta(n)Θ(T(n))=Θ(n)

综上所述,在平均情况和最坏情况下,它们的运行时间为Θ(n)\Theta(n)Θ(n)。

2.2-4

我们可以如何修改几乎任意算法来使之具有良好的最好情况运行时间?


答:

  • 首先,可以判断算法是否为无法匹配期望结果的输入。如果相匹配,则直接返回。
  • 其次,可以添加特殊情况,让算法优先检查是否匹配这些特殊情况。如果相匹配,则直接返回预先计算出的结果。
  • 最后,可以对一般输入进行分类,让出现概率更高的输入优先匹配最适算法,以减少执行步数。
算法导论练习题2.2 文章目录2.3分治算法习题2.3-2习题2.3-3习题2.3-4习题2.3-5习题2.3-6习题2.3-7总结 2.3分治算法 将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 分解—解决—合并 θ\thetaθ=(nlglglgn) 按照书中的方式编写的代码,采用两个函数递归调用: # merge(合并)函数在改写A def merge(A, p, q, r): n_1 = q - p + 1 n_2 = r - q 阅读详情

相关推荐

算法导论练习题4.1-4.2

文章目录4.1最大子数组4.1-14.1-24.1-44-1.54.2矩阵乘法的Strassen算法 4.1最大子数组 按照书中分治思想的代码: def find_max_crossing_subarray(A, low, high): left_sum = -float('inf') S_left = 0 mid = (low + high) // 2 for i in range(mid, low - 1, -1): S_left = S_left +

M2962244239的博客 650

数据结构-时间复杂度计算详解--向李红老师的数据结构低头 :)

今天早上突然想总结一下数据结构的时间复杂度的知识。 之前学了很多遍,但是一直没有总结,所以之前参考了Algorithm还有清华大学出版的那个数据结构书,今天早上花了几个小时好好的总结一下,也送给三班的同学们。 算法的时间复杂度定义为: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是

Hayden‘s Blog 5606

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 236

《算法导论》2.2练习答案

2.2-1用Θ记号表示函数n3/1000-100n2-100n+3 舍弃它的低阶项,并忽略前面的常数因子 Θ(n3) 2.2-2考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n - 1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素运行?用Θ记号给出选择排序的最好情况和最坏情况运行时间。 (1)伪代码: SELECTION-SOR

游吟焰火的博客 1406

Qt 5.9.1 32位下,手把手搞定周立功CAN二次开发库的加载与配置(含常见错误排查)

本文详细介绍了在Qt 5.9.1 32位环境下配置周立功CAN二次开发库的完整流程,包括环境准备、项目配置、常见错误排查及性能优化建议。特别针对MinGW 32bit环境,提供了.pro文件的精准配置和DLL部署策略,帮助开发者快速解决库文件匹配、编译报错和运行时问题,实现高效的CAN总线通信开发。

weixin_28717431的博客 356

Cadence17.2 > Allegro > 检查PCB Layout信号线组等长

Cadence17.2 > Allegro > 检查PCB Layout等长和配线

DL_62532的专栏 1万+

时间复杂度+常见复杂度解释

前言 算法的效率 虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。 算法的效率主要由以下两个复杂度来评估:时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。 设计算法时,一般是要先考虑系...

CrankZ的博客 2万+

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 352

算法导论 — 2.2 算法分析

练习 2.2-1 用ΘΘΘ记号表示函数n3/1000–100n2–100n+3n^3/1000 – 100n^2 – 100n + 3n3/1000–100n2–100n+3。   解   Θ(n3)Θ(n^3)Θ(n3)。    2.2-2 考虑排序存储在数组AAA中的nnn个数:首先找出AAA中的最小元素并将其与A[1]A[1]A[1]中的元素进行交换。接着,找出AAA中的次最小元素并将其与A...

yangtzhou的专栏 764

基于SAHI算法优化YOLOv8的小目标检测性能研究

SAHI(SliceAwareHyperInference)是一种推理优化算法,通过将大图切片为小块并分别推理的方式,实现更精细的小目标检测。提升小目标检测精度:切片后的小目标在每个小块中占比更大,模型能够更好地聚焦。兼容性强:可直接集成到现有目标检测框架中(如YOLO系列、Detectron2等)。支持大分辨率图片和视频推理:减少硬件对大图推理的限制。本文详细探讨了如何通过SAHI(切片辅助超推理算法)结合YOLOv8模型,有效提升小目标检测性能,尤其是在高分辨率图片和视频场景中表现优异。

博客 2371

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

算法导论第二章习题

算法导论第二章习题笔记 文章目录算法导论第二章习题笔记习题2.1-2:重写插入排序过程,使之按非升序(而不是非降序)排序。2.1-3 :查找问题:2.1-4:考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。2.2-1:用θ记号表示函数$n^3/1000-100n^2-...

hwl19951007的博客 2728

边缘AI工业落地:YOLO26-Seg + RK3588 NPU 极致部署(低功耗+实时实例分割,工业场景全覆盖)

本次实战汇总了「YOLO26-Seg+RK3588 NPU」工业边缘部署中最常见、最致命的8个坑点,所有坑点均来自真实工业项目,解决方案均为零代码/一键操作,无需复杂配置,能让你少走90%的弯路,节省大量时间,必看必记!❌ RKNN转换报错「算子不支持/模型加载失败」→ ✅ 导出ONNX时必须指定opset=12,重新导出即可,RK3588唯一兼容版本;❌ 分割mask错位/轮廓模糊 → ✅ 导出ONNX时加,并保证RKNN的归一化参数与YOLO26一致,零代码修复;

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

算法导论 练习题 3.2-2

苦海无涯闯进来 489

UWB 多传感器通信的纳秒无线位置和时钟同步方法

利用UWB高精度的特点,实现多节点下的无线时钟同步和定位。通过优化硬件架构,减少不确定延迟的影响,系统可以提供纳秒级时钟同步消息

DT程序员的博客 1328

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

算法导论 练习题 3.2-7

苦海无涯闯进来 407

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A=<31,41,59,26,41,58>A=<31,41,59,26,41,58>A=<31,41,59,26,41,58>上的执行过程。 答: 图a显示了数组AAA的初始化状态,也就是数组AAA在排序前的顺序。 在图b中,我们认定由第1个元素31为已排序的元素,此时我们指定第2个元素41为当前待插入的元素。因为41>31,所以41继续保存在数组第2个元素的位置。此时,数组AAA中

火云的专栏 447

算法导论 练习题 17.2-2

1

苦海无涯闯进来 1198

算法导论 练习题 4.2-3

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

苦海无涯闯进来 1318

[算法导论][练习题]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∣9

火云的专栏 322

算法导论 练习题 15.2-2

1

苦海无涯闯进来 473

算法导论 练习题 20.2-1

1

苦海无涯闯进来 589

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

1.2-1 给出一个实际应用的例子,它在应用这一层次上要求有算法性的内容。讨论其中所涉及的功能。 在现在的网约车服务中,为了节省油费以及时间,服务平台需要自动为司机选择一条最短路径作为导航。同时,也为了节省乘客的时间,通常会通过一定的算法来避免堵车。 1.2-2 假设我们要比较在同一台计算机上插入排序和合并排序的实现。对于规模为n的输入,插入排序要运行8n28n^28n2步,而合并排序要运行64nlog⁡2n64n\log_2n64nlog2​n步。当n取怎样的值时,插入排序的性能要优于合并排序? 8n2&

火云的专栏 195

算法导论 练习题 13.2-2

1

苦海无涯闯进来 547

算法导论之2.3-7练习题

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

踩风火轮的乌龟 1275
上一篇: [算法导论][算法实现与分析]选择排序
下一篇: [算法导论][算法实现与分析]归并排序
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值