从零开始学算法(基于Python)

作者
李峰
丛书名
CDA数字化人才系列丛书
出版社
电子工业出版社
ISBN
9787121422416
简要
简介
内容简介 本书的目的是帮助初学者掌握编程中的基础算法,并通过Python语言进行实战演练,通过即学即练的方式掌握这些经典算法,让读者真正体会算法的美妙,成为读者学习算法的领路人。本书分为8章,涵盖的主要内容有算法之美,通过生活中的例子学习算法;贪心算法,选择当前的方案;分而治之算法,将复杂的问题拆分为简单的问题;树算法,围绕树结构的各种算法;图算法,围绕图结构的各种算法;动态规划,一种求解问题的强大工具;回溯法,深度优先遍历问题的解空间;分支限界法,广度优先遍历问题的解空间。
目录


第1章 算法之美\t1

1.1 生活中的算法——猜数游戏\t1

1.1.1 好玩的猜数游戏\t2

1.1.2 游戏的秘密——二分搜索技术\t2

1.1.3 猜数游戏算法实现\t4

1.2 算法的指标——空间复杂度和时间复杂度\t6

1.2.1 时间复杂度\t6

1.2.2 空间复杂度\t9

1.3 经典算法回顾——排序算法\t10

1.3.1 冒泡排序\t10

1.3.2 简单选择排序\t14

1.3.3 直接插入排序\t19

1.4 怎样才能学好算法\t23

第2章 贪心算法\t24

2.1 短浅的眼光——贪心\t24

2.1.1 适当的贪心——坏事变好事\t25

2.1.2 过度贪心——赔了夫人又折兵\t25

2.1.3 为贪心加上限制\t25

2.2 美丽心灵——哈夫曼编码\t26

2.2.1 认识哈夫曼编码\t26

2.2.2 如何设计哈夫曼编码\t27

2.2.3 哈夫曼编码算法实现\t33

2.3 带你去旅行——单源短路径\t36

2.3.1 如何快到朋友家做客\t36

2.3.2 从短的条路开始分析\t37

2.3.3 找到抵达朋友家的短路径\t38

2.3.4 Dijkstra算法实现\t44

2.4 选择困难症——背包问题\t46

2.4.1 如何装沙子赚更多的钱\t47

2.4.2 海盗的智慧\t47

2.4.3 背包问题算法实现\t50

2.5 搬家师傅的烦恼——集装箱装载问题\t52

2.5.1 如何装更多的物品\t53

2.5.2 搬家师傅的十年经验\t53

2.5.3 装载问题算法实现\t55

第3章 分而治之算法\t58

3.1 纵横捭阖,各个击破——分而治之\t58

3.1.1 分而治之——把复杂的事情简单化\t59

3.1.2 可分可治,缺一不可\t59

3.1.3 合久必分,分久必合——治而合之\t60

3.2 真币和——伪币问题\t61

3.2.1 可恶的\t62

3.2.2 先对一半的硬币进行考虑\t62

3.2.3 找出硬币的规律\t64

3.3 再谈排序算法(1)——合并排序\t66

3.3.1 如何将分而治之思想应用到合并排序上\t67

3.3.2 先对一半的数字进行考虑\t67

3.3.3 合并排序算法实现\t70

3.4 再谈排序算法(2)——快速排序\t74

3.4.1 如何将分而治之思想应用到快速排序上\t74

3.4.2 找到一个“分”的中心\t75

3.4.3 快速排序算法实现\t79

3.4.4 排序算法总结\t81

3.5 累人的比赛——循环赛日程安排\t82

3.5.1 公平的比赛\t82

3.5.2 如何设计循环赛\t83

3.5.3 找出循环赛的排列规律\t86

第4章 树算法\t89

4.1 生活中的“树”\t89

4.1.1 炎黄子孙,生生不息\t90

4.1.2 学校的组织结构\t90

4.1.3 操作系统的结构\t91

4.2 一叶一菩提——二叉树的遍历\t92

4.2.1 什么是二叉树\t92

4.2.2 二叉树的前序遍历\t92

4.2.3 二叉树的中序遍历\t97

4.2.4 二叉树的后序遍历\t102

4.2.5 二叉树的平层遍历\t107

4.3 重建家谱图——二叉树的还原\t111

4.3.1 什么是二叉树的还原\t112

4.3.2 前序遍历和中序遍历还原家谱图\t113

4.3.3 中序遍历和后序遍历还原家谱图\t118

4.4 十年树木,百年树人——二叉树的高度\t123

4.4.1 什么是树的高度\t123

4.4.2 在树的遍历基础上增加高度信息\t124

4.4.3 遍历树获得高度信息\t126

4.5 寻根溯源——找到所有祖先结点\t128

4.5.1 什么是树的祖先\t128

4.5.2 在树的遍历基础上增加结点找到信息\t129

4.5.3 遍历树获得所有祖先\t131

第5章 图算法\t134

5.1 生活中的“图”\t134

5.1.1 城市的交通轨道\t135

5.1.2 人与人之间的关系\t136

5.1.3 互联网的连接\t136

5.2 寻找所有的城市——有向图的遍历\t137

5.2.1 什么是有向图\t137

5.2.2 有向图的深度优先遍历\t138

5.2.3 有向图的广度优先遍历\t144

5.3 短的管道——Kruskal算法\t149

5.3.1 如何铺设短的管道\t149

5.3.2 什么是小生成树\t150

5.3.3 Kruskal算法的贪心思想\t151

5.3.4 Kruskal算法实现\t156

5.4 再谈短的管道——Prim算法\t158

5.4.1 基于管道的边和结点贪心的区别\t159

5.4.2 Prim算法的贪心思想\t159

5.4.3 Prim算法实现\t162

5.5 多源短路径——Floyd算法\t164

5.5.1 朋友之间相互访问的短路径\t164

5.5.2 自上而下分析朋友之间的短路径\t165

5.5.3 自下而上迭代朋友之间的短路径\t166

5.5.4 Floyd算法实现\t172

第6章 动态规划算法\t176

6.1 长远的眼光——动态规划\t176

6.1.1 时间倒流,改变历史\t177

6.1.2 慎用贪心算法\t177

6.1.3 强者恒强,弱者恒弱——子结构\t178

6.2 智能的语言翻译——编辑距离\t178

6.2.1 设计语言翻译系统\t179

6.2.2 考虑后一次编辑情况\t180

6.2.3 自下而上进行距离编辑\t186

6.3 智能的电梯——电梯优化\t196

6.3.1 设计智能电梯\t196

6.3.2 先考虑后一次电梯停留的情况\t197

6.3.3 自下而上计算电梯的停留过程\t200

6.4 名字的相似度——长公共子序列\t208

6.4.1 外国人名的相似度\t208

6.4.2 考虑后一个字符比较情况\t209

6.4.3 自下而上进行距离编辑\t213

第7章 回溯法\t219

7.1 现代计算机的福音——回溯法\t220

7.1.1 让猴子打出《莎士比亚全集》\t220

7.1.2 一条路走到黑——深度遍历\t221

7.1.3 乱花渐欲迷人眼——搜索中的剪枝\t223

7.2 不能攻击的皇后——8个皇后问题\t224

7.2.1 一山不容二虎\t224

7.2.2 如何设计8个皇后的解向量\t226

7.2.3 搜索过程中的剪枝\t228

7.3 绝望的小老鼠——迷宫中的小老鼠\t241

7.3.1 上帝视角帮助小老鼠\t241

7.3.2 小老鼠如何进行搜索\t242

7.3.3 小老鼠的出逃之路\t248

7.4 再谈0/1背包问题\t253

7.4.1 背包问题回顾\t253

7.4.2 还可以使用贪心算法求解吗\t253

7.4.3 通过搜索求解背包问题\t255

7.5 再谈集装箱装载问题\t262

7.5.1 集装箱装载问题回顾\t263

7.5.2 使用贪心算法求解而存在的问题\t263

7.5.3 通过搜索求解装载问题\t264

第8章 分支限界法\t276

8.1 一步一个脚印——分支限界\t277

8.1.1 步步为营——广度遍历\t277

8.1.2 剪掉没有营养的分支\t279

8.1.3 条条大路通罗马——和回溯法的区别\t280

8.2 再谈迷宫中的小老鼠问题\t281

8.2.1 迷宫中的小老鼠问题回顾\t281

8.2.2 使用分支限界思路规划小老鼠的路径\t283

8.2.3 小老鼠的出逃之路\t287

8.3 三谈0/1背包问题\t291

8.3.1 0/1背包问题回顾\t292

8.3.2 使用分支限界的思路装船\t294

8.3.3 背包的搜索过程\t300

8.4 三谈集装箱装载问题\t305

8.4.1 集装箱装载问题回顾\t305

8.4.2 使用分支限界的思路装载集装箱\t307

8.4.3 集装箱的装载过程\t314

相关资源(PDF,TXT,电子书)

村网 国学鼎 数字追踪 车牌号查询 生活分享
桂ICP备20004708号-2