分享
 
 
 

阅读《Programming Pearls second Edition》后的一些总结和个人实践的套用

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

以下内容是我阅读《Programming Pearls second Edition》后

的一些总结和个人实践的套用。

1、程序员的主要问题不一定是技术上的,更可能是心理上的:

因为他正试图解决一个错误的问题,所以他不能取得进步。

通过打破概念上的障碍,转而解决一个更简单的问题,这样

我们最终解决了问题。

2、"问题越一般话,解决起来可能也就越容易",对于编程来说,

这就意味着直接解决一个23种情况的问题,要比编写一个处

理n种情况的通用程序,然后将该程序应用到n=23时的情况

更加困难.

3、代码的开发是自顶向下的(先从一般概念开始,然后再细化

到一行一行的代码),但正确性分析是自底向上底:我们将

从个别的代码行开始,研究它们如何一起协作以解决该问题。

当你在调试、修改代码或错误的断言语句是,要完全地理解

代码,抵御那种“改变代码,只要能让她运行起来就行”的

冲动。

4、保持代码的简单性通常是正确性的关键。

断言注释{}伪码例子(作者分析):

(断言:输入、程序变量以及输出之间的关系描述了程序的

状态;断言允许程序员精确的说明这些关系。)

David Gries的咖啡罐问题。起初给你提供一个盛装了一些

黑豆和白豆的咖啡罐以及一大堆额外的黑豆。然后你重复进

行以下过程,直到罐中只剩下一粒豆子为止:

随机从罐中选择两粒豆子。如果它们颜色一样,就将它们扔

掉,并且在罐中放入一粒黑豆。如果它们颜色不一样,则将

白豆放回罐子,同时扔掉黑豆。

请证明该过程会终止。当一开始罐子里既有黑豆又有白豆是,

你能说出罐子里最后剩下的豆子是什么颜色的吗?

m:表示罐子里黑豆子的个数

n:表示罐子里白豆子的个数

简写形式sameColor()表示从罐中取出两粒豆子颜色相同

m=黑豆子数

n=白豆子数

{(m+n)>0}

loop

if (m+n)==1

{m==1 || n==1}

if m==1

{m==1}

color=block;break

else

{n==1}

color=whrite;break

case

sameColor()==black:

{sameColor()==black && m>=2}

m=m-1;

{(m+n)>=1}

sameColor()==whrite:

{sameColor()==whrite && n>=2}

n=n-2;

{n>=0}

m=m+1;

{(m+n)>=1}

sameColor()==false:

{sameColor()==false && n>=1 && m>=1}

m=m-1

{(m+n)>=1}

{(m+n)>=1}

分析:循环终止时color将被赋值,在case中三种情况都会使罐

子中的豆子总数(m+n)减少一个,在初始使(m+n)>0,所以最

后罐子中肯定剩余一个豆子,m==1或n==1,可以使程序终止;

5、简单而且功能强大的程序可以让用户高兴并且也不会让程序构建

者烦恼,这是程序员的终极目标。

6、对实时软件系统进行性能计算时,我们必须按照2、4或6的系数

降低性能,以补偿我们的无知。在进行可靠性/可用性承诺时,

我们应该对我们认为能够满足的目标保留一个10的系数,以补偿

我们的无知。在估计鬼迷、成本以及进度时。我们应该保留2或4

的系数,以弥补我们在某个方面的缺漏。

爱因斯坦明言“任何事都应该做到尽可能的简单,除非没有更简

单的了”

7、分治法:要解决规模为n的问题,可递归解决两个规模近似为n/2

的子问题然后将他们的答案进行合并以得到整个问题的答案。

8、一个二分查找算法优化的例子:

算法一:

l=0;u=n-1

loop

/*查找t在x[l..u]中的位置*/

if l>u

p=-1;break file://查找结束,t不存在x[l..u]中

m=(l+u)/2 file://二分x[l..u]

case

x[m]<t: l=m+1

x[m]==t:p=m;break

x[m]>t: u=m-1

算法二:(优化后的算法)

l=-1;u=n

while l+1!=u

m=(l+u)/2

if x[m]<t

l=m

else

u=m

p=u

if p>=n || x[p]!=t

p=-1 file://t不存在x[l..u]中

说明:

算法一和算法二都完成了二分查找功能;如果t在x[l..u]中存在

多次,则算法一返回的位置可能是其中的任一个,但算法二会返

回最先的位置。虽然算法二看似比算法一难些,但是算法二更有

效率,因为算法一种可能对t的比较要多于两次,case中;弹算

法二只需比较一次。

9、代码优化原则:尽量少用代码优化;软件的许多其它属性和效率

一样重要,甚至更重要;在优化代码前,我们应该确保其它方法

不会提供更加有效的解决方案。

10、我本人的一个优化例子:

在对一个嵌入设备做存储操作时,其设配厂商提供了动态库中包

括了对设配存储区的完全重写操作,和单条记录添加、删除操作。

通过测试发现做单条操作与做完全重写所花费的时间基本相同,

甚至更多。原来,其存储介质为falsh,做任何操作都是先全部擦

除再重新写入。所以做单条操作会比完全重写要慢,而且操作要稳

定。从而我再也没有用过单条操作调用,而全都用完全重写,从而

提高了效率。也就是说,有的时候简单的操作,并不一定效率会高,

它有可能是组织了一些复杂操作的结果。就像,用%求于,要比用

if和减法慢的多。

10、减少空间通常带来运行时间上合理的副作用:程序越小,加载的时

候也越快,也越容易填充到高速缓存中;需要操作的数据越少,操

作时所花的时间通常也就越少。跨网络传送数据时所需的时间通常

和数据大小成正比。

压缩空间的关键是简单,简单性可以产生功能性、健壮性以及速度

和空间;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有