目录
用元组来定义树与二叉树时, 遇到了诸多问题, 所以在这里单独写成一个贴子.
按上一贴的二叉树习题.
a) 二叉树的左、右子树需要区别对待, 所以, 定义子节点函数更合理. 有两种方法: 1) 使用两个函数; 2) 使用一个函数, 但将子树类型写成一个字符类型的参数 (取值为 l 或 r), 其取值范围为一个字母表. 后一种方案由 彭子峰 同学提出.
b) 要想说明子树的子树, 需要处理 lrrl 这类的字符串. 这涉及到字母表的正闭包.
c) 叶节点的子树缺乏定义, 这个还是不行, 需要引入一个空节点
ϕ
\phi
ϕ (phi, 不是 emptyset), 它有吸收作用. 即该节点的左、右子树都是它自己.
1. 字母表
我们先来定义字母表、字母表的闭包.
Definition 11. An alphabet Σ \Sigma Σ is a set of characters.
常见的字母表包括: Σ = { 0 , 1 } \Sigma = \{0, 1\} Σ={0,1}, Σ = { a , … , z } \Sigma = \{\mathrm{a}, \dots, \mathrm{z}\} Σ={a,…,z}. 我们这里需要的是 Σ = { l , r } \Sigma = \{\mathrm{l}, \mathrm{r}\} Σ={l,r}, 其中 l 表示左, r 表示右. 字母在式子里写成 mathrm 格式,表示常量.
字母表的正闭包定义如下:
Definition 12. The positive closure of alphabet
Σ
\Sigma
Σ is given by
Σ
+
=
Σ
1
∪
Σ
2
∪
.
.
.
\Sigma^+ = \Sigma^1 \cup \Sigma^2 \cup ...
Σ+=Σ1∪Σ2∪....
如果 Σ = { 0 , 1 } \Sigma = \{0, 1\} Σ={0,1}, 那么 Σ + = { 0 , 1 , 00 , 01 , 10 , 11 , 000 , … } \Sigma^+ = \{0, 1, 00, 01, 10, 11, 000, \dots \} Σ+={0,1,00,01,10,11,000,…}, 如果 Σ = { l , r } \Sigma = \{\mathrm{l}, \mathrm{r}\} Σ={l,r}, 那么 Σ + = { l , r , l l , l r , r l , r r , l l l , … } \Sigma^+ = \{\mathrm{l}, \mathrm{r}, \mathrm{ll}, \mathrm{lr}, \mathrm{rl}, \mathrm{rr}, \mathrm{lll}, \dots \} Σ+={l,r,ll,lr,rl,rr,lll,…}.
还有个叫克林的哥们儿考虑空串 ε \varepsilon ε (varepsilon),硬生生把自己的名字加进来. 英文名怎么写我不知道, 直接翻译的.
字母表的克林闭包定义如下:
Definition 13. The Cling closure of alphabet
Σ
\Sigma
Σ is given by
Σ
∗
=
Σ
0
∪
Σ
+
=
{
ε
}
∪
Σ
+
\Sigma^* = \Sigma^0 \cup \Sigma^+ = \{\varepsilon\} \cup \Sigma^+
Σ∗=Σ0∪Σ+={ε}∪Σ+.
字母表克林闭包的元素, 就称为字符串.
在某个状态 (可以是图或树的某个节点, 或有限状态自动机的某个节点) 下, 接受一个字符进行状态的跳转, 跳转函数定义为:
Definition 14. Let
S
\bm{S}
S denote the set of states. The state transition function is given by
f
:
S
×
Σ
→
S
f: \bm{S} \times \Sigma \to \bm{S}
f:S×Σ→S.
写成一个定义有点牵强, 先这样吧.
为了描述在某个状态接受字符串的跳转, 可定义跳转函数为
Definition 15. Let
S
\bm{S}
S denote the set of states. The positive state transition function is given by
f
:
S
×
Σ
+
→
S
f: \bm{S} \times \Sigma^+ \to \bm{S}
f:S×Σ+→S, where
∀
\forall
∀
s
∈
S
s \in \bm{S}
s∈S and
a
1
a
2
…
a
k
∈
Σ
+
a_1 a_2 \dots a_k \in \Sigma^+
a1a2…ak∈Σ+,
f
(
s
,
a
1
a
2
…
a
k
)
=
f
(
f
(
s
,
a
1
)
,
a
2
a
3
…
a
k
)
f(s, a_1 a_2 \dots a_k) = f(f(s, a_1), a_2 a_3 \dots a_k)
f(s,a1a2…ak)=f(f(s,a1),a2a3…ak).
即: 接受第 1 个字符跳转到一个状态, 再接受第 2 个字符继续跳转, 以此类推.
2. 二叉树
2.1 初始版本
Definition 16. Let
Σ
=
{
l
,
r
}
\Sigma = \{\mathrm{l}, \mathrm{r}\}
Σ={l,r} be the alphbet and
ϕ
\phi
ϕ be a null node. A binary tree is a triple
T
=
(
V
,
r
,
c
)
T = (\bm{V}, r, c)
T=(V,r,c), where
V
=
{
v
1
,
…
,
v
n
}
\bm{V} = \{v_1, \dots, v_n\}
V={v1,…,vn} is the set of nodes,
r
∈
V
r \in \bm{V}
r∈V is the root, and
c
:
V
∪
{
ϕ
}
×
Σ
+
→
V
∪
{
ϕ
}
c: \bm{V} \cup \{\phi\} \times \Sigma^+ \to \bm{V} \cup \{\phi\}
c:V∪{ϕ}×Σ+→V∪{ϕ} satisfying
a)
c
(
ϕ
,
l
)
=
c
(
ϕ
,
r
)
=
ϕ
c(\phi, \mathrm{l}) = c(\phi, \mathrm{r}) = \phi
c(ϕ,l)=c(ϕ,r)=ϕ;
b)
∀
v
∈
V
∖
{
r
}
\forall v \in \bm{V} \setminus \{r\}
∀v∈V∖{r},
∃
!
\exists !
∃!
s
∈
Σ
+
s \in \Sigma^+
s∈Σ+ st.
c
(
r
,
s
)
=
v
c(r, s) = v
c(r,s)=v;
c)
∀
v
∈
V
,
a
∈
Σ
\forall v \in \bm{V}, a \in \Sigma
∀v∈V,a∈Σ,
c
(
v
,
a
)
≠
r
c(v, a) \neq r
c(v,a)=r.
说明:
a) 我现在不清楚条件 a) 是否冗余, 好像可以从 b) 和 c) 推导出;
b) 条件 b) 表示从根节点可到达任意其它正常节点, 且路径唯一;
c) 条件 c) 表示根节点没有父节点.
d) 从条件 b) 和 c) 可以推导出
V
\bm{V}
V 中节点没有环, 可写为: Property 1:
∀
v
∈
V
\forall v \in \bm{V}
∀v∈V,
∄
s
∈
Σ
+
\not\exists s \in \Sigma^+
∃s∈Σ+ st.
c
(
v
,
s
)
=
v
c(v, s) = v
c(v,s)=v. 这里
∄
\not\exists
∃ 为 not exists.
e) 上一条可以写成单独的一条性质 Property. 在理论体系中, 哪些内容写进定义, 哪些内容写成性质 (Propertyy)、定理 (Theorem)、命题 (Proposition), 既与内容本身有关, 也与研究者的个人喜好有关.
d) ! 表示 ”不“.
e)
Σ
\Sigma
Σ 和
ϕ
\phi
ϕ 是常量, 与具体的哪棵二叉树无关, 因此未把它们作为单独的元组.
习题 9. 考虑 ϕ \phi ϕ, 重新写 Definition 7 以解决其存在的问题, 见其讨论 d).
2.2 打磨版本
同学们终于肯跟我讨论了, 而且指出了前面定义的若干问题. 是时候展示真正的实力了!
Definition 17. Let
Σ
=
{
l
,
r
}
\Sigma = \{\mathrm{l}, \mathrm{r}\}
Σ={l,r} be the alphbet and
ϕ
\phi
ϕ be a null node. A binary tree is a triple
T
=
(
V
,
r
,
c
)
T = (\bm{V}, r, c)
T=(V,r,c), where
V
=
{
v
1
,
…
,
v
n
}
\bm{V} = \{v_1, \dots, v_n\}
V={v1,…,vn} is the set of nodes,
r
∈
V
r \in \bm{V}
r∈V is the root, and
c
:
V
∪
{
ϕ
}
×
Σ
∗
→
V
∪
{
ϕ
}
c: \bm{V} \cup \{\phi\} \times \Sigma^* \to \bm{V} \cup \{\phi\}
c:V∪{ϕ}×Σ∗→V∪{ϕ} satisfying
∀
v
∈
V
\forall v \in \bm{V}
∀v∈V,
∃
!
\exists !
∃!
s
∈
Σ
∗
s \in \Sigma^*
s∈Σ∗ st.
c
(
r
,
s
)
=
v
c(r, s) = v
c(r,s)=v.
说明:
a) Definition 16 中, a) 与 c) 都是冗余的.
b) 如果仅保留 Definition 16 中的 b), 会出现 bug. 反例:
V
=
{
r
}
\bm{V} = \{r\}
V={r},
c
(
r
,
l
)
=
c
(
r
,
r
)
=
ϕ
c(r, \mathrm{l}) = c(r, \mathrm{r}) = \phi
c(r,l)=c(r,r)=ϕ,
c
(
ϕ
,
l
)
=
c
(
ϕ
,
r
)
=
ϕ
c(\phi, \mathrm{l}) = c(\phi, \mathrm{r}) = \phi
c(ϕ,l)=c(ϕ,r)=ϕ. Definition 17 中的条件未单独考虑
r
r
r, 因此修复了该 bug.
c)
c
(
r
,
ε
)
=
r
c(r, \varepsilon) = r
c(r,ε)=r. 即从
r
r
r 读入空串到自己.
现在讨论该二叉树的几个性质:
第一, 二叉树的任何节点 (空节点除外) 不会有到自己的环.
Property 1.
∀
v
∈
V
\forall v \in \bm{V}
∀v∈V,
∄
s
∈
Σ
+
\not\exists s \in \Sigma^+
∃s∈Σ+ st.
c
(
v
,
s
)
=
v
c(v, s) = v
c(v,s)=v.
Proof. Suppose that
∃
v
i
∈
V
\exists v_i \in \bm{V}
∃vi∈V and
s
′
∈
Σ
+
s' \in \Sigma^+
s′∈Σ+ st.
c
(
v
i
,
s
′
)
=
v
i
c(v_i, s') = v_i
c(vi,s′)=vi.
According to Definition 17,
∃
s
1
∈
Σ
∗
\exists s_1 \in \Sigma^*
∃s1∈Σ∗ st.
c
(
r
,
s
1
)
=
v
i
c(r, s_1) = v_i
c(r,s1)=vi.
Consequentyly
c
(
r
,
s
1
s
′
)
=
c
(
c
(
r
,
s
1
)
,
s
′
)
=
c
(
v
i
,
s
′
)
=
v
i
c(r, s_1s') = c(c(r, s_1), s') = c(v_i, s') = v_i
c(r,s1s′)=c(c(r,s1),s′)=c(vi,s′)=vi, and
s
s
s takes at least two values (
s
1
s_1
s1 and
s
1
s
′
s_1s'
s1s′), making it not unique.
This contradition shows that the assumption does not hold.
The proof is finished.
第二, 空节点的左右孩子都是自己.
Property 1.
c
(
ϕ
,
l
)
=
c
(
ϕ
,
r
)
=
ϕ
c(\phi, \mathrm{l}) = c(\phi, \mathrm{r}) = \phi
c(ϕ,l)=c(ϕ,r)=ϕ.
Proof. Given any
s
=
a
1
a
2
…
a
n
+
1
∈
Σ
∗
s = a_1 a_2 \dots a_{n+1} \in \Sigma^*
s=a1a2…an+1∈Σ∗, we consider
c
(
r
,
s
)
c(r, s)
c(r,s). Let the path corresponding to the calculation of
c
(
r
,
s
)
c(r, s)
c(r,s) be
v
0
′
v
1
′
…
v
n
+
1
′
v_0' v_1' \dots v_{n+1}'
v0′v1′…vn+1′ where
v
0
′
=
r
v_0' = r
v0′=r. Since
∣
V
∪
{
ϕ
}
∣
=
n
+
1
|\bm{V} \cup \{\phi\}| = n + 1
∣V∪{ϕ}∣=n+1, according to the Pigeon Cage Principle (鸽笼原理), there must
∃
\exists
∃
0
≤
i
<
j
≤
n
+
1
0 \leq i < j \leq n + 1
0≤i<j≤n+1 st.
v
i
′
=
v
j
′
v_i' = v_j'
vi′=vj′. In other words,
v
i
′
…
v
j
′
v_i' \dots v_j'
vi′…vj′ is a loop.
According to Property 1,
v
i
′
∉
V
v_i' \not\in \bm{V}
vi′∈V, hence
v
i
′
=
v
j
′
=
ϕ
v_i' = v_j' = \phi
vi′=vj′=ϕ.
Now assume that
∃
i
<
k
<
j
\exists i < k < j
∃i<k<j st.
v
k
′
∈
V
v_k' \in \bm{V}
vk′∈V. We have
c
(
r
,
a
1
a
2
…
a
k
)
=
v
k
′
c(r, a_1 a_2 \dots a_k) = v_k'
c(r,a1a2…ak)=vk′, and
c
(
r
,
a
1
a
2
…
a
j
a
i
+
1
a
i
+
2
…
a
k
)
=
v
k
′
c(r, a_1 a_2 \dots a_j a_{i+1} a_{i + 2} \dots a_k) = v_k'
c(r,a1a2…ajai+1ai+2…ak)=vk′, making the path from
r
r
r to
v
k
′
v_k'
vk′ not unique.
Hence the assumption does not hold, and
v
i
′
=
v
i
+
1
′
=
⋯
=
v
j
′
=
ϕ
v_i' = v_{i + 1}' = \dots = v_j' = \phi
vi′=vi+1′=⋯=vj′=ϕ.
In other words, any character takes
ϕ
\phi
ϕ to itself.
This completes the proof.
说明:
a) 鸽笼原理:
n
+
1
n + 1
n+1 只鸽子飞进
n
n
n 个鸽笼, 至少有两个鸽子在同一个笼子里. 这是组合数学中重要的定理.
b) 这里用到了有穷状态自动机 (Finite state automata) 的知识. 从任一节点 (状态), 读入一个字符, 到达下一个节点. 这里的
ϕ
\phi
ϕ 被称为 陷井状态.
未完待续.