浅谈算法解析
# 前言
算法其实和语言无关的,算法是一种思想,你想通了就可以使用不同的语言写出来,如java、python、javascript、swit...
算法可以用来做很多事情,如 编译器、数据库、文件、操作系统、智能AI、各种软件等等。
通过性能优化能够让程序跑的更快。接触算法学习计算机,学好算法,才能创造出更有意义的东西。而不是简单的把数据取出来,然后简单的放到某一个界面上就结束了这样。
学习算法不是一蹴而就的,而是需要积累的。学习算法不像是学习数学那样很快就能够看到效果,从最基础的地方开始积累,一点点的向着目标前进,最终肯定会对算法觉得满意,如此在计算机科学的领域大放溢彩。
还是那句老话:光看文章能够掌握两成,动手敲代码、动脑思考、画图才可以掌握八成。源码仓库 (opens new window)
不要完美主义。掌握好“度”。
太过于追求完美会把自己逼的太紧,会产生各种焦虑的心态,最后甚至会怀疑自己,温故而知新,不要停止不前,掌握好这个度,不存在你把那些你认为完全掌握了,然后就成了某一个领域的专家,相反一旦你产生很浓厚的厌恶感,那么就意味着你即将会放弃或者已经选择了放弃,虽然你之前想把它做到 100 分,但是由于你的放弃让它变为 0 分。
学习本着自己的目标去。不要在学的过程中偏离了自己的目标。要分清主次。 难的东西,你可以慢慢的回头看一看。那样才会更加的柳暗花明,更能提升自己的收获。
# 学习路径
# 线性(排序)
线性结构主要体现在排序算法上,算法也是算法领域一个非常重要的内容,虽然简单但是通过学习排序可以理解很多深度的算法思想。
# 树形结构
几种不同的树形结构,知道它们的应用场合、它们的特点、局限性。
# 图结构
图论相关的基础算法
# 小结
对于算法的学习来说,编程其实是次要的。对于一些算法思想,写写画画来理解这些算法背后的过程,可能是一个更好的学习算法的思想,一旦你把这个算法想明白了,编码并不难。对于一些著名的所谓的很复杂的算法,大多数都在十几行的范围里就可以完全把它写出来。
# 算法和数据结构的重要性
从最简单的线性到最复杂的图形结构上看,数据结构和算法在计算机编程中是非常非常重要的。
linux创始人说的一段话:优秀的程序员和平庸的程序员之间的一个非常重要的区别,其实就是在数据结构的使用上,更重要的是从编程的角度上来讲,数据结构和算法完全无法分家的。
算法 + 数据结构 = 编程
:Algorithms + Data Structures = Programs
很多算法是依托于数据结构存在的,没有这个数据结构就没有这个相应的算法。很多面试问题,听起来像是算法问题,但是本质是数据结构的问题,很多问题比你想象的要更加基础,并不是出一段非常复杂非常精巧的算法问题让你来解决。
很多时候只是考察你的基础是否牢固,微软让面试者白板编程写一个堆以及谷歌直接拒绝了一个写不出二叉树翻转这样简单算法的面试者。
当你把基础打牢之后,面对更加复杂更加精巧的算法问题其实才会有思路,否则一味的去追求解决所谓的精巧的算法问题,也只是看到一个问题学习一个想法,而不是系统的把它们整理在一个算法框架中。
# 白板编程
在一些IT企业的面试中通常喜欢白板编程的方式来考验算法能力。白板变成就是,不给你编译器,给你一个白板,直接在上面写代码。甚至让你在白板上写的代码,可以直接编译运行,所以在白板上编程不会写那种很长的代码,这类面试问题,大多数都是在十行以内的范围中可以解决的。白板编程考察的主要是算法思想的基本功。
# 数据结构和算法
十种排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。
图
其它算法:最小生成树的贪心算法、最短路径的动态规划、树形结构的递归、归并排序和快速排序的分治算法。
其它数据结构:斐波那契堆、索引堆。(之前数据结构的文章中没有写到的,可以到这里查看掘金平台-数据结构算法实现文章 (opens new window))
# 大多数的IT领域细分下来都和算法有关
图形学
图像学
机器学习
人工智能
数据挖掘
操作系统
编译原理
网络安全
虚拟现实
高性能计算
只有当你的算法基础足够好,学这些才能很快的无知有能的上手。
# 总结
计算机算法领域的先驱说的一段话。高纳德先生:计算机编程它的本身是美的,这种美其实主要体现在使用精巧的算法来解决这些问题上。
高纳德先生是一个非常传奇的一个人物。计算机科学家或者软件工程师绝不仅仅是简单的码农,这是一个非常美丽的创造的过程,这些人更应该称为是艺术家。