编程珠玑(2)第八章学习笔记

第八章,作者通过对最大子段和问题的深入探讨,讲解了时间复杂度对算法设计的影响。在实际中,程序实现指定功能可能会有多种方法,此时我们考虑的不仅是功能的实现,还需要在功能实现的基础上考虑算法的时间复杂度。

       在最大子段和的问题上,作者先后分析了四种实现方式,对其时间复杂度做了理论分析,并且对不同数量级的数据进行了实际运行时间的统计。通过这样一系列的介绍,作者总结了几个重要的算法设计技术:

1、保存状态,避免重复计算。(算法2和算法4)

2、将信息预处理至数据结构中。(算法2b)

3、分治算法。(算法3)

4、扫描算法。(算法4)

5、累计。(算法2b)

6、下界。

下面是几个算法的实现。

"h1.h"

#ifndef H1_H
#define H1_H

#include<string.h>
#include<ctype.h>
#include<time.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */

#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


struct posNode{
	int start;
	int end;
};

#endif

"maxSum.cpp"

#include"h1.h"

//Solution 1, Time complexity is O(n^3)
int maxSum1(int a[], int n, posNode *pos){ //用start和end返回子向量,函数返回最大值和位置

	int i, j, k;
	int sum, maxsofar;

	maxsofar = 0;

	for(i=0; i<n; i++){
		for(j=i; j<n; j++){
			sum = 0;
			for(k=i; k<j; k++){
				sum = sum + a[k];
				if(sum > maxsofar){
					maxsofar = sum;
					pos->start = i;
					pos->end = k;
				}
			}
		}
	}

	return maxsofar;
}

//Solution 2, Time complexity is O(n^2)
int maxSum2a(int a[], int n, posNode *pos){

	int i, j;
	int sum, maxsofar;

	maxsofar = 0;
	for(i=0; i<n; i++){
		sum = 0;
		for(j=i; j<n; j++){
			sum = sum + a[j];
			if(sum > maxsofar){
				maxsofar = sum;
				pos->start = i;
				pos->end =j;
			}
		}
	}

	return maxsofar;
}

int maxSum2b(int a[], int n, posNode *pos){

	int realarray[101];
	int *cumarr;
	int i, j, maxsofar, sum;

	cumarr = realarray+1;
	cumarr[-1] = 0;

	for(i=0; i<n; i++){
		cumarr[i] = cumarr[i-1] + a[i];
	}
	
	maxsofar = 0;
	for(i=0; i<n; i++){
		for(j=i; j<n; j++){
			sum = cumarr[j] - cumarr[i];
			if(sum > maxsofar){
				maxsofar = sum;
				pos->start = i+1;
				pos->end = j;
			}
		}
	}

	return maxsofar;
}

//Solution3, Time complexity is O(nlogn)
int maxSum3(int a[], int low, int high, posNode *pos){
	
	int i, m, lmax, rmax, max, leftPos, rightPos, sum;

	if(low > high){
		return 0;
	}
	if(low == high){
		if(a[low] > 0){
			return a[low];
		}
		else{
			return 0;
		}
	}

	m = (low+high) / 2;

	leftPos = rightPos = m;

	lmax = sum = 0;
	for(i=m; i>=low; i--){
		sum = sum + a[i];
		if(sum > lmax){
			lmax = sum;
			leftPos = i;
		}
	}

	rmax = sum = 0;
	for(i=m+1; i<=high; i++){
		sum += a[i];
		if(sum > rmax){
			rmax = sum;
			rightPos = i;
		}
	}

	max = maxSum3(a, low, m-1, pos);

	if( maxSum3(a, m+1, high, pos) > max){
		max = maxSum3(a, m+1, high, pos);
	}

	if(lmax+rmax > max){
		max = lmax + rmax;
		pos->start = leftPos;
		pos->end = rightPos;
	}
	return max;
}

//Solution4, Time complexity is 0(n)
int maxSum4(int a[], int n, posNode *pos){

	int maxSofar, maxEnding;
	int i;

	maxSofar = 0;
	maxEnding = 0;

	pos->start = 0;
	pos->end = 0;
	for(i=0; i<n; i++){
		
		maxEnding += a[i];
		if(maxEnding < 0){
			maxEnding = 0;
			pos->start = i+1;
		}

		if(maxSofar < maxEnding){
			maxSofar = maxEnding;
			pos->end = i;
		}
	}

	return maxSofar;
}

int main(){

	int a[]= {31, -41, 59, 26, -53, 58, 97, -93, -23, 84};
	posNode *pos;

	pos = (posNode*)malloc(sizeof(posNode));
	if(!pos){
		printf("Memory allocation error!\n");
		exit(0);
	}
	pos->start = 0;
	pos->end = 0;

	long startClock, endClock;

	startClock = clock();
	int result = maxSum4(a, 10, pos);
	endClock = clock();



	printf("The result is:%d , The position starts at %d, ends at %d .\nThe time cost is %d \n", 
		result, pos->start+1, pos->end+1,endClock-startClock);

	free(pos);
	return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《编程 续》是Peter Norvig在原作《编程》基础上的延续,旨在进一步探讨编程技巧和优化方法。本书通过大量实例和案例,帮助读者更好地理解和运用编程的精髓。 本书主要涵盖了以下几个方面: 首先,作者介绍了一些高效的算法和数据结构,以帮助读者更好地解决各类实际问题。例如,作者详细讲解了常用的排序算法和搜索算法,在实际应用中如何选择最合适的算法进行优化。 其次,本书还涉及了一些高级的编程技巧和思维模式。作者以实际案例为依据,深入讲解了如何进行代码重构、如何处理复杂的数据结构、如何进行并行计算等等。这些技巧和模式可以使读者的代码更加简洁、高效和可维护。 此外,本书还对一些热门的编程语言和框架进行了介绍和比较。作者通过对比分析,帮助读者选择最适合自己项目需求的编程语言和框架,并介绍了它们的一些优缺点和使用技巧。 最后,作者还分享了一些自己的编程心得和经验,并对未来的发展趋势进行了预测。他鼓励读者积极参与开源项目,不断学习和提升自己的编程水平。 总而言之,《编程 续》是一本帮助读者深入理解编程精髓和优化技巧的实用指南。它丰富了原作的内容,并引入了新的案例和技巧,对于专业程序员和对编程感兴趣的人都是一本值得阅读的书籍。通过学习本书,读者能够更好地提升自己的编程能力,解决实际问题,并更好地适应行业的不断变化和发展。 ### 回答2: 《编程 续》是一本继承《编程》精神的编程类图书,它深入探讨了更多关于编程和算法的话题,帮助读者进一步提升编程技巧和解决问题的能力。 这本续集书籍首先延续了原版的思维方式和编程风格,鼓励读者通过实践和思考来掌握编程的本质。它从不同的角度和实际场景出发,提供了更多实用的编程技巧和解决问题的方法,使读者能够更加高效地编写代码。 《编程 续》的内容涵盖了多个领域,包括排序算法、字符串处理、数据结构、网络编程等。它介绍了一些经典的算法和数据结构,并通过大量的例子和实践题目帮助读者加深理解和掌握。 此外,《编程 续》还关注了一些系统设计和性能优化的问题,提供了一些实际应用的案例和经验分享。通过学习这些内容,读者可以更好地设计和构建可扩展、高性能的软件系统。 总的来说,《编程 续》是一本非常实用的编程类书籍,它以深入浅出的方式讲解了多个编程和算法的关键概念,帮助读者在解决问题和编写代码时更具洞察力和技巧。无论是编程初学者还是有一定经验的开发工程师,都可以从中获得很多启发和收获。 ### 回答3: 《编程续》是由Jon Bentley所著的计算机编程经典著作《编程》的续篇。在这本续作中,作者进一步探讨了计算机科学和编程的一些重要问题和技巧。 《编程续》以问题为中心,通过讲解不同的编程问题和解决方案,培养读者的编程思维和解决问题的能力。书中的问题涉及各个领域,包括算法设计、数据结构、性能优化、并发编程等内容,内容丰富而实用。 这本书的编写风格类似于《编程》,采用了一种琐碎而有趣的方式来讲解问题,引导读者逐步分析和优化解决方案。通过这种方法,读者可以深入了解各种编程技巧和策略,从而提高自己的编程水平。 《编程续》还包含了许多实际案例和代码示例,读者可以通过实践来巩固所学的知识。这使得书籍的内容更加贴近实际编程应用,并能帮助读者更好地理解和运用所学的技巧。 总之,如果你对计算机科学和编程有浓厚的兴趣,并希望深入了解和掌握一些编程问题和技巧,那么《编程续》是一本非常值得阅读的书籍。它将帮助你提升编程能力,并成为你在实际编程中的得力助手。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值