在此之前,先粘贴一道智力题!问题的抽象!问题的边界条件!都要细细考虑清楚!问题的边界条件!
两个罐,一个装盐一个装糖。拿一勺子的盐到糖中,混合均匀后,再一勺子的糖+盐,到盐的罐子中。问哪个罐子纯度高。
边界条件!程序员的思维去思考问题!
===============
原来看编程之美快一个月了。总结下吧。算法是弱项。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值,就是空闲/忙碌时间的值。
【时间段内平均的建模,数值的意义,实验确定参数】