聊聊“内功”——算法和数据结构
今天来说说程序员的“内功”——算法和数据结构。
很多想要学习编程的人包括我,都会有这样的疑惑:我应该学什么编程语言,是学java?python?c++?…;
我应该学什么技术,前端开发?web开发?网络爬虫?
大家都莫名有种慌张感,担心自己学了一种语言,学了一门技术,很快被淘汰。
我觉得,需要正视事实,互联网行业变化很快,技术和编程语言就是解决问题的工具,很容易更新,与此同时,你也很难预料到未来是什么样子,需要学习什么技术。
不光是互联网行业,几乎所有行业都是这样,只是程度不同而已,哪有所谓的“铁饭碗”。
因此我们很焦躁,内心不安。
我能想到的解决办法,就是在瞬息万变的互联网世界,我们得找到不变的东西。
正是那些不变的东西,充实了我们的内心,让我们心安。
算法和数据结构可能就是我们需要好好修炼的“内功”,掌握了基本的结构和法则,我们再根据多变的世界,选择适合的工具来解决问题。也就是人们常说的随机应变。
世界的现象有实有虚,千变万化,但背后的道理确是不变的。
所以想要修炼自己的内功,不得不理解数据结构和算法。如果把计算机世界,比作充满艺术的世界,那么算法就是美妙的乐曲,而数据结构是乐曲需要的音乐符号,是乐曲的基础。
什么是算法?
当我第一次问自己这个问题的时候,就自然而然联想到数字,脑子里出现很多乱七八糟的公式、抽象的数字,一想到这些,就想到我糟糕的数学成绩(两次高考,数学都不及格),也想到了我初高中的时候,无论是家长还是老师,都有意无意传达一种信号,女生不适合学数学,别看女生现在数学成绩好,等到了高中,立马就被男生赶上等等。
我无数次给自己心理暗示,远离数学,好运就会降临。但,当我在写代码的时候,发现了自己的瓶颈,因为恐惧数学,所以只能利用别人编好的算法。
而当我不得不面对,这个瓶颈(其实是内心的恐惧)时,我再一次问自己什么是算法?
算法,没那么难理解,其实就是解决某个问题的一套流程**。**
打个简单的比方,如何做一盘炒青菜?弄懂这个流程,你就了解了炒青菜的算法。
1.青菜洗净准备
2.热锅下油
3.放入准备好的青菜,进行翻炒
4.炒出盛盘
这就是我炒青菜的算法,一共有四步,当然这只是我的算法,每个人可以有每个人的算法,可能做出来的质量更高,速度更快。
同理,在计算机的世界,算法就是某项操作的过程,比如排序。你的计算机存储了很多乐曲,如何按照播放的次数的多少给歌曲排序,从而将你喜欢的歌曲排在前面,这就涉及到了排序算法。
什么是数据结构?
数据结构是数据组织、管理和存储的格式。
当我第一次听到这个概念的时候,又开始想象。脑子里出现了很多数字小人,他们毫无目的的到处乱跑。这时候,数字国王觉得这样下去,这个国家迟早药丸,所以任命大臣制定了一些规则,让数字小人组织起来,各司其职。
由于这些规则,数字小人不再乱跑,呆在属于自己的组织里,安心工作。
这些组织结构各异,有的线性排列,比如数组、链表,有的树状排列,比如:二叉树、红黑树等等。
这些组织因为结构不同,也拥有不同的职能,有的组织擅长查找,有的组织擅长插入和删除。
上述所说的组织,就是我们常说的数据结构。
常见的八大数据结构有:
未来我们会详细介绍。
如何运用?
当掌握了算法和数据结构,并能灵活运用,你的内功也就练成了,我们再看计算机世界的很多问题,都能知道背后的原理。
比如我们在玩游戏的时候,有的时候遇到神坑的队友情绪激动,会说一些脏话,比如 草尼马,你麻弊等等,但是 好心 的游戏运营商,会利用某个敏感词过滤技术,将这些骂人的话,变成xxx。其中敏感词过滤用到的trie树数据结构,通过遍历trie树来过滤敏感词,如图所示。
最近很火的爬虫技术,如何用网络爬虫爬取互联网。其实用到的是图论的遍历算法。互联网虽然复杂,但其实也是一张大图,可以把每个网页当作一个节点,把超链接当作连接节点的弧,这样可以从任何一个网页出发,用图的遍历算法,自动地访问每一个网页并把它们存起来。这就是网络爬虫的基本原理。
也许你好奇过,为什么淘宝能推荐你喜欢的商品,到底是采用了什么方法呢?这里面可能就运用到了分类算法,让你和与你爱好相似的其他用户分组在一起,推荐系统就会有针对性的给你推荐,和你在同一组用户购买的产品。
当然这样的例子很多很多,计算机的世界于你而言也越来越有趣。
而当你修炼的内功不光能看透计算机世界的现象,还能看透世界的现象,也就学会了举一反三。
最后,,
一直觉得,每个人都有长处,老天给的gift,但要学会发掘,比如我的抽象理解能力不行(看到数字想吐),想象力来凑(把数字看成是会卖萌的小人)。尽量不给自己设限吧,毕竟我们已经在修行了。