《数据结构与算法经典问题解析 Java语言描述》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:(印)纳拉辛哈·卡鲁曼希(Narasimha Karumanchi)著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2016
  • ISBN:9787111538455
  • 页数:443 页
图书介绍:本书以Java为描述语言,介绍了数据结构与算法的基本知识。书中结合企业界的工程实践提炼教学内容,特别对数据结构中易混淆的问题进行了梳理,对每一个问题提出不同的解决方案。本书是一本优秀的数据结构方面的教材。

第1章 绪论 1

1.1 变量 1

1.2 数据类型 1

1.3 数据结构 2

1.4 抽象数据类型 2

1.5 什么是算法 3

1.6 为什么需要算法分析 3

1.7 算法分析的目的 3

1.8 什么是运行时间分析 4

1.9 如何比较算法 4

1.10 什么是增长率 4

1.11 常用的增长率 4

1.12 分析的类型 5

1.13 渐近表示 6

1.14 大O表示法 6

1.15 Ω表示法 7

1.16 ?表示法 8

1.17 重要说明 9

1.18 为什么称为渐近分析 9

1.19 渐近分析指南 9

1.20 渐近表示法的性质 11

1.21 常用的对数和累加公式 11

1.22 分治法主定理 12

1.23 分治法主定理的相关问题 12

1.24 问题规模减小和递归求解主定理 13

1.25 问题规模减小和递归求解主定理的变型 13

1.26 猜测和确认的方法 14

1.27 平摊分析 15

1.28 算法分析的相关问题 15

第2章 递归和回溯 28

2.1 引言 28

2.2 什么是递归 28

2.3 为什么要用递归 28

2.4 递归函数的格式 28

2.5 递归和内存(可视化) 29

2.6 递归与迭代 30

2.7 递归说明 30

2.8 递归算法的经典用例 30

2.9 递归的相关问题 31

2.10 什么是回溯 32

2.11 回溯算法的经典用例 32

2.12 回溯的相关问题 32

第3章 链表 34

3.1 什么是链表 34

3.2 链表抽象数据类型 34

3.3 为什么要用链表 35

3.4 数组概述 35

3.5 链表、数组和动态数组的比较 36

3.6 单向链表 36

3.7 双向链表 41

3.8 循环链表 46

3.9 一种存储高效的双向链表 51

3.10 松散链表 52

3.11 链表的相关问题 55

第4章 栈 72

4.1 什么是栈 72

4.2 如何使用栈 72

4.3 栈抽象数据类型 73

4.4 异常 73

4.5 应用 73

4.6 实现 73

4.7 栈的各种实现方法比较 77

4.8 栈的相关问题 78

第5章 队列 98

5.1 什么是队列 98

5.2 如何使用队列 98

5.3 队列抽象数据类型 99

5.4 异常 99

5.5 应用 99

5.6 实现 99

5.7 队列的相关问题 104

第6章 树 110

6.1 什么是树 110

6.2 术语 110

6.3 二叉树 111

6.4 二叉树的遍历 114

6.5 通用树(N叉树) 135

6.6 线索(无栈或无队列结构)二叉树遍历 141

6.7 表达式树 147

6.8 异或树 149

6.9 二叉搜索树 150

6.10 平衡二叉搜索树 164

6.11 AVL树 165

6.12 树的其他形式 178

6.12.1 红黑树 178

6.12.2 伸展树 179

6.12.3 增强树 179

6.12.4 替罪羊树 179

6.12.5 区间树 180

第7章 优先队列和堆 181

7.1 什么是优先队列 181

7.2 优先队列ADT 181

7.3 优先队列的应用 182

7.4 优先队列的实现 182

7.5 堆和二叉堆 183

7.6 二叉堆 184

7.7 优先队列(堆)的相关问题 190

第8章 并查集ADT 201

8.1 引言 201

8.2 等价关系和等价类 201

8.3 并查集ADT 202

8.4 应用 202

8.5 并查集ADT实现中的权衡 202

8.6 快速UNION实现(慢FIND) 203

8.7 快速UNION实现(快速FIND) 206

8.8 路径压缩 208

8.9 小结 209

8.10 并查集的相关问题 209

第9章 图算法 211

9.1 引言 211

9.2 术语 211

9.3 图的应用 214

9.4 图的表示 214

9.5 图的遍历 217

9.6 拓扑排序 225

9.7 最短路径算法 226

9.8 最小生成树 231

9.9 图算法的相关问题 235

第10章 排序 256

10.1 什么是排序 256

10.2 为什么需要排序 256

10.3 排序的分类 256

10.4 其他分类方法 257

10.5 冒泡排序 257

10.6 选择排序 258

10.7 插入排序 259

10.8 希尔排序 261

10.9 归并排序 262

10.10 堆排序 264

10.11 快速排序 264

10.12 树排序 266

10.13 排序算法比较 267

10.14 线性排序算法 267

10.15 计数排序 267

10.16 桶排序 268

10.17 基数排序 268

10.18 拓扑排序 269

10.19 外部排序 269

10.20 排序的相关问题 270

第11章 查找 279

11.1 什么是查找 279

11.2 为什么需要查找 279

11.3 查找的类型 279

11.4 符号表和散列 281

11.5 字符串查找算法 281

11.6 查找的相关问题 281

第12章 选择算法(中位数) 304

12.1 什么是选择算法 304

12.2 基于排序的选择算法 304

12.3 基于划分的选择算法 304

12.4 线性选择算法——中位数的中位数算法 305

12.5 按照排序顺序查找K个最小元素 305

12.6 选择算法的相关问题 305

第13章 符号表 314

13.1 引言 314

13.2 什么是符号表 314

13.3 符号表的实现 315

13.4 符号表实现方法的比较 315

第14章 散列 317

14.1 什么是散列 317

14.2 为什么用散列 317

14.3 散列表ADT 317

14.4 散列的例子 317

14.5 散列的组成部分 319

14.6 散列表 319

14.7 散列函数 319

14.8 负载因子 320

14.9 冲突 320

14.10 冲突解决技术 320

14.11 分离链接法 320

14.12 开放定址法 321

14.13 冲突解决技术的比较 322

14.14 散列如何达到O(1)的时间复杂度 322

14.15 散列技术 323

14.16 不适用散列表的问题 323

14.17 布鲁姆过滤器 323

14.18 散列的相关问题 325

第15章 字符串算法 335

15.1 引言 335

15.2 字符串匹配算法 335

15.3 蛮力法 336

15.4 Robin-Karp字符串匹配算法 336

15.5 基于有限自动机的字符串匹配算法 337

15.6 KMP算法 338

15.7 Boyce-Moore算法 342

15.8 存储字符串的数据结构 342

15.9 字符串的散列表实现 342

15.10 字符串的二叉搜索树实现 343

15.11 键树 343

15.12 三叉搜索树 345

15.13 二叉搜索树、键树和三叉搜索树的比较 349

15.14 后缀树 349

15.15 字符串的相关问题 353

第16章 算法设计技术 361

16.1 引言 361

16.2 分类 361

16.3 按实现方法分类 361

16.4 按设计方法分类 362

16.5 其他分类法 363

第17章 贪婪算法 364

17.1 引言 364

17.2 贪婪策略的定义 364

17.3 贪婪算法的要素 364

17.4 贪婪算法的适用范围 365

17.5 贪婪算法的优缺点 365

17.6 贪婪算法的应用 365

17.7 贪婪思想 365

17.8 贪婪算法的相关问题 368

第18章 分治算法 375

18.1 引言 375

18.2 分治策略的定义 375

18.3 分治法的适用范围 375

18.4 分治法的图形化描述 375

18.5 分治思想 376

18.6 主定理 377

18.7 分治法的应用 377

18.8 分治法的相关问题 378

第19章 动态规划算法 390

19.1 引言 390

19.2 动态规划策略的定义 390

19.3 动态规划策略的性质 390

19.4 动态规划的适用范围 390

19.5 动态规划的实现方法 391

19.6 动态规划算法的例子 391

19.7 动态规划思想 391

19.8 动态规划的相关问题 396

第20章 复杂度类型 425

20.1 引言 425

20.2 多项式/指数时间 425

20.3 决策问题的定义 426

20.4 决策过程 426

20.5 复杂度类型的定义 426

20.6 复杂度类型 426

20.7 归约 428

20.8 复杂度类型的相关问题 430

第21章 杂谈 433

21.1 引言 433

21.2 位运算的使用 433

21.2.1 按位与操作 433

21.2.2 按位或操作 434

21.2.3 按位异或操作 434

21.2.4 按位左移操作 434

21.2.5 按位右移操作 434

21.2.6 按位补操作 434

21.2.7 检测第K位是否置位 434

21.2.8 第K位置位 435

21.2.9 第K位清零 435

21.2.10 切换第K位 435

21.2.11 切换值为1的最右位 435

21.2.12 隔离值为1的最右位 435

21.2.13 隔离值为0的最右位 435

21.2.14 检查某个数是否是2的幂 436

21.2.15 将某个数乘以2的幂 436

21.2.16 将某个数除以2的幂 436

21.2.17 找到给定操作数的模 436

21.2.18 反转二进制数 436

21.2.19 位值1的计数 436

21.2.20 创建末尾位为0的掩码 437

21.2.21 交换奇偶位 438

21.2.22 不使用除法来计算平均数 438

21.3 其他编程问题 438

参考文献 442