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


    设计算法(Design Algorithm

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

    一、算法蓝图

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

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

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

    1、明确问题

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

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

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

    那么,怎么明确问题呢?

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

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

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

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

    2、建立模型

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

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

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

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

    3、算法选择

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

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

    二、建立模型

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

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

    1、确定假设

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

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

    2、验证模型

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

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

    不一定。

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

    3、权衡可行性

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

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

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

    三、算法选择

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    NeurlPS‘22 推荐系统论文梳理
    Vue复习7:组件化编程,关于VueComponent,非单文件组件,单文件组件
    flink1.17安装
    SpringCloud Sleuth 分布式请求链路追踪
    MySQL+Redis+nodejs服务器搭建及工具安装笔记(Windows)
    第P7周—咖啡豆识别(1)
    如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题
    ModuleNotFoundError: No module named ‘models‘ 的解决方法
    数据库优化 | 干货
    Qt学习--QT Creator使用基本介绍
  • 原文地址:https://blog.csdn.net/zhongguomao/article/details/127585287