《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实现”只是整个拼图的一部分。我们所希望的是,读者能掌握其中的设计原则与理论基础,以便能设计出属于自己的算法与数据结构。

你可能感兴趣的:(python,数据结构与算法,java)