龙空技术网

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

极客晨星少儿编程 58

前言:

今天兄弟们对“算法不可以用自然语言描述”可能比较关心,朋友们都想要分析一些“算法不可以用自然语言描述”的相关文章。那么小编也在网摘上搜集了一些关于“算法不可以用自然语言描述””的相关文章,希望大家能喜欢,小伙伴们一起来学习一下吧!

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

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

01 算法概念的理解

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

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

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

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

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

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

流程图的符号描述

一段求三个数中最大数的伪代码

02 一个典型算法的例子

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

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

常见的几种经典排序算法

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

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

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

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

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

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

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

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

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

03 怎样评价算法的好坏?

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

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

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

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

更多信息请关注极客晨星少儿编程官方公号。极客晨星针对6-16岁青少年的具体情况,开发了4套课程体系,分别涵盖可视化编程逻辑概念、初级/中级算法、js、python、C语言及国际高级信息奥林匹克竞赛。采用线上一对一直播教学模式,深受广大家长与孩子的喜爱。

点击下方链接了解更多!

标签: #算法不可以用自然语言描述 #算法只能用流程图表示吗