《计算复杂性:现代方法》——导读

前 言

计算复杂性理论在过去三十多年中发展迅速。自1990年以来取得的出人意料的结果和基础性的结果本身就可以写出一部书。这些结果涉及的领域非常广泛,包括:经典复杂性类的概率型新定义(IP=PSPACE和各种PCP定理)以及它们在近似算法中的应用,肖尔(Shor)为量子计算机设计的整数因数分解算法,对人们目前处理著名的P?=NP问题 译文用“P?=NP”来表示原文中的“P versus NP”。——译者注的各种方法为什么未能获得成功的理解,去随机化理论和基于计算难度的伪随机性,以及随机性提取器和扩张图等伪随机对象的优美构造。

本书的目标就是为了在介绍复杂性理论经典结果的同时阐述近年来取得的新成果。写作本书的出发点是让它既可以作为教科书使用,也可以作为自学的参考书使用。这意味着我们在写作本书时必须兼顾广泛的读者。为实现这一目标,我们对全书进行了精心的设计。我们实际上还假设读者不具备关于计算的任何背景而且只具备附录A中概述的最少数学背景。我们为本书提供了一个网站http://www.cs.princeton.edu/theory/complexity 。网站上列出了相关的辅助材料,包括用本书作为教材时的详细教学计划、全书各个章节的草稿,以及涵盖相关主题的其他资源的超链接。全书始终强调各个概念在何种场合下是有用的,以及为什么这些概念要这样定义。在一些关键的定义上,我们还用一些例子进行了阐释。为了使行文流畅,我们力争尽可能少地引用参考文献。参考文献的引用有两种情况,其一是当前的结果用到了文献中的标准术语,其二是我们觉得为特定的结果提供一些历史信息将有助于阐明其动机和适用的场合。每章末尾有一个单独的注记小节,它简明扼要地讨论了更多的相关工作。当一个概念有多种定义时,我们会选择相对简单的定义;当一个结果有多种证明时,我们会选择能证得更具一般性的结论或者最优结论的证明。

全书分为三个部分。

第一部分:基本复杂性类。这个部分是对复杂性理论的广泛介绍。从图灵机的定义和可计算理论的基本概念开始,这个部分涵盖了各种基本的时间复杂性类和空间复杂性类,还包含了更现代的一些专题,包括概率算法、交互式证明、密码学、量子计算机和PCP定理及其应用。

第二部分:具体计算模型的下界。这个部分讨论在线路和判定树等具体计算模型上用算法求解各种计算任务所需的计算资源的下界。这些计算模型初看起来与图灵机有很大的区别,但更深入研究将得到它们与图灵机之间的有趣的相互联系。

第三部分:高级专题。这个部分主要是1980年以后人们在复杂性理论方面获得的进展。内容包括计数复杂性、平均复杂性、难度放大、去随机化和伪随机性、PCP定理的证明以及自然证明。

本书的每一章几乎都可以单独进行阅读,但是第1章、第2章和第7章不能跳过。正是这种设计,使得本书可以适用于下面各种不同的读者。

物理学家、数学家和其他科学家。这个读者群对计算复杂性理论越来越感兴趣,他们特别感兴趣的是那些高调的研究结果,例如肖尔算法(Shor algorithm)和最近取得的确定型素性测试算法。这个读者群的知识储备丰富,他们可以快速通读第一部分,然后迅速进入第二部分和第三部分,也可以单独阅读各个章节并找到理解当前研究结果所需的每个知识点。

本身不从事计算复杂性理论研究的计算机科学家。他们既可以用本书来自学,也可以将本书作为参考书,还可以用本书来讲授本科生或研究生的计算理论或计算复杂性理论课程。

从事计算复杂性理论研究或者打算从事这种研究的任何人,包括教授和学生。本书讲解最新研究结果和高级专题的详细程度可以让打算从事复杂性理论和相关领域研究的读者具有充足的知识储备。

本书可以作为如下几类课程的教科书。

本科生的计算理论课程。很多计算机科学系都用西普赛尔(Sipser)的书[Sip96]来为本科生开设计算复杂性理论这门课。本书可以用作对西普赛尔的教材在一些更现代的专题上的补充,这些专题包括概率算法、密码学和量子计算。相比于自动机理论和可计算理论的精细划分,本科生可能会发现这些专题更能令人耳目一新。所需的数学背景是能够比较自然地阅读数学证明以及离散数学知识,这些知识通常涵盖于“离散数学”或“计算机数学”等课程中,而目前多数计算机系都已经开设了这样的课程。

为高年级本科生和新入学的研究生开设的计算复杂性导论课程。本书还可以用来为计算机科学专业的高年级本科生和新入学的研究生开设计算复杂性导论课程,以替代1994年帕帕迪米特里奥(Papadimitriou)撰写的教材[Pap94](该书未包含很多最近的研究成果)。这门课程可以讲授第一部分的多数专题,再零星地讲授第二部分和第三部分的内容,并且假设学生具备了一定的算法知识和计算理论的知识。

研究生的计算复杂性课程。本书也可以作为研究生的计算复杂性课程的教材,以培养学生在复杂性理论或者算法和机器学习等相关领域开展研究的能力。这门课程可以用第一部分来复习基本知识,然后进入第二部分和第三部分的高级专题中。本书的内容多于一个学期的教学内容,网站上提供了这门课程的其他几种教学大纲。

研究生讨论班或高级课程。第二部分和第三部分中的各个独立章节都可以用于复杂性理论的讨论班和高级课程,比如关于去随机化、PCP定理和下界的讨论班或高级课程。

本书网站为这些课程提供了几种教学计划和素材。如果你在课程中采用了本书,我们乐意了解情况并得到你的反馈。我们要求你不要在网上发布本书习题的答案,这样其他人才可以用这些习题给学生留作业或出考题。

在写作本书的过程中,我们清醒地意识到我们不得不舍弃对一些重要结果的讲述。我们希望本书对其他教材的大量引用有助于读者的进一步阅读。同时,我们还计划对本书的网站进行周期性的更新,以帮助读者了解和浏览他们感兴趣的新结果。

最重要的是,我们希望通过本书将计算复杂性中激动人心的研究结果以及它们对其他学科的深刻影响传递给读者。

让我们一起为彻底解决P?=NP问题而努力吧!

目 录

[第0章 记号约定
0.1 对象的字符串表示](/)
0.2 判定问题/语言
0.3 大O记号
习题
[第一部分 基本复杂性类
第1章 计算模型——为什么模型选择无关紧要
1.1 计算的建模:你真正需要了解的内容](/)
1.2 图灵机
 1.2.1 图灵机的表达能力
1.3 效率和运行时间
 1.3.1 定义的健壮性
1.4 机器的位串表示和通用图灵机
 1.4.1 通用图灵机
1.5 不可计算性简介
 1.5.1 停机问题
 1.5.2 哥德尔定理
1.6 类P
 1.6.1 为什么模型选择无关紧要
 1.6.2 P的哲学意义
 1.6.3 P的争议和解决争议的一些努力
 1.6.4 埃德蒙兹的引言
1.7 定理1.9的证明:O(TlogT)时间的通用模拟
本章学习内容
本章注记和历史
习题
[第2章 NP和NP完全性
2.1 类NP](/)
 2.1.1 P和NP的关系
 2.1.2 非确定型图灵机
2.2 归约和NP完全性
2.3 库克勒维定理:计算的局部性
 2.3.1 布尔公式、合取范式和SAT问题
 2.3.2 库克勒维定理
 2.3.3 准备工作:布尔公式的表达能力
 2.3.4 引理2.11的证明
 2.3.5 将SAT归约到3SAT
 2.3.6 深入理解库克勒维定理
2.4 归约网络
[2.5 判定与搜索(/)
2.6 coNP、EXP和NEXP
 2.6.1 coNP
 2.6.2 EXP和NEXP
2.7 深入理解P、NP及其他复杂性类
 2.7.1 NP的哲学意义
 2.7.2 NP与数学证明
 2.7.3 如果P=NP会怎样
 2.7.4 如果NP=coNP会怎样
 2.7.5 NP和NP完全之间存在其他复杂性类吗
 2.7.6 NP难的处理
 2.7.7 更精细的时间复杂性
本章学习内容
本章注记和历史
习题
第3章 对角线方法
3.1 时间分层定理
3.2 非确定型时间分层定理
3.3 拉德纳尔定理:NP非完全问题的存在性
3.4 神喻机器和对角线方法的局限性
 3.4.1 逻辑独立与相对
本章学习内容
本章注记和历史
习题
第4章 空间复杂性
4.1 空间受限计算的定义
 4.1.1 格局图
 4.1.2 一些空间复杂性类
 4.1.3 空间分层定理
4.2 PSPACE完全性
 4.2.1 塞维奇定理
 4.2.2 PSPACE的本质:最佳博弈策略
4.3 NL完全性
 4.3.1 基于证明的NL定义:仅能读一次的证明
 4.3.2 NL=coNL
本章学习内容
本章注记和历史
习题
第5章 多项式分层和交错
5.1 类Σp2
5.2 多项式分层
 5.2.1 多项式分层的性质
 5.2.2 PH各层的完全问题
5.3 交错图灵机
 5.3.1 无限次交错
5.4 时间与交错:SAT的时空平衡
5.5 用神喻图灵机定义多项式分层
本章学习内容
本章注记和历史
习题
第6章 布尔线路
6.1 布尔线路和P/poly
 6.1.1 P/poly和P之间的关系
 6.1.2 线路的可满足性和库克勒维定理的另一种证明
6.2 一致线路
 6.2.1 对数空间一致线路族
6.3 纳言图灵机
6.4 P/poly和NP
6.5 线路下界
6.6 非一致分层定理
6.7 线路复杂性类的精细分层
 6.7.1 类NC和类AC
 6.7.2 P完全性
6.8 指数规模的线路
本章学习内容
本章注记和历史
习题
第7章 随机计算
7.1 概率型图灵机
7.2 概率型图灵机示例
 7.2.1 寻找中位数
 7.2.2 概率型素性测试
 7.2.3 多项式恒等测试
 7.2.4 二分图的完美匹配测试
7.3 单面错误和“零面”错误:RP、coRP、ZPP
7.4 定义的健壮性
 7.4.1 准确度常数的作用:错率归约
 7.4.2 期望运行时间与最坏运行时间
 7.4.3 使用比均匀硬币投掷更具一般性的随机选择
7.5 BPP同其他复杂性类之间的关系
 7.5.1 BPPP/poly
 7.5.2 BPPPH
 7.5.3 分层定理与完全问题
7.6 随机归约
7.7 空间受限的随机计算
本章学习内容
本章注记和历史
习题
第8章 交互式证明
8.1 交互式证明及其变形
 8.1.1 准备工作:验证者和证明者均为确定型的交互式证明
 8.1.2 类IP:概率型验证者
 8.1.3 图不同构的交互式证明
8.2 公用随机源和类AM
 8.2.1 私有随机源的模拟
 8.2.2 集合下界协议
 8.2.3 定理8.12的证明概要
 8.2.4 GI能是NP完全的吗
8.3 IP=PSPACE
 8.3.1 算术化
 8.3.2 #SATD的交互式协议
 8.3.3 TQBF的协议:定理8.19的证明
8.4 证明者的能力
8.5 多证明者交互式证明
8.6 程序检验
 8.6.1 具有验证程序的语言
 8.6.2 随机自归约与积和式
8.7 积和式的交互式证明
 8.7.1 协议
本章学习内容
本章注记和历史
习题
第9章 密码学
9.1 完全保密及其局限性
9.2 计算安全、单向函数和伪随机数产生器
 9.2.1 单向函数:定义和实例
 9.2.2 用单向函数实现加密
 9.2.3 伪随机数产生器
9.3 用单向置换构造伪随机数产生器
 9.3.1 不可预测性蕴含伪随机性
 9.3.2 引理9.10的证明:戈德赖希勒维定理
9.4 零知识
9.5 应用
 9.5.1 伪随机函数及其应用
 9.5.2 去随机化
 9.5.3 电话投币和比特承诺
 9.5.4 安全的多方计算
 9.5.5 机器学习的下界
本章学习内容
本章注记和历史
习题
第10章 量子计算
10.1 量子怪相:双缝实验
10.2 量子叠加和量子位
 10.2.1 EPR悖论
10.3 量子计算的定义和BQP
 10.3.1 线性代数预备知识
 10.3.2 量子寄存器及其状态向量
 10.3.3 量子操作
 10.3.4 量子操作实例
 10.3.5 量子计算与BQP
 10.3.6 量子线路
 10.3.7 传统计算是量子计算的特例
 10.3.8 通用操作
10.4 格罗弗搜索算法
10.5 西蒙算法
 10.5.1 定理10.14的证明
10.6 肖尔算法:用量子计算机实现整数分解
 10.6.1 ZM上的傅里叶变换
 10.6.2 ZM上的量子傅里叶变换
 10.6.3 肖尔的阶发现算法
 10.6.4 因数分解归约为阶发现
 10.6.5 实数的有理数近似
10.7 BQP和经典复杂性类
 10.7.1 量子
习题
第11章 PCP定理和近似难度简介
11.1 动机:近似求解NP难的优化问题
11.2 用两种观点理解PCP定理
 11.2.1 PCP定理与局部可验证明
 11.2.2 PCP定理与近似难度
11.3 两种观点的等价性
 11.3.1 定理11.5与定理11.9的等价性
 11.3.2 重新审视PCP的两种理解
11.4 顶点覆盖问题和独立集问题的近似难度
11.5 NPPCP(poly(n),1):由沃尔什哈达玛编码得到的PCP
 11.5.1 线性测试与沃尔什哈达玛编码
 11.5.2 定理11.19的证明
本章学习内容
本章注记和历史
习题
第二部分 具体计算模型的下界
第12章 判定树
12.1 判定树和判定树复杂性
12.2 证明复杂性
12.3 随机判定树
12.4 证明判定树下界的一些技术
 12.4.1 随机复杂性的下界
 12.4.2 敏感性
 12.4.3 次数方法
本章学习内容
本章注记和历史
习题
第13章 通信复杂性
13.1 双方通信复杂性的定义
13.2 下界方法
 13.2.1 诈集方法
 13.2.2 铺砌方法
 13.2.3 秩方法
 13.2.4 差异方法
 13.2.5 证明差异上界的一种技术
 13.2.6 各种下界方法的比较
13.3 多方通信复杂性
13.4 其他通信复杂性模型概述
本章学习内容
本章注记和历史
习题
第14章 线路下界:复杂性理论的滑铁卢
14.1 AC0和哈斯塔德开关引理
 14.1.1 哈斯塔德开关引理
 14.1.2 开关引理的证明
14.2 带“计数器”的线路:ACC
14.3 单调线路的下界
 14.3.1 定理14.7的证明
14.4 线路复杂性的前沿
 14.4.1 用对角线方法证明线路下界
 14.4.2 ACC Vs P的研究现状
 14.4.3 具有对数深度的线性线路
 14.4.4 线路图
14.5 通信复杂性方法
 14.5.1 与ACC0线路之间的联系
 14.5.2 与线性规模对数深度的线路之间的联系
 14.5.3 与线路图之间的联系
 14.5.4 卡奇梅尔维格德尔森通信游戏
与深度下界
本章学习内容
本章注记和历史
习题
第15章 证明复杂性
15.1 几个例子
15.2 命题演算与归结
 15.2.1 用瓶颈法证明下界
 15.2.2 插值定理和归结的指数下界
15.3 其他证明系统概述
15.4 元数学的思考
本章学习内容
本章注记和历史
习题
第16章 代数计算模型
16.1 代数直线程序和代数线路
 16.1.1 代数直线程序
 16.1.2 例子
 16.1.3 代数线路
 16.1.4 代数线路中类似于P、NP的复杂性类
16.2 代数计算树
 16.2.1 下界的拓扑方法
16.3 布卢姆舒布斯梅尔模型
 16.3.1 复数上的复杂性类
 16.3.2 完全问题和希尔伯特零点定理
 16.3.3 判定性问题——曼德勃罗集
本章学习内容
本章注记和历史
习题
第三部分 高级专题
第17章 计数复杂性
17.1 计数问题举例
 17.1.1 计数问题与概率估计
 17.1.2 计数可能难于判定
17.2 复杂性类#P
 17.2.1 复杂性类PP:类似于#P的判定问题
17.3 #P完全性
 17.3.1 积和式和瓦利安特定理
 17.3.2 #P问题的近似解
17.4 户田定理:PHP#SAT
 17.4.1 过渡:具有唯一解的布尔满足性问题
 17.4.2 ⊕的性质和对NP、coNP证明引理17.17
 17.4.3 引理17.17的证明:一般情形
 17.4.4 第二步:转换为确定型归约
17.5 待决问题
本章学习内容
本章注记和历史
习题
第18章 平均复杂性:勒维定理
18.1 分布问题与distP
18.2 “实际分布”的形式化定义
18.3 distNP及其完全问题
 18.3.1 distNP的一个完全问题
 18.3.2 P可抽样的分布
18.4 哲学意义和实践意义
本章学习内容
本章注记和历史
习题
第19章 难度放大和纠错码
19.1 从温和难度到强难度:姚期智XOR引理
 19.1.1 用因帕利亚佐难度核引理证明姚期智XOR引理
 19.1.2 因帕利亚佐难度核引理的证明
19.2 工具:纠错码
 19.2.1 显式纠错码
 19.2.2 沃尔什哈达玛纠错码
 19.2.3 里德所罗门纠错码
 19.2.4 里德穆勒纠错码
 19.2.5 拼接纠错码
19.3 高效解码
 19.3.1 里德所罗门解码
 19.3.2 拼接解码
19.4 局部解码与难度放大
 19.4.1 沃尔什哈达玛纠错码的局部解码算法
 19.4.2 里德穆勒纠错码的局部解码算法
 19.4.3 拼接纠错码的局部解码算法
 19.4.4 局部解码算法综合运用于难度放大
19.5 列表解码
 19.5.1 里德所罗门纠错码的列表解码
19.6 局部列表解码:接近BPP=P
 19.6.1 沃尔什哈达玛纠错码的局部列表解码
 19.6.2 里德穆勒纠错码的局部列表解码
 19.6.3 拼接纠错码的局部列表解码
 19.6.4 局部列表解码算法综合运用于难度放大
本章学习内容
本章注记和历史
习题
第20章 去随机化
20.1 伪随机数产生器和去随机化
 20.1.1 用伪随机数产生器实现去随机化
 20.1.2 难度与去随机化
20.2 定理20.6的证明:尼散维格德尔森构造
 20.2.1 两个示意性例子
 20.2.2 尼散维格德尔森构造
20.3 一致假设下的去随机化
20.4 去随机化需要线路下界
本章学习内容
本章注记和历史
习题
第21章 伪随机构造:扩张图和提取器
21.1 随机游走和特征值
 21.1.1 分布向量和参数λ(G)
 21.1.2 无向连通性问题的随机算法的分析
21.2 扩张图
 21.2.1 代数定义
 21.2.2 组合扩张和扩张图的存在性
 21.2.3 代数扩张图蕴含组合扩张图
 21.2.4 组合扩张图蕴含代数扩张图
 21.2.5 用扩张图设计纠错码
21.3 扩张图的显式构造
 21.3.1 旋转映射
 21.3.2 矩阵乘积和路径乘积
 21.3.3 张量积
 21.3.4 替换乘积
 21.3.5 显式构造
21.4 无向连通性问题的确定型对数空间算法
 21.4.1 连通性问题的对数空间算法(定理21.21的证明)
21.5 弱随机源和提取器
 21.5.1 最小熵
 21.5.2 统计距离
 21.5.3 随机性提取器的定义
 21.5.4 提取器的存在性证明
 21.5.5 基于哈希函数构造提取
 21.5.6 基于扩张图的随机游走构造提取器
 21.5.7 由伪随机数产生器构造提取器
21.6 空间受限计算的伪随机数产生器
本章学习内容
本章注记和历史
习题
第22章 PCP定理的证明和傅里叶变换技术
22.1 非二进制字母表上的约束满足问题
22.2 PCP定理的证明
 22.2.1 PCP定理的证明思路
 22.2.2 迪纳尔鸿沟放大:引理22.5的证明
 22.2.3 扩张图、随机游走和INDSET的近似难度
 22.2.4 迪纳尔鸿沟放大
 22.2.5 字母表削减:引理22.6的证明
22.3 2CSPW的难度:鸿沟和字母表大小之间的平衡
 22.3.1 莱斯的证明思想:并行重复
22.4 哈斯塔德3位PCP定理和MAX3SAT的难度
 22.4.1 MAX3SAT的近似难度
22.5 工具:傅里叶变换
 22.5.1 GF(2)n上的傅里叶变换
 22.5.2 从较高层面看傅里叶变换和PCP之间的联系
 22.5.3 GF(2)上线性测试的分析
22.6 坐标函数、长编码及其测试
22.7 定理22.16的证明
22.8 SETCOVER的近似难度
22.9 其他PCP定理概述
 22.9.1 具有亚常数可靠性参数的PCP定理
 22.9.2 平摊的查验复杂度
 22.9.3 2位测试和高效傅里叶分析
 22.9.4 唯一性游戏和阈值结果
 22.9.5 与等周问题和度量空间嵌入之间的联系
22.A 将qCSP实例转换成“精细”实例
本章学习内容
本章注记和历史
习题
第23章 为什么线路下界如此困难
23.1 自然证明的定义
23.2 为什么自然证明是自然的
 23.2.1 为什么要求可构造性
 23.2.2 为什么要求广泛性
 23.2.3 用复杂性测度看自然证明
23.3 定理23.1的证明
23.4 一个“不自然的”下界
23.5 哲学观点
本章注记和历史
习题
附录A 数学基础
部分习题的提示
参考文献
术语索引
复杂性类索引

时间: 2024-09-23 14:54:52

《计算复杂性:现代方法》——导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul