《Python算法教程》——第1章 引言 1.1 这是一本怎么样的书

简介:

本节书摘来自异步社区《Python算法教程》一书中的第1章,第1.1节,作者[挪威]Magnus Lie Hetland(赫特兰), 凌杰 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第1章 引言

1.提出问题。

2.思考真正困难所在。

3.提出解决方案。

——摘自《The Feynman Algorithm》,Murray Gell-Mann著

让我们先来考虑一下下面这个问题:我们想要访遍瑞典境内所有的城市、小镇和村庄,然后再返回出发地点。显然,这段旅程肯定要耗费掉不少时间(毕竟我们要访问24 978个地方),因而我们希望能最小化该旅行路线。也就是说,我们既要能按计划逐个参观这些地方,又要尽可能地走出一条最短路线来。作为一个程序员,我们当然不屑于用手工方式来设计该路线,显然会更倾向于用写代码的方式来完成相关计划。然而,这似乎是一件不可能完成的任务。的确,想要写出一个针对少量城镇的简单程序并不难,但如果想要进一步用它来解决实际问题,相关的改进就会变得极其困难。这是为什么呢?

其实,早在2004年就已经有一个五人的研究团队发现了这个被称为瑞典之旅的问题,之后陆续有多个别的研究团队也都试图解决过这个问题,但是都失败了。该五人团队采用了一款带有智能优化技术的、能模拟交易技巧的软件,并将其运行在一组由96台机器(Xeon 2.6GHz)组成的工作站集群上。结果,该软件从2003年3月一直运行到2004年5月。最终不得不在打印出该问题的最佳解决方案之前被中止运行。因为综合各方面的因素,他们估计程序所需要的总CPU时间竟然长达85年!

下面再来思考一个类似的问题:我们想要在中国西部的喀什市到东海岸的宁波市之间找出一条最短路线。目前,中国境内有3 583 715千米长的公路和77 834千米长的铁路,之间有着数以百万计的路口可供我们考虑,其中可供选择的路线千千万万,难以估算。这个问题似乎与前一个问题是密切相关的,都是希望通过GPS导航和在线地图服务找出最短路线的规划问题,并且不能有太明显的滞后现象。也就是说,只要向您最爱的地图服务程序输入这两个城市,您就应该能在短时间内得到它们之间的最短路线。这又应该怎么做呢?

关于这些问题,读者将来都可以在本书中找到相关进一步的讨论。例如,第一个问题其实叫作旅行商问题(traveling salesman,或推销员问题(salesrep)),这将是本书第11章所要涵盖的内容。而所谓的最短路径问题(shortest path),则是第9章中所要介绍的内容。但我们更希望读者能从中学会如何深入分析问题的困难所在,并且掌握那些已被承认的、高效的知名解决方案。更为重要的是,我们将在本书中传授一系列常用的算法处理技术,及一些与计算机运算相关的问题,以便帮助读者熟练掌握书中所介绍的技术和算法,以及所演示的针对困难问题而提出的最接近期望值的解决方案。在这一章中,我们将对本书的主要内容做简单介绍——我们可以期望什么,我们应该期望什么。另外,我们还会列举本书各章节所要介绍的具体内容,以便读者可以直接跳到自己想阅读的内容附近。

1.1 这是一本怎么样的书

简而言之,这是一本为Python程序员解决算法问题的书。正如书上所说,它的内容涵盖相关的面向对象模式和一些常见问题的处理方式——也就是相关的解决方案。对于一个算法设计者,我们需要的不是简单地实现或执行一些现有算法的能力。相反,我们期望能拿出一个新算法——一个能解决一般性问题的、前人没有提过的全新解决方案。在本书中,我们要学习的就是此类解决方案的设计原则。

但这又不是一本传统意义上的算法书。毕竟,大部分这类题材的权威书籍(例如Knuth那部经典著作,或是由Cormen等人合著的那本标准教科书)都属于理论研究型的,显得有些过于严肃,尽管其中也不乏一些侧重于可读性的作品(例如Kleinberg与Tardos合写的书就是其中之一)。当然,我们在这里并不是要取代这些优秀的作品,而只是希望能在此基础上做一些补充。我希望利用自己多年的算法教学经验,尽可能清楚地为读者诠释算法的工作方式,以及一些需要共同遵守的基本原则。对于一个程序员来说,这种程度的诠释可能就已经足够了,读者需要有更多的机会去理解为什么相关的算法是正确的、如何将这些算法运用到他们所面对的新问题中去。但这就需要去阅读一些更形而上的、百科全书式的教科书。我希望这本书能为读者打下一定的基础,这将有助于他们理解相关的定理以及其相应的证明。

请注意:

这本书和其他算法书之间的一个区别是,我采用了谈话式的风格。虽然我希望这至少能吸引一些我的读者,但这可能不是您喜欢的风格。我们对此深感抱歉,但现在您已经至少被提醒了。

除此之外,市面上还有另一种算法类书籍。它们通常以“(数据结构与)算法(blank版)”为题,这里的blank通常为作者本人所使用的编程语言。有不少这样的书(而且似乎都是以blank=Java的情况为主),但其关注点多集中在与基本数据结构有关的东西上,以至于忽略了某些更为实质性的内容。如果说这是某一门数据结构基础课程的教科书,或许还可以理解,但对于Python程序员来说,学习单向或双向链表并不是一件能让所有人兴致勃勃的事情(尽管我们在下一章中还是会提到一些)。即便是哈希这样重要的技术,我们也可以通过Python中的字典类型免费获得相应的哈希表,完全不需要再去考虑重新实现它们。恰恰相反,我将注意力集中在更高级的一些算法。但这样一来,许多重要的概念在Python语言本身或标准库对相关算法(如查找、搜索、哈希等)的“黑盒”化实现中被淡化了。为此,我们在文中加入了一些特定的“黑盒子”专栏,以做补充。

当然,本书与那些“Java/C/C++/C#”算法流派还有一个显著的区别,即这里的blank为Python。这使得本书更接近那些与语言无关的算法书(例如Knuth、Cormon等人以及Kleinberg与Tardos的作品),这些书常常使用伪代码来说明问题。这实际上是一种侧重于可读性的伪编程语言,因而它不具备执行能力。而可读性正好是Python最显著的特点之一,因此它或多或少可以被视为是一种具有执行能力的伪代码。就算我们从没用过Python,也能看懂绝大部分Python程序。总之,这本书中代码示例都是高度可读的——我们不需要成为Python方面专家,也能轻松读懂这些示例(尽管有时候还是需要读者去查阅一些与内置函数有关的资料)。当然,您也可以把这些示例当作伪代码来理解。综上所述……

1.1.1 本书将主要涉及以下内容

  • 算法分析,主要侧重于渐近运行时间分析。
  • 算法设计的基本原则。
  • 如何用Python描述那些常用的数据结构。
  • 如何用Python实现那些知名算法。

1.1.2 本书还将简单或部分涉及以下内容

  • Python中直接可用的算法,它们通常是语言本身或其标准库的一部分。
  • 纯思想性及形而上的内容(尽管本书会对它们做一些证明,并提供相关的证明示例)。

1.1.3 本书不会涉足以下领域

  • 与数值计算或数学理论有关的算法(只有第2章中涉及了一些浮点运算)。
  • 并行算法与多核编程。

正如大家所知,“用Python实现”只是整个拼图的一部分。我们所希望的是,读者能掌握其中的设计原则与理论基础,以便能设计出属于自己的算法与数据结构。

相关文章
|
5天前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
16 3
|
4天前
|
存储 算法 搜索推荐
深度剖析 Python 算法:时间复杂度与空间复杂度的爱恨情仇,你站哪边?
【7月更文挑战第23天】在Python算法设计中,时间复杂度与空间复杂度如影随形,反映算法效率与资源消耗。时间复杂度揭示算法随输入规模增长的计算趋势,空间复杂度关注额外存储需求。找最大值示例中,两种实现均具O(n)时间与O(1)空间复杂度,但在排序等复杂场景下,如冒泡排序与快速排序,或哈希表与二叉树查找,权衡变得关键。实时系统偏好低时间复杂度算法,存储受限环境则需关注空间效率。最佳选择依应用场景而定,掌握二者平衡,方能编写高效代码。
|
3天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
【7月更文挑战第23天】在Python编程中,掌握算法复杂度—时间与空间消耗,是提升程序效能的关键。算法如冒泡排序($O(n^2)$时间/$O(1)$空间),或使用Python内置函数找最大值($O(n)$时间),需精确诊断与优化。数据结构如哈希表可将查找从$O(n)$降至$O(1)$。运用`timeit`模块评估性能,深入理解数据结构和算法,使Python代码更高效。持续实践与学习,精通复杂度管理。
22 9
|
2天前
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
【7月更文挑战第25天】在网络技术快速发展的背景下, Python因其简洁的语法和强大的库支持成为学习网络编程的理想选择。
14 5
|
4天前
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
21 7
|
4天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是幕后操控程序效率的双雄。时间复杂度反映算法执行时间随输入规模增长的速度,空间复杂度则计量算法运行时额外内存的使用。如顺序查找的时间复杂度O(n)与固定空间O(1),对比冒泡排序的O(n^2)时间和快速排序的O(n log n)时间优势,后者虽递归消耗空间,但在多数情况下提供更佳性能。根据需求,可权衡选择,如利用哈希表在充足内存下实现O(1)查找,或在空间受限时,偏好空间效率更高的算法,实现Python代码的高性能与优雅。
20 6
|
23小时前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
7 1
|
2天前
|
存储 算法 搜索推荐
揭秘!Python算法设计的隐形杀手:忽视时间复杂度与空间复杂度的后果有多严重?
【7月更文挑战第24天】在 Python 编程中, 算法设计是性能与效率的基石。忽视时间复杂度 (如使用 O(2^n) 的斐波那契数列递归算法而非 O(n) 的动态规划版本) 和空间复杂度 (如在插入排序中每次迭代都复制整个已排序数组, 导致 O(n^2) 的空间复杂度) 可能严重拖累程序。性能优化至关重要, 合理的算法设计保证程序高效稳定, 是攀登技术高峰的坚实阶梯。
|
1天前
|
算法 Python