前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解一下“算法”,每个人都要掌握的编程知识

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

作者头像
讲编程的高老师
发布2020-08-14 09:56:58
4310
发布2020-08-14 09:56:58
举报

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

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

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. 健壮性,就是说如果我们给这个算法的输入条件出错了,这个算法会不会出错,也叫容错率。就好比前面对学生按高矮排序的时候,突然插入一个其它班的同学、或者跑过来一条小狗狗,算法有没有考虑到这些情况。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 讲编程的高老师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档