算法修炼之路—算法学习心得及【链表】小结(持续更新)

引言

从第一篇Leetcode141链表类型题目的总结,到目前为止已经近20天了,也有一点经验与总结需要进一步的梳理和细化,这也是想先写一部分关于链表类型的小结的初衷。
经过3周的链表题目联系与思考,接下来计划对字符串题目“下手”了,再暂时转战另一题型前对链表进行简单的梳理。

算法修炼之路阶段

我将算法的学习分为三个阶段:入门,初级、中级与高级:

  1. 入门阶段
    目标: 对算法与数据结构的知识有简单了解,此阶段主要是“扫盲”。
    其中入门就是需要对一系列的名词以及典型算法进行学习,构建初步印象和结构的阶段,直观理解就是了解排序算法(冒泡排序,快速排序,选择排序,归并排序,堆排序等经典排序算法与其思想);以及一些抽象数据结构,包括栈,队列,树,图等,了解简单的数据结构之后对算法中数据结构的选择以及内存使用的判断会有较好的辅助作用。
  2. 初级阶段
    目标: 对算法进行实际的训练与学习,学会分析场景并给出至少一种解法,此阶段是构建简单的算法体系
    这个阶段前期准备需要对入门阶段的经典算法进行实现,为刷题做知识储备,不至于见到题目大脑一空白。随着刷题以及总结和分析的积累,我们会进入到更高层的阶段。
  3. 中级阶段
    目标: 将题目模块化,有机整体化,并于实际场景联系起来。
  4. 高级阶段
    目标: 构建自己的算法与数据结构知识体系,辨证分析场景问题解决方法,适应不同需求选择最合适的算法与数据结构。

链表经验总结

链表题目的典型求解方法是双指针解法,很多题目都可以通过双指针进行求解,甚至两个指针不够时,再来一个指针;或者单指针+辅助容器解法,接下来我们简单说明一下这两种思路的含义:

  1. 单指针 + 辅助容器解法
    这类解法的特点是,思路简单,实现容易且代码易读,其思路符合人脑最朴实的思考规律,这也是对算法题目有了初步“感觉”之后的体现。这里我们可以称之为题感,这是学习算法的初步成果体现,也是步入初级阶段的体现。
    常用的辅助容器涵盖了Stack, HashSet, HashMap,分别是栈,以及依赖于哈希算法的集合与映射数据结构。
    优点: 思路较简单;实现容易;
    缺点: 空间复杂度较高,通常为常数级,甚至平方级。
  2. 双指针/多指针解法
    这类解法一般是方法1的进阶,一般是为了追求O(1)空间复杂度的改善解法思路,以时间换空间的思想;也存在双指针不能满足需求,多指针实现功能的做法。
    优点: 空间复杂度降低,在数据规模较大的情况下,对内存消耗明显降低;
    缺点: 需要一定的算法素质,对编程人员要求较高;代码易读性下降;

学习历程心得

  1. 将经典的排序算法其实现以及思想尽量做到烂熟于心
    为了简单起见,我拿排序算法来举例。不要认为这些排序算法好多哦,而且觉得一些复杂度太高的算法也不实用啊,还要学习它干嘛··· balabala… 如果之后看过更高级一些的系统书籍之后,你就会觉得现在看得这些排序算法真的是精减得不能再精简的了,经过时间的筛选后留下的大多是精华,我们在学习的最初阶段有质疑并不是坏事,但是行动大于质疑才是现在更好的心态与状态。
    经过脚踏实地地理解以及实现之后,会在自己的潜意识中更多、更好地培养自己的题感

  2. 刷题不是一蹴而就,也不是一去不复返,它是一个迭代的动态过程
    在刷题第一遍的过程中,不要对自己的要求太过严苛,先从简单的题目做起(这一步属于初级阶段,一定要有一定的经典算法的储备,即自己认真走过了入门阶段),当思考超过30mins之后请接受自己暂时无法解出这道题的现实,我必须承认,这在一开始会给自己造成一定的挫败感和失落感,但是我们必须学着坦诚地面对,无论你将它看作什么。第一遍刷题的目标是算法题的长见识。
    当你通过将简单的题目大致走过一遍之后,这时候你会明显地察觉到自身能力的提高,看到题目后并没有了完全的MB状态,而是真正地有了一个思考地过程,不论结果优劣或者方向偏移多少,这个思考过程是弥足珍贵的。

    我在入门阶段的时候,是通过极客时间(没有广告费,野生代言:))王争的《数据结构与算法之美》学习的,在此之前我并不是没有试着自学过这些东西,但是相信我,在你接触一个新领域的时候,没有先验经验或者有经验者指导的情况下自学,效率极其低下。我是在2019年8月份前后,一个月的时间去梳理了需要学的东西并制定了一系列的计划,之后突然想起了好像在两年前买过一个算法课,就去找了找,还好我有着良好的觉得花过钱买得课不学就吃亏的心理,我去找了找,开始从王争的专栏开始学习,我认为对于入门来说很合适,文字与音频均有。

  3. 学习算法并不是算法工程师的必修课,它是每一位优秀的程序员都应该具备的素质
    在真正开始学习算法之前,我其实已经有了一些非常正规的项目经验,但也有了一定的经历与心得。在多个项目中,总是难以避免思考数据如何读取,以及在内存中如何存放,以期在修改、获取的时候能够更方便——这个过程其实就是数据结构选择;当我们实现依托要求通过编程实现特定功能时,需要在数据结构基础上进行增删改查一系列的操作,这就是算法
    当我们没有学习数据结构与算法相关知识时,首先我们没有要关注代码性能的意识,只停留在能初步实现功能的层次;其次我们没有这方面的知识储备,并不知道可选范围以及其相关特性,很难选择出适合的数据结构,进而难以构造出高性能的代码;最后我们没有自学以及受过相关训练,难以做到深一步的优化。而市场竞争往往就是在比较性能,或是谁能在有限资源下最大化生产力,最优化资源使用和配置。
    拥有这部分知识的程序员不一定是优秀的IT从业者,但是没有算法与数据结构知识体系的程序员一定不是优秀的IT人才。

发布了53 篇原创文章 · 获赞 59 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011106767/article/details/105627968