蚊章汇 - Happy Bear
type: channel
link: https://linuxcn.bwsl.wang/author/251/
description: Happy Bear
items: 学习数据结构与算法分析如何帮助您成为更优秀的开发人员

学习数据结构与算法分析如何帮助您成为更优秀的开发人员
type: item
date: 2015-11-04T18:00:00+08:00
description: "相较于其它方式，我一直热衷于推崇围绕数据设计代码，我想这也是Git能够如此成功的一大原因[…]在我看来，区别程序员优劣的一大标准就在于他是否认为自己设计的代码还是数据结构更为重要。"-- Linus Torvalds"优秀的数据结构与简陋的代码组合远比反之的组合更好。"-- Eric S. Raymond, The Cathedral and The Bazaar学习数据结构与算法分析会让您成为一名出色的程序员。数据结构与算法分析是一种解决问题的思维模式。 在您的个人知识库中，数据结构与算法分析的相关知识储备越多，您将越多具备应对并解决各类繁杂问题的能力。掌握了这种思维模式，您还将有能力针对新问题提出更多以前想不到的漂亮的解决方案。您将更深入地了解，计算机如何完成各项操作。无论您是否是直接使用给定的算法，它都影响着您作出的各种技术决定。从计算机操作系统的内存分配到RDBMS的内在工作机制，以及网络协议如何实现将数据从地球的一个角落发送至另一个角落，这些大大小小的工作的完成，都离不开基础的数据结构与算法，理解并掌握它将会让您更了解计算机的运作机理。对算法广泛深入的学习能为您储备解决方案来应对大体系的问题。之前建模困难时遇到的问题如今通常都能融合进经典的数据结构中得到很好地解决。即使是最基础的数据结构，只要对它进行足够深入的钻研，您将会发现在每天的编程任务中都能经常用到这些知识。有了这种思维模式，在遇到磨棱两可的问题时，您将能够想出新奇的解决方案。即使最初并没有打算用数据结构与算法解决相应问题的情况，当真正用它们解决这些问题时您会发现它们将非常有用。要意识到这一点，您至少要对数据结构与算法分析的基础知识有深入直观的认识。理论认识就讲到这里，让我们一起看看下面几个例子。最短路径问题我们想要开发一个软件来计算从一个国际机场出发到另一个国际机场的最短距离。假设我们受限于以下路线：从这张画出机场各自之间的距离以及目的地的图中，我们如何才能找到最短距离，比方说从赫尔辛基到伦敦？Dijkstra算法是能让我们在最短的时间得到正确答案的适用算法。在所有可能的解法中，如果您曾经遇到过这类问题，知道可以用Dijkstra算法求解，您大可不必从零开始实现它，只需知道该算法的代码库能帮助您解决相关的实现问题。如果你深入到该算法的实现中，您将深入理解一项著名的重要图论算法。您会发现实际上该算法比较消耗资源，因此名为A*的扩展经常用于代替该算法。这个算法应用广泛，从机器人寻路的功能实现到TCP数据包路由，以及GPS寻径问题都能应用到这个算法。先后排序问题您想要在 开放式在线课程 （ MOOC，Massive Open Online Courses ） 平台上(如Udemy或Khan学院)学习某课程，有些课程之间彼此依赖。例如，用户学习 牛顿力学 （ Newtonian Mechanics ） 课程前必须先修 微积分 （ Calculus ） 课程，课程之间可以有多种依赖关系。用YAML表述举例如下：# Mapping from course name to requirements # # If you're a physcist or a mathematicisn and you're reading this, sincere # apologies for the completely made-up dependency tree :) courses: arithmetic: [] algebra: [arithmetic] trigonometry: [algebra] calculus: [algebra, trigonometry] geometry: [algebra] mechanics: [calculus, trigonometry] atomic_physics: [mechanics, calculus] electromagnetism: [calculus, atomic_physics] radioactivity: [algebra, atomic_physics] astrophysics: [radioactivity, calculus] quantumn_mechanics: [atomic_physics, radioactivity, calculus] 鉴于以上这些依赖关系，作为一名用户，我希望系统能帮我列出必修课列表，让我在之后可以选择任意一门课程学习。如果我选择了微积分（calculus）课程，我希望系统能返回以下列表：arithmetic -> algebra -> trigonometry -> calculus 这里有两个潜在的重要约束条件：返回的必修课列表中，每门课都与下一门课存在依赖关系我…