跨越算法开篇

数据结构与算法是编程的基本功,当你算法掌握越来越深的时候你会发现写代码的时候,会不由自主考虑很多性能方面的问题。写出时间复杂度高、空间复杂度高的垃圾代码越来越少了,算法能力提升了很多,编程能力也有了质的飞跃。

首先一个三连问。

  • 是不是从学校开始,你就觉得数据结构难学,然后一直没认真学?
  • 工作中,一遇到数据结构这个坑,你又发自本能地迅速避让,因为你觉得自己不懂,所以也不想深究,反正看起来无关大局?
  • 当你想换工作面试,或者研究某个开源项目源码,亦或者和团队讨论某个非框架层面的高可用难题的时候,你又发现,自己的基础跟不上别人的节奏?

如果你有这种情况,其实你并不孤独。这不是你一个人遇到的问题。工作十间,见过许多程序员。他们有着各种各样的背景,有很多既有潜力又非常努力,但始终无法在自己现有水平上更进一步。少年不要慌,青叶带你跨越算法这道坎。

在技术圈里,我们经常喜欢谈论高大上的架构,比如高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是凤毛麟角。

基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位

那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等,当然还有数据结构和算法。

发车了,算法专栏现在开始。伙计们快上车!!

深入浅出

入门篇

时间、空间复杂度分析是数据结构和算法中非常重要的知识点,贯穿整个专栏的学习过程。但同时也是比较难掌握的。

基础篇

这部分是专栏中篇幅最大的内容,也是我们学习的重点,计划共有 26 节内容,涵盖了最基础、最常用的数据结构和算法。针对每种数据结构和算法,我都会结合具体的软件开发实例,由浅入深进行讲解

高级篇

这部分我会讲一些不是那么常用的数据结构和算法。虽然不常用,但是这些内容你也需要知道。设置这一部分的目的,是为了开拓视野。

实战篇

我会拿一些开源项目、框架或者系统设计问题,剖析它们背后的数据结构和算法,让你有一个更加直观的感受。

学习数据结构与算法的意义

你是不是觉得数据结构和算法,跟操作系统、计算机网络一样,是脱离实际工作的知识?可能除了面试,这辈子也用不着?

还有一些人也只听说过数组、链表、快排这些最最基本的数据结构和算法,稍微复杂一点的就完全没概念。

当然,也有很多人说,自己实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要 Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。事实真的是这样吗?

很多大公司,比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。有些人虽然技术不错,但每次去面试都会“跪”在算法上,很是可惜。那你有没有想过,为什么这些大公司都喜欢考算法呢?

业务开发工程师,你真的愿意做一辈子 CRUD boy 吗?

是的,对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解

作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。

比如,我们常用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?

我觉得,高手之间的竞争其实就在细节。这些细节包括:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。这些累积起来,决定了一个框架是不是优秀。所以,如果你还不懂数据结构和算法,没听说过大 O 复杂度分析,不知道怎么分析代码的时间复杂度和空间复杂度,那肯定说不过去了,赶紧来补一补吧!

对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码!

你可能会说,我在小公司工作,用户量很少,需要处理的数据量也很少,开发中不需要考虑那么多性能的问题,完成功能就可以,用什么数据结构和算法,差别根本不大。但是你真的想“十年如一日”地做一样的工作吗?

我们学习数据结构和算法,并不是为了死记硬背几个知识点。我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报。

算法真的很难么?

你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步。

真正的原因是没有找到好的学习方法没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。

什么是数据结构?什么是算法?

大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。

虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。

从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。

数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招!

为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

这里面有 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

话不多说不服就干,关注公众号持续更新。在这里问大家一个问题,对于 HashMap 的时间复杂度是多少呢?并发拓容场景下 HashMap 会有什么问题呢?

欢迎关注公众号后台回复关键字 “HashMap” 获取问题答案也可以回复 加群,在技术群表达你的观点。

原文地址:https://blog.51cto.com/14745561/2475844

时间: 2024-10-01 00:37:48

跨越算法开篇的相关文章

算法开篇学习之数组元素查找

[摘要]最近两个月都在学习 Linux 驱动,中间碰到了很多问题,进度比较缓慢.尽管不是班科出生的,但是还是觉得算法很有必要学一学.因此将数组元素查找作为自己算法开篇的第一篇博客,好好跟着平凡程序员的博客学习,内容基本是拿来主义. 我们可以下面一个数组查找的函数说起.一句一句写起,首先我们开始从最简单的函数构造开始 int find(int array[], int length, int value) { int index = 0; return index; } 这里看到,查找函数只是一个

算法-开篇

小马同学,马农一枚,互联网搬运工,写了多年的程序,由于不是软件/计算机专业出身,算法技能较为薄弱,故在此开一栏,以巩固自己的算法知识,记录自己的学习过程.大部分例子主要参考了<<算法导论>>(作者:Thomas H. Cormen等)及<<数据结构.算法与应用-C++语言描述>>(作者:Sartaj Sahni)两本书. 网易公开课上也有名校的算法相关的视频课程可以学习:1.麻省理工学院公开课:算法导论(http://open.163.com/special

医学图形算法开篇

医学图形算法主要跟医学医学二三维数据打交道,主要是结合已有的计算机图形学技术开发符合医学手术规划需要的算法分析. VTK是医学图形算法用的较多的开发引擎与算法库; 当前结合计算机图形学技术,医学手术模拟仿真上急需解决截骨碰撞反应,实现医学截骨模型碰撞前后的逼真模拟建模...... 原文地址:https://www.cnblogs.com/huangyupu2019/p/10661864.html

实用性模型算法研究

数据建模十类算法 1.蒙特卡罗算法2.数据拟合.参数估计.插值等数据处理算法3.线性规划.整数规划.多元规划.二次规划等规划类4.图论算法(最短路.网络流.二分图等算法)5.动态规划.回溯搜索.分治算法.分支定界等计算机算法6.最优化理论的三大非经典算法:模拟退火法.神经网络.遗传算法7.网格算法和穷举法8.连续离散化方法9.数值分析算法10.图象处理算法 以上十类算法开篇. 实用性模型算法研究

还记得面试时被算法支配的恐惧吗?

还记得面试时被算法支配的恐惧吗? <font size = '5'>?<center>面试造火箭,上班拧螺丝</center> </font> 大多数程序员心里会想"总结的真精辟",当面试到算法时,各种"跪"."再跪"."还是跪"......,多少人因为算法而拿不到心仪的offer,算法毁一生啊. 智力面试时代 现在算法已经成为大厂面试的重中之重,甚至一些国外的大厂只面试算法,为

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考

【转】 跨越千年的RSA算法

跨越千年的RSA算法 [转]http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计 算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里

算法系列教程01 - 开篇

大家好,好久没有更新文章了,对不起大家.今天开始,我要写另一个系列教程:算法. 开篇语 为什么要写算法系列教程呢?因为最近刚看完<Algorithms, 4th Edition>这本经典算法书(电子书,中英版网上都有下载),有了些新收获,觉得那些零散的知识点和经验有必要也值得花时间好好整理一下.另外,我自己的算法知识应该还没有达到去学好“机器学习”这门学科的程度,在写教程的同时我也会不断学习,我想和大家一起用算法这把钥匙开启“机器学习”这扇大门,去探索算法是如何让机器“学习”的. 为什么要学习

算法与数据结构开篇——基础与心得

算法与数据结构开篇 你真的会数据结构吗? 公司开发一个客服电话系统,小菜需要完成客户排队模块的开发,经过三次修改: 第一次:小菜使用了数据库设计了一张客户排队表,并且设置了一个自动增长的整型id字段,来一个用户,就在这张表的末尾插入一条数据,等客服系统一空闲,就将表中最前的的客户提交,然后删除这条记录. 实时排队模块,在内存中实现即可,无序用数据库 第二次:小菜用数组变量重新实现了这个功能,害怕数组不够大,选择远大于实际情况的100作为数组长度 数组虽然可以满足一定需求,但是需要考虑溢出问题,以