时隔一年重读《算法导论》,去年读到了二叉查找树就搁浅了,今年从头捡起,希望能走的
更远一些。算上大学时的数据结构与算法课,今年可以算是第三波学习攻势了。随着学习的深入,
对算法的学习渐渐有了些自己的看法和感悟。
一.为什么学习算法?
记得初学算法时不明白为什么费力分析程序的执行步骤后,还要用公式表达出来并求极值。
一遍遍的学习渐渐有了领悟:算法研究是用来做大事的!之所以分析效率还求极限,是因为
各种算法和数据结构都要研究其在海量输入数据或最坏最不利的情况下的效率表现。如果
只是我们每天乏味工作中那三两个数的排序,几十个数值对的哈希,那其实怎样实现都无所
谓了。
所以个人觉得,学习算法能提高分析代码、洞察效率的能力,并且它也是我们继续深入学习
操作系统、网络编程、数据库的基础。如操作系统管理内存的红黑树,保存进程优先级的
最大堆,程序运行时函数调用的栈结构,数据库中的B树索引,大量数据的外部多路归并排序
和编译器将表达式解析为树然后遍历等等。所以要想深入计算机科学的内核,算法这一关是
必须过的,这也是我的学习计划。
是在整个知识体系的最底层部分,这是我宏伟蓝图的基础,呵呵~
如果你学了感觉它没用,其实不是那样的,只是你还没碰到需要它的场合,杀鸡焉用牛刀,
记住它是用来做大事情!
二.算法的学习方法
学习算法如果选择好方法学到最后很可能就什么都不记得了,就像我第一次读《算法导论》时
一样,也仔仔细细的看了,还做了些习题,可读完过后感觉什么都没掌握一样。这次重读,我
找到了适合自己的方法:
1.《算法导论》中几乎每个数据结构与算法都会有对应的例子和图示用来生动讲解。光看一遍
还不够,拿起笔跟着例子走一遍算法的伪代码,看看算法每一步中的值、状态是怎么变化的。
这样才能把例子搞透,不然白瞎了《算法导论》里一幅幅那么清楚明了的图示了。
2.搞懂例子,自然就要实现算法了。不管算法多么简单,一定要自己动手实现,切忌手懒啊。
实现好一个个算法的代码都保存备份好,这也是一笔财富,而且很有成就感。 关于具体用什么
语言来实现稍后再说。
3.只是搞清楚了基本的算法还不够,《算法导论》每节后还有不少有价值的习题,特别是每章
最后都有一些思考题,其中有的是数据结构进行扩展的,有的是算法的实际应用,一定要好好
研究才能更深的理解这一节的知识。
4.最后一定要记笔记,不管是手写的还是博客。笔记不仅方便以后的查找,记笔记的过程也会
激发你大脑思考,很多奇思妙想都是动笔头时冒出来的。
记住:学习并不浪费时间,浪费时间的是重复学习!
三.实现语言的选择
大学时的数据结构课要求使用的是C++,后来我第一遍学《算法导论》时用的是我最习惯的
Java,而现在第二遍学习时我用的却是C。不用我最熟悉的Java而用C的原因是C语言的简洁
和指针的强大,这一点在实现复杂一些的数据结构时体现的尤为突出。并且很多底层的东西
如操作系统、编译器等也都是C的地盘,因此同时学习C语言和算法对未来的深入学习有着
极为重要的作用。暂时放下我的老朋友Java,拥抱C!
四.要把握本质
初学算法时,搞不清楚为什么有那么多的数据结构,那么多的排序算法。散列表不是已经很好
了吗,为什么又搞出一堆二叉树?快排不是已经很完美了吗,为什么还有堆排、冒泡、合并排?
一遍遍地学习,学会比较各种数据结构和算法后,才能看清这些的设计背后的本质。
1.各种排序
快速排序的确很完美了,但其他排序方法也是有他们的用武之地的。对于输入数据范围已知时,
如输入数据都是0到10之间的整数,那么计数排序就可以上场了。又如当输入数据是海量的,
没法一次全部拿到内存中排好时,可以将输入数据分成多块,每块拿到内存中排序,之后对每
个排好序的块进行多路归并。
2.堆、栈及链表
堆、栈、链表都是再简单不过的数据结构了,但我们学习时不能就局限于对简单应用的掌握,
这些简单结构在特定场景或与其他数据结构结合起来使用时会产生巨大的威力。如堆在K路
归并中与其他内排序的配合,用栈来实现递归调用(如二叉树的非递归中序遍历)等。
3.哈希与红黑
散列表性能很好,可是当需要随时动态插入数据时,随着数据越来越多,散列表中的冲突数据
也越来越多,这样的静态散列自然要性能下降。可是红黑树却可以保证树的高度从而保证效率,
所以尽管红黑树很复杂,但它却是维护动态集合的不错选择。然而散列表也是与时俱进的,
动态哈希能够在散列表中数据增多到一定量时自动增大散列表,并重新哈希。这就需要较大的
存储空间,但现今的内存白菜价,所以散列表也可以维护动态数据集合了,所以memcached火
起来了。
4.树家族
平衡树家族很庞大,有AVL树、红黑树、Treap树以及Size平衡树(SBT)。但学习时要把握住
他们的本质:他们都是平衡二叉树,区别只是在如何保持树的高度不会过高上。为何关注树的
高度?因为平衡二叉树上各种操作的性能都是由树高来决定的。
此外常见的还有基数树和Trie树。在树结点中保存01或者各种字符,用于排序01串以及文本统计。
五.算法的等级修炼
我心中对算法有个模糊的分级,学习时可以设定自己短期或长期想要达到的目标。
现在快要第二次学完《算法导论》基础部分的十四章了,也只是了解的程度,才刚刚开始有些
感悟。都说算法是内功,学习起来需要旷日持久、小火慢熬,所以还要努力啊!
1.了解:了解各种算法和数据结构的基础知识,但对他们的具体应用范围一头雾水。
2.掌握:能够清楚明白各种算法的优劣,并开始学会比较他们的应用场景。
3.选择:至此各种结构与算法已经在我们的锦囊里了,碰到问题时要学会从中拿出合适的。
4.扩展:根据具体问题对现有算法进行简单的扩展和改造,并进行效率分析。
5.设计:能为现实生活中复杂的问题设计全新的数据结构或算法来解决。
结束语
算法是美妙而迷人的,但越深入就需要越强的数学功底。每个人可以根据自己的兴趣浓淡、
个人能力为自己制定目标。我自知自己没有那么强的能力,所以个人制定目标等级是3和4
之间,也就是能够应用这些现有的数据结构和算法,能简单的扩展和分析就可以了。希望
大家也都能为自己制定合适的目标,重要的是享受算法的学习过程。切忌走火入魔啊,哈哈!
分享到:
相关推荐
机器学习是一门致力于研究如何通过计算机的手段,利用经验改善系统性能的科学,...对于刚入门或正准备入门的学习者来说,这些知识构成了机器学习学习路径中的核心基础,对于深入理解后续的高级算法和模型应用至关重要。
本资源包是一个深度学习与计算机视觉的综合总结,旨在帮助初学者理解和掌握这个领域的基础知识。 首先,我们从基础的卷积神经网络(CNN)开始。CNN是一种专门处理二维图像数据的神经网络结构,通过卷积层、池化层...
在编程过程中,我们经常需要处理各种算法和逻辑,这些知识点对于任何程序员来说都是基础且重要的。下面我们将深入探讨几个在编程中常见的问题及其解决...在实践中,不断学习和总结经验,将使我们在编程道路上走得更远。
在我深入学习数值分析的过程中,我从中学到的不仅仅是算法与程序设计的技巧,更多的是对数学理论深刻的理解和思考方式的转变。 首先,数值分析教会了我如何将数学理论应用于解决现实世界中的问题。以往我对数学的...
在描述中提到,通过递归算法学习输出斐波那契数列,让学生体验了不同解题策略,理解递归在解决复杂问题时的高效和简洁。 2. **计算机运行原理**:这部分内容涉及计算机内部工作原理,包括计算机硬件和软件的交互,...
赛后,全面反思和总结比赛中的得失,持续优化改进,对于不断学习和提升至关重要。参加“蓝桥杯”对参赛者而言是难得的成长经历,不仅能够锻炼编程技能,还能够让人在挑战中获得宝贵的经验和成长。
《2019单片机的课程学习总结》是对个人在学习单片机过程中所积累的经验和感悟的总结,涵盖了从入门到深入实践的全过程。以下是其中的知识点详解: 1. **基础阶段**:学习单片机的第一步是掌握基础理论,包括了解...
**VC++学习笔记总结** VC++,全称Visual C++,是Microsoft公司开发的一款集成开发环境,主要用于编写基于Windows操作系统的应用程序。它结合了C++编程语言的强大功能和微软的Visual Studio IDE(集成开发环境)的...
这本书不只是一本技术手册,它更是作者对编程世界深刻感悟和经验积累的总结。正如标题所示,它如同一场旅程,带领读者从游戏编程的启蒙阶段,一路攀登至精通的高峰,无论新手或进阶者都能在其中找到适合自己的营养。...
代码中包含了详细的注释,不仅展示了解题思路,还融入了作者的个人感悟和总结,这对于初学者来说是非常宝贵的学习资源。 总的来说,这份资料集是学习LeetCode初级算法的良好起点,它结合了理论与实践,通过实际操作...
这反映了在技术领域中,年轻时的天赋虽然重要,但持续不断的学习和实践经验积累更是成为顶尖专家的关键因素。 - **人生哲学**:文中引用了老子的观点,强调了“道”越追求越简单的道理。对于编程者而言,这寓意着...
在学习图像处理算法、设计界面元素的过程中,作者鼓励读者不要犹豫,直接把理论付诸实践。因为只有通过实践,才能真正地掌握知识,才能发现和解决问题,这也是独立开发中最为关键的一部分。 文章的结语部分,作者...
5. **笔记与感悟**:这部分可能包含学习者对复杂概念的简化解释,对特定问题的独特见解,或者是对解题策略的总结,对于加深理解非常有帮助。 6. **实战模拟**:可能包含历年的考研真题代码实现,以及模拟试题,帮助...
在设计这样一个系统时,首先需要理解基本的数据结构和算法。C语言中的结构体可以用来封装学生的个人信息和成绩,形成学生记录的数据模型。例如,定义一个`Student`结构体,包含姓名、学号和各科成绩等字段。对于成绩...
我希望跟随者书本题目的练习和总结,利用github新建这个项目,为自己的算法学习立一个规划。 代码 我会优先用java实现我的算法,有时间的情况下,我会用python3再实现一遍。 书中的题目我尽量都完成,题目我会简单的...
标题中的“我的学习心得与总结”表明这是一份个人的学习笔记或者经验分享,可能是作者在IT领域的学习过程中积累的知识和感悟。描述与标签相同,强调了作者希望得到他人的反馈和指正,暗示了这份资料可能包含了一些...
例如,对于JAVA和C#编程语言的学习,日记中可能包含关于语法、数据结构、算法的实际应用以及遇到的编程问题和解决策略。在网络工程方面,可能会涉及网络拓扑设计、路由配置、网络安全问题等,这些都可以在日记中详细...
总结起来,这份《吴恩达机器学习个人笔记》全面覆盖了机器学习的基础理论、主要算法、实践技巧以及模型评估与优化等多个重要领域,是学习者深入理解机器学习、提升技能的有效辅助工具。通过研读这份笔记,读者不仅...
《数值分析学习感悟》 数值分析,这门深邃而实用的学科,犹如一把钥匙,为我们打开了数学世界的大门,引领我们深入探索那些抽象而精确的理论与算法。经过一个学期的学习,我对数值分析有了全新的认识,同时也感受到...
最后,开发者在总结中表达了对学习过程的感悟,认为这个大作业不仅锻炼了编程技能,也加深了对数据结构和算法的理解。同时,他也指出了可能存在的不足和待改进的地方,比如性能优化、用户体验提升以及异常处理等方面...