《编程之美》简略笔记

在此之前,先粘贴一道智力题!问题的抽象!问题的边界条件!都要细细考虑清楚!问题的边界条件!

两个罐,一个装盐一个装糖。拿一勺子的盐到糖中,混合均匀后,再一勺子的糖+盐,到盐的罐子中。问哪个罐子纯度高。

边界条件!程序员的思维去思考问题!

===============

原来看编程之美快一个月了。总结下吧。算法是弱项。take it serious!

第一章:

在进行算法设计时,首先要定出算法的一些基本框架。知道这类问题大概可以用什么方法求解。

最笨的,暴力搜索,回溯递归,再优化下,针对可能重复出现的问题,使用剪枝,或者动态规划。对于最优化问题,贪心,广度优先深度优先等。这些基本的框架要掌握,知道主动去用。

然后再高级点,启发式的方法,设定评价函数等,引导搜索。

数学里的,异或的用法:相同为0,不同为1。这点在很多地方可以用到。抽象概念。

使用动规时,考虑下怎么去设计,状态转化方程?max?从哪种变量开始可选?从后面推倒前面?等等。

巧妙的转化,如进制的转化(第2题,使用9进制的概念,还有很多题使用到的二进制处理)。

筛子的方法。求素数等等。把后面不合格的先筛去,剩下的就是合格。从不安全局面,推出后续的不安全局面。

位操作,mask,移位等处理。也是很基本很重要的。位操作的速度要快很多。

第二章:

位操作的效率要高。移动等。还有方幂的特殊性质:(n&(n-1)) = 0.

淫荡的打表法,空间换时间,很经典,直接查找。

将问题转换,转为查找的算法。效率高很多。

数字,基本还是质因数。处理各种质因数的形式。

分类讨论,基本的思路。当然,通项公式更是基本的方法。

分治,问题的划分,从小规模去查找。还有中间部分的处理方式。

部分和的方法,空间换时间。前后两个方向,多种部分和形式,不要死板。

二阶递推数列,对应就有二阶的矩阵。

降维,枚举一维的情况,另一维的处理就简单了。

数组移位,与逆序的关系。

预处理,如排序等。很重要的预处理方式。

第三章:

空间换时间,转成查找的方式,更直观。

递归!递归的过程,递归基,递归步骤等。基本的算法解决思路。

hash等,外在的存储,判断是否存在。

两个栈模拟队列。

程序上溢出错?

第四章:

递归的公式,推出最后的通项公式?

问题的转换,蚂蚁问题,楼梯问题等,其实都可以看做一个方向的单纯运动。

又见XOR!相异为1,相同为0。去到具体的语境,看下有没符合的。而且XOR满足结合律。

===================================================================

1.1.

代码1-3应该是更直观的:高就sleep,低就继续判断(判断也是一种操作)。这是在能获得当前系统的占用率的情况下,即有相应的API控制。不用想太多,很直观,高就休息,低就工作。对所谓空操作的理解,判断也是操作。

开始在想,工作一段时间,休息一段时间,那么在这段总时间内,就能得到50%的占用率。这是模型建立的关键。总时间的平均。操作系统运行的时间调度片问题。

如何确定工作多久,代码1-1很原始,但也需要进行估算等。并且,需要了解的是,不能过于频繁地调用,即sleep的时间不能过短,因为调用程序也需要消耗时间。代码1-2,可以获得运行时间,不用进行指令数到时间的对应关系估计。通过实验的方法确定1-1的时间,这是比较科学的,实验的手段来检测。

正弦曲线时,先使用了一个数组来存好值,符合程序处理的方式。二是,了解在程序中数值的意义问题,如sin值,就是空闲/忙碌时间的值。

【时间段内平均的建模,数值的意义,实验确定参数】

    原文作者:lightty
    原文地址: https://blog.csdn.net/lightty/article/details/8262506
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞