【liuyubobobo-算法与数据结构】第一章 课程概述


持续学习&持续更新中…

守破离


  • 任何时候学习算法都不晚,而且越早越好,这么多年,你听说过技术过时,什么时候听说过算法过时,不仅没有过时,因为机器学习、大数据的要求,算法变得越来越重要了。
  • 对算法的学习,会逐渐培养你理清逻辑的习惯,对每一个变量作用的深刻理解,也能让你写出越来越优雅的代码

什么是算法

一系列解决问题的,清晰,可执行的计算机指令。

算法的5大特性

有限性
  • 一个算法不应该是无限循环的,应该在有限的时间里可以执行完。
  • 所谓的有限的时间,不代表这个时间一定会非常短。
  • 比如我设计了一个算法,这个算法需要一万年、一亿年才能执行完,从原则上讲,它也是一个算法。只不过它消耗的时间太长,并不实用而已。
  • 这样一个不实用的算法并非完全没有意义!
  • 可以想象一下,有可能在现在我们需要一万年的时间才能执行完的算法,随着技术的发展(硬件技术、并行计算、量子计算…),使得在以后,同样的算法可能只需要一秒钟就可以执行完毕。这个算法此时就有意义了。
  • 另外一点,很多时候我们研究算法,恰恰是从这样的一个看似不可行的算法出发,一步一步的优化它,最终得到一个可行得算法。
  • 所以,对于一个看起来不可行的算法,它可能是有研究意义的。
确定性
  • 每一个指令本身应该是含义唯一的,不能产生二义性。
可行性
  • 算法中的每一步都应该是可行的。
输入
输出
  • 并不像函数的输入输出那样,算法的输入输出是宏观的、抽象上的输入和输出。

    1. 对于一个算法来说,它肯定是有它操作的对象的。它所操作的这些对象就是这个算法的输入。
    2. 算法执行产生的效果、结果就是该算法的输出,是宏观抽象的输出。

为什么要学习算法

  • 为了IT企业面试(无可厚非、但不仅仅、绝不止步于此)

在这里插入图片描述

  • 算法在计算机行业中是至关重要的。可以说,在计算机中,算法无处不在

算法无处不在

  • 编程语言的编译器(编译器如何理解程序?如何智能报告编译错误、逻辑错误?如何优化代码?…?)

在这里插入图片描述

  • 常见的工具:搜索引擎、推荐算法

在这里插入图片描述

  • 日常生活:苹果手机助手(如何智能理解人类的语言?)

在这里插入图片描述

  • 日常生活:推荐

在这里插入图片描述

  • 影视特效——制作电影、动画片也离不开算法(物体的运动、灯光反射折射、水滴滴落、水花四溅…)

在这里插入图片描述

在这里插入图片描述

  • 平常玩的游戏(小游戏:迷宫、扫雷、BluePath…)(大型游戏:英雄联盟、CF…)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • PS

在这里插入图片描述

  • 压缩算法

在这里插入图片描述

  • 数据库

在这里插入图片描述

  • 电脑AI(机器学习的一个分支:深度学习)

在这里插入图片描述

  • 计算机视觉算法——人脸识别

在这里插入图片描述

  • AR

在这里插入图片描述

在这里插入图片描述

  • 程序(软件)的性能优化

在这里插入图片描述

在这里插入图片描述

速度提升了7倍

在这里插入图片描述

  • 我们每天都在接触算法,以至于我们都没有意识到它的存在。

在这里插入图片描述

  • 学好算法,才能创造出更有意义的事物。

在这里插入图片描述

  • 算法无处不在…

如何学算法

  • 算法的学习曲线相对陡峭,是需要积累的。

  • 学习算法有点像学习数学,不是很快就能看到效果的,但是,如果我们从最基础的地方开始积累,一点一点地向着自己的目标前进,相信我们最终都能体会到算法之美,进而在计算机科学这个伟大的领域大放异彩

课程简介

学习要求
  • 需要掌握最基础的编程语言知识

  • 编程语言:C++

  • 了解数组、链表、堆、栈等线性结构

  • 对基本算法知识有常识性了解:如递归、遍历、算法复杂度…

学习路径
  • 第1步: 线性结构(主要是排序)

  • 第2步: 树结构

  • 第3步: 图结构

在这里插入图片描述

学习方法

算法是一种思想,是不依赖任何语言的,是和语言无关的。

  • 想要编写出代码实现出某个算法或数据结构。

  • 重要的是拿出笔和纸等工具,来对其写写画画,想通想懂它们,理解它们背后的过程和背后的逻辑,彻底理解它们背后的算法思想

  • 一旦把算法想通、想明白了,编码实现它们并不难。

  • 白板编程考察的是大家算法思想的基本功。

数据结构的重要性

I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structres more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships.
—— Linus Torvalds(creator of Linux)

  • 优秀的programmer和平庸的programmer之间的区别:数据结构的使用。

  • 算法和数据结构是不可分割的。

  • 程序 = 数据结构 + 算法 (Algorithms + Data Structures = Programs)

  • 面试中,很多问题看起来是算法问题,但其实本质上还是一个数据结构问题,考察的还是你数据结构的掌握程度。

  • 当我们将数据结构的基础打牢之后,面对更加复杂更加精巧的算法问题时可能才会有思路。

算法思想

  • 分治算法——归并排序、快速排序…

  • 贪心算法——最小生成树…

  • 动态规划——最短路径…

  • 递归搜索——树形结构…

每个细分领域都是算法

不积跬步无以至千里

在这里插入图片描述

体会算法之美

Computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty. A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.
——Donald Knuth

  • 计算机编程本身是美的,这些美主要体现在使用精巧的合适的算法来解决相应的问题

  • 目标:计算机科学家、软件工程师、艺术家

参考

liuyubobobo: 算法与数据结构-综合提升 C++版.

课程代码仓库: 算法与数据结构-综合提升 C++版.


本文完,感谢您的关注支持!


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值