专栏首页讲编程的高老师了解一下“算法”,每个人都要掌握的编程知识

了解一下“算法”,每个人都要掌握的编程知识

假设我们有一个难题需要解决,那怎么解决呢?解决的步骤怎样呢?如果有一样东西能把这个解决这个难题的步骤描述出来,那就叫做这个问题的算法。

你看,如果我们学习算法的话其实学习的是解决问题的步骤,无论我们从事哪个行业学一下算法都是很有帮助的。

01

算法概念的理解

算法可以很复杂也可以很简单

百度百科上对算法的定义:

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

为什么算法是解题方案的准确、完整的描述,而且还要清晰的指令呢?因为绝大多数算法最终需要转换成计算机程序给计算机执行的,而计算机是比较死板的。更直白地讲,算法呢大多数时候是充当了人和计算机之间的一种“翻译”的角色。

那么我们用什么方法或者是工具来准确、完整、清晰的描述解题方案呢?也就是说,我们用什么方法来描述算法呢?

给人看的算法呢,经常采用三种方式来描述它:

  1. 自然语言。所谓自然语言就是人类的语言,我们人类语言最大的特点就是不严谨,同样一句话不同的语境、不同的人可能会有不同的理解,这和算法的定义是背道而驰的。所以又有了下面两种算法描述方法。
  2. 流程图,N-S图。又称程序框图,用一组统一规定的标准符号描述程序运行具体步骤的图形表示。这是一种非常好的算法描述方法,一图胜千言。我们做02典型算法的例子里会介绍。
  3. 伪代码。一种非正式的,类似于英语结构的,用于描述模块结构图的语言

流程图的基本符号

求三个数中最大值的伪代码

02

一个典型算法的例子

其实我们碰到的很多问题,在不同的时间、不同的地点可能已经有另外的一些人碰到过很多很多次了。所以呢,就有很多很经典的算法,我们如果认真的研究一下这些算法,你会觉得比打游戏打怪升级还更有意思。比如下面这张图里几种常见的排序算法,所谓排序算法就是给计算机一组杂乱无章的数,让它帮我们从小到大或者从大到小排列起来。

排序算法最常见的应用就是,期末考试的时候我们老师把每个同学的成绩都输入给计算机,计算机能帮我们把这些成绩排个序。想象一下,如果是全国统考的高考,全国那么多考生的成绩排序,如果是人工排的话那得多大的工作量?光中午管盒饭也不老少啊!

常见的几种经典排序算法

我们以上图中的第一种冒泡排序为例来说明一下算法,及其描述。

如果我们用自然语言来描述冒泡排序是这样的:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这之后,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

你如果看上面这段名字可能有点懵逼,如果带入一个问题场景来理解冒泡排序可能会容易的多。

比如说,我们有一组10个同学到操场集合站成一列,这个时候体育老师来了说:“大家按照身高从低到高排好!” 那怎么排列呢?那这个时候呢就可以这样来看:

  1. 从第一个开始比较相邻的两个同学,如果第一个同学比第二个同学高,那么他们换一下位置。
  2. 第一个和第二个比完(可能要交换位置)之后呢,那么第二个就肯定比第一个高了;这个时候再把第二个和第三个比较,如果还比第三个高,那么再和第三个也交换一下位置。这样一直比到第10个,那么经过这么一轮的比较之后,站在第10个的同学肯定就是所有同学里面最高的了。
  3. 然后再用步骤1、2同样的方法来对前面的9个同学操作,那第9个同学又变成剩下的9个里面最高的了。
  4. 然后再对剩下的8个同学进行类似操作,然后是剩下的7个。。。一直到最后一个,这样一轮又一轮地操作之后就把这10个同学从矮到高拍好了。

如果这样的冒泡算法用流程图来表示,是怎样的呢?

一个100个数的数组的冒泡排序

流程图呢,其实是计算机专业的或者相近专业的人才看的东东。普通人要想看明白它呢,也很简单。首先,找到“开始”,然后顺着箭头一路向下,如果碰到一个菱形就是一个分支,这个棱形里面呢是一个条件,所谓条件就是满足条件结果为真、不满足为假,然后从棱形出来就要根据这个条件的取值选择走哪条,如果是走回头路的话就变成了一个循环,所以那你就带着一个值慢慢跟着箭头走,很容易搞明白。

03

怎样评价算法的好坏?

俗话说“条条大路通罗马”,但是呢并不是每条路都那么好走的。有些路比较好找,但是需要走的时间长;有些路可以很快到达,但是很难走;有些路理论上能到达目的地,但是实际上几乎相当于死路走不通。这样的话呢,不同的衡量标准下呢这不同的路就有了好坏之分。

那么解题的算法也是一样,同一个问题可能有很多个算法,就像我们在02里看到的排序算法。那么,这么多算法,我们有没有什么标准可以评价他们的好坏呢?答案是肯定的。

主要从几个方面来衡量一个算法的优劣:

  1. 时间复杂度,可以粗暴地理解为运行这个算法所需要的时间;
  2. 空间复杂度,可以粗暴地理解为运行这个算法占用的计算机(或手机之类的)内存大小,就是手机发烫不发烫;
  3. 正确性,这个就很好理解了;
  4. 可读性,对于一些简单问题的算法别整的像相对论那么难理解;
  5. 健壮性,就是说如果我们给这个算法的输入条件出错了,这个算法会不会出错,也叫容错率。就好比前面对学生按高矮排序的时候,突然插入一个其它班的同学、或者跑过来一条小狗狗,算法有没有考虑到这些情况。

好了,关于算法的理解入门,石头就说这么多了。

本文分享自微信公众号 - 讲编程的高老师(codegao),作者:中年糊涂的石头

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学了机器学习算法理论之后该干点啥?—ML Note 59

    “Advice for applying machine learning:——Deciding what to try next”

    讲编程的高老师
  • 神经网络的反向传播算法—ML Note 52

    上一小节讲了神经网络的代价函数,这一小节讲解一个让代价函数最小化的算法:反向传播算法。

    讲编程的高老师
  • 神经网络用来解决什么问题的?—ML Note 44

    “Neural Networks: Representation——Non-linear hypotheses”。

    讲编程的高老师
  • 大数据的衰落

    我们早已经被算法包围了。让我们看看Google在无人驾驶汽车中的专有算法是如何作为结合软件、数据、传感器和物资的连接组织在交通运输中实现真正的飞跃的。终究是什么...

    华章科技
  • 11位机器学习大牛最爱算法全解

    【新智元导读】“你最喜欢的机器学习算法是什么?”这个问题有些像“你最喜欢的颜色是什么?”说不重要吧,细究起来,颇有深意。本文摘选一些机器学习大牛在 Quora ...

    新智元
  • 【榜单】计算机科学中最重要的32个算法

    【新智元导读】 奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph...

    新智元
  • 数据挖掘18大算法实现以及其他相关经典DM算法

    算法使用方法在每个算法中给出了3大类型,主算法程序,调用程序,输入数据,调用方法如下: 将需要数据的测试数据转化成与给定的输入格式相同,然后以Client类...

    机器学习AI算法工程
  • 算法概论

    打好牢固的基础,是成就高楼万丈的基石头。在学习算法之前,我们先了解算法是什么?如何设计算法?什么才是“好”算法?如何优化算法?

    PayneWu
  • 2.1 C语言程序的灵魂

    广义地说:为解决一个问题而采取的方法和步骤,就称为“算法”。计算机算法可以分为两大类:数值运算算法和非数值运算算法

    C语言入门到精通
  • 发现 | 基于深度学习的自动上色程序,以及其实际应用

    来自伯克利大学和麻省理工学院的三名研究者Richard Zhang、Phillip Isola、Alexei A. Efros日前给出了深度学习在另一个特定领域...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券