学习笔记设计算法(Design Algorithm)

Posted SAP剑客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记设计算法(Design Algorithm)相关的知识,希望对你有一定的参考价值。

设计算法(Design Algorithm

—— 主要内容来自吴晶辰老师《算法通识课》学习笔记

一、算法蓝图

算法是解决问题的工具,我们学习算法的目标是解决问题,让计算机更好地工作,这光靠算法懂得多是远远做不到的。

算法工程师有一套用算法解决问题的标准流程,我们称之为“算法蓝图”。

把复杂的问题简化成三个步骤:

1、明确问题

我们经常会听到这样一个段子:

◤产品经理最主要的工作就是和开发“战斗”,产品经理认为某个需求很重要,但是开发人员认为没办法实现。产品经理就指责程序员不懂业务,而程序员则指责产品经理不懂技术,总是鸡同鸭讲◢。

其实,他们两个可能都没有错,只是需要要在设计算法之前,就先明确问题,对问题的“方向”和“边界”先达成共识,再开始谈算法的实现。

那么,怎么明确问题呢?

我们可以从三个要素入手:

明确目的:究竟要选哪种目的要在一开始就确立下来;

明确限制条件:要把量化的指标确立下来;

明确评价标准:问题得以解决的表示要确立下来(比如时间、成本、收益等);

2、建立模型

现实问题是没有办法直接交给计算机的,我们需要一个数学模型来与计算机建立桥梁,建立模型的过程,也是把现实问题转化成算法问题的过程,用另一套语言来重新描述问题。

提出一个问题,直接设计算法、编写程序需要大量的成本,如果没有模型也就对结果没有办法进行预估,有了数学模型,才能实现推理、预估或者预测。

所以,在设计算法之前,一定要建立数学模型。

但是需要注意的是,数学模型并不是对现实问题的完美描述,建模的过程,也是大量细节被抽象掉的过程,在算法迭代中,模型迭代是非常重要的一环。

3、算法选择

算法各有优劣,算法工程师在选择的时候会考虑时间复杂度,也要考虑达成目标水平的高低等。

如何选择出最适合的算法,是算法工程师面对的又一个重要挑战。

二、建立模型

建模就是把复杂的现实问题,转化成数学语言的过程。

算法工程师通常会遵循如下三个步骤:

1、确定假设

我们先要搞清楚,需要得到一个精度的预测结果。如果我们想要的精度很低,那只需要一个简单、容易计算的模型,需要对问题进行最大程度的简化。如果对精度要求非常高,就需要把各种复杂的因素都考虑进来。

确定假设,其实是一步步确立重要变量、核心关系的过程。舍弃不重要的细节,把模糊的问题,明确化、量化,这样就把一个复杂的现实问题,转化成了计算机可以理解,算法可以处理的数学问题。

2、验证模型

模型验证就是不断和现实问题作比较,验证模型是否足够贴合现实问题

模型的验证是不是总有固定的方法呢?

不一定。

模型的验证不是一成不变的,我们得从多角度来论证,有时候还需要一点奇思妙想。

3、权衡可行性

一个模型是不是最优选择,不仅要看模型是不是靠谱,还要看是否能实现。

一个复杂得模型对算法也提出了更高得要求,要么是成本上的,要么是复杂度上的。复杂的模型或多或少都带来了更复杂的解法。

模型的选择过程存在主观性,没有统一的标准说怎么样的才是最好的,但它有一个底线,那就是模型必须能求得有效解

三、算法选择

那么,建模之后,我们该如何选择算法呢?

1、关系:模型与算法并非一一对应

同样的一个模型,可以对应的算法有很多。

比如“背包问题”,我们可以采用“暴力算法”、“分支定界法”、“基因算法”等。

所以,在开始选择算法之前,我们先要认识到,模型和算法的关系,并不是一一对应的。一个数学模型仍然可以被多个算法求解,同样的,一个算法也可以用来求解多个数学模型。

所以,建模不等于就完成了算法选择,最终能不能把问题有效解决,找到合适的算法是至关重要的。

2、选择:质量与效率的权衡

算法工程师很在意算法解决问题的质量,而在时间复杂度和解决问题的质量水平之中的权衡,就成了算法选择的重中之重了。

只是绝大多数问题都不存在唯一解或者绝对正确的解,需要算法工程师不断根据场景、根据目标,在质量和效率之间做出合理的权衡,选出最合适的算法。

3、进阶:算法工程师的考量

除了上面的质量和效率,其实还会有更进一步的考量,就是数据。

实际应用的时候,算法工程师通常更加青睐那些对数据错漏有容忍度的算法,就算个别数据存在问题,也不会对算法结果造成太大的影响。

再有,算法成立也存在限制条件,它们只有在某些条件下才能够发挥作用。那么算法工程师在选择算法的时候,也会考虑到限制条件,如果限制条件太严格,数据又不满足,就要考虑那些对限制条件要求比较低的算法了。

还有数据不够怎么办?像深层卷积神经网络对数据量有非常大的要求,如果数据不够,也就没有办法用这样的算法。可能就要选择一些逻辑简单、对数据量要求更低的算法

以上是关于学习笔记设计算法(Design Algorithm)的主要内容,如果未能解决你的问题,请参考以下文章

高级算法设计讲义 Lecture Notes for Advanced Algorithm Design

System Design 学习笔记2

Java学习笔记——设计模式之七.模板方法模式

学习数据结构笔记(21) --- [克鲁斯卡尔算法(Kruskal Algorithm) 由公交车站连接问题引入]

System Design 学习笔记1

Android学习笔记---Material Design设计理念