1.0 前言

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

简单地说,算法其实是解决问题的方法,他不是属于计算机方面的一个专属名词。不正式的说,算法是任何定义明确的计算过程,比如买菜大妈的买菜策略,骗子的坑人步骤,再比如高考中数学的立体几何,有的人写二十行,有的人写四十行,他们都写上了属于自己的算法,但是效率不同。

复杂一点的,再比如:一个环卫工人要清扫五个地点:

她也有不止一种执行完这个任务的方法:

那到底哪种方法走的路比较少?这就是我们之后要学习的最短路算法。

下面举一个例子来了解算法:

我们从小都见过的小学奥数题:有一口井七米深,一只青蛙从井底爬上来,白天爬了三米,晚上掉下两米,这样它要爬几天才能上来?

我们最笨的解题步骤

  1. 让青蛙爬三米
  2. 判断是否爬上去了
  3. 让青蛙掉下两米
  4. 重复上述过程并记录天数

(而不是计算得出一天爬一米,得出七天爬上来)

或者另一种算法:

  1. 最后一天直接爬上去:7-3=4米
  2. 其余天,一天一米:路程/速度=4天
  3. 4+1=5天

由此可见,我们首先要保证算法的正确性,其次要保证算法的效率,我们比较一下上述算法:

  1. 计算得出一天爬一米,得出七天爬上来,这种算法是错误的
  2. 模拟法,让青蛙模拟整个爬井的过程,我们看看有几次运算:

0+3=3,3<7

3-2=1

次数:0+1=1

1+3=4,4<7

4-2=2

次数:1+1=2

0+3=3,5<7

5-2=3

次数:2+1=3

0+3=3,6<7

6-2=4

次数:3+1=4

4+3=3,7=7,爬出来了

次数:4+1=5

一共进行了19次运算

  1. 公式法:7-3=4,3-2=1,4/1=4

进行了3次运算

从这个对比中应该能感受到算法不同,效率差距是很大的,然而感受其实的还不够。

试想:

假如这口井是100米?1000米?10000米?随着深度的增加,模拟法的计算次数也再增加,和深度成正比。

而再看公式法,其实和深度并没有什么关系,不管深度是多少,公式法永远只用计算3次即可。

这种计算次数和条件的大小,数量等因素没有关系的算法,视为非常优秀的一种算法。

那我们计算机的算法到底是什么?我们提到,算法不是计算机领域才拥有的概念,它可以用任何方式来描述,我们之前接触到的基本都是用文字来表达,比如我在上文中列出的解题步骤。而我们要干的事,或者说计算机的算法要干的事,就是用代码来描述计算机上的处理过程。我们用一行行的语句来描述一个个解决问题的方法,这就是编程。

计算机所有算法都是通过基本语句一点点描述出来的,比如上文的模拟算法:

  1. 让青蛙爬三米
  2. 判断是否爬上去了
  3. 让青蛙掉下两米
  4. 重复上述过程并记录天数

其中涉及到编程的很多基本语句:加减法、条件判断语句、循环语句等,编程语言也有很多,但是只是一个工具而已,就和汉语英语一样,并且单词数量比这两种语言少很多。所以只要脑海中的思路足够清晰,我们用一种(编程)语言把它描述出来即可,而不是我们之前去用汉语描述。

事实上,计算机的算法解决的问题可能是更加实际的问题,关系着我们每个人的生活,比如地图app如百度地图,高德地图,是如何帮你规划的路线的?再比如双十一如此疯狂的购物,各大购物网站是如何保证不会崩溃的?再比如到现在还没解决的问题:微博到现在为止,志玲姐姐结个婚,服务器都会崩。

如何衡量一个算法到底优不优秀?我们下篇来讲。

1.1何为算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

下面为算法的五个特性:

有穷性(Finiteness)

算法的有穷性是指算法必须能在执行有限个步骤之后终止;

确切性(Definiteness)

算法的每一步骤必须有确切的定义;

输入项(Input)

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

输出项(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

可行性(Effectiveness)

算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

1.2衡量算法的指标

一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

用几句话简单说明一下时间复杂度。

时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。

1)不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;

2)数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;

3)而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。

4)还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。

注意:不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。

因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。

而空间复杂度是相似的,只是他的单位不是时间,而是空间,可以认为是内存。

2.1计算机

说完算法,我们来谈谈计算机吧。

计算机的优势非常明显:速度、记忆、精确,但是它也不是万能的。

就算计算机速度快,也不可以给他无限大的工作量,就算计算速度再快的计算机,在O(N^N)等复杂度的算法面前,也是无能为力,具体使用那种算法是人说了算,计算机无条件执行,这就对编程的人提出了要求。

计算机的容量是非常大的,但是也不能存无限多的东西,同样的问题,解决方法不同,花费的空间差异也是巨大的。

计算机是精确的,但是解决问题的方法和人类不一样,比如计算机很难回答某件物品“美不美”,“值不值”,再比如很多算法对人类是很直观的,可以用语言描述,但是转化成机器语言会花很多时间。

总而言之,请善待你的计算机啦。

算法总结-1算法入门相关推荐

  1. 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】

    文章目录 SPFA简介 链式前向星介绍 SPFA算法思路详细 模板-链式前向星 参考书籍:算法竞赛入门到进阶 罗勇军 SPFA简介 用队列处理Bellman-Ford算法可以很好地优化,这种方法叫做S ...

  2. 热烈推荐: A*算法 (启发式搜索的入门篇,必看)转载

    热烈推荐: A*算法 (启发式搜索的入门篇,必看)转载 (2005-10-8 21:56)在搜索式算法中,A*算法算是个分水岭.因为它引入了启发式估价函数,从"瞎搜"转化到了&qu ...

  3. 数据结构和算法_零基础入门01

    数据结构和算法_零基础入门01 一.数据结构是什么? 逻辑结构.物理结构 二.算法 算法的五个基本特征 算法设计的要求 b站学习小甲鱼的数据结构与算法,自留笔记. 程序设计=数据结构+算法 一.数据结 ...

  4. 算法设计与分析入门篇----贪心法3

    正在网易云课堂学习王宏志老师的算法设计与分析入门篇课程视频,将学习中的作业问题发上来与大家一同讨论.这篇是对第五周的作业第三题个人的一些思路,希望与大家一同学习. 课程调度 题目内容: 有 n 个人, ...

  5. 算法设计与分析入门篇----动态规划 1

    正在网易云课堂学习王宏志老师的算法设计与分析入门篇课程视频,将学习中的作业问题发上来与大家一同讨论.这篇是对第四周的作业第一题个人的一些思路,希望与大家一同学习. 题目内容: 给定有 n 个整数组成的 ...

  6. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  7. 数据挖掘算法_数据挖掘算法入门

    有南方的朋友讲过北方人喜欢打比方,尤其是甲方的,其实也没什么不好了.如果是做菜的话,那么这些算法就相当于烹饪的工具了.对原始的食材进行预处理.加工整合,选择合适烹饪工具,以及对应的方法步骤,最后收获舌 ...

  8. 聚类算法 K-Means 简介与入门

    K-Means 算法是最简单的一种聚类算法,属于无监督学习算法. 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. 假 ...

  9. 《算法笔记》学习 入门篇

    目录 <算法笔记>学习 3.1 简单模拟 例1:[PAT B1001]害死人不偿命的(3n+1)猜想 例2:[PAT B1032]挖掘机技术哪家强 3.2 查找元素 例:[codeup 1 ...

  10. 离线强化学习(Offline RL)系列3: (算法篇) AWAC算法详解与实现

    [更新记录] 论文信息:AWAC: Accelerating Online Reinforcement Learning with Offline Datasets [Code] 本文由UC Berk ...

最新文章

  1. 使用PHP对数据库输入进行恶意代码清除
  2. 说说报表工具的无编码定制能力
  3. maven netty 配置_SpringBoot整合Netty(附源码)
  4. 微信jssdk 图片上传 JAVA_微信jssdk图片上传
  5. mysql group where_[MySQL] 测试where group by order by的索引问题
  6. form表单通过checkbox_飞冰表单解决方案 - FormBinder
  7. 2020.02.04 14:30
  8. echarts折线图y轴根据数值自动_Python matplotlib 绘制双Y轴曲线图的示例代码
  9. 算法面试避坑指南,助你轻松应对Java面试
  10. 【基础教程】基于matlab图像处理(读写+显示+运算+转换+变换+增强+滤波+分析+统计)【含Matlab源码 144期】
  11. 阿斯克码表ACSII对照表
  12. 小米笔记本Air 13.3 指纹版安装黑苹果 macOS High Sierra 10.13 教程
  13. 服务器fs改变文件内容,SeaweedFS文件系统
  14. 陀螺世界进度条一天进度多少_陀螺世界满级要多久?
  15. CSS动画文字闪烁问题
  16. 点赋科技:网店的营销策略是什么?
  17. 机器人动力学 - 机器人学中的惯性矩阵坐标转换及在SolidWorks中的测量
  18. Android实现第三方登录并获取到头像、名字
  19. 文献翻译:Social LSTM: Human Trajectory Prediction in Crowded Spaces
  20. python ocr识别身份证_不告诉你我用了它配合Python简简单单开发OCR识别,带你识别手写体、印刷体、身份证等N种,附代码!...

热门文章

  1. 在linux中 要删除abc目录,操作系统原理与应用(linux)A卷
  2. vb如何测试连接mysql_VB怎么连接访问Access数据库?
  3. sip中的100trying到底有啥用
  4. SIP协议(基础技术知识)
  5. 学校计算机教室安全预案,小学校园微机室安全事故应急疏散预案
  6. python访问共享文件夹 exist false_python os.path.exists()对于存在的nfs挂载目录文件失败...
  7. geoserver安装(war安装+exe安装)
  8. 【转】c#数字图像处理(一)Bitmap类、 Bitmapdata类和 Graphics类
  9. perl连接oracle的方法,Perl 连接Oracle 数据库
  10. 【LightOJ - 1123】Trail Maintenance(在线维护最小生成树,删边思维)