1. Toán rời rạc Thuật toán 5: Khử ký tự Phần 2: Đồ Thị => Để chứng minh định lý ta
không dẫn về được. chỉ cần chứng minh không tồn
Phần 1: NNHT&Ôtômát Xuất phát từ tập Δ={S}, tập I) Các định nghĩa tại 1 đồ thị nào có 1 đỉnh bậc
∑=Φ, nếu A∈Δ và - Đồ thị: G=(X,E) trong đó: lẻ.
Giả thiết: A=>x1,x2…xn thì kết nạp X là tập đỉnh (x1, x2,…xn); E Phản chứng: Giả sử G có 1
Ta có: biến vào Δ và ký tự kết thúc là tập cạnh (e1,e2,..en). đỉnh bậc lẻ x1 vì x1 là 1 đỉnh
VP: G=<∑,Δ,P,S> vào ∑. Khi đó tập sản xuất - Cung (xi,xj) – có hướng bậc lẻ ta xóa 1 cung đi qua x1
Otomat: M=<∑,Q,δ, q0, F> B sẽ lấy tất cả các sản xuất hoặc vô hướng thì x1 thành chẵn. Tuy nhiên
Trong đó: có các biến ∈Δ và ký tự ∈∑ Chú ý: một cung vô hướng đỉnh kề với nó thành bậc lẻ x2
∑: là bảng chữ cái khi tập có thể thay bằng hai cung tiếp tục lặp lại: ta xóa cung đi
hợp các trạng thái trung Thuật toán 6: Loại bỏ ε ngược chiều nhau. qua x2 -> thành chẵn cứ như
gian. sản xuất. - Chu trình: là một đường đi vậy ta xóa mãi đến khi hết
∑={a, b, c} A->ε sẽ được gọi là ε sản khép kín, đầu cuối trùng cạnh mọi đỉnh sẽ trở về bậc
Q={q0, q1,… qn} xuất. nhau. không =>
q0: trạng thái xuất phát * Chú ý: A->ε thì A được + Chu trình Euler: là chu
F: Tập trạng thái kết thúc gọi là biến triệt tiêu nếu trình đi qua tất cả các 3. Định lý 3: 1 đồ thị là đồ thị
δ(q,a) = P A->x1,x2…xn và x1,xn là biến cạnh, mỗi cạnh 1 lần. Euler (là đồ thị tồn tại chu
triệt tiêu thì A cũng là biến + Chu trình Haminton: là trình Euler) khi và chỉ khi 1 đồ
Thuật toán 1: Biến đổi triệt tiêu. Khi đó: chu trình đi qua tất cả các thị tồn tại mọi đỉnh bậc chẵn
OHK -> OHĐ. Bước 1: xác định tất cả các đỉnh mỗi đỉnh 1 lần (G-Euler mọi đỉnh bậc
Input: M=<∑,Q,δ, q0, F> biến triệt tiêu. - Bậc của đỉnh: chẵn).
Output:M1=<∑1,Q1,δ1,q01, F1> Bước 2: Xét sản xuất Kí hiệu: din của x là số cung G1/2 Euler (tồn tại đường đi
∑1=∑; q01=q0, q1=2Q (là tập A->x1,x2…xn . đi vào đỉnh x Euler không quá 2 đỉnh bậc
hợp tất cả các tập con của Q - Nếu xk là biến triệt tiêu thì dout(x): là số cung đi ra của x lẻ).
kể cả các tập Φ và q. thay xk bởi ε hoặc giữ d=din+dout: số bậc của x. CM:
δ1([p1, p2,pk]a) = Uδ(pi, a). nguyên xk din: nửa bậc vào; dout: nửa Bổ đề: với mọi đồ thị G mà
F1: là tập hợp tất cả các đỉnh - Không được thay tất cả bậc ra. bậc của đỉnh ≥2 thì luôn luôn
của q1 có chứa các đỉnh Khi đó: đỉnh cô lập là đỉnh tồn tại chu trình.
các xk=ε
thuộc F. bậc 0, đỉnh bậc 1 là đỉnh - Nếu chu trình tồn tại khuyên
treo. (là chu trình chỉ có 1 đỉnh) =>
Thuật toán 7: Chuẩn
Thuật toán 2: Xây * Mô tả đồ thị ĐPCM.
Choomssky.
dựngOH, tương đương với Cách 1: Mô tả bằng ma trận - Nếu không tồn tại khuyên:
Dạng chuẩn Choomssky có
VPCQ G. kề (ma trận trọng số): với tức là đồ thị đã tồn tại cung.
dạng:
Input: G=<∑,Δ,P,S> mỗi 1 cung xi, xj gán 1 giá Xuất phát từ 1 đỉnh ta tiếp tục
G=<∑,Δ,P,S>
Output: M1=<∑1,Q1,δ1,q01, F1> trị (gọi là trọng số) Cịj mang đi:
P= A->BC
Lấy ∑1≡∑, Q1=Δ∪{D} (là ý nghĩa thực tế nào đó. + Nếu quay về đỉnh xuất phát
A-> A
đỉnh mới phát sinh), q01=S, G=(X,E) tương đương với => là 1 chu trình.
F1={D}. ma trận C=(Cij)mxn + Nếu không quay về đỉnh
Khi đó tồn tại bài toán: Cho
Nếu A->aB thì δ(A,a) = B Cách 2: Mô tả bằng danh xuất phát => phải đi tiếp đến
văn phạm phi ngữ cảnh bất
Nếu A->a thì δ(A,a) = D sách cạnh: dùng 3 mảng ký khi quay về để thành 1 chu
kỳ, hãy chuyển văn phạm
hiệu là mảng đầu, mảng trình.
về dạng chuẩn Choomssky.
Thuật toán 3: Xây dựng cuối và mảng trọng số. * Chứng minh định lý Euler.
- Với giả thiết: Văn phạm
VPCQ G tương đương với II) Các định lý - Điều kiện cần: giả sử G là
không chứa ký tự vô sinh,
OH. 1. Định lý 1: Không tồn tại Euler cần chứng minh mọi
không chứa ký tự không
Input: M=<∑,Q,δ, q0, F> OHĐ một đồ thị nào mà số đỉnh đỉnh bậc chẵn cho G là Euler
dẫn về được, không chứa
Output: G=<∑1,Δ1,P1,S1> bậc lẻ là 1 số lẻ. tức là tồn tại chu trình đi qua
epsilon sản xuất và không
∑1=∑, Q1=Δ1,q0=S, 2. Định lý 2: Mọi đồ thị số tất cả các cạnh, mỗi cạnh đúng
chứa sản xuất đơn.
Nếu δ(q,a) = P =>q->ap∈p1 đỉnh bậc lẻ phải là số chẵn 1 lần, từ đó suy ra mỗi lần chu
Và δ(q,a)=P∈F =>q->a∈p1 Đề thi: CMR không tồn tại trình đi qua 1 đỉnh thì bậc của
Thuật toán chuyển về dạng
1 đỉnh bậc lẻ là 1 số lẻ đỉnh tăng 2. Từ đó => mọi
chuẩn Chomsky:
Thuật toán 4: Khử ký tự vô CM: đỉnh bậc chẵn.
Bước 1: giữ nguyên các sx
sinh. Giả sử xk và xm là 2 đỉnh - Điều kiện đủ: Giả sử mọi
đã thuộc chuẩn Chomsky.
Xuất phát từ tập A=Φ bậc lẻ thì chúng ta nối 2 đỉnh bậc chẵn => tồn tại chu
Bước 2: Xét A->x1,x2…xn
Nếu A->a thì Δ=Δ∪{A} cung phụ vào 2 đỉnh này => trình C đi qua các cạnh, mỗi
với xk∈∑.
Nếu A->x1,x2,…xn∈Δ->Δ=Δ∪{A} 2 đỉnh trở về chẵn => nếu G cạnh đúng 1 lần. Vì G là liên
Thay A->x1,x2…xn bởi
Khi đó: tập sản xuất chỉ giữ có 2k+1 đỉnh lẻ thì ta thêm thông và mọi đỉnh bậc chẵn từ
A->x1,x2…Ak…xn
lại các sản xuất chứa các k cung để biến đỉnh lẻ thành đó suy ra mọi đỉnh của G bậc
Ak->xk
biến trong Δ. đỉnh chẵn. ≥2 => tồn tạ chu trình C1 ∈G.
Bước 3: Xét A->x1,x2…xn
=> 1 đồ thị có số đỉnh bậc Nếu C1 chứa tất cả các cạnh
với ∀xk∈∑. lẻ là 1 số lẻ sẽ tương đương => đó chính là chu trình Euler
với 1 đồ thị có 1 đỉnh là số cần tìm.
lẻ.
2. Nếu C1 chưa chứa tất cả các 1. Thuật toán Khuska - Xuất phát từ 1 đỉnh bất kỳ, u∈U đều được gán một số
cạnh, ta xóa C1 khỏi G, xóa Bước 1: Sắp xếp các cạnh hãy kết nạp vào cây khung thức l(u), l(u) gọi là trọng số
chu trình khỏi G và đồng theo Cij tăng dần mà đỉnh lân cận gần nhất của cạnh u. Trọng số của đồ
thời xóa các đỉnh cô lập xuất Bước 2: xuất phát từ T=∅ với đỉnh xuất phát và thuật thị G ta ký hiệu là l(G):=∑l(u).
hiện =: thu được G1 mọi hãy kết nạp dần T theo toán sẽ kết thúc khi tập đỉnh Nếu l(u)≥0 với mọi u∈U thì ta
đỉnh bậc chẵn. nguyên tắc từ cạnh bé đến =n. nói đồ thị G là đồ thị có trọng
- Áp dụng bổ đề, trong G1 cạnh lớn để sao cho cạnh * Nhận xét: số không âm.
tồn tại chu trình C2∈G1, nếu sau không được tạo thành 1. Thuật toán không cần sắp Giả sử a=x1u1x2u2…xkukxk+1=b
C2 chứa tất cả các cạnh => chu trình với cạnh trước. xếp, từ đó dẫn tới độ phức là đường đi từ a đến b trong đồ
ĐPCM. Nếu không ta lại Thuật toán kết thúc khi số tạp của thuật toán thấp hơn. thị có trọng số G. Độ dài
xóa tiếp. cạnh trong T=n-1 2. Do ta kết nạp các đỉnh đường đi trên là l(a,b):=∑l(ui)
Ta nối C1,C2,….Cn => - Nhận xét 1: Độ phức tạp hoàn toàn mới, từ đó khẳng và gọi là trọng số của đường đi
* Thuật toán: của thuật toán sẽ phụ thuộc định, đỉnh mới luôn luôn từ đỉnh a đến đỉnh b. Ký hiệu
Xuất phát từ 1 đỉnh bất kỳ, vào thuật toán sắp xếp. kết nạp đỉnh ngoài. D(a,b) là tập tất cả các đường
hảy đi 1 cách thoải mái, chỉ - Nhận xét 2: Trong trường Vì vậy khi cần kiểm soát đi từ đỉnh a đến đỉnh b trong
cần tuân thủ 2 nguyên tắc hợp đồ thị nhiều cạnh ta vẫn quá trình tạo chu trình. đồ thị có trọng số G. Đường đi
NT1: Đi đến đâu xóa cạnh phải sắp xếp tất cả các cạnh 3. Để xây dựng thuật toán, ngắn nhất từ đỉnh a đến đỉnh b
đến đó, đồng thời xóa các bắt buộc, tuy nhiên khi kết với 1 đỉnh xk [αk,βk]. là đường thỏa mãn
đỉnh cô lập tạo thành. nạp chỉ kết nạp n-1 cạnh. Trong đó: l(a,b)=min{l(ω)/ω∈D(a,b)}
NT2: Chỉ đi qua cầu (cung + Điểm khó nhất của thuật αk: là khoảng cách nhỏ nhất * Mô tả thuật toán
lối trực tiếp giữa 2 đỉnh) khi toán chính là cần xác định đến tập A. Procedure Dijkstra (G=<X,U):
không còn cách nào khác thì sao cho cạnh sau không tạo βk: là đỉnh tương ứng với đồ thị liên thông có trọng số
mới được đi. thành chu trình với cạnh khoảng cách nhỏ nhất được không âm)
CM: G là 1 đỉnh Euler trước. nối với đỉnh đó trong tập A {G có các đỉnh a=x0,x1....,xn
không quá một đỉnh bậc lẻ. Cách làm: Ký hiệu A là tập được nối với xk. =b và trọng số l(xi,xj)=∞ nếu
Do G không quá 1 đỉnh bậc đỉnh của T hiện thời. xét * Mô tả thuật toán (xi,xj)≠U trong G}
lẻ do đó số đỉnh bậc lẻ chỉ là cạnh xk -> xl khi đó có các Procedure Prim For i:= l to n
0 or 2. Nếu là 0 -> chính là khả năng sau: Input: G=<V,E> σ(vi):= ∞
chu trình Euler. Nếu số đỉnh 1. xk,xl∈A => tồn tại chu Output: A={u0} σ(a):=0
bậc lẻ là 2 ta đem nối 1 cung trình => không được chấp Tmin =∅
phụ giữa 2 đỉnh lẻ -> mọi S:=∅
nhận. While |A<n do
đỉnh bậc chẵn -> ĐPCM. {ban đầu các nhãn được khởi
2. xk∈A; xl∉A => kết nạp Begin
Từ 1 chu trình C’ đi qua mọi được đồng thời kết nạp xl vào Xét u∉A
tạo sao cho nhãn của a bằng 0,
cạnh, ta xóa khỏi C’ cung phụ A (A được mở rộng). If d(u,x*) = min d(v,A) then còn các đỉnh khác bằng ∞, tập
nối 2 đỉnh lẻ ta thu được định 3. xk∉A; xl∉A => kết nạp A= A∪{v} S=∅}.
lý. được và đồng thời kết hợp Tmin=Tmin ∪ {x*, v} While b∉S
* Mô tả thuật toán được xk vào A. End; Begin
Procedure Euler(G:đồ thị vô 4. xk∉A; xl∉A => kết nạp Output(Tmin) U:=đỉnh không thuộc S có
hướng liên thông với các được và phát sinh tập mới. 3. Thuật toán Diskstra nhãn σ(u) nhỏ nhất.
=> Thuật toán kết thúc khi tất Thuật toán tìm đường đi S:=S∪{u}
đỉnh đều bậc chẵn)
cả các tập gộp làm 1. ngắn nhất với ma trận trọng
Chu trình:=Chu trình trong For tất cả các đỉnh x không
* Mô tả thuật toán số không âm.
G bắt đầu tại một đỉnh được Procedure Kruska thuộc S.
chọn tùy ý và các cạnh được - Xuất phát trên tư tưởng If σ(u)+l(u,x)< σ(x):= σ(u)
Input: G=<V,E>
thêm vào để xây dựng gán 1 đỉnh xk với 1 nhãn là +l(u,x).
Output: Tmin cây khung bé nhất
đường đi qua các đỉnh và + Sắp xếp E theo Cij tăng [αk,βk]. trong đó {thêm vào S đỉnh có nhãn nhỏ
cuối cùng quay lại đỉnh xuất dần. αk: khoảng cách đường đi nhất và sửa đổi nhãn của các
phát ban đầu; + Tmin = ∅ ngắn nhất. đỉnh không thuộc S}.
H:=G với các cạnh của G While |Tmin<n-1 do βk: đỉnh nối với xk trong End {l(a,b)=độ dài đường đi
sau khi bỏ đi chu trình; Begin đường đi ngắn nhất. ngắn nhất từ a đến b
While H còn các cạnh + Xét (u,v)∈E Trong quá trình tiến hành 4. Thuật toán Ployd
Begin If (u,v) không tạo các nhãn luôn luôn thay đổi Xác định đường đi ngắn nhất
thành chu trình trong Tmin. liên tục và chọn các nhãn
Chu trình con:=chu trình giữa mọi cặp đỉnh.
Then Begin nhỏ nhất.
trong H bắt đầu tại đỉnh Nhận xét:
Tmin= Tmin∪(u,v)
trong H cũng là đỉnh đầu Nhãn d(xk) = min[d(xk), - Dij KS kiểm tra đường đi
E=E(u,v)
mút của một cạnh thuộc chu End;
d(u0 + C[u,xk]]. Trong đó: ngắn nhất từ i->j.
trình. End. d(u) : là nhãn trước - Mô phỏng thuật toán
H:=H với các cạnh của chu Output (Tmin). C[u,xk]: là khoảng cách từ For i:=1 to n do
trình con được chèn vào tại 2. Thuật toán Prim u-> x. For j:=1 to n do
một đỉnh thích hợp; Xuất phát từ tư tưởng lân * Định nghĩa: If(i≠j) theo Dij ks ktra (i,j).
End {chu trình là chu trình cận lớn nhất. * Đồ thị G=<X,U> được Thuật toán:
Euler}. gọi là đồ thị có trọng số khi
III) Các thuật toán cơ bản và chỉ khi mỗi cạnh (cung)
3. Input: ma trận trọng số
C=(Cịj)nxm
Output: là ma trận D đường
đi ngắn nhất.
Ký hiệu:
dij là đường đi ngắn nhất từ
i->J.
θij là đỉnh đi trước đỉnh j
trong đường đi từ i->j
Bước 1: Khởi tạo Dij=Cij
θij =i
Bước 2: lặp k:=1 ->n
Bước 3: For i:=1 ->n
For j:=1 ->n
If(nếu) Dij>Dik+Dkj
-> Dij=Dik+DKj
θij =θki
4. Dạng chuẩn Chomsky
* Định nghĩa:
1 văn phạm được gọi là dạng
chuẩn Chomsky nếu tập sản
xuất có dạng A->BC
A->a
Ý nghĩa: Nếu thuộc dạng chuẩn
Chomsky thì khi xây dựng cây
văn phạm thì đó là cây nhị
phân.
* Mô tả thuật toán
Procedure Chomsky
Input: G=<∑,∆,P,S) PNC
không chứa ký tự vô ích, không
chứa epsilon sản xuất, không
chứa sản xuất đơn.
Output: G1 là dạng chuẩn
Chômsky.
P có dạng
A -> x1,x2,x3,…xn n≥2
A ->a
B1: Khử epsilon sản xuất
B2: Khử sản xuất đơn
B3: Khử ký tự vô sinh
B4: Khử ký tự không dẫn về
được
B5: Đưa về dạng chuẩn
Chomsky.