1本质
1)算法和人做事最核心的差异是对明确性的要求不同,算法对明确性有着极其严苛的要求。
2)算法的优势在于模型化,模型化让算法能在不同领域之间快速迁移。
3)算法本身没有好坏,背后体现的都是人的思想。
2复杂度
1)时间复杂度是工具,可以衡量、比较不同算法的效率。
2)时间复杂度也是一种指标,能够督促算法工程师不断改进算法,降低复杂度,提高效率。
3)想要降低时间复杂度,我们可以用“空间换时间”和“分治”的办法。
3启发
1)成功地建立贴近现实的模型,同时保持问题的可解性,是评价数学模型巧妙的一个重要角度。
2)很多问题输入规模大到计算机也没法处理。这时我们需要谨慎地取舍,把问题规模降低到算法可以处理的范围。
3)算法经常采用迭代的方法逐步逼近问题答案。如何保证收敛和收敛效率体现了算法设计时的巧妙。
4反思
1)算法不能对问题负责。算法是工具,就像手里的锤子,锤子能钉钉子,但锤子不知道钉钉子要解决什么问题。
2)算法不能对数据负责。如果数据就是垃圾,算法再好用也白搭。
3)算法不能对解释负责。算法科学家有事宁可放弃一定的准确性,也会去选择那些更容易被解释和接受的算法。
5算法蓝图
算法解决问题的基本蓝图:
1)明确问题,不明确问题会导致在算法设计中走很多不必要的弯路。
2)建立模型,数学模型是对现实问题的近似和抽象,能够建立起计算机算法和问题之间的桥梁,为算法的效果进行预先估计。
3)选择算法,达成目标的好坏和时间复杂度决定了算法的选择。
6建立模型
1)建模就是把复杂的现实问题,转化成数学语言的过程。
2)算法工程师会遵循三个步骤,不断迭代找出最合适的模型:
第一,确定假设,找到核心变量和关系,舍弃不重要的细节,把模糊的问题,明确化、定量化。
第二,验证模型,不断和现实问题做比较,验证模型是否足够贴合现实问题。
第三,权衡可行性,找到一个又能准确描述现实,又能有效求解的模型。
7算法选择
1)我们强调了算法和模型不是一一对应的关系,建模不等于就可以完成算法选择。
2)在选择算法的时候,最重要的就是对质量和效率两个关键指标的权衡。
3)更进一步,优秀的算法工程师还会考虑数据对算法的影响,更加偏好那些数据敏感度低,限制条件少,对数据依赖小的算法。
8迭代
1)迭代,是一步一步重复某个固定操作,逐步接近答案的策略。
2)迭代算法能有效运行,有两个条件必须满足:一个是算法必须收敛,一个是不动点必须唯一。
3)迭代算法的运算速度快,是因为它放弃了一点点解决问题的质量,换来了大幅的速度提升。
9分治
1)分治算法是通过回溯,不断分解同样的问题,直到问题小得可以直接解决,再把小问题的解合并成原来问题解的算法策略。
2)确保要解决的问题能分解成与原问题类似的子问题,并且这些子问题之间相互独立,这时分治策略才能奏效。
3)如果分解问题和合并结果计算不复杂,分治策略能减小算法的复杂度。
4)分治策略开启了并行计算的大门,利用多CPU硬件上的优势,可以减少算法的运行时间。
10动态规划
1)动态规划指的既是多步骤的决策优化问题,也是解决这类问题的算法方法。
2)动态规划算法是在多步骤的决策优化问题满足最优子结构的时候,用以终为始、以小建大的方向解决问题的算法策略。
3)动态规划的效率会受“维度爆炸”的影响。
11分支界定
1)组合优化是一类特别难解决的问题,它的搜索空间大,我们很难确定谁是最优解。
2)分支定界法是把分支、定界、剪枝三个过程结合在一起,减小搜索空间,保证找到组合优化问题最优解的算法策略。
3)要让分支定界法高效,从根本上是要进行有效的剪枝。为了进一步提升分支定界法的效率,我们可以使用提前停止的策略。
12启发式
1)遇到特别复杂的组合优化问题时,如果找不到最优解,我们可以转而使用启发式算法,找到不错的可行解。
2)启发式算法是人们通过对问题的理解,以某一套规则制定出来的一类算法。
3)元启发式算法是通过人们对自然或者人类解决问题时通用逻辑的观察和模拟,总结出来的一系列通用启发式算法。
13蒙特卡罗
1)对问题中的随机事件进行取样,为有限个样本进行独立计算,最后把每个样本结果进行统计的策略叫蒙特卡罗方法。
2)蒙特卡罗方法最适用于随机变量多,计算逻辑复杂的问题。
3)随机模拟不是万能的。它会占用大量计算资源,依赖于参数的正确性,并且对揭示问题本质没有太大帮助。
14机器学习
1)机器学习算法是一系列让计算机自主学习的算法。它们最适合用在人类没法用明确规则进行解决的问题上。
2)机器学习学到了很多人类没教过、自己也不懂的事物细节。
3)机器学习学到的是事物之间的复杂关系。
15学习策略
1)机器学习模拟了不同的学习模式,学习模式不同,学到的知识也不一样,但也许能解决的问题是一致的。
2)机器学习得到的知识传回给人类并不容易,但又很必要,我们还在探索更好的传回的方法。
16算法思维
1)很多人关注的是眼下问题的特定结果,而算法工程师更在意通用方案,解决更多更广泛的问题。
2)学会拿数据和算法工程师沟通。数据越多,质量越高,算法工程师对你要解决问题的兴趣也越高。
3)和算法工程师最好的互动方式,就是一起在抽象模型和现实场景当中来回转换。