哪本《数据结构与算法 java》最好

学习数据结构与算法,成为出色的程序员 - 文章 - 伯乐在线
& 学习数据结构与算法,成为出色的程序员
“相较于其它方式,我一直热衷于推崇围绕数据设计代码,我想这也是Git能够如此成功的一大原因[…]在我看来,区别程序员优劣的一大标准就在于他是否认为自己设计的代码还是数据结构更为重要。” —— Linus Torvalds
“优秀的数据结构与简陋的代码组合远比反之的组合更好。” —— Eric S. Raymond, The Cathedral and The Bazaar
学习数据结构与算法分析会让您成为一名出色的程序员。
数据结构与算法分析是一种解决问题的思维模式。 在您的个人知识库中,数据结构与算法分析的相关知识储备越多,您将越多具备应对并解决各类繁杂问题的能力。掌握了这种思维模式,您还将有能力针对新问题提出更多以前想不到的漂亮的解决方案。
您将更深入地了解,计算机如何完成各项操作。无论您是否是直接使用给定的算法,它都影响着您作出的各种技术决定。从计算机操作系统的内存分配到RDBMS的内在工作机制,以及网络协议如何实现将数据从地球的一个角落发送至另一个角落,这些大大小小的工作的完成,都离不开基础的数据结构与算法,理解并掌握它将会让您更了解计算机的运作机理。
对算法广泛深入的学习能为您储备解决方案来应对大体系的问题。之前建模困难时遇到的问题如今通常都能融合进经典的数据结构中得到很好地解决。即使是最基础的数据结构,只要对它进行足够深入的钻研,您将会发现在每天的编程任务中都能经常用到这些知识。
有了这种思维模式,在遇到磨棱两可的问题时,您将能够想出新奇的解决方案。即使最初并没有打算用数据结构与算法解决相应问题的情况,当真正用它们解决这些问题时您会发现它们将非常有用。要意识到这一点,您至少要对数据结构与算法分析的基础知识有深入直观的认识。
理论认识就讲到这里,让我们一起看看下面几个例子。
最短路径问题
我们想要开发一个软件来计算从一个国际机场出发到另一个国际机场的最短距离。假设我们受限于以下路线:
Dijkstra 算法
从这张画出机场各自之间的距离以及目的地的图中,我们如何才能找到最短距离,比方说从赫尔辛基到伦敦?是能让我们在最短的时间得到正确答案的适用算法。
在所有可能的解法中,如果您曾经遇到过这类问题,知道可以用Dijkstra算法求解,您大可不必从零开始实现它,只需知道该算法的代码库能帮助您解决相关的实现问题。
如果你深入到该算法的实现中,您将深入理解一项著名的重要图论算法。您会发现实际上该算法比较消耗资源,因此名为的扩展经常用于代替该算法。这个算法应用广泛,从机器人寻路的功能实现到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 :)
arithmetic:
[arithmetic]
trigonometry:
[algebra, trigonometry]
mechanics:
[calculus, trigonometry]
atomic_physics:
[mechanics, calculus]
electromagnetism:
[calculus, atomic_physics]
radioactivity:
[algebra, atomic_physics]
astrophysics:
[radioactivity, calculus]
quantumn_mechanics: [atomic_physics, radioactivity, calculus]
12345678910111213141516
# 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
这里有两个潜在的重要约束条件:
返回的必修课列表中,每门课都与下一门课存在依赖关系
我们不希望列表中有任何重复课程
这是解决数据间依赖关系的例子,解决该问题的排序算法称作拓扑排序算法(tsort,topological sort)。它适用于解决上述我们用YAML列出的依赖关系图的情况,以下是在图中显示的相关结果(其中箭头代表需要先修的课程):
拓扑排序算法
拓扑排序算法的实现就是从如上所示的图中找到满足各层次要求的依赖关系。因此如果我们只列出包含radioactivity和与它有依赖关系的子图,运行tsort排序,会得到如下的顺序表:
arithmetic
trigonometry
atomic_physics
radioactivity
arithmeticalgebratrigonometrycalculusmechanicsatomic_physicsradioactivity
这符合我们上面描述的需求,用户只需选出radioactivity,就能得到在此之前所有必修课程的有序列表。
在运用该排序算法之前,我们甚至不需要深入了解算法的实现细节。一般来说,你可能选择的各种编程语言在其标准库中都会有相应的算法实现。即使最坏的情况,Unix也会默认安装tsort程序,运行man tsort 来了解该程序。
其它拓扑排序适用场合
类似make的工具 可以让您声明任务之间的依赖关系,这里拓扑排序算法将从底层实现具有依赖关系的任务顺序执行的功能。
具有require指令的编程语言适用于要运行当前文件需先运行另一个文件的情况。这里拓扑排序用于识别文件运行顺序以保证每个文件只加载一次,且满足所有文件间的依赖关系要求。
带有甘特图的项目管理工具。甘特图能直观列出给定任务的所有依赖关系,在这些依赖关系之上能提供给用户任务完成的预估时间。我不常用到甘特图,但这些绘制甘特图的工具很可能会用到拓扑排序算法。
霍夫曼编码实现数据压缩
(Huffman coding)是一种用于无损数据压缩的编码算法。它的工作原理是先分析要压缩的数据,再为每个字符创建一个二进制编码。字符出现的越频繁,编码赋值越小。因此在一个数据集中e可能会编码为111,而x会编码为10010。创建了这种编码模式,就可以串联无定界符,也能正确地进行解码。
在gzip中使用的DEFLATE算法就结合了霍夫曼编码与LZ77一同用于实现数据压缩功能。gzip应用领域很广,特别适用于文件压缩(以.gz为扩展名的文件)以及用于数据传输中的http请求与应答。
学会实现并使用霍夫曼编码有如下益处:
您会理解为什么较大的压缩文件会获得较好的整体压缩效果(如压缩的越多,压缩率也越高)。这也是SPDY协议得以推崇的原因之一:在复杂的HTTP请求/响应过程数据有更好的压缩效果。
您会了解数据传输过程中如果想要压缩JavaScript/CSS文件,运行压缩软件是完全没有意义的。PNG文件也是类似,因为它们已经使用DEFLATE算法完成了压缩。
如果您试图强行破译加密的信息,您可能会发现由于重复数据压缩质量更好,密文给定位的数据压缩率将帮助您确定相关的(block cipher mode of operation)。
下一步选择学习什么是困难的
作为一名程序员应当做好持续学习的准备。为了成为一名web开发人员,您需要了解标记语言以及Ruby/Python、正则表达式、SQL、JavaScript等高级编程语言,还需要了解HTTP的工作原理,如何运行UNIX终端以及面向对象的编程艺术。您很难有效地预览到未来的职业全景,因此选择下一步要学习哪些知识是困难的。
我没有快速学习的能力,因此我不得不在时间花费上非常谨慎。我希望尽可能地学习到有持久生命力的技能,即不会在几年内就过时的技术。这意味着我也会犹豫这周是要学习JavaScript框架还是那些新的编程语言。
只要占主导地位的计算模型体系不变,我们如今使用的数据结构与算法在未来也必定会以另外的形式继续适用。您可以放心地将时间投入到深入掌握数据结构与算法知识中,它们将会成为您作为一名程序员的职业生涯中一笔长期巨大的财富。
可能感兴趣的话题
数据结构比算法重要
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分11阅读权限10帖子精华可用积分11 信誉积分163 专家积分0 在线时间45 小时注册时间最后登录
白手起家, 积分 11, 距离下一级还需 189 积分
帖子主题精华可用积分11 信誉积分163 专家积分0 在线时间45 小时注册时间最后登录
论坛徽章:0
一本算法导论够不够,还要买其他书才能学好数据结构吗?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分18609阅读权限90帖子精华可用积分18609 信誉积分214 专家积分20 在线时间938 小时注册时间最后登录
大富大贵, 积分 18609, 距离下一级还需 1391 积分
帖子主题精华可用积分18609 信誉积分214 专家积分20 在线时间938 小时注册时间最后登录
论坛徽章:0
能不能学好和你买了几本书关系不大吧。
UID空间积分0 积分11阅读权限10帖子精华可用积分11 信誉积分163 专家积分0 在线时间45 小时注册时间最后登录
白手起家, 积分 11, 距离下一级还需 189 积分
帖子主题精华可用积分11 信誉积分163 专家积分0 在线时间45 小时注册时间最后登录
论坛徽章:0
& & 你的意思是不用看书吗?
我在问,如果要看书的话,一本《算法导论》除了学好算法外,能不能学好数据结构,如果不能还要买那些书?
UID空间积分0 积分2324阅读权限50帖子精华可用积分2324 信誉积分1064 专家积分0 在线时间2868 小时注册时间最后登录
小富即安, 积分 2324, 距离下一级还需 2676 积分
帖子主题精华可用积分2324 信誉积分1064 专家积分0 在线时间2868 小时注册时间最后登录
论坛徽章:9
最近几位同学脾气貌似都不小啊,呵呵。
唉,我也年轻过。
自强不息 厚德载物
鬼话始于呵呵
UID空间积分0 积分3639阅读权限50帖子精华可用积分3639 信誉积分1325 专家积分0 在线时间2943 小时注册时间最后登录
小富即安, 积分 3639, 距离下一级还需 1361 积分
帖子主题精华可用积分3639 信誉积分1325 专家积分0 在线时间2943 小时注册时间最后登录
论坛徽章:0
如果lz迷茫的心在求得了几本书名后得到了些许安慰,那也值了
但这真心是个非必要非充分条件
要想学好,首先要有一颗热爱盗版的心
UID空间积分0 积分755阅读权限20帖子精华可用积分755 信誉积分639 专家积分0 在线时间882 小时注册时间最后登录
丰衣足食, 积分 755, 距离下一级还需 245 积分
帖子主题精华可用积分755 信誉积分639 专家积分0 在线时间882 小时注册时间最后登录
论坛徽章:0
算法导论感觉有点太深入了,看的云里雾里的,翻了几页实在翻不下去了
UID空间积分0 积分5182阅读权限70帖子精华可用积分5182 信誉积分794 专家积分0 在线时间1428 小时注册时间最后登录
富足长乐, 积分 5182, 距离下一级还需 2818 积分
帖子主题精华可用积分5182 信誉积分794 专家积分0 在线时间1428 小时注册时间最后登录
论坛徽章:0
算法导论太数学,如果能把这本书看得差不多明白,特别是分析那一块看得明白,那么你应该就是属于相当牛的人那一块了。
学完算法导论确实能让你对常见的算法有一个了解,现在大部分“算法/数据结构”书的内容讲的都是这些内容,算法导论里至少有一个不常在别的书里的如红黑树,二项堆等结构,习题也介绍了许多相似的数据结构如treap,我敢说你学完(是学明白)算法导论里的内容后,你可以在大部分人面前装逼.
当然算法这个范围太宽泛了,你只能说:要用什么的时候再学什么。(如人工智能常用的--神经网络,蚁群,模拟退火)
当然有基础才更容易的深入。
UID空间积分0 积分3377阅读权限50帖子精华可用积分3377 信誉积分1906 专家积分0 在线时间6922 小时注册时间最后登录
小富即安, 积分 3377, 距离下一级还需 1623 积分
帖子主题精华可用积分3377 信誉积分1906 专家积分0 在线时间6922 小时注册时间最后登录
论坛徽章:3
算法导论感觉从动态规划开始就有点难了..
翻译的也很机械啊.
打算慢慢看具体数学了..
不过这东西,看是没用的
多做题,多想.
想的多了,有时候找到规律的那个想法,虽然你不知道它学名叫啥,但确实是最好的解法了.
知识,每天盯紧收获
UID空间积分13 积分4118阅读权限50帖子精华可用积分4118 信誉积分589 专家积分50 在线时间2655 小时注册时间最后登录
小富即安, 积分 4118, 距离下一级还需 882 积分
帖子主题精华可用积分4118 信誉积分589 专家积分50 在线时间2655 小时注册时间最后登录
论坛徽章:0
算法导论,对于非算法从业者的开发研发人员,基本“足够”了
UID空间积分0 积分2227阅读权限50帖子精华可用积分2227 信誉积分635 专家积分5 在线时间916 小时注册时间最后登录
小富即安, 积分 2227, 距离下一级还需 2773 积分
帖子主题精华可用积分2227 信誉积分635 专家积分5 在线时间916 小时注册时间最后登录
论坛徽章:0
敢为lz是学生还是已经工作了的?算法导论这种书做敲门砖还不错了,但不见得实用。如果业界中不用高级算法和数据结构,那为什么还要学? | 程序师您的举报已经提交成功,我们将尽快处理,谢谢!
我一般用VC,感觉还好。
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'学数据结构和算法哪些书比较好?
[问题点数:100分,结帖人a]
学数据结构和算法哪些书比较好?
[问题点数:100分,结帖人a]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年4月 总版技术专家分月排行榜第一
2009年11月 Linux/Unix社区大版内专家分月排行榜第一2009年6月 Linux/Unix社区大版内专家分月排行榜第一2009年4月 C/C++大版内专家分月排行榜第一2009年3月 C/C++大版内专家分月排行榜第一2009年3月 Linux/Unix社区大版内专家分月排行榜第一2009年2月 Linux/Unix社区大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 数据结构与算法 pdf 的文章

 

随机推荐