买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))

我觉得这真是一本不错的书,正是符合我的喜好的一本书。恩,所以我还是买了原版回来,尽管我的英文水平有些差劲。我注意到有网上一个人评论说,里面有些雕虫小技而已,对于大的项目可能不适用,或者在现代计算机内存,cpu速度都很强的情况,有些问题不那么在乎了。
我对这个评价觉得很不满意,尤其是将“智慧”所称雕虫小技,更是感到不认可。我觉得这本书想讲解的其实不是投机取巧的东西,而是完全为了是锻炼程序员的思想层次上的东西。这些也是决定一个程序员素质高低的关键。
技术可能会更新,涌现新的语言,工具和方法,环境等等,但是思想则会更持久,而这本书主要叙述的是思想,视角,从这个层次上提高效率和优美性。

我也看到了另一本书,是effective系列中的effective c#,我觉得这本书也是我比较需要的,因为里面有一些问题可能我并不是非常清楚。它主要的是帮助不太了解这些问题的人了解这些问题,了解编译器的喜好和个性,从而让你更有效的使用这个IDE,让你了解影响你的代码效率的比较底层的对你透明的一些东西,从而可写出更符合编译器口味,更有效率的代码。这和思想和算法层次是不同的,这主要是从高级语言特性等方面来提高代码效率,教给你良好的习惯和摒弃不良的代码习惯。它的层次更接近应用层,与语言,ide特性更相关。

而pearls是比较抽象的,我在书中看到的叙述感到非常有趣,因为作者提出问题后经常会给这个问题实际中的例子,这就非常有信服力,让你觉得这些智慧确实有用!我很喜欢,因为这些绝非投机,而非小计,而是智慧!不然,你觉得算法是什么,它就是一种抽象的方法,一种很强的智慧操纵后的解决方法转换处理(从人的直观型逻辑思维习惯转换为代码的过程控制型习惯),一种智慧的结晶。

这本书里面提到另一个人提出了一句话,而这句话恰恰也是作者的想法:A problem that seems difficult may have a simple, unexpected solution. 我想我确实是不太信任别人的翻译的,所以我要买回原版。因为中文表义具有一种模糊性,就是模棱两可,而英文表义具有一种确定性,即它的一些动词的语态与时间,被动等等结合,它可以更准确无歧义的进行描述。而且中文译者里面的素质也是良莠不齐的,可能得到公认和信任的也就是侯捷先生了,从他在前面列出一系列的词语对照和原因解释就能看出他的责任心和工作态度。回过来这句话,一个看起来很困难的问题,可能具有一个简单的出人意料的解法。嗯,我想这句话来描述优美的算法和代码非常恰当!

——————————————
比如说我在88上遇到的这个问题:
1,1,2,2,3,3,4,4,5,5这十个数字,要求排成一排,是两个1之间有1个数字,两个2之间有2个数字,...,两个5之间有5个数字。

怎么排呢?你可以在纸上尝试一下,无论如何,你都做不出结果,因为这道题无解。
怎么证明它无解呢?老实说,我虽然看到提示说用奇偶性证明,但是我没有想出怎么回事,而是用tc遍历搜索了一下发现没有任何输出。证明的方法我觉得这也可以说是另一种智慧能力的体现了,但是其实过程很简单:如果给 10 个数字从 1 到 10 进行连续编号,则显然这组编号必定由 5 奇数 5 偶数组成。
我们假设具有一个解满足题目要求,现在我们再次对这个解从 1 到 10 重新编号(显然仍由 5 个奇数编号和 5 个偶数编号组成):

那么考虑这个解里面的局部(子串):
1*1, 3***3, 5*****5,  这三对的数字(1,3,5)的编号的奇偶性相同。也就是(奇奇,或偶偶)* 3;
2**2, 4****4, 这两对数字(2,4)的编号的奇偶性不同。也就是说(是1奇1偶)* 2;

可见,解的编号具有偶数个偶数和偶数个奇数,和 5 奇 5 偶矛盾!因此无解。
证毕。

时间: 2024-09-27 09:33:20

买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))的相关文章

88上的数学题目之二

在前面一个帖子中,我已经提出了一道来自88上的数学题目,所以这次是第二道来自88的数学题目.对于一个程序员来说,数学基础是非常重要的.所以我在浏览88时,特别关注数学题目的帖子. 问题:1/2*3/4*5/6........*99/100  和1/10哪个大? 下面是来自一个网友给出的解答,id我忘记了, 解答:另a=1/2*3/4...*99/100,                 b=2/3*4/5...100/100,            因为a*b=1/100,   并且a<b,因此

88上的数学题目(3)

非常高兴,又见到了我最喜欢的数学题目.这已经是第三篇数学题目文章.原帖号称是初中数学题,惭愧的是我这个master的数学基础薄弱....下面是题目的原帖: 题目: 发信人: wonuvy (日格一物百合帮米米坛之九五二七), 板面: ZJUOnline 标  题: 初中数学题,急问 发信站: 飘渺水云间 (Fri Jan 25 16:16:43 2008), 转信从2的0次方,到2的2008次方这2009个数字里,有多少个数字的最高位是1? 请给出答案,并证明. 对于此问题,当然是指10进制,那

《编程珠玑(续)(修订版)》目录—导读

内容提要 编程珠玑(续)(修订版) 本书是计算机科学方面的经典名著<编程珠玑>的姊妹篇,讲述了对于程序员有共性的知识.本书延续了<编程珠玑>的特色,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路.书中涵盖了程序员操纵程序的技术.程序员取舍的技巧.输入和输出设计以及算法示例,这些内容结合成一个有机的整体,如一串串珠玑展示给程序员.本书对各个层次的程序员都具有很高的阅读价值. 版权声明 编程珠

《编程珠玑(第2版•修订版)》目录—导读

作者简介编程珠玑(第2版•修订版)Jon Bentley 世界著名计算机科学家,被誉为影响算法发展的十位大师之一.他先后任职于卡内基-梅隆大学(1976~1982).贝尔实验室(1982~2001)和Avaya实验室(2001年至今).在卡内基-梅隆大学担任教授期间,他培养了包括Tcl语言设计者John Ousterhout.Java语言设计者James Gosling.<算法导论>作者之一Charles Leiserson在内的许多计算机科学大家.2004年荣获Dr. Dobb's程序设计卓

《编程珠玑(续)(修订版)》—第1章1.1节计算素数

第1章 性能监视工具 编程珠玑(续)(修订版) 听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体.性能监视工具(profiler)对程序起着同样的作用. 你现在用什么工具来研究程序?复杂的分析系统很多,既有交互式调试器,又有程序动画系统.正如CT扫描仪永远代替不了听诊器一样,复杂的软件也永远代替不了程序员用来监控程序的最简单工具--性能监视工具,我们用它了解程序各部分的执行频率. 本章先用两种性能监视工具来加速一个小程序(记住真正的目的是说明性能监视工具).后续

编程珠玑--旋转算法

旋转算法出自<编程珠玑>第二章题目.   <编程珠玑>一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输.使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感.   题目:将一个n元一维数组a[n]左移i个位置.例如,当n=8,i=3时,数组abcdefgh旋转为defghabc.请设计一个算法完成这个任务.   1. 块交换法: 分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面.  

编程珠玑--粗略估算

粗略估算是<编程珠玑>中第七章提到的内容.   这篇文章将"粗略估算"看做是一项工程技术,是程序员必备的一项技能之一. 本人非常同意这个观点.粗略估算是一种把复杂的事情简单化的能力.我们对某个算法的时间复杂度和空间复杂度的估算就是基于这种估算的能力.如果你能较为准确的估算出一个程序的输出结果,如果你能准确估算出这个程序的运行时间,如果你能准确估算出这个项目的开发时间--如果你能拥有这样的能力,该有多么美好啊.所以难怪乎像微软.Google这样的大公司老喜欢出"请计

编程珠玑--位图法排序

题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复.求如何将这n个正整数升序排列. 约束:最多有1MB的内存空间可用,有充足的磁盘存储空间.   分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码.而包含正整数的文件约为10^7个int大小.这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法.因此衍生出下面两种方法:   方法1

新手菜鸟关于编程珠玑的疑问

问题描述 新手菜鸟关于编程珠玑的疑问 大神们好,我是新手,在看编程珠玑的时候想到一个问题.问题描述如下: 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数 如果内存不足,仅可以用文件来进行处理,如何处理? 编程珠玑和网上各种大神的想法都是这样的: 按最高位分为两段,没有出现的那个数,肯定在比较小的段里面. 各位是不考虑这种情况,还是不可能出现这种情况?: 按每一位分段,分出来的都是相等数目的数.比如说从42亿个32位数里面取出来2亿个数,全取对称数.比如第一