编程珠玑读后感1(1个算法)

原创 2007年09月22日 17:56:00
 

HTML Tags and JavaScript tutorial



编程珠玑读后感1(1个算法)





在《编程珠玑》第八章,作者提出一道算法题:
程序描述:
输入是一个具有N个浮点数字的向量X: 其输出是在输入的任何相邻子向量中找出的最大和。
例如,输入如下10个元素:
31 -41 59 26 -53 58 97 -93 -23 84
返回 x[2..6]的总和,或为187
作者分别给出了三次算法O(n^3),两个二次算法O(n^2),分治算法O(n logn )和扫描算法O(n)。
我对该问题作了研究后,给出自己的一种解法。
考虑数组 x[ N ],我们新开辟一个数组sumX[ N + 1 ],其中sumX[ 0 ] = 0, 而 sumX[ i ] 为 x[ 0..i-1 ] 的和。
这样,对于 x[ i..j ]的和,有 sum( x[ i..j ] ) = sumX[ j+1 ] - sumX[ i ].
对于数组sumX, 假设最大值为 sumX[ posMax ], 最小值为 sumX[ posMin ],下面分三种情况:
1. posMin < posMax,也即最小值在最大值左边,我们可以肯定 x[ posMin..posMax-1 ] 就是所要求的总和。
否则,若x[ i..j ]是所要求的总和,且 i != posMin或 j != posMax,
则有sum( x[ i..j ] ) <= sum( x[ posMin, j ] ) <= sum( x[ posMin, posMax ] )
或sum( x[ i..j ] ) <= sum( x[ i, posMax ] ) <= sum( x[ posMin, posMax ] )
上面两不等式至少有一个严格小于,所以sum( x[ i..j ] ) < sum( x[ posMin, posMax ] )
由上可知,这种情况中返回结果 sumX[ posMax ] - sumX[ posMin ]
2. posMin == posMax,说明除了 x[ posMin ]外,其余x[ i ] 全为0
又由于sumX[ 0 ] = 0,所以 sumX[ posMax ] > 0
所以 x[ posMax - 1 ]是所要求的总和
这种情况中返回结果 sumX[ posMax ],也就是 x[ posMax-1 ] 一个元素
3.posMin > posMax
这种情况比较复杂,我们可以把sumX分为三部分:
a)sumX[ 0 ]..sumX[ posMax ];  b)sumX[ posMax + 1 ] ... sumX[ posMin - 1 ], c)sumX[ posMin ].. sumX[ N + 1 ].
我们可以肯定,要找出的x[ i..j-1 ],也可以认为是sumX[ i],sumX[j ]必在同一个小部分中。
否则,若 0 <= i <= posMax 而 posMax < j
则sum( x[ i..j-1 ] ) = sumX[ j ] - sumX[ i ] < sumX[ posMax ] - sumX[ i ]。
对于其他情况,也可以同样证明。
于是我们可以分别对数组a,b,c处理,找出最大和。
对数组a,找出最小值sumX[ posMin1 ],必有posMin1 < posMax,
于是结果 tmpMax1 = sumX[ posMax ] - sumX[ posMin1 ]
对数组c,找出最大值sumX[ posMax3 ],必有posMin < posMax3,
于是结果 tmpMax3 = sumX[ posMax3 ] - sumX[ posMin ]
对数组b,这是一个比开始问题规模更小的子问题,可再迭代处理,得到结果tmpMax2
这种情况中返回结果 tmpMax1, tmpMax2, tmpMax3中最大值
这种算法在最优情况下(posMin <= posMax)可看作一线性算法,运行时间O(n)
在最坏情况下(每次处理均有posMax = 0, posMin = 数组索引最大值,每个子问题规模减2),
这时可看作二次算法,运行时间O(n^2)
使用随机数调试,发现大部分情况运行时间在O( n logn ) 与 O( n^2 )之间。
测试结果:
N=10  N*logN=23  N*sqrtN=31  N^2=100  程序运行次数:27
N=100  N*logN=460  N*sqrtN=1000  N^2=10000  程序运行次数:404
N=1000  N*logN=6907  N*sqrtN=31622  N^2=1000000  程序运行次数:13009
N=10000  N*logN=92103  N*sqrtN=1000000  N^2=100000000  程序运行次数:683867 
 


《编程珠玑》 学习收获

很早就买了这本书,不过一直没看,听师哥师姐们说,要想进互联网公司(dui)...
  • dcj0913
  • dcj0913
  • 2014年09月17日 10:41
  • 1044

【读薄《编程珠玑》】贰 啊哈!算法

这篇文章是[《读薄》系列博客][1]的第 贰 篇,在这篇文章中,作者提出了三个问题,并且给出了相应的解决方案,本文阐述了这三个问题以及解决方案,并且对课后习题进行了分析。 问题集合 0x00: 给定一...
  • luoyhang003
  • luoyhang003
  • 2016年12月11日 00:27
  • 573

编程珠玑_第二章_啊哈 算法

三个问题: 一、给出一个顺序文件,它最多包含40亿个随机排列的32位整数。        问题:找出一个不在文件中的32位整数。        注意:题目中没有说,这40亿个数是否是含有重复的数...
  • insistGoGo
  • insistGoGo
  • 2012年07月15日 22:20
  • 3047

《编程珠玑》(第二版)第一章习题2(用位运算实现位向量)

《编程珠玑》第一章提出了一个排序问题,可以用位图或位向量来表示。如可用一个20位长的字符串来表示一个所有元素都小于20的简单非负整数集合,如集合{1,2,3,5,8,13}可以表示为: 0 1 1 ...
  • yudan_jiangnan
  • yudan_jiangnan
  • 2016年05月30日 13:56
  • 458

编程珠玑:第二章 啊哈,算法三个问题

一. 三个问题 A:给出一个顺序文件,它最多包含40亿个随机排列的32位整数。        问题:找出一个不在文件中的32位整数。        注意:题目中没有说,这40亿个数是否是含有重复的数据...
  • tangli555
  • tangli555
  • 2016年09月10日 21:55
  • 163

"编程珠玑" 第一章 磁盘文件排序问题

问题描述: 输入: 一个最多包含n个正整数的文件,每个数都小于n,其中 n = 10^7.如果在输入文件中 有任何整数重复出现就是致命错误.没有其他数据与该整数相关联. 输出: 按升序排列的...
  • rongdongzhu1
  • rongdongzhu1
  • 2015年09月07日 23:41
  • 468

算法、数据结构经典资料简介(TAOCP、Robert Sedgewick、算法导论、编程珠玑)

算法、数据结构经典资料简介(TAOCP、Robert Sedgewick、算法导论、编程珠玑) 产品开发中,为了提高效率尽量用算法API库,找不到后在自己实现,绝大多数算法都能找到算法库 The ...
  • ajian005
  • ajian005
  • 2012年11月08日 20:03
  • 1321

《编程珠玑》---笔记。浏览此文,一窥此书。

第一章: 磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案。要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案。   比如:文中:最初的需求只是“我如何对磁盘文件排序”...
  • yang_yulei
  • yang_yulei
  • 2014年06月30日 23:53
  • 10115

《编程珠玑》高清pdf版

下载地址:网盘下载 作者简介 编辑 Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998...
  • cf406061841
  • cf406061841
  • 2017年05月27日 18:57
  • 2589

编程珠玑 第二版 第三章 习题答案

Exercise 1、在网上看到很多人都是先用数组来
  • spencerzou
  • spencerzou
  • 2014年05月27日 17:39
  • 1316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程珠玑读后感1(1个算法)
举报原因:
原因补充:

(最多只允许输入30个字)