《Python算法教程》——第2章 基础知识 2.1 计算领域中一些核心理念

第2章 基础知识

Tracey:我不知道您在哪里。

Zoe:隐身术就是这样——您应该听说过的。

Tracey:我可不认为这属于基础知识。

——选自《Firefly》第14集台词

在我们将注意力转向本书主体内容,也就是那些数学技术、算法设计原则及经典算法之前,还必须先了解一些最基本的技术与原则。因为当您阅读到后续章节时,至少应该非常清楚类似“无反向环路的加权有向图”以及“Θ(n lg n)运行时间”这些词句所表达的具体含义。同时,我们也理应要对Python中一些基本数据结构的实现方式有个起码的了解。

幸运的是,这些基本问题并非都很难掌握。本章主要将聚焦于两个话题:首先是渐近记法(asymptotic notation),它主要关注的是运行时间的本质。再就是树(tree)与图(graph)这两种数据结构在Python中的实现方式。在这部分内容中,我们将为您介绍一些与程序运行时间有关的实用建议,以及应该如何避免一些基本的设计陷阱。不过,还是先让我们来看看应该如何在特定抽象机制中描述算法的行为吧。

2.1 计算领域中一些核心理念

20世纪30年代中期,英国数学家Alan Turing公开发表了一篇题为《On computable numbers, with an application to the Entscheidungsproblem》(其中译版为《论可计算数及其在判定问题上的应用》)的论文,这篇论文在许多方面都奠定了现代计算机科学的理论基础。如今,由他所提出的抽象设备——图灵机——已经成为了计算领域的理论核心。当然,这在很大程度上是因为该设备本身非常简单,而且容易掌握。图灵机是一种非常简单的抽象设备,它能读、能写,并且能沿着一条无限长的纸带移动。尽管图灵机有着各种不同的具体实现,但每种实现都可以被视为一台有限状态机:它由一个有限的状态集(包括已完成部分)与各种用于触发读写操作及不同状态切换的潜在符号共同组成。我们可以把它们看作这些机器运行所需要的一组规则(例如,“当我们在状态4的情况下遇到X,就向左移动一步,然后写入一个Y,并切换到状态9。”)。尽管这些机器看上去非常简单,但已经很让人惊叹了。因为有了它们,人们在计算领域就几乎无所不能了。

通常来说,所谓算法,实际上指的是一个执行过程,包含了能够解决某个特定问题的有限步骤集(其中可能包含了一些循环和条件元素)。而图灵机则是这个待解决问题的一种正规描述形式。这种形式通常被用于讨论解决该问题所需要的时间(这里既可以指整体时间,也可以指可接受的时间,相关内容将在第11章中详细讨论)。然而对于更细粒度上的算法效率分析来说,图灵机恐怕就不再是我们的首选了,因为这时候相较于可滚动的纸带,我们更需要的是一大块可直接存取的内存。于是随机存取机就应运而生了。

尽管随机存取机这种描述形式使用起来会有点儿复杂,但其实我们只需知道其能力极限在哪里,不至于让它影响我们的算法分析结果就可以了。简而言之,该机器是从标准单处理器计算机简化出来的一种抽象模型,它应该具备以下几个属性。

  • 该机器上不会有任何形式的并发执行,它只有在执行完一条指令后才能执行其他指令。
  • 该机器上的所有标准基本操作,如算术运算、比较运算以及内存存取,所耗费的时间都是常数级的(尽管具体数值上会有所不同),同时它也没有更复杂的基本操作,例如排序。
  • 尽管计算机字(即word,其大小通常等于我们在常数时间内所能读取的值)的字长是有限的,但必须足够大,大到能满足我们在解决问题过程中所有的内存编址的需求,此外还要加上一定比例的额外变量。

当然,在某些情况下,我们可能还会有一些更具体的要求,但就机器本身而言也就大致如此了。

现在,相信我们已经对算法是什么,以及运行它们的抽象硬件环境有了一点直观的认知。下面我们来谈谈整个概念拼图中的最后一块:问题。就我们的目标而言,问题其实指的是输入与输出之间所存在的某种关系。事实上,我们还可以说得更精确一些:这里所反映的是一组集合对之间的关系(数学意义上的)——在这里,对于输入来说,什么样的输出是可接受的——并且借由指定这种关系的过程,我们的问题就会被确定下来。以排序问题为例,我们可以将其视为A、B两个集合之间的关系。这两个集合分别由一组序列组成。除了描述具体的排序过程外(该过程就是算法),我们还需要指定对于一个给定的输入序列(集合A中的某个元素),什么样的输出序列(集合B中元素)是可接受的。我们可以规定结果序列必须由输入序列相同的元素组成,并且将以递增顺序排列(其中的每个元素始终大于或等于前一个元素)。在这里,集合A中的元素(输入序列)就被我们称为问题实例。由此可见,关系本身实际上就是我们的问题。

当然,想要让我们的机器有的放矢,我们还得对其输入进行0、1编码。尽管在这里,我们无须去关心那些编码的具体细节,但是其中的理念很重要,因为其运行时间复杂度(这正是下一节中所要介绍的)是基于知道了问题实例大小,这个大小可以简单看成编码它所需的内存大小。我们会发现,这通常与编码自身的确切属性没有太大关系。

时间: 2024-09-23 06:19:18

《Python算法教程》——第2章 基础知识 2.1 计算领域中一些核心理念的相关文章

《Python算法教程》——导读

前 言 这本书结合了我的三大爱好:算法.Python编程及诠释事物.对我来说,这三项都是美学问题--找出让事情尽善尽美的方法.这就需要我们首先去发现相关事物的精华所在,然后精雕细琢,使其发光发亮,或至少比原先要闪亮一些.当然,由于某些材料表面的杂质太多,加工的结果可能会有些不尽人意.但幸运的是,本书中所涉及的内容大多都是现成品,因为我所写的都是一些久负盛名的算法及其论证,采用的也是最受欢迎的编程语言之一.至于在诠释事物方面,我一直在努力试着让事情变得尽可能显而易见一些.但即便如此,我也肯定还有许

《ADOBE FIREWORKS CS5标准培训教材》——第1章 基础知识和基本操作1.1 关于Adobe Fireworks CS5

第1章 基础知识和基本操作 学习要点: 认识Fireworks CS5,并了解Fireworks CS5的新功能 熟练掌握在Fireworks CS5中创建.打开和保存Fireworks文档的操作 熟练掌握在Fireworks CS5中导入.优化和导出文档的操作 熟悉Fireworks CS5的工作环境 熟练掌握"工具"面板的使用 熟练掌握在Fireworks CS5中选择和修改对象的操作 Fireworks CS5相对于CS4版本表层功能并没有太大升级,但在软件性能方面却有极大提升.

《CCNP SWITCH 300-115学习指南》——第1章 基础知识回顾

第1章 基础知识回顾CCNP SWITCH 300-115学习指南在正式进入CCNP SWITCH这门针对园区网交换技术的课程之前,我们首先快速地回顾一遍CCNA中的相关知识点并简要地介绍其中部分技术,以便于本书内容的理解.由于这里提到的所有技术都是独立存在的,如生成树或虚拟LAN(VLAN),因此本章将这些基础知识汇总到一起进行复习,并且在后续章节中将不再重复类似的基础讲解. 如果读者十分了解交换术语,并对交换技术有着基本的认识,建议跳过此章,直接从第2章开始阅读. 本章涵盖如下CCNA基础交

以Python代码实例展示kNN算法的实际运用_基础知识

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. kNN方法在类别决策时,只与极少量的相邻样本有关.由于kNN方法主

《Python算法教程》——2.5 本章小结

2.5 本章小结 在本章,我们从一些重要的基本概念入手,定义了一系列略显松散的算法理念.抽象计算机及一些相关的问题.紧接着,我们讨论了两个主要话题,即渐近表示法与图结构.渐近记法主要用于描述一个函数的增长态势.它能让我们忽略掉那些不相干的加法或乘法常数,并聚集于问题的主体部分.这样一来,我们就可以根据一些显著特征,在某个抽象层次上对相关算法进行运行时间评估,而不用去操心既定实现中的那些具体细节.我们用三个希腊字母O .Ω与Θ来分别表示算法的上界.下界以及整体渐近边界,它们各自可以用来描述一个算法

《Python算法教程》——2.6 如果您感兴趣

2.6 如果您感兴趣 如果想了解有关图灵机以及计算领域方面更多基础知识的话,或许您会喜欢Charles Petzold写的那本<The Annotated Turing>.尽管该书在结构上依然只是Turing原始论文的一个注释版本,但其大部分内容实际上是Petzold本人对那些主要概念所做的诠释说明,里面含有大量的实例.总之,他对这个话题做了一个非常好的阐述.至于在计算领域的基础教科书方面,您可以看看Lewis与Papadimitriou合作的<Elements of the Theor

《Python算法教程》——1.4 本书主要内容

1.4 本书主要内容 本书大体结构如下. 第1章 引言:这章您目前已经读了大半了,主要是对本书内容做一个预览. 第2章 基础知识:这章主要涉及一些基本的概念与术语,以及一些基本的数学运算.除此之外,我们还会介绍一些比以往任何时候都要模糊的计算公式,并试图用它们来获取正确的结果.这就是所谓的渐近记法. 第3章 计数初步:这章会涉及更多数学运算--但这些运算真的很有趣,我保证!主要是一些用于算法运行时间分析的基本组合运算,以及对递归与递推关系的概念性介绍. 第4章 归纳.递归及归简:标题中的这三个词

《Python算法教程》——2.2 渐近记法

2.2 渐近记法 还记得第1章中那个拿append与insert做对比的例子吗?似乎是出于某种原因,当我们选择将相关元素项添加到list尾端时,其在应对list大小变化时的性能弹性要比在其首端插入要好一些(关于list,读者稍后可以参考黑盒子专栏中的相关内容).而且,这些内置操作通常还都是用C编写的.如果我们花点时间用纯Python重新实现一下list.append方法,(粗略)估计新版本会比原版本慢50倍左右.并且我们还可以做进一步估计,相较于这个较慢的.纯Python实现的append方法在

[Python学习] 专题三.字符串的基础知识

        在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础         字符串指一有序的字符序列集合,用单引号.双引号.三重(单双均可)引号引起来.如:         s1='www.csdn.net'   s2="www.csdn.net"   s3='''aaabbb'''         其中字符串又包括:        1.转义字符串         像C语言中定义了一些字母前加"\