• 从零开始学算法(基于Python)
21年品牌 40万+商家 超1.5亿件商品

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

批量上传,套装书可能不全,下单前咨询在线客服! 正版书 !!!

53.54 4.9折 109 全新

库存3件

四川成都
认证卖家担保交易快速发货售后保障

作者李峰

出版社电子工业出版社

ISBN9787121422416

出版时间2022-01

装帧平装

开本其他

定价109元

货号29361085

上书时间2024-10-20

百叶图书

已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
前言

前言

这个技术有什么前途

随着计算机编程人员的不断增多,公司面试要求也越来越高,而算法无疑是面试官喜欢考察的内容之一,学好算法是面试者或程序员应具备的基本能力;在面试的过程中,面试官通常也会考查面试者的编程能力。现在流行的编程语言无疑是Python,本书不仅帮助初学者掌握算法,而且通过Python语言进行实战演练,让读者在理解算法的同时掌握Python,提升读者的综合竞争力。

作者的使用体会

我也是从学生时代一路走来的,深知算法对编程者的重要性,也知道对于一名普通的初学者来说,算法入门是多么不容易。算法并不神秘,算法就在我们身边,我们的吃喝住行样样离不开算法,我们吃的饭菜的烹饪顺序,喝的饮料的配方,房子里使用的扫地机器人的扫地路径,开车规划的短路线等,都充斥着大量美妙的算法。算法种类繁多,给人“乱花渐欲迷人眼”的感觉,让很多初学者望而却步,其实算法本质上是有规律可循的,掌握这些规律,就会有一种“初极狭,才通人,复行数十步,豁然开朗”的感觉。我愿意把自己对算法的理解和掌握的规律分享给读者,希望读者通过本书能对算法也有一种“豁然开朗”的感觉,真正体会到算法的美妙。

本书的特色

本书描述的都是算法中的一些经典问题、经典解法,读者在学习的时候往往会惊叹这些算法设计得巧妙,会思考这些算法是怎么被想到的。其实这些算法都经过了严格的数学证明,但是证明过程对于初学者来说很难理解,如果深挖下去,不但会花费很多时间,而且还会把自己绕进去。本书从实际出发,省略掉令人乏味的数学证明,通过形象生动的图解演示整个算法过程,目的是让读者形象地了解算法的整个运行过程,加深记忆。再遇到类似问题,读者可以像求解数学题一样,触类旁通,用已经掌握和学习了的经典算法解决遇到的新问题。求解问题流程如下图所示。

求解问题流程

本书不仅描述算法的流程,而且还配以大量的Python实战演练,因为算法的设计和实现不应该被分割。有些面试者在面试的时候,可以将算法的原理讲得头头是道,但是一旦面试官让其将算法通过程序实现出来,就会出现无法下笔或者实现出来的程序和自己设计的算法不一致的情况。这主要是因为算法从设计到实现还需要一个大量训练的过程,如果只是训练算法的设计而忽略了算法的实现,那么对于程序员来说就相当于跛着脚走路,所以我建议初学者在理解算法以后要进行大量的实际编程,在编程中领悟算法。本书基于以上观点,在介绍完算法以后,会配以可执行的程序,通过程序的实际结果来验证算法的正确与否,让读者在理解算法的同时进行实战训练,加深对算法的理解,填补算法设计和算法实现之间的沟壑。

本书主要内容

本书主要讲解了7种常用的算法,分别是贪心算法、分而治之算法、树算法、图算法、动态规划、回溯法和分支限界法。

  • 贪心算法。“贪心”又名“贪婪”,是求解化问题的一种算法,在求解问题时,贪心算法是直观和容易理解的。事物是具有两面性的,当前的并不一定是终结果的,所以贪心算法并不能保证有答案,但是常常可以帮助我们得到接近答案的答案。
  • 分而治之算法。顾名思义,先“分”而后“治”,“分”就是将整体划分成部分,“治”就是先求解部分问题,每个部分问题都解决了,整体也就解决了,“天下难事,必作于易;天下大事,必作于细”,只要事物达到了一定的规模,就需要不断地拆分,然后求解。
  • 树算法。树结构是一个非常重要的数据结构,树结构在现实生活中随处可见,如家谱、公司组织结构、操作系统的目录等,围绕着树结构也有各种各样的算法,掌握这些算法以后处理树结构问题就可以得心应手。
  • 图算法。图结构也是一个非常重要的数据结构,图结构在现实生活中也随处可见,如城市的交通轨道、人际关系、互联网等,围绕着图结构也有各种各样的算法,掌握这些算法以后处理图结构问题也就可以得心应手了。
  • 动态规划。动态规划是比贪心算法更加强大、通用的求解化问题的工具。在用动态规划算法对问题求解时,从整体上加以考虑是“目光长远”的,其从终结果的解不断反推前面决策的。人们一旦学会了动态规划,无疑就掌握了一种求解问题的利器。
  • 回溯法。通过深度优先搜索对待选解决方案进行系统的检查,在搜索的过程中去除不必要的搜索,极大地减少了程序的整个搜索时间,保证了在有限的时间内找到问题的答案。
  • 分支限界法。通过广度优先搜索对待选解决方案进行系统的检查,在搜索的过程中去除不必要的搜索,极大地减少了程序的搜索时间,保证了在有限的时间内找到问题的答案。

本书读者对象

  • 算法初学者
  • Python程序员等其他编程爱好者
  • 各计算机专业的大中专院校学生
  • 需要算法入门工具书的人员
  • 其他对算法有兴趣的人员


导语摘要

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



作者简介
李峰,本硕均就读于西北工业大学计算机学院,曾在韩国成均馆大学交流半年,CSDN博客专家,现就职于腾讯科技有限公司任高级工程师,工作期间,技术成果丰硕,多次获奖。

目录
目录

第1章  算法之美1

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

1.1.1  好玩的猜数游戏2

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

1.1.3  猜数游戏算法实现4

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

1.2.1  时间复杂度6

1.2.2  空间复杂度9

1.3 经典算法回顾——排序算法10

1.3.1  冒泡排序10

1.3.2  简单选择排序14

1.3.3  直接插入排序19

1.4 怎样才能学好算法23

第2章  贪心算法24

2.1 短浅的眼光——贪心24

2.1.1  适当的贪心——坏事变好事25

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

2.1.3  为贪心加上限制25

2.2 美丽心灵——哈夫曼编码26

2.2.1  认识哈夫曼编码26

2.2.2  如何设计哈夫曼编码27

2.2.3  哈夫曼编码算法实现33

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

2.3.1  如何快到朋友家做客36

2.3.2  从短的条路开始分析37

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

2.3.4  Dijkstra算法实现44

2.4 选择困难症——背包问题46

2.4.1  如何装沙子赚更多的钱47

2.4.2  海盗的智慧47

2.4.3  背包问题算法实现50

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

2.5.1  如何装更多的物品53

2.5.2  搬家师傅的十年经验53

2.5.3  装载问题算法实现55

第3章  分而治之算法58

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

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

3.1.2  可分可治,缺一不可59

3.1.3  合久必分,分久必合——治而合之60

3.2 真币和——伪币问题61

3.2.1  可恶的62

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

3.2.3  找出硬币的规律64

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

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

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

3.3.3  合并排序算法实现70

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

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

3.4.2  找到一个“分”的中心75

3.4.3  快速排序算法实现79

3.4.4  排序算法总结81

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

3.5.1  公平的比赛82

3.5.2  如何设计循环赛83

3.5.3  找出循环赛的排列规律86

第4章  树算法89

4.1 生活中的“树”89

4.1.1  炎黄子孙,生生不息90

4.1.2  学校的组织结构90

4.1.3  操作系统的目录结构91

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

4.2.1  什么是二叉树92

4.2.2  二叉树的前序遍历92

4.2.3  二叉树的中序遍历97

4.2.4  二叉树的后序遍历102

4.2.5  二叉树的平层遍历107

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

4.3.1  什么是二叉树的还原112

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

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

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

4.4.1  什么是树的高度123

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

4.4.3  遍历树获得高度信息126

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

4.5.1  什么是树的祖先128

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

4.5.3  遍历树获得所有祖先131

第5章  图算法134

5.1 生活中的“图”134

5.1.1  城市的交通轨道135

5.1.2  人与人之间的关系136

5.1.3  互联网的连接136

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

5.2.1  什么是有向图137

5.2.2  有向图的深度优先遍历138

5.2.3  有向图的广度优先遍历144

5.3 短的管道——Kruskal算法149

5.3.1  如何铺设短的管道149

5.3.2  什么是小生成树150

5.3.3  Kruskal算法的贪心思想151

5.3.4  Kruskal算法实现156

5.4 再谈短的管道——Prim算法158

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

5.4.2  Prim算法的贪心思想159

5.4.3  Prim算法实现162

5.5 多源短路径——Floyd算法164

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

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

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

5.5.4  Floyd算法实现172

第6章  动态规划算法176

6.1 长远的眼光——动态规划176

6.1.1  时间倒流,改变历史177

6.1.2  慎用贪心算法177

6.1.3  强者恒强,弱者恒弱——子结构178

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

6.2.1  设计语言翻译系统179

6.2.2  考虑后一次编辑情况180

6.2.3  自下而上进行距离编辑186

6.3 智能的电梯——电梯优化196

6.3.1  设计智能电梯196

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

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

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

6.4.1  外国人名的相似度208

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

6.4.3  自下而上进行距离编辑213

第7章  回溯法219

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

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

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

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

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

7.2.1  一山不容二虎224

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

7.2.3  搜索过程中的剪枝228

7.3 绝望的小老鼠——迷宫中的小老鼠241

7.3.1  上帝视角帮助小老鼠241

7.3.2  小老鼠如何进行搜索242

7.3.3  小老鼠的出逃之路248

7.4 再谈0/1背包问题253

7.4.1  背包问题回顾253

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

7.4.3  通过搜索求解背包问题255

7.5 再谈集装箱装载问题262

7.5.1  集装箱装载问题回顾263

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

7.5.3  通过搜索求解装载问题264

第8章  分支限界法276

8.1 一步一个脚印——分支限界277

8.1.1  步步为营——广度遍历277

8.1.2  剪掉没有营养的分支279

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

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

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

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

8.2.3  小老鼠的出逃之路287

8.3 三谈0/1背包问题291

8.3.1  0/1背包问题回顾292

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

8.3.3  背包的搜索过程300

8.4 三谈集装箱装载问题305

8.4.1  集装箱装载问题回顾305

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

8.4.3  集装箱的装载过程314

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

主编推荐

李峰,本硕均就读于西北工业大学计算机学院,曾在韩国成均馆大学交流半年,CSDN博客专家,现就职于腾讯科技有限公司任高级工程师,工作期间,技术成果丰硕,多次获奖。



精彩内容

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

喜欢电影的人可能看过《加勒比海盗》这部电影,在电影中每个海盗都想获得无尽的财宝。我们假设一种场景,一伙海盗在岛上发现了一个沙矿,这座沙矿可以生产三种沙子:沙子A、沙子B和沙子C。三种沙子有不同的质量和价值,沙子B质量,价值也,沙子C质量小,价值也,沙子A的价值和质量在沙子B和沙子C之间。海盗的小船有承重限制,所有沙子的质量已经超过小船承重的极限,超过承重极限船就会浮不起来,所以不可能把所有沙子都装到船上。如果你是这伙海盗的首领,你想在不沉船的情况下,获得总价值的沙子,你会怎么装载呢?

2.4.1  如何装沙子赚更多的钱

你是这伙海盗的首领,带着大家辛辛苦苦、冒着生命的危险来到这座小岛上,找到了可以带来财富的沙子。但是你也不知道怎么用小船装沙子才能赚更多的钱,这时候你在内部开了一个会议集思广益,看看手下人有没有好的想法。

海盗甲:老大,我们首先应该选择质量小的沙子C装到船上,装完沙子C以后,再把质量次小的沙子A装到船上,后用沙子B装满小船,这样岛上只剩下沙子B啦,沙子A和沙子C都被我们装完了,赚的钱应该多。

海盗乙个站起来反对:老大,我觉得海盗甲说的不对,我们应该先装价值的沙子B,装完沙子B以后,再装价值次高的沙子A,直到小船装满,这样岛上只剩下价值的沙子C,价值的沙子A和沙子B都被我们装上船了,赚的钱肯定比海盗甲的方案多。

海盗丙推了推眼镜,轻轻说道:老大,他俩说的都不对,海盗甲只考虑了质量,没有考虑沙子的价值,海盗乙只考虑了沙子的价值,没有考虑沙子的质量,我认为选择沙子应该既考虑质量又考虑价值,我们应该首先选择单位价值的沙子,然后选择单位价值次高的沙子,这样赚的钱才会是多的。

听了三个小弟的建议,你也不知道谁的建议才是正确的,看着手下人都在等着你决定怎么搬沙子,你才发现做海盗还是要有知识、懂算法才行。海盗丙看出了你的心思,又推了推眼镜说道:老大,不要担心,你先听听我的分析,再来做决定。

2.4.2  海盗的智慧

海盗丙推了推眼镜继续说道:在这座小岛上,一共就有三种沙子,分别是沙子A、沙子B和沙子C,其质量分别是20、30、10,对应的价值分别为60、120、50,沙子B虽然价值,但是质量也,沙子C质量小,价值也。我们的小船可以装沙子的质量是50。因为沙子的种类也不是很多,我们直接分析就好了。下面我们按照海盗甲的思路来进行装载。

(1)因为小船的承重是50,首先我们把质量小的沙子C全部装到船上,沙子C的全部质量是10,装完沙子C以后,小船还能装载质量为40的沙子;

(2)然后把质量次小的沙子A全部装到船上,沙子A的全部质量是20,装完沙子A以后,小船还能承重20;

(3)后用沙子B装满小船,沙子B的总质量是30,装满小船以后,小岛上还剩下质量为10的沙子B,海盗甲的装载策略如图2.27所示。

图2.27  海盗甲的装载策略

通过海盗甲的方案,我们装在船上的沙子价值多少呢?船上沙子C的价值为50,沙子A的价值为60,沙子B总质量是30,船上只装了20,所以船上沙子B的价值是80。因此,按照海盗甲的方案,船上沙子的总价值是190。接下来我们按照海盗乙的策略来进行装载。

(1)因为小船的承重是50,首先我们把价值的沙子B全部装到船上,沙子B的全部质量是30,装完沙子B以后,小船还能装载质量为20的沙子;

(2)然后把价值次高的沙子A全部装到船上,沙子A的全部质量是20,装完沙子A以后,小船也装满了;

(3)因为小船装满了,价值的沙子C一丁点也没有装上船,海盗乙的装载策略如图2.28所示。

图2.28  海盗乙的装载策略

通过海盗乙的方案,我们装在船上的沙子价值多少呢?沙子B全部装上了船,所以沙子B总的价值为120,沙子A也全部装上了船,所以沙子A总的价值为60。因此,按照海盗乙的方案,船上沙子的总价值是180,比海盗甲的方案还少了10。后我们按照海盗丙的思路来进行装载。海盗丙的装载思路是按照单位价值的沙子进行依次装载,沙子A的总质量是20,总价值是60,所以单位价值是3;沙子B的总质量是30,总价值是120,所以单位价值是4;沙子C的总质量是10,总价值是50,所以单位价值是5。按照单位价值进行贪心,首先装载沙子C,然后装载沙子B,后装载沙子A。

(1)因为小船的承重是50,首先我们把单位价值的沙子C全部装到船上,沙子C的全部质量是10,装完沙子C以后,小船还能装载质量为40的沙子;

(2)然后把单位价值次高的沙子B全部装到船上,沙子B的全部质量是30,装完沙子B以后,小船还能装载质量为10的沙子;

(3)后用沙子A装满小船,沙子A的总质量是20,装完小船以后,小岛上还剩下质量为10的沙子A,海盗丙的装载策略如图2.29所示。

图2.29  海盗丙的装载策略

通过海盗丙的方案,我们装在船上的沙子价值多少呢?沙子C全部装上了船,所以沙子C总的价值为50,沙子B也全部装上了船,所以沙子B总的价值为120,沙子A总质量是20,船上只装了10,所以船上沙子A的价值是30。因此,按照海盗丙的方案,船上沙子的总价值是200,价值比海盗甲和海盗乙的方案都高一些。

海盗丙骄傲地对老大说:老大,三个方案都分析完了,海盗甲的方案价值是190,海盗乙的方案价值是180,我的方案价值是200,选哪个方案一目了然了吧!

听了海盗丙的分析,你满意地点点头,决定就按照海盗丙的方案来进行装船

   相关推荐   

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP