作者 谢恩铭,公众号「程序员联盟」。
转载请注明出处。
原文:https://www.jianshu.com/p/b2f23799a5bb

内容简介


  1. 前言
  2. 什么是算法
  3. 算法无处不在
  4. 计算机的“特权”角色
  5. 什么是数据结构
  6. 第一部分第二课预告

1. 前言


程序员应该知道:程序 = 数据结构 + 算法(Program = Data Structure + Algorithm )。

作为一个程序员,如果不了解数据结构和算法,应该会不太好意思出门跟人家打招呼。

在这个课程里,我会带大家以循序渐进、轻松幽默的形式从入门到精通数据结构和算法,相信我们会度过一段非常愉快的时光。

你会发现,入门数据结构和算法,其实一点都不难。

话休絮烦,我们直接进入主题。

2. 什么是算法


算法的英语是 Algorithm。

首先我们来思考一个问题:

什么是算法?

要很准确地回答这个问题并不容易,但其实也没那么难,我不需要用一大堆理论来说清楚什么是算法,况且算法也不仅限于 IT(Information Technology 的简称,表示“信息技术”)编程领域。

所以一个通俗易懂的回答可以是:

算法是以简单概念的形式对如何解决问题的一种精确描述。

所以说:

  • 算法是一种描述(description),且是一种精确的描述。
  • 描述什么?描述如何解决问题。
  • 以什么样的形式来描述?以简单概念的形式。

说到问题,在日常生活中,我们经常需要解决问题。有的人可能每天需要解决很多问题,有的人可能就是问题本身。

下面我就来描述一个生活中的问题,从广义上来考虑“问题”和“算法”的概念。

3. 无所不在的算法


我们可以用一个几乎关乎所有人的问题来开始说明:烹饪。毕竟“民以食为天”。

假设你饿了,你来到厨房,想整点什么吃的,正好你看到了一包方便面,然后你不自觉舔了舔舌头,你想吃方便面了(如果你正好是在睡觉前看到这里,请不要打我。不鼓励大家多吃方便面。这里的例子也可以是煮饭、煮面或者烹饪其他食物),那你应该怎么烹饪它呢?

这是一个简单的过程(这里只说最简单的水煮的方式,请大家不要纠结烹饪的细节,也许你有其他更好的烹饪方便面的方式):

  1. 在锅子里倒入适量水
  2. 在炉子上点起火来(如果是电磁炉就不用火)
  3. 把锅子放在炉子上
  4. 等待水开,转中火
  5. 把方便面饼放入锅中
  6. 煮半分钟
  7. 放入所有调料包
  8. 煮 1 分钟
  9. 出锅

可以看到,我已经以简单概念的形式精确描述了如何解决“煮方便面”这个问题。

所以上面这套流程的描述,你可以把它称为“算法”,这个算法是专门针对“煮方便面”这个问题的。

你会注意到上面的例子中有许多暗含的东西:我说你最初拥有一包方便面,但你也需要锅子、水,等。

我们可能会处于所有这些东西都不可用的特定情况下,然后我们就得使用另一种算法(或许先得自己造口锅出来)。

上面的流程里,我使用的各条指令(步骤)是比较“精确的”,但我们可以精简到更少的指令,或扩充到更多指令。你也许会说,如果要更精确地说,得说明如何把水装进锅子里。

如果要根据这个食谱来烹饪方便面的人不知道如何执行“在锅子里倒入适量水”这一指令,则有必要用更简单的术语解释(例如,需要解释如何使用水龙头)。

类似地,在我们编程时,你使用的算法的精度取决于许多参数:你使用的编程语言,可用的库,等等。

4. 计算机的“特权”角色


如果在日常生活中能找到算法的痕迹,为什么我们却主要在计算机科学(Computer Science)中讨论它呢?

原因很简单:计算机(或电脑)非常擅长执行重复性任务。它们快速,高效,“任劳任怨”,从不喊累。

假设我们可以描述用于计算 3 的平方根的小数的算法(这算法得是人类可以操作的)。利用这个算法,你可以使用纸和笔来计算 3 的平方根的前 7 个小数位(1.7320508)。

但如果需要你计算 3 的平方根的前 10 万个小数位呢?用纸和笔会计算到怀疑人生。这种时候,计算机将变得更加合适。

我们可以设计出不少用于信息处理的算法。说到信息处理,通常有以下几类:

  • 研究
  • 比较
  • 分析
  • 分类
  • 提取

计算机通常在这些方面更加有优势,可以很好地处理大量信息。

你可能已经想到了著名搜索引擎谷歌(最初谷歌正是靠着其搜索算法的实力才能主导市场,成就了今天超高的市值),但这种活动并不仅限于互联网领域。

当你玩即时战略游戏(Real-Time Strategy Game,简称 RTS。例如红警,星际争霸,等等)的时候,如果你下达指令给一个单位,让它移动。此时电脑需要掌握很多的信息(例如地图的结构,单位的起点,单位的终点),它也必须产生新的信息:单位应走的路线。

所以其实算法源于生活(毕竟算法是人想出来的),但是我们通常在 IT 这个领域才讨论算法,因为计算机的特殊性。

5. 什么是数据结构


上面说到了算法,现在我们来聊聊数据结构。数据结构的英语是 Data Structure。data 表示“数据”,structure 表示“结构”。

除了处理信息(数据是信息的符号表示或称载体,信息则是数据的内涵)外,还必须考虑如何存储信息。存储信息的方式可能会对其处理方式产生非常重要的影响。

具体地说,我们可以用字典作为例子。我们可以将字典定义为“单词及其定义的一个集合”(一个单词对应一个定义)。

如果一部字典里的单词是胡乱排序的,这样的字典应该很难使用吧。比如你要找一个单词的定义,你得一页页地翻字典,直到找到那个单词。

按字母顺序来排列单词显然是一种非常有效的解决方案,可以快速找到你所要的单词。因此,这是一种不错的存储信息的方式。

算法(描述方法)和数据结构(描述组织)之间存在非常紧密的联系。
简单来说,对信息的存储方式就是数据结构关心的事,对信息的处理方式就是算法关心的事。

通常,某些数据结构对于某些算法的实现至关重要;反之亦然。

例如,如果我们想要在已经按字母顺序排列好的字典中添加一个新单词,我们就不能只是将这个新单词写在字典的最后一页的空白处,而是必须使用算法将其添加到正确的位置。

因此,数据结构的研究与算法的研究是密不可分的,我们需要同时来学习它们。

6. 第一部分第二课预告


今天的课就到这里,一起加油吧!

下一课我们将用一个小故事来引出算法复杂度的学习(真正算法复杂度的讲论将在第三课):

下一课:数据结构和算法 | 第一部分第二课:小鸭子们去度假


我是 谢恩铭,公众号「程序员联盟」号主,慕课网精英讲师 Oscar 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

数据结构和算法 | 第一部分第一课:什么是数据结构和算法相关推荐

  1. 数据结构和算法 | 第一部分第二课:小鸭子们去旅行

    作者 谢恩铭,公众号「程序员联盟」. 转载请注明出处. 原文:https://www.jianshu.com/p/31d14bd080d4 内容简介 引出算法复杂度的故事 两种算法 两种算法的对比 第 ...

  2. 学习《数据结构》要爬的第一步梯子

    小王开始专业课的复习 一.数据结构是什么 二.数据结构中基本概念和术语 2.1数据结构的概念 2.2按照不同功能划分逻辑结构 2.3存储结构中重点 顺序存储举例 链式存储举例 三.抽象数据类型的表示与 ...

  3. 高中计算机竞赛教案,信息技术教学案例评比——选择排序的算法实现(金华第一中学)...

    信息技术教学案例评比--选择排序的算法实现(金华第一中学) 发布时间:2018-02-24 选择排序的算法实现 --牛人争霸大赛,在游戏中学算法 (钱晓峰       浙江省金华第一中学        ...

  4. 数据结构(C语言)第二版 第一章课后答案

    数据结构(C语言)第二版 第一章课后答案 这本书,我以后也会用,所以趁着考完试做个整理,顺便分享出来.电子资源发不出来,放评论区吧,有需要自取. 1. 简述下列概念:数据.数据元素.数据项.数据对象. ...

  5. 算法笔记CodeUp第一至第六章刷题记录

    文章目录 <算法笔记>2.2小节--C/C++快速入门->顺序结构 1.例题1-1-1 按要求输出信息(1) 2.例题1-1-2 按要求输出信息(2) 3.例题1-2-1 求两个整数 ...

  6. 苏州大学计算机课程与资源,苏州大学计算机学院2018-2019学年第一学期研究生课课程表...

    苏州大学计算机学院2018-2019学年第一学期研究生课课程表 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 苏州大学计算机学院201 ...

  7. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  8. 第一周Access课总结

    第一周Access课总结 1:这节课学到了什么? 这节课重点学了数据库是用来干什么 做什么的  老师怕我们理解不了 用了很长时间向我们举了很多的例子 让我们终于知道了数据库是用来干嘛的了 顾名思义 数 ...

  9. 智慧航空AI大赛-阿里云算法大赛总结 第一赛季总结

    [以前的文章]最后一公里极速配送 - 阿里云算法大赛总结 总结一下新的教训 1.由于都是NP难题,获得最优解用常规的方法非常困难,对于不是算法科班出身的人来说,首先应该到网络上寻找一下论文,是否有一些 ...

最新文章

  1. mysql5.5在windows7下编译的详细步骤_Windows7下编译MySQL5.5的详细步骤
  2. 一种新型鱼眼图像轮廓提取算法
  3. 【计算机网络】计算机网络概述 : 总结 ( 概念 | 组成 | 功能 | 分类 | 性能指标 | OSI 七层参考模型 | TCP/IP 模型 | 五层参考模型 )★★★
  4. redis-使用问题
  5. django分页-Paginator类
  6. 23种设计模式(十四)接口隔离之代理模式
  7. python测试用例设计方法_设计测试用例的基本方法
  8. mysql execute stmt_execute_prepared_stmt()
  9. Qt 动态添加控件,并删除指定控件
  10. vue文件下载及重命名
  11. 人工智能导论 第二章 搜索技术
  12. create方法 eslint关闭_react create-react-app使用less 及关闭eslint
  13. 【技术分享】一:搜索排序—概述
  14. 初学verilog必看
  15. Rosetta中文教程(一)
  16. 微软亚洲研究院新推英库拼音输入法
  17. 运维知识体系V2.0-赵班长
  18. *.3ds文件格式与*.max文件格式的区别
  19. java 文件导出Excel 文本形式转数字格式解决,字段是int导出需求是数字解决方案
  20. Android布局分析工具Layout Inspector(解决布局产生的性能问题)

热门文章

  1. 三八妇女节即将到来,跨境电商如何玩转节日营销?
  2. 转一条个人网站上的新闻。
  3. MySQL中特别实用的几种SQL语句送给大家
  4. 勒索病毒WannaCry还没搞定 比它更厉害的永恒之石又来了
  5. int类型的数据长度
  6. 潭州教育-Python学习笔记@条件与循环
  7. ICCV2017 UCT:学习统一卷积网络进行实时可视化跟踪---论文笔记
  8. 2013年数学二真题手稿解析
  9. 2010年-2020年数学二真题之反常积分
  10. 笔记本硬盘数据导出失败怎么恢复