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

简介: 我觉得这真是一本不错的书,正是符合我的喜好的一本书。恩,所以我还是买了原版回来,尽管我的英文水平有些差劲。我注意到有网上一个人评论说,里面有些雕虫小技而已,对于大的项目可能不适用,或者在现代计算机内存,cpu速度都很强的情况,有些问题不那么在乎了。

我觉得这真是一本不错的书,正是符合我的喜好的一本书。恩,所以我还是买了原版回来,尽管我的英文水平有些差劲。我注意到有网上一个人评论说,里面有些雕虫小技而已,对于大的项目可能不适用,或者在现代计算机内存,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 偶矛盾!因此无解。
证毕。

目录
相关文章
|
13天前
|
机器学习/深度学习 存储 算法
算法·动态规划Dynamic Programming
算法·动态规划Dynamic Programming
10 0
|
8月前
|
算法
算法导论(第三版)具体算法解析与理解
算法导论(第三版)具体算法解析与理解
|
10月前
|
C++
C++ Primer Plus 第八章答案 函数探幽
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
81 0
|
10月前
|
存储 C++
C++ Primer Plus 第十一章答案 使用类
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
53 0
|
11月前
|
机器学习/深度学习 开发框架 编解码
动手学强化学习(三):动态规划算法 (Dynamic Programming)
动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略。
167 0
动手学强化学习(三):动态规划算法 (Dynamic Programming)
|
Java 物联网 Go
洛谷 P1001 A+B Problem (java实现)
洛谷 P1001 A+B Problem (java实现)
|
Java
java编程思想第四版第十四章 类型信息习题
运行结果: 不可以向下转型到Circle
66 0
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门(2)
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门(2)
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门(1)
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门
[解题报告]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门(1)
[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)
[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)
[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)