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

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

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

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

 

兔兔RabbitMQ!!! CSDN认证博客专家 Go/GoLang Redis MySQL
全站最硬核博主(之一)。在腾讯总部工作,bat/tmd有五家发过offer。acm/leetcode刷题狂,c /Java/python/go/php各种后端语言都喜欢,安卓/node/叶子/jsp等前端也能写,最喜欢鼓捣各种组件,请多指教。
已标记关键词 清除标记
相关推荐
<span style="color:#404040;">1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。</span><br /><br /><span style="color:#404040;">2.网上数据结构和算法的课程不少,但存在两个问题:</span><br /><br /><span style="color:#404040;">1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了</span><br /><span style="color:#404040;">2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 </span><br /><span style="color:#404040;">3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 </span><br /><span style="color:#404040;">4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴</span><br /><br /><span style="color:#404040;">3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。</span><br /><br /><span style="color:#404040;">教程内容:</span><br /><span style="color:#404040;">本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。</span><br /><br /><span style="color:#404040;">学习目标:</span><br /><span style="color:#404040;">通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。</span>
<p> <br /> </p> <p> <span style="color:#494949;font-size:14px;"><br class="Apple-interchange-newline" /> <span style="font-size:14px;">为什么人人都要学算法?</span></span><span style="color:#494949;font-size:14px;"> </span> </p> <p> <span style="color:#494949;font-size:14px;"><span style="font-size:14px;"><br /> </span></span> </p> <p style="font-family:"font-size:16px;color:#4D4D4D;background-color:#FFFFFF;"> <span style="color:#333333;font-size:14px;">程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。</span><span style="color:#333333;font-size:14px;">很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测。但是这些其实都不是具体的算法,而是一系列算法的集合。</span> </p> <p style="font-family:"font-size:16px;color:#4D4D4D;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">所以说,好的代码从来离不开优秀的算法算法不学不可!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">本门课程为系</span><span style="font-size:14px;">列课程第一课,挑选出非</span><span style="font-size:14px;">常实用、高效、高频的算法:动态规划!</span> </p> <p class="ql-long-24357476" style="color:#494949;"> <span style="font-size:14px;">动态规划</span><span><span style="font-size:14px;">(</span><span style="color:#333333;font-family:arial;background-color:#FFFFFF;font-size:14px;">Dynamic programming,简称DP</span><span style="font-size:14px;">)</span></span><span><span style="font-size:14px;">很多人都觉得是比较难以理解和掌握的一种算法,为了应付面试更多的时候程序员会选择直接死记硬背</span><span style="color:#333333;font-family:arial;background-color:#FFFFFF;font-size:14px;">斐波那楔数列或者背包问题的源码,其实只要认真学习、彻底理解,动态规划并没有那么难。</span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <span style="font-size:14px;color:#E53333;">学完即可掌握面试中90% 以上会问到的算法问题 ,实用性99.9999%!</span> </p> <p> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"></span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">这门课程,授课老师很厉害!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="color:#6B6B6B;font-family:"background-color:#FAFAFA;font-size:14px;">王硕-资深软件工程师,从事计算机相关课程教学多年,擅长Java、Python、数据结构和算法等课程,有丰富的计算机课程的教学经验。致力于企业级软件开发和计算机教育工作,具有索尼中国研究院和四大国有银行软件开发中心的工作经历。 著有编程畅销书《你也能看得懂的Python算法书》。</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">本课程实用性极强,边学边练!<span style="background-color:#FF9900;">零基础</span>也能轻松入门~</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;color:#E53333;">在这门课中,我们保证你能收获到这些</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span>1)<span style="color:#3A4151;font-family:"font-size:14px;background-color:#FFFFFF;">透彻理解:</span>到底<span style="color:#3A4151;font-family:"font-size:14px;background-color:#FFFFFF;">什么是动态规划</span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;"> <span><span style="background-color:#FFFFFF;">2)细致讲解:挖矿工问题</span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;"> <span><span style="background-color:#FFFFFF;">3)<span style="color:#3A4151;">细致讲解:<span style="color:#3A4151;font-family:"font-size:14px;background-color:#FFFFFF;">爬台阶问题</span></span></span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;"> <span><span style="background-color:#FFFFFF;">4)<span style="color:#3A4151;">细致讲解:<span style="color:#3A4151;font-family:"background-color:#FFFFFF;">背包问题</span><span></span></span></span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <span style="font-size:14px;"><span style="color:#E53333;">【注意】</span></span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <span style="font-size:14px;">1)现在购买至少享受40元优惠;</span><br /> <span style="font-size:14px;">2)课程教辅材料自助下载;</span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> --------------------------------------------------------------- </p> <p> <br /> </p>
<p><span style="font-size: 18px;"><strong>【为什么学习机器学习算法?】</strong></span></p> <p style="text-align: left;"><span style="font-size: 14px;">人工智能是国家发展的战略,未来发展的必然趋势。</span></p> <p style="text-align: left;"><span style="font-size: 14px;">将来很多岗位终将被人工智能所代替,但人工智能人才只会越来越吃香。</span></p> <p style="text-align: left;"><span style="font-size: 14px;">中国人工智能人才缺口超过</span><span style="font-size: 14px;">500</span><span style="font-size: 14px;">万,人才供不应求。</span></p> <p style="text-align: left;"><span style="font-size: 16px;">要想掌握人工智能,机器学习是基础、是必经之路,也是极其重要的一步。</span></p> <p><span style="font-size: 18px;"><strong>【课程简介】</strong></span></p> <p><span style="font-size: 14px;">很多人认为机器学习难学,主要是因为其过于关注各种复杂数学公式的推导,从而忽略了公式的本质。</span></p> <p><span style="font-size: 14px;"> 本课程通过对课件的精心编排,课程内容的不断打磨,重磅推出机器学习8大经典模型算法,对晦涩难懂的数学公式,</span><br /><span style="font-size: 14px;"> 通过图形展示其特点和本质,快速掌握机器学习模型的核心理论,将重点回归到机器学习算法本身。</span></p> <p><span style="font-size: 14px;">本课程选取了机器学习经典的8大模型:</span></p> <p><span style="background-color: #2dc26b; color: #ffffff; font-size: 16px;">线性回归、逻辑回归、决策树、贝叶斯分类器、支持向量机(SVM)、集成学习、聚类以及降维</span></p> <p><span style="font-size: 14px;">再也不用东拼西凑,一门课程真正掌握机器学习核心技术。</span></p> <p><span style="font-size: 14px;"> 它们是人工智能必经之路,机器学习必学技术,企业面试必备技能。</span></p> <p><span style="font-size: 14px;"> </span></p> <p><span style="font-size: 14px;">《<span style="color: #e53333;">深度学习与神经网络从原理到实践</span>》课程现已上线,这使得人工智能学习路径更加完备,</span></p> <p><span style="font-size: 14px;">地址:<a href="https://edu.csdn.net/course/detail/29539">https://edu.csdn.net/course/detail/29539</a></span></p>
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页