算法总结-1算法入门

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)等复杂度的算法面前,也是无能为力,具体使用那种算法是人说了算,计算机无条件执行,这就对编程的人提出了要求。

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

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python(10)- 格式化输出%

格式化输出1. 格式化输出浮点数2. 格式化输出整数3. 格式化输出浮点数4. 格式化输出百分号%变量的格式化输出&#xff1a;input函数将信息输出到控制台&#xff0c;实现变量和文字一起输出。 %格式化操作符&#xff0c;和不同的字符连用&#xff0c;%s 字符串&#xff0c;%d 十…

FM系列算法解读(FM+FFM+DeepFM)

在计算广告中&#xff0c;CTR是非常重要的一环。对于特征组合来说&#xff0c;业界通用的做法主要有两大类&#xff1a;FM系列和Tree系列。这里我们来介绍一下FM系列。   在传统的线性模型中&#xff0c;每个特征都是独立的&#xff0c;如果需要考虑特征与特征之间的相互作用…

二叉树层序遍历

层序遍历序列为&#xff1a;ABCDEFG 思路&#xff1a;栈是先进后出的数据结构&#xff0c;而队列是先进先出的数据结构。 我们层序遍历&#xff0c;很明显&#xff0c;先遇到的节点先打印&#xff0c;不同于前中后序遍历&#xff0c;我们采用队列结构。 具体执行过程如下&…

深度学习(01)-- 基础学习

文章目录目录1. 深度学习基础1.1 深度学习总览1.2 深度网络训练过程1.2.1 传统神经网络的训练方法为什么不能用在深度神经网络1.2.2 deep learning训练过程1.3 数学知识&#xff1a;2. 九种深度学习模型2.1 受限玻尔兹曼机RBM2.2 自编码器AE&#xff08;降维&#xff09;2.3 深…

MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss

损失函数1.激活函数2.损失函数2.1均方误差损失函数2.2交叉熵损失函数2.3 NLLLoss()2.4 BCELoss()1.激活函数 全连接网络又叫多层感知器&#xff0c;多层感知器的基本单元神经元是模仿人类神经元兴奋与抑制机制&#xff0c;对其输入进行加权求和&#xff0c;若超过某一阈值则该…

Java的IO总结

非流式文件类--File类 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等&#xff0c;以下是文件操作常用的函数。 File类是对文件系统中文件以及文…

深度学习(02)-- ANN学习

文章目录目录1.神经网络知识概览1.1深度学习顶会1.2相关比赛1.3神经网络知识概览1.4神经网络编程一般实现过程2.简单神经网络ANN2.1 数据集&#xff1a;2.2 网络结构&#xff1a;2.3 代码实现2.3.1 读取数据&#xff0c;并做处理2.3.2 构建网络结构2.3.3 训练网络目录 1.神经网…

python(11)-if语句,断言assert

分支语句if1.if基本语法2 if语句的嵌套3 比较运算符号4 逻辑运算符&#xff1a;5 整数随机数初应用6 tip7.断言assert1.if基本语法 if语句开发中的应用场景&#xff1a;如果条件成立做一件事情&#xff0c;如果条件不成立做另外一件事情。有了if语句&#xff0c;程序有了分支.…

深度学习(03)-- CNN学习

文章目录目录1.CNN学习2.Keras深度学习框架目录 1.CNN学习 卷积神经网络CNN总结 从神经网络到卷积神经网络&#xff08;CNN&#xff09;我们知道神经网络的结构是这样的&#xff1a; 那卷积神经网络跟它是什么关系呢&#xff1f;其实卷积神经网络依旧是层级网络&#xff0c;…

Collections 工具类常见方法

Collections 工具类常用方法: 排序查找,替换操作同步控制(不推荐&#xff0c;需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void reverse(List list)//反转 void shuffle(List list)//随机排序 void sort(List list)//按自然排序的升序排序 void sort(L…

PaperNotes(1)-Modeling the World from Internet Photo Collections

从网络图片集对世界进行建模AbstractIntroduction2 Previous Work2.1特征匹配2.2 稀疏重建2.3 基于图像建模2.4 基于图像的渲染2.5 图像浏览&#xff0c;检索和注释3 Overview概述4 Reconstructing Cameras and Sparse Geometry&#xff08;相机标定与稀疏重建&#xff09;4.1K…

深度学习(04)-- 典型CNN结构(LeNet5 ,AlexNet)

LeNet5 LeNet5可以说是最早的卷积神经网络了&#xff0c;它发表于1998年&#xff0c;论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明&#xff0c;有兴趣的同学可以去参考原文&#xff0c;论文原文…

Arrays工具类常见方法

Arrays类的常见操作 排序 : sort()查找 : binarySearch()比较: equals()填充 : fill()转列表: asList()转字符串 : toString()复制: copyOf() 排序 : sort() // *************排序 sort****************int a[] { 1, 3, 2, 7, 6, 5, 4, 9 };// sort(int[] a)方法按照数字顺序…

Python(12)-while语句+赋值运算符号+转义字符

while循环语句1.while基本语法2.break continue3.转义字符4.赋值运算符5.Print函数输出换行符号1.while基本语法 循环语句的程序三大流程之一&#xff1a; 顺序 --从上到下以顺序的方式执行代码 分支流程–依据条件判断&#xff0c;决定要执行的代码分支–丰富代码形式 循环–…

CNN的几种经典模型

本文主要介绍一下CNN的几种经典模型比较。之前自己也用过AlexNet和GoogleNet&#xff0c;网络上关于各种模型的介绍更是形形色色&#xff0c;自己就想着整理一下&#xff0c;以备自己以后查阅方便 LeNet5 先放一张图&#xff0c;我感觉凡是对深度学习有涉猎的人&#xff0c;对…

阿里Java编程规约(命名风格、常量定义、代码格式)

命名风格 1、【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a;_name / __name / $name / name_ / name$ / name__ 2、【强制】代码中的命名严禁使用拼音与英文混合的方式&#xff0c;更不允许直接使用中文的方…

PaperNotes(2)-Generative Adversarial Net-代码实现资料

Generative Adversarial Nets-生成对抗网络Abstract1.Introduction2.Related work3.Adversarial nets4.Theoretical Results4.1全局最优 pgpdatap_gp_{data}pg​pdata​4.2算法1的收敛性质5.Experiments6.Advantagesa and disadvantages7.Conclusions and future work8.GAN-代码…

深度学习(05)--典型CNN结构(VGG13,16,19)

文章目录目录1.VGG结构2.VGG结构解释3.3*3卷积核的优点4.VGG的muti-scale方法5.VGG的应用目录 1.VGG结构  LeNet5用大的卷积核来获取图像的相似特征  AlexNet用99、1111的滤波器  VGG 巨大的进展是通过依次采用多个 33 卷积&#xff0c;模仿出更大的感受野&#xff08;r…

redis——发布和订阅

频道的订阅和退订 当一个客户端执行 SUBSCRIBE 命令&#xff0c; 订阅某个或某些频道的时候&#xff0c; 这个客户端与被订阅频道之间就建立起了一种订阅关系。 Redis 将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典里面&#xff0c; 这个字典的键是某个被订…