做为Python小白,本人几个月前读完了Mark Lutz的1400页巨著《Learning Python》(太TM啰嗦了,读过的请举手),本打算继续学习下一步《Programming Python》, 但觉得基础过于薄弱,所以决定先找一本Python的算法书学习一下 。一方面可以打个扎实一点的数据和算法的基础,另一方面可以进一步熟悉一下Python语言和代码。

想法可嘉,但是问题很快来了,选哪本算法书呢?反正书都不贵,最后除了本文的主角书目,作者还买了其他几本相关书籍:

  1. 《数据结构与算法 Python语言实现》-- Goodrich, Tamassia, Goldwasser; 译者 张晓,赵晓南 (以下按作者名字简称GTG)
  2. 《Python 算法教程》-- 由大神Magnus Hetland撰写(也就是Python基础教程的作者)
  3. 《图解数据结构–使用Python》-- 吴灿铭
  4. 《你也能看得懂的Python算法书》-- 王硕等
  5. 《算法》-- Sedgewick (早两年为了显摆买的,买来才发现是Java写的,褶子了!)

经过三个月的时间,作者完整阅读了GTG这本书,将书中代码全部手敲一遍,并进行了实施。其他的几本也或多或少地翻阅了一些,下面分享一下学习心得。

  1. GTG这本书中的算法种类非常完善,和Sedgewick的内容高度一致。其中对树的遍历,优先级队列,堆(尤其是基于堆的优先级队列),映射和哈希,搜索树(二叉树,平衡树,AVL,2-4树,红黑树),文本处理,都有非常深入的解释和代码。但最后的关于图的一章感觉比较单薄,止于Dijkstra, Prim-Jarnik, Kruskal算法,不太过瘾。
  2. GTG使用的是图解算法过程,主要算法都配上了分步过程图,非常易懂,这一点可以和Sedgewick媲美。吴灿铭老师的版本在图解上做得也很好。相比起来,大神Hetland的版本可以算惜墨如金了,既不肯多花文字,也不肯多配图,有点 “智商过160再来看我的书” 的意思,很伤自尊。对于算法实现,Hetland的代码更是少之又少,确实牛B,但读起来太吃力,放弃了。
  3. 下面这段是重点 : 读GTG最大的感受,是里面的代码是真正的面向对象编程,并且代码本身非常的Pythonic(忠实于Python的风格)。何出此言呢?这是因为,基本上每个算法,GTG的作者都将其写成一个类(Class),同时将查询、插入,删除、排序、遍历等功能写成类下面的方法(method). 换句话说,GTG把每个算法都写成了一个工具。这些工具的使用方式,和Python的built-in函数功能类似。相比起来,国内作者这几个版本,更倾向于以函数的形式,短平快地把算法表达出来,代码行数较少;对于类的使用,往往局限于对Node之类的简单定义。然而,这个方式的问题在于,代码的可复用性、可扩展性不强。感觉这也是国内码农的一个普遍风格:快速解决问题,不注重可复用性。可惜的是,这无法体现出OOP的优势。
  4. GTG中前面章节中实施的类,在后面章节中经常被再次引用实施。比如第七章中的链接队列(LinkedQueue)在第八章 ‘树’ 的类建立中被继承使用,而第九章基于堆的优先队列(Heap Priority Queue), 在最后一章图的Kruskal中被再次使用。等等。这个方式,可以让读者更深刻地理解链表,栈,堆,队列,映射,树,图等算法和类之间的关联。
  5. 再有,相比起来,国内几部算法书的代码,明显不够Pythonic, 能感觉出作者在用C或C++的方式写Python代码。举个栗子:a和b两个变量的交换赋值,国内作者一般是:temp=a; a=b; b=temp;其实Python代码应该是酱婶儿的:a, b = b, a (Guido: 我就问你服不服)
  6. 《你也能看懂的Python算法书》,比较适合学校孩子们入门兴趣使用,家长们可以关注一下。但此书不甚严谨,对专业人员可能用处不大,比如里面用List/Array来实现/解释链表,感觉有点南辕北辙。吴灿铭的《图解数据结构–使用Python》更适合大学阶段的学生使用,对国内读者来说,可能比GTG更容易理解。

下面再说说GTG的一些问题:

  1. GTG中所有的代码,只给到类,但不给任何实例化(instantiation)的过程。作者网站上的代码,只有极个别的情况给出if __name__ == '__main__: 的代码 。因此,读者应该耐着性子自己进行代码实施。本人感觉这样对理解书中内容帮助更大。实施时,建议使用Jupyter Notebook, 这样反复修改、试验、运行代码非常快捷。
  2. 其次,GTG的类代码中,很多情况下没有给出__str__, __repr__, 或__iter__等特殊方法,造成代码运行后,不易看到数据结构及其成员的变化;比如在红黑树中,看不到再平衡后每个节点的红黑信息以及父节点信息,不方便和书中分步骤配图逐一比对变化过程,这些都需要读者自己添加代码。
  3. 由于GTG由三个作者完成,因此各章的写作风格和易理解程度不尽相同。比如,在文本处理的中的KMP算法,就讲得不明不白,搞得人好恼火!还有几个地方也出现了类似情况。怎么办:答案是去网上找关于此算法的视频和文章。除了CSDN,本人去油管上听了知名印度大叔Abdul Bari还有Tushar Roy的视频,非常有帮助。话题扯开,话说网上充满了印度兄弟们用英文进行的各种算法和计算机讲座,难怪硅谷那么多印度裔CEO。国内的同学们,不要讨论要不要学英语了,而是讨论怎么学吧。这一点上印度兄弟们语言优势太明显了。
  4. 最后,这本书翻译的质量还是不错的,但是个别地方需要和原文对照着看才能理解,并且代码中的英文批注并未翻译。作者英文没有障碍,感到对照原著阅读还是非常有帮助的。
  5. 书中习题很多,因本人只是为了了解算法和熟悉Python语言,并未做题,所以此部分不做评论。

《数据结构与算法 Python语言实现》书评与学习心得相关推荐

  1. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

  2. 《数据结构与算法 Python语言描述》 读书笔记

    已经发布博客 <数据结构与算法 Python语言描述> 读书笔记 第二章 抽象数据类型和Python类 2.1 抽象数据类型abstract data type:ADT 2.1.1 使用编 ...

  3. 数据结构与算法python语言实现-第四章答案

    数据结构与算法python语言实现-第四章答案 4.1 def findmax(S, index=0):if index == len(S) - 1:return S[index]max=findma ...

  4. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  5. mooc数据结构与算法python版第十一周作业_中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南...

    中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南 更多相关问题 [判断题]实际集成运放的上限截止频率为无穷大 [多选题]现代城市的发展凸现出与以往不同的动力机制包括 教师在引 ...

  6. python数据结构题目_《数据结构与算法Python语言描述》习题第二章第三题(python版)...

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

  7. 数据结构与算法python语言实现答案_数据结构与算法:Python语言实现 源代码 PPT 练习答案 源码.zip...

    1 60660-数据结构与算法:Python语言实现[练习答案]Solutions Manual.rar 943.25 KB 2018/11/1 12:03:34 2 __MACOSX 0 Bytes ...

  8. 数据结构与算法 Python语言描述 笔记

    数据结构 线性表包括顺序表和链表,python的list是顺序表,链表一般在动态语言中不会使用.不过链表还是会出现在各种算法题中. 链表 link list 单链表 逆转链表: leetcode 20 ...

  9. 数据结构与算法Python语言实现《Data Structures Algorithms in Python》手写课后答案--第十一章

    第十一章 本章叙述了不同平衡树的构造性能问题 习题代码如下(部分代码引用书中源代码,源代码位置目录在第二章答案中介绍) #11.1 #(1,A) # \ # (2,B) # \ # (3,C) # \ ...

最新文章

  1. 【数据结构总结】第七章 查找
  2. 概率与统计在计算机应用,计算机技术在概率论和数理统计中的应用
  3. HDOJ1860 ( 统计字符 ) 【水题】
  4. 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
  5. Wireshark文档阅读笔记-TCP 4 times close解析与实例
  6. Log4j2进阶使用(按大小时间备份日志)
  7. 使用.net开发手机管理软件(一至三)
  8. [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作
  9. 故障转移集群仲裁盘_MongoDB负载均衡、故障转移及海量数据应对方案
  10. phoenixframework 自动化测试平台 1.4.8 版本发布
  11. HDOJ(HDU) 2123 An easy problem(简单题...)
  12. html个人博客完整代码_Spring Cloud Alibaba迁移指南1:零代码从Eureka迁移到Nacos
  13. JS数组 团里添加新成员(向数组增加一个新元素)只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素。myarray[5]=88;...
  14. python爬虫爬取英文考研词汇
  15. 微信公众号授权H5页面
  16. C# 重新启动计算机
  17. 艺多不压身 -- 目录
  18. 焦作网络赛K. Transport Ship
  19. archlinux什么桌面好_ArchLinux搭建高效便捷的平铺式桌面
  20. 解码方法( dfs | dp )

热门文章

  1. 使用C语言的七个步骤
  2. 亿图图示EDraw Max,云的跨端思维导图
  3. 宁夏中卫市:新一代云计算走向世界
  4. win10卸载AVG AntiVirus Free
  5. 计算机系统安全启动,关闭电脑的安全启动项( Secure Boot )
  6. 多DZ和UC同步登陆状态(支持HTTPS,PHP7.4.3)
  7. pxtorem插件配置
  8. mysql中如何批量删除冗余数据库,删除WordPress数据库中的多余冗余数据
  9. 一个站点不够学?那就在用Python增加一个采集目标,一派话题广场+某金融论坛话题广场爬虫
  10. Android移动开发——全方面分析 Hilt 和 Koin 性能