斯坦福算法Specialization的收获
为什么要写这篇文章
自5月以来,在Coursera平台研习"斯坦福算法Specialization"课程已有近两个月之久,在此期间已修完两门课程并获益匪浅。近期突然领悟到:唯有将知识转化为实际应用才能真正掌握其精髓,在回溯这段学习经历时发现虽然开发了不少程序代码并整理了大量笔记材料但系统性的总结文章几乎没有涉及至此篇博客正为此目的即期初结出的果实旨在为读者提供清晰的知识框架帮助他们快速把握核心要点
进行写作的同时也是一种自我实现的方式。注意到博客上的文章阅读量持续上升时会让我感到非常愉悦,并能感受到一种愉悦感。尽管至今没有收到评论回复但真实的阅读量让我意识到自己创作的价值也让我意识到自己作品的存在意义。与其多言不如立即行动让我们直接进入创作环节吧!
收获一:建立起与Graph的舒适感
Expressed in English, this means I can feel more comfortable working with graphs. When I first encountered graph theory, I felt overwhelmed by its complexity. Various concepts made it seem too complicated at first; graphs themselves are composed of nodes and edges. Edges can be directed or undirected, and beyond that, they can also have weights. In any case, for newcomers, the sheer number of concepts was overwhelming. Having studied discrete mathematics in college, I had some basic understanding of graph theory. Now that I delve deeper into related algorithms, many of the foundational knowledge from high school resurface. This makes the learning process much smoother and enjoyable compared to my initial struggles with the subject matter.
我的主要编程语言是Java。遇到需要用图来解决的问题时(尤其是像PM这样的需求),我会非常熟练地使用JGraphT这个强大的API工具进行调用。如果能在项目pom.xml中添加必要的依赖项,则能够方便有效地调用该库。例如获取两个顶点之间的边getEdge(v1, v2)、边权重getEdgeWeight()以及获取顶点邻居的方法等都是非常实用的功能。特别是当我们处理依赖关系时较为常见的情形下(有些双向连接、有些单向连接),我们通常会采用图作为数据结构来进行管理与分析(特别是当需要管理多个相互关联的任务或组件时)。在这种情况下(尤其是当我们需要快速定位并处理复杂的依赖关系时),可以用获取结点所有neighbor的方法来简化操作并提高效率
我在图论方面的词汇量得到了显著提升。我对Dijkstra这个词感到畏惧——一方面担心其算法原理难以理解;另一方面也因发音问题而心生困扰。这些问题都已迎刃而解——掌握基本概念后阅读Dijkstra Shortest Path算法伪代码变得异常直观;只需理解所有优秀算法共有的特性即可:简单易懂!我亲手实现了该算法——在大规模数据集上运行完全正确;第二个问题其实更为简单——老师反复强调他的名字发音却让我无欲无求:j和k都不发音;于是简化为"jk"音节即可…….
收获二:更深入理解了Big-Oh Notation
Big-Oh notation 也被表示为O(n)或O(log n)的形式。
多用于算法时间复杂度的分析。
我对这个符号并不陌生。
在数学分析中,则用于比较两个无穷小量的大小。
但在算法分析领域中, 我并未系统地学习过它.
在这一专项课程中, Big-Oh notation成为了不可或缺的知识点.
几乎所有算法都需要经过这样的分析步骤.
Big-Oh Notation 通常被用作评估算法效率的标准。著名计算机科学家Tim Roughgarden曾分享过一句富有启发性的名言:"对于任何一个我们设计出的算法来说,我们都需要问自己是否还有改进的空间?"这句话提醒着每一位算法设计者:无论你已经实现什么,总有可能找到进一步优化的空间,从而让程序运行得更快更高效。计算复杂度是一种衡量程序运行效率的方法,它通过比较不同数据集下的运行时间来判断哪种方法更为优秀,但这种方法存在明显的局限性:它受到特定数据集的影响较大,无法有效比较不同规模数据下的性能差异。因此,在评估算法效率时,我们需要采用一种与数据规模无关的方法——即Big-Oh Notation,这种方法能够准确反映程序运行时间随输入规模增长的变化趋势。最理想的情况是线性时间复杂度O(n)
收获三:有了深入学习数据结构的方法论
学习时需要抓住重点,但这种能力本身也是一种技巧。我在接触新事物时通常会更倾向于关注熟悉的知识领域,并在此基础上深入钻研,从而增强自信心,最终深化对全局理解的程度。其实分为三个关键步骤:第一,掌握核心领域;第二,从熟悉的知识点入手;第三,并以此为基础建立全局认知。这些方法都需要投入大量时间和精力
在这一领域(或方向)的学习中,我掌握了数据结构学习中的关键要素。当遇到一个新的数据结构时,请问你首先想了解的是什么?首先是该数据结构所支持的基本操作是什么?其次是对于这些operation来说, 该数据结构执行的时间效率如何?
通过该方法,我掌握了heap这种数据结构。它主要支持两种操作类型:首先执行的是插入操作(insert),其次是删除最小值操作(extract-min)。这两个操作的时间复杂度均为O(log n)。因此,在需要频繁提取最小值的应用场景中,推荐使用堆数据结构。
收获四:学到了英文数理证明的基本词汇
经过几个月的学习后,在老师的指导下验证了很多定理。这些定理都是用英文阐述,并通过英文推导得出结论。初期阶段的内容确实有些难以适应,并且花费了不少时间和精力去理解其背后的逻辑关系。不过随着时间的推移逐渐掌握了其中的逻辑结构,并且发现英语作为一种高度逻辑性的语言……这种书写的优点是非常有说服力且易于理解的语言结构
总结
这是我从斯坦福大学算法专业课程学习中所获得的一些心得体会。然而,在这些知识海洋中还有很多内容并未深入探讨清楚;所写出的内容只是冰山的一角——这表明我对这些方面有很好的掌握程度。对此我十分感激Tim Roughgarden教授——他为我们提供的这套课程真是物有所值;其每月$35的费用也相当合理——因此我想向大家强烈推荐去学习一下这套课程!
