算法导论第三版2.3答案

算法导论第三版2.3答案

2.3-1

划分:
{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

void merge(int a[], int l, int mid, int r)
{
	int n1 = mid - l + 1, n2 = r - mid;
	for(int i = 1; i <= n1; ++i) L[i] = a[l + i - 1];
	for(int i = 1; i <= n2; ++i) R[i] = a[mid + i];
	int i = 1, j = 1, k = l;
	while(i <= n1 && j <= n2)
	{
		if(L[i] <= R[j]) a[k ++] = L[i++];
		else a[k ++] = R[j++];
	}
	
	while(i <= n1) a[k ++] = L[i ++];
	while(j <= n2) a[k ++] = R[j ++];
}

2.3-3

设 n = 2 k . 若 n = 2 , k = 1 , T ( n ) = 2 = 2 l g 2 , 成立 . 若 n = 2 k , k > 1 , T ( n ) = n l g n = k ∗ 2 k 若 n = 2 k + 1 , k > 1 T ( n ) = ( k + 1 ) ∗ 2 k + 1 = 2 T ( n / 2 ) + n = 2 T ( 2 k ) + 2 k + 1 = 2 k ∗ 2 k + 2 k + 1 = k ∗ 2 k + 1 + 2 k + 1 = ( k + 1 ) ∗ 2 k + 1 = n l g n . 设n = 2^k.\\ 若n = 2,k=1,T(n)=2=2lg2,成立.\\ 若n=2^k,k>1,T(n)=nlgn=k*2^k\\ 若n=2^{k+1},k>1\\ T(n)=(k+1)*2^{k+1} \\ = 2T(n/2)+n\\ =2T(2^k)+2^{k+1}\\ =2k*2^k+2^{k+1}\\ =k*2^{k+1}+2^{k+1}\\ =(k+1)*2^{k+1} =nlgn. n=2k.n=2,k=1,T(n)=2=2lg2,成立.n=2k,k>1,T(n)=nlgn=k2kn=2k+1,k>1T(n)=(k+1)2k+1=2T(n/2)+n=2T(2k)+2k+1=2k2k+2k+1=k2k+1+2k+1=(k+1)2k+1=nlgn.

2.3-4

T ( n ) = { 1 n = 1 T ( n − 1 ) + O ( n ) n > 1 T(n) = \begin{cases} 1 & n = 1 \\ T(n-1) + O(n) & n > 1 \end{cases} T(n)={1T(n1)+O(n)n=1n>1

2.3-5

/*
* @Author: gorsonpy
* @Date:   2022-12-17 15:46:15
* @Last Modified by:   gorsonpy
* @Last Modified time: 2022-12-17 15:46:15
*/
#define NIL -1
int binary_search(int a[], int n, int x)
{
	int l = 1, r = n;
	while(l < r)
	{
		int mid = l + r >> 1;
		cout << l << " " << r << " " << mid << endl;
		if(a[mid] < x) l = mid + 1;
		else r = mid;
	}

	if(a[l] != x) return NIL;
	return l;
}

每次都把搜索范围减去一半,故为 O ( l g n ) O(lgn) O(lgn)

2.3-6

这题有点不太明白,感觉书上讲的有点问题,二分优化的插入排序虽然确定插入位置只要 O ( l g n ) O(lgn) O(lgn),但是移动还是需要 O ( n ) O(n) O(n)啊。。

void insert_sort(int a[], int n)
{
	for(int i = 2; i <= n; ++i)
	{
		int x = a[i];
		a[i] = INF, a[0] = -2e9;
		int l = 0, r = i;
		while(l < r)
		{
			int mid = l + r >> 1;
			if(a[mid] < x) l = mid + 1;
			else r = mid;
		}
		int j = i - 1;
		while(j && j >= l) a[j + 1] = a[j], --j;
		a[l] = x;
	}
}

2.3-7

这个就是枚举第一个加数是哪个,然后根据大小关系选择在左右的其中一个部分进行二分查找 x − a i x - a_i xai。二分的代码不好写,瞎写了一个也不知道对不对,反正思路是这么个思路~

/*
* @Author: gorsonpy
* @Date:   2022-12-17 16:19:10
* @Last Modified by:   gorsonpy
* @Last Modified time: 2022-12-17 16:33:57
*/
/*
* @Author: gorsonpy
* @Date:   2022-12-17 16:19:10
* @Last Modified by:   gorsonpy
* @Last Modified time: 2022-12-17 16:37:00
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];

int main()
{
	int n, x;
	cin >> n;
	for(int i = 0; i < n; ++i) cin >> a[i];
	cin >> x;
	bool success = false;
	for(int i = 0; i < n; ++i)
	{
		int key = x - a[i], l, r;
		if(a[i] < key) 
		{
			l = i + 1, r = n;
			while(l < r)
			{
				int mid = l + r + 1 >> 1;
				if(a[mid] > key) r = mid - 1;
				else l = mid;
			}
			if(a[l] == key) success = true;
		}
		else if(a[i] > key)
		{
			l = 0, r = i - 1;
			while(l < r)
			{
				int mid = l + r >> 1;
				if(a[mid] < key) l = mid + 1;
				else r = mid;
			}
			if(a[r] == key) success = true;
		}
		else
		{
			l = i + 1, r = n;
			while(l < r)
			{
				int mid = l + r + 1 >> 1;
				if(a[mid] > key) r = mid - 1;
				else l = mid;
			}
			if(a[l] == key) success = true;
			l = 0, r = i - 1;
			while(l < r)
			{
				int mid = l + r >> 1;
				if(a[mid] < key) l = mid + 1;
				else r = mid;
			}
			if(a[r] == key) success = true;
		}
	}

	cout << (success ? "YES" : "NO") << endl;
	return 0;
}

汇总传送门

链接: 算法导论习题答案汇总

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《算法导论第三版答案PDF是一本非常有价值的资料,其中包含了本书提出的各种算法问题的详细解答。这本答案PDF的编写者经过了严格的选择和考核,他们大都是计算机科学领域的权威专家和学者,拥有丰富的经验和深入的知识。 这本答案PDF主要分为三个部分,第一部分是对于算法的分析和设计,第二部分是算法基础和数据结构,第三部分是高级主题和高级算法。每一章节都有详尽的解答,从基本的数据结构,例如栈、队列和堆,到高级算法,例如线性规划和哈希表,每个问题都有详尽的解答,便于读者深入理解算法背后的原理和技巧。 该答案PDF还提供了大量的例子和练习题,让读者能够在学习过程中实时测试自己的理解和掌握程度。此外,该答案PDF还提供了许多实用的技巧、经验和应用场景,使读者能够更好地应用所学知识来解决实际的问题。 总的来说,《算法导论第三版答案PDF是一本非常有价值的资料,不仅能够帮助读者更加深入地理解算法的背后原理和技巧,还能够帮助读者应用所学知识来解决实际的问题。无论是计算机科学学生还是职业程序员,都可以从中受益匪浅。 ### 回答2: “算法导论第三版答案 pdf”指的是《算法导论》这本书的答案解析。这本书是计算机科学领域中一本非常重要的教材,其内容涵盖了算法设计、算法分析和算法实现三个方面。 由于《算法导论》中的题目非常经典,因此很多读者都希望可以得到书中题目的答案解析,以便更好地理解和应用其中的算法知识。 目前,网络上可以找到一些《算法导论答案解析的PDF文档。这些文档通常由一些对该书有深刻理解的计算机科学专家或者学术界人士撰写。这些答案解析包括书中大部分习题的解答和讨论,能够帮助读者更加深入地掌握其中的算法知识。 然而,需要注意的是,仅仅阅读答案解析是远远不够的。为了真正掌握《算法导论》中的算法知识,读者需要通过反复的练习和实践来加深理解,甚至可以自己设计算法并实现其代码。只有这样,才能真正掌握算法知识,提高自己的编程能力。 ### 回答3: 算法导论第三版答案 PDF是一本对算法导论第三版中的习题进行详细解答的参考书籍。该书可以帮助读者更好地理解和掌握算法导论这本指导性书籍中包含的众多算法和数据结构。 这本答案集涵盖了算法导论第三版中的全部习题,包括题目和答案。它涉及的主题包括渐进分析、排序和选择、数据结构(如堆、散列表、二叉搜索树等)、高级设计和分析技术(如贪心、动态规划、图算法和NP完备性)等。对于学习算法导论的人来说,这是一本非常有用的参考书。 此外,算法导论第三版答案PDF还提供了对习题解答的分析和讨论,这可以帮助读者更好地理解解题的过程和思路。通过阅读该书,读者可以加深对数据结构和算法的理解,提高自己解决问题的能力。因此,如果您正在学习算法导论或者需要更加深入地掌握里面的知识,这本答案集将是您的一个绝佳资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

102101141高孙炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值