只要一个人明确地,诚挚地针对任何一个主题反思,那么这个人就必然可以和他周围的浮泛思想区隔开来。任何知性上的努力,都可以带我们脱离庸俗,它将引领我们穿越艰辛且隐蔽的道路,到达与世隔绝的境地。在那里,我们将发现自己浸淫在无数非凡的想法之中。这就是反思能够带给我们的结果。

这些年,越来越觉得独立思考之可贵。开这个博客也是为了记录自己的思考和想法。这个博客是建在Github Page上的,我会在这里记录计算机方面的学习思考。但这个博客不会是一个纯粹的技术博客,它也会记录我在社会,艺术,科技,生活等方面的想法。

正如苏格拉底所说:未经审视的生活不值得过。面对生活,希望我可以顽抗到底。

学习方法论

  1. 重视问题
  • 一个领域最重要,最活跃的东西是问题
  1. 独立思考
  • 独立思考是解决问题的关键
  1. 主动检索
  • 互联网是宝藏,Internet是最好的老师
  1. 重视媒介
  • 书籍文字是最好的学习方式,缺点是慢,好书好文字需要筛选
  • 文档是一种重要的媒介
  • 图片是一种重要的描述关键内容的媒介
  • 对于学习来说,视频是一种次等的媒介
  1. 知识的组织结构和知识内容本身同等重要
  • 良好的知识组织,可以帮助人迅速的掌握知识内容,更可以加深对知识内容的理解
  1. 及时记录,对学习过程做充分的思考和记录
  • 好记性不如烂笔头
  • 笔记不一定要完美,但是要记录思考和想法
  1. 电子产品中的代码,文档,笔记要及时备份
  2. 不断学习
  • 活到老,学到老
  1. 敢于折腾
  • 生命在于折腾
  1. 学习不能一步到位,要逐环旋进

数学方法论

  1. 消元
  2. 变形
  3. 数形结合
  4. 普遍的代价是抽象

编程方法论

  1. 状态机
  • 计算机本质上是一个状态机,内存存储的数据构成了当前的状态,CPU只能利用当前的状态计算出下一个状态。
  • 使用计算机解决问题,就是在思考如何将这个问题表达成状态(用哪些变量存储哪些数据)以及如何在状态中转移(怎样根据一些变量计算出另一些变量)。
  • 空间复杂度就是为了支持你的计算所必需存储的状态最多有多少,时间复杂度就是从初始状态到达最终状态中间需要多少步!
  1. 数据结构组织决定算法设计
  • 数组,链表是一切数据结构的最底层实现
  • 数组,链表都是线性结构,可以看作是一维结构。
  • 栈,队列,优先队列本质上是以不同顺序处理线性结构的一种抽象。
  • 树和图本质上是一种二维的结构,处理二维数据结构,就像数学上的消元一样,核心方法是降维。从二维结构中抽象出一维结构,通过解决一维结构的问题,解决二维结构问题。
  1. 关心输入
  • 输入提供了问题的规模和原始数据,也就是问题的状态表达,很多时候,要对输入做必要的限制和约束,处理极端情况。
  1. 编程是人利用计算机解决问题,不是计算机解决问题
  2. 计算机解决问题的办法就是暴力遍历解空间
  3. 优化解决办法的一个途径是对解空间进行分类,对不同的状态做不同的操作和处理
  • 从集合的角度考虑问题
  1. 递归
  • 递归本质上就像抛出悠悠球并回收,是一个双程。
  • 递归代码最重要的两个特征:结束条件和自我调用。
  • 递归函数要对不同的状态做不同的处理
  1. 缩小问题规模
  2. 信息应该充分利用
  • 在解决问题的过程中,会有很多信息产生,要充分利用已经产生的信息来减少对未产生信息的计算。
  • 典型的算法思想:回溯法&&分支限界法。二者本质上都是一致的,都是充分利用已经计算过的信息,来实现对树的剪枝。
  • 回溯法利用回溯过的线路中的最优值对树的其他线路进行剪枝;分支限界法则是充分利用遍历过的树的上层信息来实现对树的下层信息的剪枝。