本书以Java为描述语言,介绍了数据结构与算法的基本知识。书中结合企业界的工程实践提炼教学内容,特别对数据结构中易混淆的问题进行了梳理,对每一个问题提出不同的解决方案。本书是一本优秀的数据结构方面的教材。
本书既是一本优秀的数据结构和算法方面的自学教材,也是正在准备面试、参加选拔性考试以及校园面试的读者的应试指南。全书以Java为描述语言,介绍计算机编程中使用的数据结构和算法,强调问题及其分析,而非理论阐述。
全书共分为21章,分别讲述了基本概念、递归和回溯、简单排序、链表、栈、队列、树、优先队列和堆、并查集DAT、图算法、排序、查找、选择算法(中位数)、符号表、散列、字符串算法、算法设计技术、贪婪算法、分治算法、动态规划算法、复杂度类型等内容。每章首先阐述必要的理论基础,然后给出问题集。书中大约有700个算法问题及相应的解法。对于许多问题,本书提供了多个具有不同复杂度的解决方法。从蛮力法开始,逐步引入问题的最佳解决方法。对于每一个问题,试图知晓算法所需的运行时间和内存空间。注重启发式教学和实际编程能力的培养。
本书由曾供职于多家知名IT企业的资深软件架构师撰写,以Java为描述语言,介绍计算机编程中使用的数据结构和算法,覆盖相应竞争性考试的主题,目的不是提供关于数据结构和算法的定理及证明,而是强调问题及其分析,讲解必备知识和解题技巧。针对不同问题,列举多个具有不同复杂度的解决方法,汇集知名IT企业经典的编程面试题目并给出解题思路,为学生应试和软件开发人员面试提供有益指导。
本书特点:
所有代码用Java实现。
数据结构难点启发思考。
为每个问题列举可能的解决办法。
基于不同复杂度提供多种巧妙的解决方法。
覆盖所有竞争性考试的主题。
囊括数据结构和算法的面试问题。
可作为大学本科生或硕士研究生课程的预习教材。
可为IT顶尖公司(微软、谷歌、亚马逊、雅虎、甲骨文、脸谱、苹果等)的求职者提供指导。
在尼赫鲁科技大学获得计算机科学学士学位,在印度理工学院孟买分校获得计算机科学硕士学位。他是亚马逊印度公司资深的软件开发工程师,之前曾就职于IBM和微软公司。他善于用轻松、浅显的方式编写技术书籍,其作品在亚马逊上深受好评。他曾在各种培训中心和大学教授数据结构和算法。
我知道许多读者往往不读前言,但是强烈建议你至少浏览一下本书前言,因为本书前言与众不同。
本书的主要目的不是提供关于数据结构和算法的定理及证明。本书采用的模式是利用不同的复杂度改善问题的解(对于每个问题,你将发现多个具有不同复杂度及降低复杂度的解法)。基本上,这一思路就是列举某个问题的所有可能解。通过这种方式,即使你遇到一个新问题,它也能够向你指明如何思考该问题所有可能的解。本书对于正在准备面试、参加选拔性考试以及校园面试的读者很有帮助。
作为一个求职者,如果你能完整地阅读本书并且很好地领会书中的内容,相信你会从容地面对面试官,这正是本书的目的所在。若作为一个教师来阅读本书,你将能够用简单的方法来提升授课质量,学生也会为选择攻读计算机科学/信息技术学位而感到欣慰。
作为准备参加计算机科学/信息技术专业选拔考试的学生,本书完整而详细地涵盖了所有必需的主题,在撰写本书时,就着眼于帮助正在准备这些考试的学生。
本书对攻读工程学位的学生和研究生都非常有用。在所有的章节中,你会发现本书更强调问题及其分析,而不是理论的阐述。每一章将首先阐述必要的理论基础,然后再给出问题集。书中大约有700个算法问题及相应的解。
对于许多问题,本书提供了多个具有不同复杂度的解决方法。我们从蛮力法开始,逐步引入问题的最佳解决方法。对于每一个问题,我们试图知晓算法所需的运行时间和内存空间。
建议读者至少完整地阅读本书一遍以便充分理解所有的主题。在随后的阅读中,你可以直接选择任何一章阅读和参考。即便经过足够的校阅,书中出现小纰漏也在所难免。如果发现了任何此类错误,wwwCarrerMonkcom网站将予以更新,请经常关注本网站以便及时了解任何勘误、新问题和解决方法。此外,请提供宝贵建议至Info@CarrerMonkcom。
祝愿你一切顺利。我相信你会发现本书很有用。
致谢
感谢我的父母,他们为我所做的一切无法衡量,是他们给予的无私的爱、提供的安定的成长环境和坚持不懈的传统价值观,教会了我赞美和拥抱生活。他们是这世界上最好的父母和榜样,他们使我明白信念、勤奋和决心能够让任何事成为可能!
本书的撰写得到了许多人的帮助,没有他们的帮助本书不可能完成。感谢他们为改进本书终稿所做出的努力。需要说明的是,我已经尽最大努力纠正了审稿人所指出的错误并准确地对各种协议和机制进行了描述。我个人对书中出现的任何其他错误负责。
首先,感谢那些在本书撰写过程中陪我度过难关的人,感谢所有给予我支持的人,感谢所有参与讨论、阅读、编写和提出宝贵意见的人,感谢所有允许我引用他们的评论并协助我编辑、校对和设计本书的人。特别地,我要感谢如下人员:
●Mohan Mullapudi,印度理工学院孟买分校,架构师,dataRPM PvtLtd
●Navin Kumar Jaiswal,资深咨询师,Juniper Networks Inc
●Kishore Kumar Jinka,印度理工学院孟买分校
●AVamshi Krishna,印度理工学院坎普尔分校,Mentor Graphics Inc
●Hirak Chatterjee,Yahoo Inc
●Kondrakunta Murali Krishna,科技学士,技术主管,HCL
●Chaganti Siva Rama Krishna Prasad,创始人,StockMonks PvtLtd
●Naveen Valsakumar,联合创始人,NotionPress PvtLtd
●Ramanaiah,讲师,龙树科技学院,MLG
最后,感谢Guntur Vikas学院主任YVGopala Krishna Murthy教授、Ayub Khan教授(ACE工程学院)、TRCBose(APTransco前任主任)、ChVenkateswara Rao VNR Vignanajyothi(工程学院,Hyderabad)、ChVenkata Narasaiah(IPS)、Yarapathineni Lakshmaiah (Manchikallu,Gurazala) ,以及所有在本项目期间帮助过我和家人的所有好心人。
——Narasimha Karumanchi
印度理工学院孟买分校理科硕士
CareerMonk.com创始人
计算机\数据结构
本书由曾供职于多家知名IT企业的资深软件架构师撰写,以Java为描述语言,介绍计算机编程中使用的数据结构和算法,覆盖相应竞争性考试的主题,目的不是提供关于数据结构和算法的定理及证明,而是强调问题及其分析,讲解必备知识和解题技巧。针对不同问题,列举多个具有不同复杂度的解决方法,汇集知名IT企业经典的编程面试题目并给出解题思路,为学生应试和软件开发人员面试提供有益指导。
本书主要特点:
所有代码用Java实现。
数据结构难点启发思考。
为每个问题列举可能的解决办法。
基于不同复杂度提供多种巧妙的解决方法。
覆盖所有竞争性考试的主题。
囊括数据结构和算法的面试问题。
可作为相关工作人员的参考手册。
作为大学本科生或硕士研究生课程的预习教材。
可为IT顶尖公司(微软、谷歌、亚马逊、雅虎、甲骨文、脸谱、苹果等)的求职者提供指导。
[印]纳拉辛哈·卡鲁曼希(Narasimha Karumanchi) 著:纳拉辛哈•卡鲁曼希(Narasimha Karumanchi)在尼赫鲁科技大学获得计算机科学科技学士学位,在印度理工学院孟买分校获得计算机科学科技硕士学位。他是亚马逊印度公司资深的软件开发工程师,之前曾就职于IBM和微软公司。他善于用轻松、浅显的方式编写技术书籍,出版了多部著作,其作品在亚马逊上深受好评,目前已被翻译为中文、韩文和日文等。他在各种培训中心和大学教授过数据结构和算法。
骆嘉伟 李晓鸿 肖正 吴帆 等译:暂无简介
数据结构是计算机科学与技术专业非常重要的一门核心基础课,计算机科学各个领域及各种应用软件都要使用相关的数据结构和算法。
作者编著本书的目的是使读者知晓数据结构和算法的设计原理和实现,而并非单纯地讲述定理及证明。为此,本书利用不同的复杂度来改善问题的解。对于许多问题,从穷举解法开始,逐步引入问题的最佳解,并给出算法所需的运行时间和空间。
全书包含4个部分,第一部分(第1~2章)主要描述抽象数据类型,给出算法的基本概念和复杂度分析与评价方法,并讨论几乎每章都要用到的递归和回溯技术。第二部分(第3~9章)介绍基本数据结构,包括链表、栈、队列、树、优先队列、堆、并查集和图,对于每一种数据结构分别采用多个实例进行具体的演示。第三部分(第10~15章)介绍数据处理的技术,包括排序、查找、选择、符号表、散列和字符串算法。第四部分(第16~21章)重点介绍一些常用的算法设计技术及应用,包括贪婪算法、分治算法、动态规划算法、复杂度类型,并讨论对于面试和考试的一些有用话题。本书强调问题及分析,而不侧重于理论。本书可作为高等院校计算机及其相关专业的数据结构课程的教材或教学参考书,同时也可以作为从事计算机研究与开发的技术人员的参考书,特别是对正在准备面试、参加选拔性考试以及校园面试的读者尤为有用。
本书的前言、第9~13章由骆嘉伟翻译,第2~5章、第15章由李晓鸿翻译,第16~21章由肖正翻译,第1章、第6~8章由吴帆翻译,第14章由朱宁波翻译。此外,梁成、夏艳、罗洪、张天伍、杨亦、齐逸也参与了部分翻译工作。
尽管我们从事数据结构和算法的教学和科研工作多年,在翻译过程中本着认真负责、力求精准的精神,但错误难免,希望广大读者批评指正。
译者
2015年12月于长沙
译者序
前言
第1章绪论1
11变量1
12数据类型1
13数据结构2
14抽象数据类型2
15什么是算法3
16为什么需要算法分析3
17算法分析的目的3
18什么是运行时间分析4
19如何比较算法4
110什么是增长率4
111常用的增长率4
112分析的类型5
113渐近表示6
114大O表示法6
115Ω表示法7
116Θ表示法8
117重要说明9
118为什么称为渐近分析9
119渐近分析指南9
120渐近表示法的性质11
121常用的对数和累加公式11
122分治法主定理12
123分治法主定理的相关问题12
124问题规模减小和递归求解主定理13
125问题规模减小和递归求解主定理的变型13
126猜测和确认的方法14
127平摊分析15
128算法分析的相关问题15
第2章递归和回溯28
21引言28
22什么是递归28
23为什么要用递归28
24递归函数的格式28
25递归和内存(可视化)29
26递归与迭代30
27递归说明30
28递归算法的经典用例30
29递归的相关问题31
210什么是回溯32
211回溯算法的经典用例32
212回溯的相关问题32
第3章链表34
31什么是链表34
32链表抽象数据类型34
33为什么要用链表35
34数组概述35
35链表、数组和动态数组的比较36
36单向链表36
37双向链表41
38循环链表46
39一种存储高效的双向链表51
310松散链表52
311链表的相关问题55
第4章栈72
41什么是栈72
42如何使用栈72
43栈抽象数据类型73
44异常73
45应用73
46实现73
47栈的各种实现方法比较77
48栈的相关问题78
第5章队列98
51什么是队列98
52如何使用队列98
53队列抽象数据类型99
54异常99
55应用99
56实现99
57队列的相关问题104
第6章树110
61什么是树110
62术语110
63二叉树111
64二叉树的遍历114
65通用树(N叉树)135
66线索(无栈或无队列结构)二叉树遍历141
67表达式树147
68异或树149
69二叉搜索树150
610平衡二叉搜索树164
611AVL树165
612树的其他形式178
6121红黑树178
6122伸展树179
6123增强树179
6124替罪羊树179
6125区间树180
第7章优先队列和堆181
71什么是优先队列181
72优先队列ADT181
73优先队列的应用182
74优先队列的实现182
75堆和二叉堆183
76二叉堆184
77优先队列(堆)的相关问题190
第8章并查集ADT201
81引言201
82等价关系和等价类201
83并查集ADT202
84应用202
85并查集ADT实现中的权衡202
86快速UNION实现(慢FIND)203
87快速UNION实现(快速FIND)206
88路径压缩208
89小结209
810并查集的相关问题209
第9章图算法211
91引言211
92术语211
93图的应用214
94图的表示214
95图的遍历217
96拓扑排序225
97最短路径算法226
98最小生成树231
99图算法的相关问题235
第10章排序256
101什么是排序256
102为什么需要排序256
103排序的分类256
104其他分类方法257
105冒泡排序257
106选择排序258
107插入排序259
108希尔排序261
109归并排序262
1010堆排序264
1011快速排序264
1012树排序266
1013排序算法比较267
1014线性排序算法267
1015计数排序267
1016桶排序268
1017基数排序268
1018拓扑排序269
1019外部排序269
1020排序的相关问题270
第11章查找279
111什么是查找279
112为什么需要查找279
113查找的类型279
114符号表和散列281
115字符串查找算法281
116查找的相关问题281
第12章选择算法(中位数)304
121什么是选择算法304
122基于排序的选择算法304
123基于划分的选择算法304
124线性选择算法——中位数的中位数算法305
125按照排序顺序查找K个最小元素305
126选择算法的相关问题305
第13章符号表314
131引言314
132什么是符号表314
133符号表的实现315
134符号表实现方法的比较315
第14章散列317
141什么是散列317
142为什么用散列317
143散列表ADT317
144散列的例子317
145散列的组成部分319
146散列表319
147散列函数319
148负载因子320
149冲突320
1410冲突解决技术320
1411分离链接法320
1412开放定址法321
1413冲突解决技术的比较322
1414散列如何达到O(1)的时间复杂度322
1415散列技术323
1416不适用散列表的问题323
1417布鲁姆过滤器323
1418散列的相关问题325
第15章字符串算法335
151引言335
152字符串匹配算法335
153蛮力法336
154RobinKarp字符串匹配算法336
155基于有限自动机的字符串匹配算法337
156KMP算法338
157BoyceMoore算法342
158存储字符串的数据结构342
159字符串的散列表实现342
1510字符串的二叉搜索树实现343
1511键树343
1512三叉搜索树345
1513二叉搜索树、键树和三叉搜索树的比较349
1514后缀树349
1515字符串的相关问题353
第16章算法设计技术361
161引言361
162分类361
163按实现方法分类361
164按设计方法分类362
165其他分类法363
第17章贪婪算法364
171引言364
172贪婪策略的定义364
173贪婪算法的要素364
174贪婪算法的适用范围365
175贪婪算法的优缺点365
176贪婪算法的应用365
177贪婪思想365
178贪婪算法的相关问题368
第18章分治算法375
181引言375
182分治策略的定义375
183分治法的适用范围375
184分治法的图形化描述375
185分治思想376
186主定理377
187分治法的应用377
188分治法的相关问题378
第19章动态规划算法390
191引言390
192动态规划策略的定义390
193动态规划策略的性质390
194动态规划的适用范围390
195动态规划的实现方法391
196动态规划算法的例子391
197动态规划思想391
198动态规划的相关问题396
第20章复杂度类型425
201引言425
202多项式/指数时间425
203决策问题的定义426
204决策过程426
205复杂度类型的定义426
206复杂度类型426
207归约428
208复杂度类型的相关问题430
第21章杂谈433
211引言433
212位运算的使用433
2121按位与操作433
2122按位或操作434
2123按位异或操作434
2124按位左移操作434
2125按位右移操作434
2126按位补操作434
2127检测第K位是否置位434
2128第K位置位435
2129第K位清零435
21210切换第K位435
21211切换值为1的最右位435
21212隔离值为1的最右位435
21213隔离值为0的最右位435
21214检查某个数是否是2的幂436
21215将某个数乘以2的幂436
21216将某个数除以2的幂436
21217找到给定操作数的模436
21218反转二进制数436
21219位值1的计数436
21220创建末尾位为0的掩码437
21221交换奇偶位438
21222不使用除法来计算平均数438
213其他编程问题438
参考文献442