预备知识
第二章属于整本书最最最简单的一章,主要介绍了一些理解后续章节内容的预备知识,
主要是集合、字符、语言、图和复杂度这几方面的内容
集合表示法
集合
一个集合就是将一组有限或无限多个元素聚集在一起,并且集合会忽略重复的元素。
集合的表示
- 对于有限的集合,可以用花括号进行表示,比如 { 1 , 3 , 5 , 7 } \{1,3,5,7\} {1,3,5,7}
- 另一种表示方法是{x|R(x)},这里的R是对x可能取值范围的某种描述,比如 { x ∣ x > 0 且 x < 100 } \{x|x>0且x<100\} {x∣x>0且x<100}
集合的运算
- 交运算
A∩B表示既在A又在B的元素的集合 - 并运算
A∪B表示在A中或者在B中的元素的集合 - 差运算
A\B表示在集合A中但不在集合B中的元素的集合 - 幂运算
2A表示所有的可以由集合A中一些元素构成的集合的集合 - 笛卡尔积
A×B是一个 有 序对 ,每个有序对第一个元素来自于A ,另一个来自于B
例题如下:
如果A= { 1 , 3 , 5 , 6 , 8 } \{1,3,5,6,8\} {1,3,5,6,8},且B= { 3 , 6 , 9 } \{3,6,9\} {3,6,9},那么我们可以得到以下内容
A ∩ \cap ∩B= { 3 , 6 } \{3,6\} {3,6},A ∪ \cup ∪B= { 1 , 3 , 5 , 6 , 8 , 9 } \{1,3,5,6,8,9\} {1,3,5,6,8,9},A\B= { 1 , 5 , 8 } \{1,5,8\} {1,5,8}
2B= { ∅ , { 3 } , { 6 } , { 9 } , { 3 , 6 } , { 3 , 9 } , { 6 , 9 } , { 3 , 6 , 9 } } \{\emptyset,\{3\},\{6\},\{9\},\{3,6\},\{3,9\},\{6,9\},\{3,6,9\}\} {∅,{3},{6},{9},{3,6},{3,9},{6,9},{3,6,9}}
A×B= { ( 1 , 3 ) , ( 1 , 6 ) , ( 1 , 9 ) , ( 3 , 3 ) , ( 3 , 6 ) , ( 3 , 9 ) , ( 5 , 3 ) , ( 5 , 6 ) , ( 5 , 9 ) , ( 6 , 3 ) , ( 6 , 6 ) , ( 6 , 9 ) , ( 8 , 3 ) , ( 8 , 6 ) , ( 8 , 9 ) } \{(1,3),(1,6),(1,9),(3,3),(3,6),(3,9),(5,3),(5,6),(5,9),(6,3),(6,6),(6,9),(8,3),(8,6),(8,9)\} {(1,3),(1,6),(1,9),(3,3),(3,6),(3,9),(5,3),(5,6),(5,9),(6,3),(6,6),(6,9),(8,3),(8,6),(8,9)}
n元关系
一个n元关系是在某个域上n元组的集合
每个n元组都是一个恰巧有n个有序元素的对象
举一个比较简单的例子,比如整数间的“大于”关系(该关系为二元关系)
A:(3,5),(7,9),(3,11)
B:(3,3),(7,3),(0,-1)
很显然A是符合大于关系的,B是不符合大于关系的
字符串和语言
字符串是一个预先定义的集合(我们称其为字母表)中元素的(有限或无限的)序列
我们通常用符号
Σ
\Sigma
Σ表示字母表,该符号读作sei伽马
字母表中的元素叫做字母,字母表上的字符串集合L叫做语言
接下来介绍几种字符串的运算:
- 联结运算
将两个或更多的字符串以一定的顺序拼接到一起,运算符为“.”
例如:aaa.bbb.ccc=aaabbbccc - 重复运算
如果 σ \sigma σ(该符号是上述字母表表示符号的小写形式,读音同上)是一个字符串,那么 σ \sigma σ* 是一个字符串的集合,其中每个字符串包含 σ \sigma σ的零次或多次出现,如(abc)*包含 ε \varepsilon ε,abc,abcabc等等。 - 集合运算符
诸如 ∩ 、 ∪ 、 ∖ \cap、\cup、\setminus ∩、∪、∖等等,大部分都是已经学过的内容就不做过多的讲解
图&树
图的相关定义
图这一节也没有太多的好讲的东西,大部分内容都在数据结构中学过,这里就提几个比较重要的概念来回顾一下
- 节点(顶点或点)
- 边
- 无向图、有向图
- 路径
- 连通、连通图、连通分量
- 强连通图、强连通分量
- 顶点的入度、出度
树的相关定义
树是一个无环的有向图,其中有一个没有入边的节点称为树的根,并且其他的节点都只有一条入边。树的重要内容如下:
- 路径
- 祖先
- 后代
- 叶子节点、根节点
计算复杂度和可计算性
复杂度问题
- 算法的复杂度
一个算法的复杂度是估计这个算法运行所需要消耗的时间或内存的一个度量标准 - 计算问题的复杂度
这个问题的复杂度体现了解决了这个问题的最好算法的复杂度
主要的复杂度类
- log——复杂度为O(logn)的问题
- polylog——复杂度为Olog(P(logn))的问题
- 线性——复杂度为O(n)的问题
- 指数——复杂度为O(2P(n))的问题
- 二重指数——复杂度为O(…)的问题
- 非初等函数——对于这些问题,不存在一个固定的k,使得这些问题的复杂度为(看书)
常见的复杂度类
- NP 非确定性对数空间
这个类中的算法通常都是很高效的 - P 确定性多项式空间
这个类中的算法被认为是高效的,特别是多项式次数较低时 - NP 非确定性多项式时间
这个类中的问题通常是低效的,因为当把他们转换为确定性算法时会引起指数级爆炸 - PSPACE 多项式空间
解决这类复杂度问题需要较大型和快速的计算机。目前仍不知道是否存在多项式算法能解决该问题 - EXPTIME 确定性指数时间
在实践中只能应用到小规模的实例中 - EXPSPACE 指数空间
这些问题和更高复杂度的问题只有当输入被限制在很小规模的实例上才可解
7.NONELEMENTARY
有这种复杂度的算法被认为是非常非常苦难的
最近在忙期末,第三章应该得等期末的东西都忙完了才能发出来,绝对不断更!