【形式语言】第一章绪论

本文介绍了集合的基本概念,包括集合的运算、二元关系及其性质,等价关系与等价类的概念,并探讨了关系的合成与闭包。此外,还讲解了形式语言的基础知识,如字母表、句子、语言的乘积等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合

集合:一定范围内的、确定的、并且彼此可以区分的对象汇集在一起形成的整体叫做集合(set),简称为集(set)
元素:集合的成员为该集合的元素(element)
基数:集合中元素个数
集合的描述形式有列举法命题法两种

集合的运算

  1. 并(∪\cup)
  2. 交(∩\cap)
  3. 差(−-)
  4. 对称差(⊕\oplus)
  5. 笛卡尔积(×\times×)
    A×B={(a,b)∣a∈A&b∈B}A\times B =\{ (a,b) | a \in A \& b \in B\}A×B={(a,b)aA&bB}
  6. 幂集(2A2^A2A)
    所有集合子集(包含本身和空集)
  7. 补集(A‾\overline AA)

令A = {1,2,3},B = {2,3,4},U = {1,2,3,4}
A∪B={1,2,3,4},A∩B={2,3},A−B={1},A⊕B={1,4},A×B={(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,2),(3,3),(3,4)},2A={∅,{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}},A‾={4}A\cup B=\{1,2,3,4\},A\cap B=\{2,3\},A-B=\{1\},A\oplus B=\{1,4\},A\times B = \{(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,2),(3,3),(3,4)\},2^A=\{\empty , \{1\},\{2\},\{3\},\{1,2\},\{1,3\},\{2,3\},\{1,2,3\}\},\overline A = \{4\}AB={1,2,3,4},AB={2,3},AB={1},AB={1,4},A×B={(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,2),(3,3),(3,4)},2A={,{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}},A={4}

关系

二元关系

二元关系:任意的R⊆A×BR\subseteq A\times BRA×B ,称RRRAAABBB上的二元关系。
表示(a,b)∈R(a,b)\in R(a,b)R也可表示为aRbaRbaRb
两个域:A称为定义域,B称为值域
A=BA = BA=B时称RRRAAA上的二元关系

几种二元关系性质
  1. 自反性 2.反自反 3.对称性 4. 反对称性 5. 传递性
    ps:对称和反对称并不是互斥的
等价关系与等价类

等价关系:具有自反性、对称性、传递性的二元关系称为等价关系。
等价类SSS的满足如下要求的划分:S1S_1S1S2S_2S2S3S_3S3、…、SnS_nSn、…称为S关于R的等价划分,SiS_iSi称为等价类。
(1) S=S1∪S2∪S3∪...∪Sn∪...S = S_1\cup S_2\cup S_3\cup...\cup S_n\cup...S=S1S2S3...Sn...
(2)如果i≠ji\not =ji=j,则Si∩Sj=∅S_i\cap S_j = \emptySiSj=
(3)对于任意的iiiSiS_iSi中的任意两个元素aaabbbaRbaRbaRb恒成立。
(4)对于任意的iiijjji≠ji\not =ji=jSiS_iSi中的任意元素aaaSjS_jSj中的任意元素bbbaRbaRbaRb恒不成立

关系的合成

R1⊆A×BR_1\subseteq A\times BR1A×BAAABBB 的关系、R2⊆B×CR_2\subseteq B\times CR2B×CBBBCCC的关系,R1R_1R1R2R_2R2的合成R1R2R_1R_2R1R2AAACCC的关系:
R1R2={(a,c)∣∃(a,b)∈R1且(b,c)∈R2}R_1R_2= \{(a,c)|\exists(a,b)\in R_1且(b,c)\in R_2\}R1R2={(a,c)(a,b)R1(b,c)R2}

关系的闭包

设P是关于关系的性质的集合,关系R的P闭包(closure)是包含R并且具有P中所有性质的最小关系。

正闭包(传递闭包)

(1)R⊆R+R\subseteq R^+RR+
(2)如果(a,b)(a,b)(a,b)(b,c)∈R+(b,c)\in R^+(b,c)R+,则(a,c)∈R+(a,c)\in R^+(ac)R+
(3)除(1)、(2)外,R+R^+R+不再含有其他任何元素。
具有传递性
对于任意的关系R,有
R+=R∪R2∪R3∪...∪Rn∪....R^+ = R\cup R^2 \cup R^3\cup ... \cup R^n \cup ....R+=RR2R3...Rn....
当S为有穷集(元素所属于的集合)时,有
R+=R∪R2∪R3∪...∪R∣S∣R^+ = R \cup R^2 \cup R^3\cup ... \cup R^{|S|}R+=RR2R3...RS
提供一种求出R+R^+R+的一套算法(S为有穷集时,这是我自己想的,还没有证明)
step1:
求出R2R^2R2,令ΔR=R2−R,R=R2∪R\Delta R = R^2-R,R = R^2\cup RΔR=R2R,R=R2R
step2:
R′=ΔRR∪RΔRR' = \Delta RR\cup R\Delta RR=ΔRRRΔR
ΔR′=R′−R\Delta R' = R' - RΔR=RR
R=R∪R′R = R\cup R'R=RR
ΔR′==∅\Delta R'==\emptyΔR==,则结束算法,此时R+==RR^+==RR+==R
ΔR′≠∅\Delta R'\not=\emptyΔR=,则令ΔR=ΔR′\Delta R=\Delta R'ΔR=ΔR,转step2
PS:“=”均表示赋值

# python代码实现
def getmutify(set1,set2):
	s = set()
	for item1 in set1:
		for item2 in set2:
			if item1[1] == item2[0]:
				s.add(item1[0]+item2[1])
	return s

def getPositiveClosure(R):
	R_2 = getmutify(R,R)
	detR = R_2 - R
	R = R.union(R_2)
	while True:
		Rc = getmutify(detR,R).union(getmutify(R,detR))
		detRc = Rc - R
		R = R.union(Rc)
		if len(detRc) == 0:
			return R
		detR = detRc

s = getPositiveClosure({"ab","bb","bc"})
print(s) #{'ac', 'ab', 'bc', 'bb'}
克林闭包

(1)R0⊆R∗,R⊆R∗R^0\subseteq R^*,R\subseteq R^*R0R,RR
(2)如果(a,b)(a,b)(a,b)(b,c)∈R∗(b,c)\in R^*(b,c)R,则(a,c)∈R∗(a,c)\in R^*(ac)R
(3)除(1)、(2)外,R∗R^*R不再含有其他任何元素。
具有自反性、传递性

语言

语言:某个集合中的元素,按照规则组合成的符号串的集合。
形式语言理论:用数学方法,对语言的表示法、结构及特性进行研究的理论。
(1)怎么构造语言
(2)怎么识别语言
(3)怎么去分析语言的含义
自动机理论:克林在研究神经细胞中,建立了识别语言的系统——有穷状态自动机。
(1)文法与自动机是等价的。
(2)文法与自动机的运算对象:集合。

基本概念

1.字母表:字母表是一个非空有穷集合,字母表中的元素称为该字母表的一个字母(letter)。又叫做符号(symbol)、或者字符(character)。通常用∑\sum符号表示。
字符两个特性
(1)整体性,也叫不可分性。
(2)可辨认性,也叫可区分性。
2.字母表的乘积
∑1∑2={ab∣a∈∑1,b∈∑2}\sum_{1}\sum_2=\{ab|a\in \sum_1,b\in \sum_2\}12={aba1,b2}
个人感觉类似于笛卡尔乘积。
3.字母表∑\sumnnn次幂
∑0={ε}\sum^0=\{\varepsilon\}0={ε}
∑n=∑n−1∑\sum^n=\sum^{n-1}\sumn=n1
其中,ε\varepsilonε是由∑\sum中的0个字符组成的。∣{ε}∣=1|\{\varepsilon\}|=1{ε}=1,∣ε∣=0|\varepsilon|=0ε=0
4.∑\sum的正闭包和克林闭包
∑+=∑∪∑2∪∑3∪...\sum^+=\sum\cup \sum^2\cup \sum^3\cup...+=23...
∑∗=∑0∪∑+\sum^*=\sum^0\cup\sum^+=0+
正闭包和克林闭包都是集合。其中,正闭包是由∑\sum中至少一个字符连接而成,而克林闭包可以不含∑\sum中的字符。
5.句子
∑\sum是一个字母表,∀x∈∑∗\forall x\in \sum^*xxxx叫做∑\sum上的一个句子。
6.句子的长度
∀x∈∑∗\forall x\in \sum^*x,句子xxx中字符出现的总个数叫做该句子的长度,记作∣x∣|x|x
7.并置
x,y∈∑∗x,y\in\sum^*x,yxxxyyy的并置是由串xxx直接相接yyy所组成的。记作xyxyxy。并置又叫做连结。
8.串x的n次幂
x0=εx^0=\varepsilonx0=ε
xn=xn−1xx^n = x^{n-1}xxn=xn1x
9.前缀和后缀
xxxyyyzzzwwwv∈∑∗v\in\sum^*v,且x=yzx=yzx=yzw=yvw=yvw=yv
(1)yyyxxx的前缀,若∣z∣≠0|z|\not = 0z=0,则称yyyxxx的真前缀
(2)zzzxxx的后缀,若∣y∣≠0|y|\not = 0y=0,则称zzzxxx的真后缀
(3)yyyxxxwww的公共前缀
(4)如果xxxwww的任何公共前缀都是yyy的前缀,则yyyxxxwww的最大公共前缀
(5)如果x=zyx=zyx=zyw=vyw=vyw=vy,则yyyxxxwww的公共后缀
(6)如果xxxwww的任何公共后缀都是yyy的后缀,则yyyxxxwww的最大公共后缀
10.子串
wwwxxxyyyz∈∑∗z\in \sum^*z,且w=xyzw=xyzw=xyz,则称yyywww的子串。
(1)tttuuuvvvwwwxxxyyyz∈∑∗z\in\sum^*z,且t=uyvt=uyvt=uyvw=xyzw=xyzw=xyz,则称yyytttwww的公共子串。如果y1y_1y1y2y_2y2,……,yny_nyntttwww的公共子串,且有∣yj∣=max{∣y1∣,∣y2∣,…,∣yn∣}|y_j|=max\{|y_1|,|y_2|,…,|y_n|\}yj=max{y1,y2,,yn},则称yjy_jyjtttwww的最大公共子串。
PS:两个串的最大公共子串不一定是唯一的。
11.语言
∀L⊆∑∗\forall L\subseteq \sum^*LLLL称为字母表∑\sum上的一个语言,∀x∈L\forall x\in LxLxxx叫做LLL的一个句子。
12.语言的乘积
L1⊆∑1∗L_1\subseteq \sum_1^*L11L2⊆∑2∗L_2\subseteq \sum_2^*L22,语言L1L_1L1L2L_2L2的乘积是一个语言,该语言定义为:
L1L2={xy∣x∈L1,y∈L2}L_1L_2=\{xy|x\in L_1,y\in L_2\}L1L2={xyxL1,yL2}是字母表∑1∪∑2\sum_1\cup \sum_212上的语言。

### 数据结构与算法 第一章 绪论 思维导图及学习资料 数据结构与算法的第一章绪论通常是帮助学生建立对数据结构的整体认识,理解其基本概念、分类以及在计算机科学中的重要性。以下是基于提供的引用内容整理而成的思维导图框架和相关学习资料。 #### 1. 数据结构绪论核心知识点 数据结构是一门研究非数值计算问题中计算机操作对象及其相互关系和运算的学科[^3]。它的主要内容包括以下几个方面: - **定义**:数据结构是指相互之间存在一定关系的数据元素的集合。 - **组成要素**: - 数据的逻辑结构:描述数据元素之间的关系,分为线性结构(如数组、链表)、树形结构(如二叉树)、图结构等[^3]。 - 数据的存储结构:指数据元素在计算机中的存储方式,主要包括顺序存储结构和链式存储结构等。 - 数据的运算:涉及对数据的各种操作,例如插入、删除、查找等[^3]。 #### 2. 算法分析基础 算法是解决某一特定问题的方法或步骤序列。为了评估算法的有效性和效率,需要对其进行时间复杂度和空间复杂度的分析[^1]。具体而言: - **时间复杂度**:衡量算法运行所需的时间随输入规模增长的变化情况。 - **空间复杂度**:反映算法执行过程中所需的额外存储空间大小。 #### 3. 数据结构的应用场景 随着计算机技术的发展,现代计算机更多地应用于非数值计算领域,比如字符处理、表格管理和图像编辑等任务。这些应用往往依赖于合理的数据组织形式来提高处理效率[^1]。 #### 4. 递归的概念引入 递归作为一种重要的编程技巧,在某些情况下能够简化问题求解过程。当直接获得大规模问题的解决方案较为困难时,可以通过构建递推公式,并借助已知的小规模问题解答逐步扩展至目标范围内的结果。这一思想由计算机自动完成整个调用链条的管理[^4]。 #### 5. Python 中常用的数据类型简介 虽然本节重点在于理论层面的知识梳理,但对于初学者来说了解一些高级语言内置的数据容器也有助于加深印象。Python 提供了几种典型的数据结构实现形式,如下所示[^5]: - 列表(List):通过方括号`[]`定义可变长度有序集合; - 元组(Tuple):类似于列表但不可更改,使用圆括号`()`; - 字典(Dictionary):键值映射关系构成的无序组合 `{key:value}`; - 集合(Set):去重后的成员群体,支持数学意义上的交集、并集运算等功能; --- ### 示例代码片段 这里给出一段简单的例子演示如何判断一个数是否存在于给定整数数组当中,体现了基本搜索功能的设计思路: ```python def linear_search(array, target): """线性查找""" for index, value in enumerate(array): if value == target: return f"Element found at position {index}" return "Element not present" if __name__ == "__main__": test_array = [8, 9, 7, 6, 5] search_target = 7 result_message = linear_search(test_array, search_target) print(result_message) ``` 上述函数实现了最朴素版本的线性扫描机制,适用于任何类型的单向迭代器兼容的对象之上。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值