算法训练:嘘,别人我不告诉他


算法 or 游戏

编程、数学是十分适合自学的,因为一道题对不对,您可以立马得到答案。

哪怕您很喜欢编程,也会如我一样在这条路上遇到无数问题:

  • 对一个题目,苦思冥想好几天;
  • 看到大佬的博客、代码,不仅思路清晰,功能实现出来了,代码还很简洁、高效,突然有点沮丧、失意;

这些问题,我们都会遇到,但我们也会一直学习,也许我们都不是很有毅力。

  • 一个题目一直想,吃饭想、走路想、有时做梦也会梦到,最后解决了您可以想一想那感觉多爽;

  • 其实您看懂了一篇博客或一段代码,不就向大佬迈进了一步么,有好的教程在这里,您应该特别兴奋才对呀。失意了就想一想自己成功时的体验,您能找到那种感觉的;

  • 如果下定决心想超越大佬,不完全是比大佬更努力,因为这只是低层面的竞争,而是首先在见识和格局上要比大佬高,气度要更大。学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,只是在机械地重复某件事,而不会有质的成长的。

我们再不断的演化,我相信人也是可以不断成长的,所以专注于不断训练和发展自己。

而编程是工科,在于实现的细节。真正的功夫都在自己的练习之中,信心和水平只能在每一次成功解题和程序成功运行中提高。

那这种训练模式,是快乐,还是痛苦呢?

真是先苦后甜,一场激情不断的游戏。

TA是一款解谜、策略类游戏,您需要先熟悉TA的各种设定、各种道具、各种技能,最后去解决一个问题。

  • 各种道具:所有结构的地基(数组、链表、柔性数组),一对一结构(栈、队列、哈希、串、广义表),一对多结构(树、堆)、多对多结构(图)、排序与查找

  • 各种设定:算法设计、算法分析、算法思想(递归、递推、暴力、二分、倍增、模拟、贪心、分治、回溯、剪枝、缓存、仿生、随机化、双指针、时空互换、动态规划、启发)

  • 各种技能:数论、图论、找规律、计算几何、搜索、概率分析、并查集、线性规划

这些工具一定要内化,因为光是知道是没用的,要感受到、触摸到。

每个工具都能带给您不一样的体验,如果您可以掌握,比较适合走算法路线,多参加算法竞赛,不过软件方面就会菜一些。

数组、链表、哈希表、二叉树、排序算法等一些基础知识,对大多数人来说是没什么问题的。但是一旦进入到路径规划、背包问题、字符串匹配、动态规划、递归遍历等一些比较复杂的问题上,就会让很多人跟不上了,不但跟不上,而且还会非常痛苦 — 那比较适合走软件方面,多参加软件竞赛,不过算法和数学方面会菜一些。


基础的设计能力:不知道如何下手怎么办?

我们实现程序里的算法时,其实就是写一个或者若干个函数。

有时候,我也不知道该如何下手。

没关系,我们可以先分析一下问题的参数:

  • 应该传什么参数给函数(作为输入参数)
  • 函数处理完后,应该把什么数据作为结果返回(作为输出参数)

函数参数搞定后,再推导返回类型、函数名,于是函数原型就出来了:

返回类型 函数名(函数参数)

对一道问题完全没想法时,多半是没有分析好,这时候不要急,一步步分析。

分析好函数原型以后,再确认条件:

  • 不变式
  • 终止条件
  • 边界条件:避免不合理的输入参数来攻击程序。

如果程序功能和某一数据结构的数据关系相同,就可以用数据结构来实现。


基础的建模能力:数组、链表,以及优化的柔性数组

所有数据结构在存储上,都只有俩种形式:

  • 数组:顺序存储
  • 链表:链式存储

所有的数据结构建模,基本都是建立在这俩种存储之上的,掌握好数组、链表,数据结构的建模基本没啥编程上的问题了。

大概,有一个性能上的问题:

  • 数组方便数据的查找、访问、存储,而增、删、移动方面麻烦
  • 链表方便数据的增加、删除、移动,而查找、访问、存储麻烦

所以,安利【柔性数组/可变长数组】优化。

柔性数组成员: 只能一个结构体有且只能放到结构体成员最后一个(占位)

struct Demo{
     int  a;              
     double  b;
     char p[0];   // 不占空间, 只能放在最后一个
};

完整版:

#include<stdio.h>

typedef struct _Demo{
     int  a;              
     double  b;
     char p[0];   // 不占空间, 只能放在最后一个
}Demo;

int main( )
{
	char str[] = "hello, C\n";
	// 柔性数组还可以巧妙的管理栈区的字符串,可这是为什么呢?
	
	Demo array;
	// 定义一个柔性数组
	
	printf("p[0] = %s\n", array.p);
	// 会输出:p[0] = hello, C
}

为什么会这样子呢,这就要画出栈空间的存储模型。

动态分配数组,长度可以扩展,既不浪费空间,又不会带来性能损失。

我看过最经典的例子,就是图的建模。

图建模:

  • 如果用邻接矩阵(数组存储),会浪费了巨大的存储空间。

  • 如果用邻接链表(链表存储),性能不好,还易产生空间碎片[^空间碎片,指的是某些容量很小(1KB 甚至更小)以致无法得到有效利用的物理空间。]。

  • 另外一种,用柔性数组存放邻接节点,性能、空间都没损耗。

注意,柔性数组长这样:

char p[0]

只能放在结构体的最后一位,而且不能嵌套。

但我们实现数据结构时,会分层级定义,所以会用多个结构体嵌套的。

这时候,可以这样:

// 有向图建模
struct graph {
    int n;                                             /* 顶点数 */
    int m;                                             /* 弧数 */
    struct successors {
        int d;                                         /* 记录每个节点的出度 */
        int len;                                       /* 听说len是数组长度 */
        int list[1];                                   /* list[0] 改成 list[1],就可以结构体嵌套了,动态申请空间就可以记录顶点之间的连接关系 */
    } *alist[1];                                       /* alist[1]是一个已经定义的结构体变量(顶点表存储的各个顶点),也可以动态开辟内存存放邻接节点 */
};


解题技巧:也说不清楚,就是对这道题有 feel 嘛!

认知心理学说,人类最有效地解决问题方式,是"目标-手段分析法"。

  • 先确认目标
  • 再一层一层地分解,大问题变一组小问题
  • 每一个小问题都有实现的手段,而后去做就完成啦

流程大致是:

  • 确认目标
  • 分析过程
  • 分而治之
  • 行行实现代码
  • 代码封装

最重要的是确认目标,最难的是分析过程,因为这是脑力活;后面的代码一行行实现在封装,只是体力活。

分析多了,就会有一些感觉、套路。

比如,一般是从暴力开始思考,而后再进一步思考怎么去优化复杂度:

  • 常见的枚举可以看一看枚举的范围是否有序,可以考虑用二分;

  • 双重循环看一看是否可以用双指针(快慢指针、对撞指针);

  • 一些要查找的O(n)复杂度的部分是否可以用map、set;

  • 括号、回文之类可以思考一下能否用栈;

  • 一些暴力搜索的部分看一看是否存在根本不可能到达的状态可以考虑剪枝;

  • 暴力搜索时看看是否有可重复利用的状态用map或数组把状态存起来(记忆化搜索),然后再看看是否可以用动态规划;

  • 一些枚举的范围很大一看就知道不可能ac,那思考一下是否可以直接推出结论或数学公式(贪心的思考方向);

  • 一些感觉是动态规划的题目,貌似每一个状态都是有规律的可以尝试用打表这种比较赖皮的方法;

  • 一些需要反复计算的部分如果是固定的,可以考虑先计算好然后把它存起来,下次直接拿来用(前缀和思想);

  • 一些题目的条件和经典题型很像的可以考虑直接套用经典题型(例如01背包模型,完全背包模型);

  • 一些常见的操作可以看看有没有现成的类或方法可以直接拿来用(例如java大数、排序、字符串反转、拼接等常见操作);

  • 一些数字的操作可以看看是否涉及到二进制,可以尝试下异或、&这些操作(位运算的骚操作);

  • 动态规划的题目看一看这一次的状态和上一步的状态是否离得很近,如果离得很近可以考虑状态压缩,降低空间复杂度(例如斐波那契,每一次的状态只和前面两步状态有关);

  • 如果题目给出了样例范围可以先通过样例范围反推出算法的时间复杂度,从而考虑题目大概可以用什么算法。

一般能有这种感觉,就是把知识【内化】为感觉了。

那具体怎么【内化】呢?

这个就得在《攻略》里说了。


攻略:新手、老手和大神之间的差异。

前置:数据结构是什么,以及作用?

https://blog.csdn.net/qq_41739364/article/details/102624503

既然数据结构这么重要,那该怎么训练呢?

先系统性学习所有数据结构(数据如何建模+实现增删改查),做相关的题,做满三道就学下一个。

做相关的题:按类别 -> 画图分析增删改查的动态过程 -> 手写代码 -> 手敲 -> 对比题解 -> 背着敲。

广泛涉猎,一本一本书地学,一个一个知识点的认真总结,从长远来看,才是真正“高效率”的学习方法。

如果想未来是一个深不可测的计算机专家,在21秒钟或24小时内改变自己的人生,或者提高自己实际的编程水平,这是不可能的。

您得试试连续 24 24个月 不间断的努力提高自己。

曾经有人拿奥数题问数学家 丘成桐,而丘成桐表示自己不会做,也不值得做。

因为奥数注重于巧妙的技巧,而数学家却不是这技巧的集合。

就像真实世界里,警察是最擅长破案的,警察不是靠像福尔摩斯式的超高水平的推理,而是挨家挨户的排查,靠平时联络的线人、以及平时对这片区域的情况,还有网络摄像头。

真实的环境中,“孙子兵法”、“博弈论” 都没啥大用,智慧主要体现于 明智的选择、开阔的眼界、春去秋来的勤奋。

对于一位数学家也是如此,相对于解题技巧,数学家更需要的其实是 勤奋、眼光和思想。


系统训练之后,要以实践为主(遇到不会的再学):

OJ训练:题目如何安排

学习的目的不能是为了“解除焦虑”,而是为了解决您真正遇到的问题。

很多人莫名其妙地焦虑,然后学了一些热门的新知,一瞬间获得那种 “哇,我懂了,我了解了新技术”的廉价快感,但是,这种快感来得快也去得快,焦虑并没有消除,甚至因为知道的东西多了更焦虑了。

学习的目的应该集中在解决问题,并且为了解决问题进行深度思考,直到问题解决,第一年能学会C、C++、数据结构就很不错了,加油~


尽管我们不需要学奥数,但奥数训练的思路,与算法训练的思路是有共同点的,也就是【内化】这个事。

那,具体怎么【内化】呢?

关键要练习更高层次的推理,不要停留在浅层。

这就意味着做题一定要慢慢加难度,不要搞低水平重复。

学了这一层,把这一层当做默认信息,上高一层。

在高一层运用熟练了,再把那一层当做默认信息,再高一层,水平得这么练。

大多数人初学数据结构的时候(新手),会特意只做相关的练习,首先是让自己知道这个东西。

类似于知道 “三角形内角之和等于180度” 这条知识,我们会去找这样一道题。

已知一个三角形,其中俩个角分别是 30度、60度,第三个角是多少度?

这种相关题,能迅速用上刚刚学的数据结构,但这是比较低的一层。

初学数据结构的人理解是,哪个结构对应哪种数据关系。

大多数人学过数据结构后(老手),会特意的问题尽量往数据结构偏移,主动制造一个局面 — 会通过一系列的布局引导,把局势引入自己擅长的局面。

类似于知道 “三角形内角之和等于180度” 这条知识,不过它不仅是一条知识,也是一个限制条件。

初学者知道的是:如果一个三角形的两个角知道了,那就等于三个角也知道了。

而老手的人根本不需要【有意识地】去调用这条知识,TA们会主动创造这么一个限制的环境,这个限制条件TA们会用,用的也特别好。

比如说,为了全面确定一个三角形,他会探寻其中两个角和一条边的情况。

他想的不是这个公式是什么 —— 那根本不用想 —— 他想的是我现在缺少什么关键条件,如何得到这个条件。

我和别人下军棋的时候,一开始根本不注意规则,俩个人玩起来也没什么规则…

后来,我发现利用好规则简直是利器,于是我说了一条规则:最小的棋子才能夺旗。

他对我定的规则没什么反应,我就怕他知道我心里的小九九,仔细观察后,发现他对自己的棋艺充满自信,对我的这条规则完全不在意(是一个会下棋的老头子)。

规则结合我的战术,就是把所有小棋(团长以下的)全部摆最前,主要是送死,全部给他。

因为我们只有俩个人下,没有中间的裁判,所以我也知道他那些吃了我小兵的棋子是什么。

我获取了大量的信息,消除了大量的不确定性,他的棋子在我眼里我差不多都是明棋;而我的棋子他一点都看不明白,中场的时候我把炸弹放到他那边,他应该以为是一个小兵吧…不过保险起见,还是用司令来吃我的“小兵”(炸弹),不得不说他很谨慎,难怪对我的这条规则完全不在意。

最后在双方都知道对方的军旗时,他的棋子愣是不敢过来 — 我最小的刚好和他最大的一样大,不过我只有几个棋子,而他的有十几个。

就因为多了一个限制条件,解决问题的视角就多了一种。

  • 新手阶段,主要是在刻意的局面下,刻意用那些知识;
  • 老手阶段,因为那些只是已经融入到了潜意识(变成了默认信息),主要是在刻意的制造一个有限制的局面;

学了这一层,把这一层当做默认信息,上高一层。

在高一层运用熟练了,再把那一层当做默认信息,再高一层,功夫得这么练。

无论是武术,还是编程,功夫越高,要求越严!

而顶级的ACMer,对信息的掌握还要高一级。

题目在他们眼里,都是信息、信息的填充。

问题就是这么一个问题:

  • 我已经知道什么信息
  • 我能填充题目上的什么信息
  • 哪里是确定的哪里是可变的,一目了然。

TA们根本都不用有意识地去想什么“因为……所以……”这种推理步骤,TA们眼中只有信息。

TA们都知道哪一步是必走的,哪一步是可选的,自己面临哪些选择,其中每一个选择会导致什么样的局面,每一个局面对自己是好是坏。

棋盘上最终出现的局面,只不过是他脑子里对这盘棋假想过的无数个局面中的一个而已 —— 那仅仅是信息。

TA们为什么可以想到那么多,那么远?

就是这么一级一级训练出来的,学了这一层,把这一层当做默认信息,上高一层。

在高一层运用熟练了,再把那一层当做默认信息,再高一层;功夫就得这么练,而且功夫越高,要求越严。

  • 新手阶段,主要是在刻意的局面下,刻意用那些知识;
  • 老手阶段,因为那些只是已经融入到了潜意识(变成了默认信息),主要是在刻意的制造一个有限制的局面;
  • 大神阶段,都是信息(不仅看见能看见的,还能看见看不见的),各种信息之间尝试排列组合,就会形成很多方案。

那怎么才能突破瓶颈,达到【大神】阶段呢?

这个就得在《模型》里说了。

攻略,最后倒是变成了一个能力管理问题了,所以您需要一个好的教练,不仅能规划训练的层级。

每天按比例的训练队员,甜蜜点是 85:15,每一个新知识都是建立在旧知识的基础之上。最好这一讲中 85% 的操作是你本来就会的(有亲切感),15% 是新技巧。

当然,这是最理想的情况。

有时候我们接受的会是 80%新信息,这时候怎么办呢?

通用的方法是死磕,一开始会感到很艰难,但坚持下来就好像吃了糖一样。

比如,刚刚开始阅读时:

  • 你带着一个话题/问题,去看有解答这个的书籍(看的越多,就越熟悉这个话题/问题);

  • 看同一个作者,不同的书(反正风格是一样的)

15.87% ,是一个甜蜜点,也是训练机器学习的上限。

如果您想参加竞赛甚至一年内拿到亚洲赛区的冠军,那每天学习四小时,我想你的安排最好是这个配比,每天学习效率的上限也就是 15.87%。

训练,贵精不贵多。事实上,这种刻意练习,很难保持在 2 小时以上。

每天精力最充沛的时段拿出来训练自己,这段时间是您每天最重要的总结,是最值得分析的。

精力不那么集中的时候,去看比较轻松的知识,比如:

  • 读理财、文化、历史、英语、文科方面;
  • 运动,洗澡,社交,处理日常事务;

除此之外,也能在竞赛前夕把选手的身体、心理调整到最佳状态。

扩展资料:《系统性学习》。


模型:一题多解怎么来?

在OJ平台上,我们貌似比较追求一题多解。

其实新手、老手做题最好是多题一解,不要学大神的一题多解。

虽然一题多解是很厉害,但多题一解、多解归一对我们来说会更现实。

找到最优的算法太考智商了,我应该是不够的,如果能把完全不同类型的题目,看作一种题目去解,对我已然帮助很大;如若能把不同问题的解法,变成一种解法,那应该是抽象到最底层的方法论了。

建立自己的工具树,不断的挂果子,收获的也是知识。

相比之下,做那些只涉及到具体的问题,就算做很多,遇到新问题还是没法解决。

如果学会把具体问题抽象成模型,就能解决更多更难的新问题。

无论是【数据结构】,还是【算法思想】、【设计模式】,这些通用的方法,是人们在设计程序时,都总结出的经验。

这些经验是具体的慢慢演变为抽象的,从具象到抽象化并传承这些抽象的知识、经验,是人与其他动物最大的区别。

大神不也都是在抽象这方面掌握的特别的好嘛?

这种抽象的模型多了,自然能做到一题多解。

我们已经知道了大神为什么这么牛,但从老手到大神之间还有很多坎的。


应用:如何把问题与某个抽象的模型相连?

比如,如何把问题与某个抽象的模型相连?

也就是,抽象还原为具象。

具体怎么做呢,我们来看一个历史性的问题,这是一个让医生们束手无策的问题。

以前有一种射线,只要以一定的强度照射在肿瘤上,就能把肿瘤给杀死,等于是可以用来治疗癌症。

现在问题在于,射线到达肿瘤之前肯定会先接触到患者身体的其他组织,那就会把好的组织也给杀死。

可是如果把射线强度调低一点,好的组织能不被伤害,可是对肿瘤就也没用了。

那有没有一个什么办法,不用做手术开刀,既能让射线杀死肿瘤,又不会伤害其他组织呢?

尽管他们已经有了这么好的工具,但却不知道该怎么用~

就设计而言,这个答案本身并不重要,我们关心的是寻找答案过程中使用的思维方式。

有抽象才有 “类比”,用类比还原抽象问题,是把一个领域的思想,运用到另一个领域中去,不过您得先发现俩个领域的共同点。

从前有一个将军,要攻打一座城。攻城需要很多士兵同时发动进攻才好。可是这座城周围的道路都很窄小,并不适合大军通过。

这怎么办呢?

将军知道通往这座城的道路有很多条,于是他把士兵分散开,以小队的形式从不同的道路出发,按照约定时间一起到达 — 结果就把城给攻下来了。

类比解决问题,是把一个领域的思想,运用到另一个领域中去。

医生们的问题,也可以用若干束低强度的射线从不同的方向照射肿瘤。

因为射线强度不高,所以不会杀死途中路过的身体组织;而因为在肿瘤上汇聚的多个射线加起来的强度够高,所以能杀死肿瘤。

其实这就是现在有不少医院使用的“伽马刀”。

一般人看东西是关注不同点,而高手、抽象思维则善于发现两个很不一样的事物之间的相同点。

比如,下面这六件事情,您能不能把它们给分个类 ——

  • 经济泡沫
  • 北极冰川融化
  • 美联储调节利率
  • 人的身体出汗
  • 不同的商品相继涨价
  • 大脑指挥身体做动作

对美国西北大学的学生测试表明,如果是按照学科分,所有学生都能分的很好。

1、3、5 是经济学问题,4、6 是生理问题,2 是自然环境问题。

但要是按照这些事情的内部机制分类,就只有少数有跨界学习经历的学生能分好。

  • 事实上 1 和 2 都是增强回路(因增强果,果增强因)

买东西的人越多经济越好,经济越好买东西的人越多;冰川越融化吸收阳光越多,吸收阳光越多冰川越融化。

  • 3 和 4 都是平衡回路(因增强果,果减弱因)

美联储加息防止经济过热;皮肤出汗防止身体过热。

  • 5 和 6 都是连锁信号传递(因果链)

石油涨价导致日用品涨价;大脑神经信号传递到四肢

能看出这种深层思维结构,才谈得上举一反三。

如果没看出来,其实也没关系,因为增强回路、平衡回路、因果链是【系统动力学】里面的模块,其地位等同数据结构的线性表、树、图。

数据结构是对数据关系的抽象,和系统动力学一样,都适用于解决有一定规律的重复性问题。

不过数据结构解决的是,数据储存和数据调用方面的问题,属于单纯的问题(有明确的方向、有标准的答案),大部分技术问题都是单纯问题,您掌握的工具、模型、视角,以及您是否聪明决定了您解决问题的上限。

而【系统动力学】虽然也是解决问题的,但这种问题不是单纯的问题(有明确的方向、有标准的答案),而是俩难问题(不好取舍)、棘手问题(对于无解的问题,也有应对的方法),比如 商业难题、看透和管理人心、预测未来等等。

系统动力学】和【数据结构】也是有交集的,图论是数据结构的精神,也是系统动力学的灵魂。

但是一般大学生并没有这种深层的思维结构,他们只知道自己亲身经历的事情一样,只理解自己专业的一点知识。

有研究说,一般科研工作者的业余爱好水平跟普通老百姓没啥区别。

但是学术水平越高的科学家,就越有可能在学术工作之外发展个什么业余爱好 —— 而诺贝尔奖得主有诸如演员、舞蹈家或者魔术师之类业余爱好的可能性,比一般科研工作者要高……22 倍。

类比可以让我们举一反三,类比可以启发我们创造新事物,类比可以让我们审视自己和别人的原则,类比可以帮助我们发现各方的分歧所在,类比可以帮助交流思想……

从具象到抽象,需要抽象思维;从抽象到具象,需要类比与联想。

抽象思维能让您认识到事物的本质,发现各种看似不一样的事物背后的共同点;类比的背后,是高级的抽象思维。


总结

我说起来容易,但编程是一门硬技能,需要系统性的勤学苦练才能学会。

所以,推荐您联机学习,不要单机打怪。

虽然伙伴也只是在“在黑暗中并肩行走”,所能做到的仅是各自努力追求心中的光明,并相互感受到这种努力,相互鼓励。

但这种相互鼓励的圈子里,让我知道你一直与我同在,你让我平静,让我对自己感觉更好。


第一级【编好程序】

这是计算机从业者所必须掌握的,属于“雕虫小技”。

(P.S. 这是清华全球创新学院的创院院长史元春教授说的,这话要我说出来,估计会被各位大佬吊打)

【过关条件】:学完编程语言,每学一章都有做三道编程方面的练习。


第二级【储备模型】

在《数据结构》、《算法思想》、《设计模式》里有大量的模型。

数据结构的出现和计算机本身工作的方式有关。

今天演化出来的很多数据结构,甚至和图灵机的原理,以及计算机底层的冯·诺依曼结构也有关。如链表这种数据结构,就和图灵机的设计直接相关。

世界上很多抽象化的结果,都和我们人容易掌握的工具有关。

如我们将大部分零件做成圆形的,或者有圆形的切割和开口,主要是因为圆形好加工。我过去做过金属工艺的加工,非常能体会使用机械(比如车床)切出一个圆的东西是很容易的事情,但是要切出一个方的是极为费劲的。

因此,谁要是在机械设计时搞了一堆方的设计,会被认为缺乏基本的机械设计素养。如果您到制造业的工厂去看看,基本上就只有两种运动,直线运动和圆周运动,其它所有的运动都是它们的组合(而且用得并不多)。

这并不是说世界上只有这两种运动,但是将运动抽象成这两种,就容易在机械中实现了。

顺序存储的数组、链式存储的链表也是如此。

扩展:《数据结构从哪开始


【过关条件】:

所以要对常见的算法有一定的基础:

  • 常见排序(冒泡、快排、插入、堆排、归并…)

  • 双指针(快慢指针、左右指针)

  • 贪心、二分(二分查找)

  • 搜索(dfs、bfs、各种剪枝、回溯思想)

  • 动态规划(各种子序列、各种子串、常见的那几个背包问题)

  • 前缀和

  • 树的常见操作(各种遍历、各种树的性质、最小生成树)

  • 图(最短路、常见性质)

常见的模型较为了解之后再去【第三级】:

  • 常见数据结构和集合类(链表、队列、栈、map、list、set、并查集都得会用)

这些基础知识不求精通,不会写代码都行,但总得知道这些知识咋回事。


第三级【解决问题】

OJ训练:题目如何安排》,如果想在这个阶段比较舒服、高效,就得找甜蜜点安排每天的题目,因材施教。

做相关的题:按类别 -> 画图分析增删改查的动态过程 -> 手写代码 -> 手敲 -> 对比题解 -> 背着敲。

广泛涉猎,一本一本书地学,一个一个知识点的认真总结,从长远来看,才是真正“高效率”的学习方法。

如果想未来是一个深不可测的计算机专家,在21秒钟或24小时内改变自己的人生,或者提高自己实际的编程水平,这是不可能的。

您得试试连续24个月不间断的努力提高自己,这离不开春去秋来的勤奋。

【过关条件】:

  • 一年里,每天做题刻意练习 2h

  • 饮食作息规律,要早睡才能早起,而早睡的条件是比较累,所以您可以每天负重深蹲 100 个,而要想运动表现处于好状态,您得多喝温水…

  • 积极,推荐阅读《积极达成:处理好情绪再处理问题》,智商特别高的人,情绪不能影响TA

一个人要跨,首先精神先跨,只要精神不垮,就没有任何力量能摧毁我的意志和身体。

                                                                    --- 某位大佬说的

第四级【建模能力】

抽象还原为具象的能力,打比方其实就是知识迁移的能力,一个人理解俩件事情的本质(还找了共同点),才能比方得让人拍案叫绝。

从具象到抽象:抽象思维

从抽象到具象:类比联想

抽象思维、类比联想相辅相成。

【过关条件】:

阅读,读完后认真做笔记。

  • 增强阅读量,文科书籍日阅读量 143 页,理科书籍日阅读量 30 页,工科书籍日阅读量 60页;

  • 抽象思维:波利亚三卷《怎样解题》、《数学的发现》、《数学的猜想》

  • 培养类比能力的书籍:《The Art of Logic in an Illogical World》、《创新的本能:类比思维的力量》


第五级【优化模型】

如果有一天,自己可以优化模型,甚至挑战这些模型,您的编程水平就很高了,也就是培养建模能力,首推《系统动力学》。

  • 培养洞察力能力的书籍:《Thinking in Systems: A Primer》、《如何系统思考》、《系统思考》、《第五项修炼》

系统动力学主要解决问题的,但这种问题不是单纯的问题(有明确的方向、有标准的答案),而是俩难问题(不好取舍)、棘手问题(对于无解的问题,也有应对的方法),比如 商业难题、看透和管理人心、预测未来等等。


如果我们抛弃次要因素,专注主要的趋势,那工程师可以分为五级,第五级最多,第一级最少(中国还没有一级工程师)。

工程师列传:

  • 一级工程师:高德纳Google云计算发明人 (爱迪生、贝尔、福特)

  • 二级工程师:杰夫·迪恩发明Google大脑、邓峰打造出了真正意义上的网络防火墙

  • 三级工程师:自己的产品做到世界第一,如人脸识别第一、语音识别第一等等

  • 四级工程师:有头脑的工程师,能写出大型的软件项目的软件工程大师

  • 五级工程师:比工科大学毕业的大学生强一些,更有经验

【编好程序】、【储备模型】、【解决问题】、【建模能力】,是图中第五级工程师的能力,而【优化模型】是图中第二、三级的工程师的能力。

第一级工程师,在玄幻小说里,也是传奇人物了。

比如《斗罗大陆2绝世唐门》的主角[霍雨浩],创造了人类与魂兽新的连接方式并成立了组织传灵塔,消除了俩大种族日益加强的争端…

正是开创了一个产业,这个人的影响力也会波及到后世,不仅可以影响身边的人,还有影响到未来的人们…

祝进步!


发布了124 篇原创文章 · 获赞 365 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_41739364/article/details/105314902