如何学好算法—算法往事:关于计算的那些事【好书推荐】
文章目录
- 如何学好算法:从理论到实践的系统性学习方法
-
- 一、理论基础:打好坚实的基础
- 二、实践为王:动手做是提高的关键
- 三、心态调整:持续学习与反思
- 《算法往事:关于计算的那些事》
如何学好算法:从理论到实践的系统性学习方法
算法是计算机科学的核心,掌握算法不仅能够提升解决问题的能力,还能帮助我们在实际项目中做出高效的决策。然而,许多学习者常常在学习过程中感到迷茫,不知道从哪里入手,或者在遇到问题时缺乏足够的思考能力。本文将从理论、实践和心态三个方面,为大家提供一条清晰的学习算法之路。
一、理论基础:打好坚实的基础
-
理解基本概念和术语
学习算法之前,首先需要理解一些基本概念。这包括但不限于:
- 时间复杂度和空间复杂度:这些衡量算法效率的指标对于评估算法的优劣至关重要。需要掌握不同算法的复杂度分析方法,如大O符号表示法、时间空间 trade-off 等。
- 数据结构:算法和数据结构是密不可分的。常见的数据结构包括数组、链表、栈、队列、哈希表、树、图等。每种数据结构的不同实现方式会影响算法的效率,因此了解数据结构的特点对于算法的学习至关重要。
-
掌握常见的算法分类
算法种类繁多,可以按照应用场景或者解决问题的方法进行分类。最常见的几类包括:
- 排序算法:如快速排序、归并排序、冒泡排序等。
- 查找算法:如二分查找、哈希查找等。
- 图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra 算法等。
- 动态规划与贪心算法:这些算法在处理优化问题时非常有用,特别是在求解最短路径、最大值等问题时,深刻理解其思想和实现方式至关重要。
- 分治算法:通过将问题分解成多个子问题,并逐一求解来得到最终结果。
学习方法:对于每种算法类型,都要通过阅读教材、查阅文献、观看相关课程,理解其原理,并尝试自己动手实现。
二、实践为王:动手做是提高的关键
-
刷题是学好算法的必经之路
大量的刷题是算法学习中不可忽视的部分。通过做题,我们能够理解算法的实际应用,提升解决问题的能力。常见的在线编程平台如 LeetCode、Codeforces、AtCoder 等都提供了丰富的题目资源,适合各个层次的学习者。
做题技巧:
- 从简单题目做起:刚开始学习时,建议从简单的题目做起,逐步增加题目难度,确保对基础算法的理解和应用。
- 分析题解:做题过程中,如果遇到无法解决的问题,不要气馁。先查阅题解,分析其他人的思路,并结合自己的思考,总结出优化方案。
-
进行项目实践
除了刷题,实际项目中的算法应用是学习的另一种有效方式。通过将算法应用于真实场景中,你可以看到算法在大规模数据处理中的实际效果,同时也能够锻炼自己解决实际问题的能力。
例如,可以尝试用经典算法来实现一个简单的搜索引擎,或通过动态规划解决一些实际的优化问题。这样可以帮助你从理论走向实际应用,更好地理解和掌握算法。
-
参与竞赛
编程竞赛不仅是对算法能力的挑战,也是对解决问题速度和效率的考验。参加 ACM ICPC、Google Code Jam 等竞赛,可以帮助你快速提升自己的编程和算法水平,同时也能锻炼应对压力的能力。
三、心态调整:持续学习与反思
-
持之以恒的学习态度
学习算法是一个长期的过程。很多时候,你可能会因为遇到困难而感到沮丧。但是,保持持续学习的态度非常重要。每天投入一定时间去学习算法,无论是通过看书、做题还是阅读论文,都能让你的算法水平不断提高。
学习方法:
- 制定学习计划:合理安排学习时间,确保每天都有一定的时间进行算法的学习和练习。
- 分阶段目标:将目标拆分为小目标,例如学习完某个算法,掌握某个数据结构,或解决一定数量的题目等。不断完成小目标,可以保持学习的动力。
-
总结与反思
学习算法的过程中,光做题是远远不够的。做题后要进行总结和反思,思考自己做题时的思路和方法是否最优。如果不是,尝试找出更优的解法,并理解为什么这样做能提高效率。
总结方法:
- 记录笔记:每做完一道题目或者学习完一个算法后,记录下自己的思考过程和遇到的问题,这有助于加深记忆并形成自己的知识体系。
- 总结规律:通过多做题,发现不同算法之间的相似性和差异,总结出常用的解题技巧和策略。
学好算法并不是一蹴而就的事情,而是一个持续积累的过程。理论学习和实践相结合,持续不断地反思和总结,才能有效提升自己的算法能力。通过刷题、参与竞赛和项目实践,逐渐提高自己的解决问题的能力,最终成为一个高效的算法专家。记住,算法是工具,最重要的是将它应用于实际问题中,发挥它的真正价值。
《算法往事:关于计算的那些事》
JD:https://item.jd.com/15085232.html
适读人群 :计算机先关专业低年级本科生一级非玄烨读者。
本书致力于为读者提供一个关于故事和计算的新视角,希望读者欣赏这些故事中的计算内容,并且这种新颖的观点能激发读者对计算机科学的兴趣。全书分两篇:算法和语言。算法篇用《糖果屋》的故事讲述了计算与算法,用夏洛克·福尔摩斯的故事讲述了表示与数据结构,用印第安纳·琼斯的故事讲述了问题求解与其局限。语言篇用《飞跃彩虹》讲述了语言与语义,用《土拨鼠之日》讲述了控制结构与循环,用《回到未来》讲述了递归,用《哈利·波特》的故事讲述了类型与抽象。
通过一些耳熟能详的故事(例如格林童话,福尔摩斯,哈利波特,回到未来,绿野仙踪,等)来解释计算的本质,讲述一种系统化的问题求解思路。
马丁·埃尔维格(Martin Erwig)
俄勒冈州立大学电子工程和计算机科学学院计算机科学教授。主要研究领域包括:语言设计和特定领域语言、函数式编程、可视化语言。他是Journal of Visual Languages and Computing的副主编,还是PEPM、SLE和EUSES指导委员会成员。
当人们问起我的工作时,话题很快就转向了什么是计算机科学。说计算机科学是计算机的科学是一种误导(尽管严格来说并非不正确),因为大多数人会把计算机理解为个人计算机或笔记本计算机,并推断计算机科学家整天在构造硬件。其实,将计算机科学定义为对计算的研究只是在转移问题,因为它立即引出了计算是什么的问题。
多年来,我逐渐意识到,仅仅通过介绍一个又一个的概念来教学并不是很有效,它太抽象了。现在,我通常首先将计算机科学描述为对系统性解决问题的研究。每个人都知道问题是什么,每个人也都理解问题的解。在通过一个例子解释了这个观点之后,我就有机会介绍算法的概念了,这使我能够指出计算机科学和数学之间的重要区别。大多数时候,我不需要谈论编程语言、计算机和相关的技术问题,但即使涉及这些问题,通过具体的问题也可以很容易地说明这些概念。本书是对这种方法的详细阐述。
计算机科学是科学俱乐部的一名相对较新的成员,有时它似乎还没有赢得像物理、化学和生物等严肃科学学科那样的声望。想象一个涉及物理学家的电影场景。你可能会看到有人在讨论黑板上复杂的公式,或者穿着实验服做实验。这位物理学家是一位声誉卓著的科学家,他的知识受到珍视。现在想象一个涉及计算机科学家的类似场景。你可能会看到一个书呆子坐在一个黑暗、凌乱的房间里,眼睛紧盯着计算机屏幕。他疯狂地敲击键盘,可能是想破解一些代码或密码。在这两个场景中,他们都正在解决一个重要的问题,但是物理学家可能会对如何解决这个问题提供一些合理的解释,而计算机问题的解仍然是神秘的,往往是神奇的,而且太复杂了,导致无法向非专业人士解释。如果计算机科学对外行来说是无法解释的,还会有人尝试进一步了解或理解它吗?
计算机科学的主题是计算,这是一种影响每个人的现象。我指的不仅仅是手机、笔记本计算机或互联网。想想折纸飞机、开车去上班、做饭,甚至是DNA转录(当你读这句话的时候在你的细胞中发生了数百万次的过程),这些都是计算—一种解决问题的系统方法的例子—尽管大多数人并不这样认为。
科学使我们对自然界如何运作有了基本的了解,并为我们提供了可靠地建立这种知识的科学方法。适用于一般科学的东西也适用于计算机科学,特别是因为我们在众多不同情况下遇到了众多形式的计算。因此,对计算有基本理解就像具备物理、化学和生物基础知识一样,可以更好地理解这个世界,更有效地解决许多现实世界的问题。这方面的计算能力通常被称为计算思维。
本书的一个主要目标是着重于计算的一般性质,进而强调计算机科学的广泛适用性。我希望这能激发人们对计算机科学更广泛的兴趣,使人们愿意对计算机科学有更多了解。
我首先指出日常活动中的计算,然后通过大家熟知的故事解释相应的计算机科学概念。日常情景取自一个典型的工作日:早上起床,吃早餐,上下班,工作场所的情节,预约医生,午后的爱好活动,晚餐,晚上反思一天的事件。这些小插曲都将引出书中的一章。然后,这些章节用七个流行的故事解释了计算的概念。每个故事贯穿2或3章,围绕计算机科学的一个主题展开讨论。
本书分两篇:算法和语言。它们是计算概念所依赖的两个主要支柱。表1概述了本书要讲的故事和它们所说明的计算机科学概念。