đồ quan hệ
Việc xây dựng quan hệ Armstrong của một sơ đồ quan hệ cho trước và ngược lại từ quan hệ cho trước ta xây dựng một SĐQH sao cho quan hệ cho trước này là quan hệ Armstrong của nó có vai trò rất quan trọng trong việc phân tích cấu trúc lôgic của mô hình dữ liệu quan hệ cả trong thiết kế lẫn trong ứng dụng. Đã có nhiều tác giả nghiên cứu vấn đề này. Trong mục này chúng tôi trình bày hai thuật toán giải quyết bài toán trên và đưa ra việc đánh giá các thuật toán này cũng như đánh giá độ phức tạp của bài toán trên.
Trước tiên, chúng ta cho một thuật toán tìm tập tất cả các phản khoá của hệ Spernner cho trước.
Thuật toán 1 ( Tìm tập phản khoá )
Vào: K = {B1,...,Bn} là hệ Sperner trên R. Ra: K-1.
Bước 1: Ta đặt K1 = {R - {a}: a ∈ B1}. Hiển nhiên K1 = {B1}-1.
Bước q + 1: (q < m). Ta giả thiết rằng Kq = Fq ∪
{X1... X tq}, ở đây X1,....,Xtq chứa Bq+1 và Fq = { A ∈
Kq : Bq+1⊆ A }. Đối với mỗi I ( I = 1,..., tq ) ta tìm các phản khoá của { Bq+1 } trên Xi tương tự như K1. Kí pháp chúng là Ai 1,..., Arii . Đặt Kq+1 = Fq∪ {Ai p : A ∈ Fq kéo theo Ai p ⊄ A,1 ≤ i ≤ tq. 1 ≤ p ≤ ri} Cuối cùng ta đặt K-1 = Km Định lí 2. Với mọi q (1 ≤ q ≤ m), Kq = { B1,.... Bq}-1, có nghĩa là Km = K-1., Rõ ràng, K và K-1 là xác định duy nhất lẫn nhau và từ định nghĩa của K-1 có thể thấy thuật toán của chúng ta không phụ thuộc vào thứ tự của dãy B1,...,
Bm. Đặt Kq = Fq∪ {X1,..., Xtq} và lq ( 1 ≤ q ≤ m-1) là số các phần tử của Kq. Khi đó ta có
Mệnh đề 3
Độ phức tạp thời gian tồi nhất của Thuật toán 2.1
là m-1 O ( |R|2∑ tq.uq). q=1 ở đây lq - tq, nếu lq > tq, uq = 1 nếu lq = tq
Rõ ràng trong mỗi bước thuật toán ta cóKq là hệ Sperner trên R. Ta biết rằng[5] kích thước của hệ Sperner bất kì trên R không vượt quá Cn[n/2], ở đây n =
|R|. Có thể thấy Cn[n/2] xấp xỉ bằng 2n+1/2/ (Π. n1/2). Từ đó độ phức tạp thời gian tồi nhất của thuật toán trên không nhiều hơn hàm số mũ theo n. Trong trường hợp mà lq ≤ lm (q = 1,..., m-1), dễ thấy rằng độ phức tạp thuật toán không lớn hơn O( |R|2 |K| |K-1|2 ). Như vậy, trong các trường hợp này độ phức tạp của Thuật toán 1 tìm K-1 là đa thức theo |R|, |K|, and |K-1|. Có thể thấy nếu số lượng các phần tử của K là nhỏ thì Thuật toán 1 là rất hiệu quả. Nó chỉ đòi hỏi thời gian đa thức theo |R|
Cho s = (R,F) là SĐQH trên R và a ∈ R. Đặt Ka = { A ⊆ R:A → {a}, ∃ B: (B → {a})(B ⊂ A)}. Ka được gọi là họ các tập tối tiểu của thuộc tính a.
Rõ ràng, R ∉ Ka, {a} ∈ Ka và Ka là hệ Sperner trên R.
Thuật toán 5. (Tìm tập tối tiểu của thuộc tính a) Vào: Cho s = (R = {a1,..., an}, F) là SĐQH, a = a1.
Ra: A ∈ Ka.
Bước 1: Ta đặt L(0) = R. Bước i + 1: Đặt
L(i) - ai+1 nếu L(i) - ai+1 → {a}, L(i+1) =
L(i), ngược lại. Khi đó A = L(n).
Bổ đề 6. L(n) ∈ Ka
Lời giải: Bằng phương pháp chứng minh qui nạp có thể thấy L(n) → {a}, và L(n) ⊆ ... ⊆ L(0) (1). Nếu L(n) = a, thì bởi định nghĩa của tập tối tiểu của thuộc tính a ta thu được L(n) ∈ Ka. Bây giờ ta giả thiết là tồn tại một B sao cho B ⊂ L(n) và B ≠ 0.
Như vậy sẽ có aj sao cho aj ⊄ B, aj ∈ L(n). Theo các xây dựng thuật toán này ta có L(j-1) - aj → {a}. Rõ ràng bởi (1) ta thu được L(n) - aj ⊆ L(j-1) - aj (2). Dễ thấy B ⊆ L(n) - aj.
Từ (1), (2) ta có B → {a}.
Dễ thấy, vì thuật toán xác định một phụ thuộc hàm bất kì có phải là phụ thuộc hàm của một SĐQH hay không là có độ phức tạp thời gian đa thức, nên độ phức tạp của Thuật toán 5 là O(|R|2|F|).
Bổ đề 7.
Cho s = (R,F) là SĐQH trên R và a ∈ R, Ka là họ các tập tối tiểu của a, L ⊆ Ka, {a} ∈ L. Khi đó L ⊂
Ka nếu và chỉ nếu tồn tại C, A → B sao cho C ∈ L và A → B ∈ F và ∀ E ∈ L => E ⊆ A ∪ ( C- B).
Lời giải. =>: Ta giả thiết rằng L ⊂ Ka. Do đó, tồn tại D ∈ Ka - L. Bởi {a} ∈ L và Ka là hệ Sperner trên R, chúng ta có thể xây dựng một tập cực đại Q sao cho D ⊆ Q ⊂ U và L ∪ Q là hệ Spernner. Từ định nghĩa của Ka, chúng ta thu được Q → {a} (1) và a ∉ Q (2). Nếu A → B ∈ F kéo theo (A tb Q, B ⊆ Q) hoặc A ⊆ Q thì Q+ = Q. Bởi (2) ta có Q → {a}. Điều này mâu thuẫn với (1). Do đó, tồn tại một phụ thuộc hàm A → B sao cho A ⊆ Q, B ⊆ Q. Từ cách xây dựng của
Q có C sao cho C ∈ L, A ⊆ Q, C - B ⊆ Q. Hiển nhiên rằng A ∪ (C-B) ⊆ Q.
Rõ ràng, E ⊆ A ∪ (C-B) đối với mọi E ∈ L. <=: Ta giả thiết rằng có C, và A → B sao cho C ∈
L, A → B ∈ F và E ⊆ A ∪ (C-B) đối với mọi E ∈ L (3). Bởi định nghĩa của L chúng ta thu được A ∪
U(C-B) → {a}. Bởi {a} thuộc L nên có D sao cho D ∈
Ka, a ∉ D, D thuộc A ∪ (C-B). Bởi (3) ta có D ∈ Ka - L.
Cơ sở trên bổ đề này và thuật toán 5, chúng ta xây dựng một thuật toán sau đây bằng qui nạp.
Thuật toán 8. Tìm họ các tập cực tiểu của thuộc tính a.
Vào: Cho s = (R, F) là một sơ đồ quan hệ và a thuộc R.
Ra: Ka
Bước 1: Đặt L(1) = E1 = {a}
Bước i + 1: Nếu có C và A → B mà C ∈ L(i), A
→ B ∈ F, ∀ E ∈ L(i) → E ∉ A ∪ ( C - B ), thì bởi thuật toán 5 chúng ta xây dựng Ei+1, ở đây Ei+1⊆ A ∪
( C - B), Ei+1 ∈ Ka . Chúng ta đặt K(i+1) = K(i) ∪ Ei+1 . Trong trường hợp ngược lại ta đặt Ka = L(i).
Bởi bổ đề 7 hiển nhiên rằng tồn tại một số tự nhiên t để Ka = L(t)
Có thể thấy rằng độ phức tạp thời gian tồi nhất của thuật toán là O ( U F Ka ( U
+ Ka )). Như vậy, độ phức tạp thời gian của thuật toán này là đa thức theo U , F
, và Ka .
Rõ ràng, nếu số lượng các phần tử của Ka đối với sơ đồ quan hệ s = <R, F> là đa thức theo kích thước của s, thì thuật toán này là rất hiệu quả. Đặc biệt khi
Ka là nhỏ.
Hiển nhiên rằng nếu đối với mỗi A → B ∈ F kéo theo a ∈ A hoặc a ∉ B, thì Ka ={a}
Nhận xét 9
Biết rằng [27] nếu s = <R, F> là một sơ đồ quan hệ, Z(F) = {A : A+ =A} và N(F) là hệ sinh nhỏ nhất của Z(F), thì
N(F) = MAX (F+) = ∪ MAX ( F+, a) a ∈ R
ở đây MAX(F+,a) = {A ⊆ U : A → {a} ∉ F+, A ⊂ B
→ B → {a} ∈ F+. Rõ ràng rằng, Ka là một hệ Sperner trên R. Có thể thấy MAX (F+, a) là tập các phản khoá của Ka đối với mọi a ∈ R. Như vậy, MAX(F+, a) = K- 1
Định lý 10
Cho r = {h1,...hm } là một quan hệ, và F là một họ f trên R. Khi đó FR = F nếu và chỉ nếu với mọi A ∈
P(R)
∩ Ei j nếu ∃ Ei j∈ Er ; A ⊆ Ei j LF(A) = A⊆Ei j
R ngược lại,
ở đây LF(A) = {a ∈ R : (A, {a}) ∈ F } và Er là hệ bằng nhau của r.
Trên cơ sở nhận xét 9, định lý 10, các thuật toán 1, 8, chúng ta xây dựng một thuật toán tìm quan hệ Armstrong từ một sơ đồ quan hệ cho trước như sau:
Thuật toán 11 (Tìm quan hệ Armstrong) Vào: Cho s = <R, F> là một sơ đồ quan hệ Ra: r là quan hệ sao cho Fr = F +
Bước 1: Đối với mỗi a ∈ R bởi thuật toán 2.8 chúng ta tính Ka, và từ thuật toán 2.1 xây dựng tập các phản khoá Ka-1 .
Bước 2: N = ∪ Ka-1 a ∈ R
Bước 3: Giả sử các phần tử của N là A1,...,At, chúng ta xây dựng quan hệ r = { h0, h1, ..., h0 } như sau: Với mỗi a ∈ R, h0(a) = 0, ∀i = 1,...,t
hi(a) = 0 nếu a ∈ Ai, hoặc hi(a) = 1 trong trường hợp ngược lại.
Do nhận xét 9 rõ ràng rằng, nếu chúng ta có N(F), thì chúng ta có thể trực tiếp xây dựng r. Độ phức tạp của việc xây dựng này phụ thuộc vào N(F)
. Dễ thấy độ phức tạp của thuật toán 11 là độ phức tạp của bước 1. Bởi bổ đề 3 và đánh giá của thuật toán 8, dễ thấy rằng độ phức tạp tồi nhất của thuật toán 11 là O ( n i n = ∑ 1 ( q mi − − ∑ 1 1 ti q ui q + F mi (mi + n))). ở đây R = {a1,...,an}, mi = Ka, and
ui q = liq nếu liq > tiq hoặc ui q = 1 nếu li q = tiq Trong trường hợp li q ≤ (∀ i, ∀ q : 1 ≤ q ≤ mi ), độ phức tạp thuật toán của chúng ta là
O ( n i n = ∑ 1 Ka i (n F + Ka i F + n Ka-1 2)).
Như vậy, độ phức tạp thuật toán 2.11 là đa thức theo R , F , Ka i , Ka-1 . Rõ ràng,
trong các trường hợp này nếu Kai và Ka-1 là đa thức (đặc biệt nếu chúng là nhỏ) theo R và
F , thì thuật toán của chúng ta là hiệu quả.
Bây giờ chúng ta sử dụng thuật toán 11 để xây dựng quan hệ Armstrong cho sơ đồ quan hệ trong ví dụ dưới đây.
Ví dụ 13
Cho s = <R, F> là một sơ đồ quan hệ, ở đây R = {a,b,c,d} và F = {{a,d} → R, {a} → {a,b,c},{b,d} →
{b,c,d}}.
Bởi thuật toán 8, chúng ta thu được Ka = {a}.Kb = {{a},{b}},Kc ={{a},{b,d},{c}}, Kd = {d}.
Trên cơ sở thuật toán 1, ta có Ka-1 = {b,c,d }, Kb-1 = {c,d}, Kc-1 = {{b},{d}}, K-1
d = {a,b,c}.
Do đó, N(F) = {{a,b,c }, {b,c,d}, {c,d}, {b}, {d}}. Khi đó ta xây dựng quan hệ r như sau:
a b c d 0 0 0 0 0 0 0 1 2 0 0 0 3 3 0 0
4 0 4 45 5 5 0 5 5 5 0
Bây giờ chúng ta xây dựng một thuật toán tìm một sơ đồ quan hệ s từ một quan hệ cho trước sao cho quan hệ này là quan hệ Armstrong của s.
Thuật toán 14 (Tìm một khoá tối thiểu từ tập các phản khoá).
Vào: Cho K là một hệ Sperner, H là một hệ Sperner, và C = {b1,...,bm} ⊆ R sao cho H-1 = K và ∃
B ∈ K : B ⊆ C.Ra : D ∈ H Ra : D ∈ H
Bước 1: Đặt T(0) = C Bước i+1: Đặt T = T(i) - bi+1
T nếu ∀ B ∈ K : T ∉ B T( i+1) =
T(i) ngược lại Cuối cùng đặt D = T(m)
Bổ đề 15. Nếu K là tập các phản khoá thì T(m) ∈
H.
Bổ đề 16. Cho H là một hệ Sperner trên R, và H-1 = { B1,...,Bm} là tập các phản khoá của H, T ⊆ H .Khi đó T ⊂ H, T ≠ ∅ nếu và chỉ nếu tồn tại B ⊆ U sao cho B ∈ T-1 , B ∉ Bi ( ∀ i : 1 ≤ i ≤ m).
Cơ sở trên bổ đề 16 và thuật toán 14 chúng ta xây dựng thuật toán sau.
Thuật toán 17. Tìm tập các khoá tối thiểu từ tập các phản khoá.
Vào: Cho K = {B1,...,Bk } là một hệ Sperner trên R
Ra: H mà H-1 = K
Bước 1: Nhờ thuật toán 2.14 chúng ta tính A1, đặt K(1) = A1
Bước i+1: Nếu có B ∈ Ki-1 sao cho B ∉ Bj ( ∀ j: 1≤ j ≤ k), thì bởi Thuật toán 2.14 chúng ta tính A i+1 , ở đây A i+1 ∈ H , A i+1⊆ B. Đặt K(i+1) = K(i) ∪ A i+1 . Trong trường hợp ngược lại ta đặt H=K(i).
Mệnh đề 18. Độ phức tạp của Thuật toán 17 là O( n ( q m = − ∑ 1 1 ( k lq + n tq uq) + k2 + n)) ở đây R = n, K = k, H = m, ý nghĩa của lq , tq, uq, xem trong mệnh đề 3.
Rõ ràng , trong các trường hợp mà lq ≤ k (∀ q : 1≤ q ≤ m-1) độ phức tạp thời gian của thuật toán là O ( R 2 K 2 H ). Dễ thấy trong các trường hợp này thuật toán 2.17 tìm tập các khoá tối tiểu có độ phức tạp thời gian là đa thức trong kích thước của R, K, H.
Nếu H là đa thức theo R và K , thì thuật toán là hiệu quả. Có thể thấy rằng nếu số lượng các phần tử của H là nhỏ thì thuật toán 17 là rất hiệu quả.
Bổ đề 19.
Cho F là một họ f trên R, a ∈R. Đặt LF(A) = {a
∈ R: ( A , {a}) ∈ F}, ZF = {A : LF (A) = A}. Rõ ràng, R ∈ ZF, A,B ∈ ZF → A ∩ B ∈ ZF. Kí pháp NF là hệ sinh tối tiểu ZF . Đặt Ma = { A ∈ NF : a ∉ A, ∃ B ∈
NF: a ∉ B,A ⊂ B}. Khi đó Ma = MAX (F,a), ở đây MAX(F,a) = {A ⊆ U : A là một tập cực đại không rỗng mà (A,{a}) ∉ F}.
Lời giải:
Biết rằng [27] MAX(F,a) ⊆ NF (1). Giả thiết rằng A ∈ Ma. Bởi A ∈ NF, có nghĩa là LF (A) = A, và a ∉ A , ta thu được ( A, {a}) ∉ F. Từ (1) và phù hợp với định nghĩa của Ma ta có A ∈ MAX(F,a).
Ngược lại, Nếu A ∈ MAX (F,a) thì do (1) ta có A ∈ NF (2). Do (A,{a}]) ∉ F và từ (2) ta thu được a ∉
A. Phù hợp với định nghĩa của MAX(F,a) ta có A ∈
Ma .
Trên cơ sở Thuật toán 17 và Bổ đề 19, ta xây dựng thuật toán dưới đây để tìm SĐQH s = <R,F> cho một quan hệ r cho trước sao cho F+ = Fr.
Thuật toán 20. (Tìm SĐQH) Vào: r là quan hệ trên R Ra: s = <R,F> mà F+ = FR
Bước1: Từ r ta tính hệ bằng nhau Er
Bước 2: Đặt Nr = { A ∈ Er : A ≠ ∩ { B ∈ Er : A ⊂ B}}
Bước 3: Với mỗi a ∈ R ta xây Na = {A ∈ Nr : a
∉ A ∃ B ∈ Nr : a ∉ B , A ∈ B } . Sau đó, bởi Thuật toán 17 ta xây họ Ha( Ha-1= Na)
Bước 4: Xây s = <R,F>, ở đây F = {A → {a} :
∀ a ∈ R , A ∈ Ha,A ≠ {a}} Mệnh đề 21.
FR = F+
Lời giải: Vì FR là một họ f trên R, có thể thấy NF r ⊂ Er, ở đây NFr là hệ sinh nhỏ nhất của ZFr. Do định nghĩa của hệ sinh nhỏ nhất ta có Nr = NFr. Do đó ta có Na = Ma. Từ định nghĩa của tập phản khoá và định nghĩa của tập Ka ta có Ha= Ka. Tù đó ta thu được F+ ⊆
FR .
Ngược lại, nếu A → B = {b1,...,bt} ∈ FR thì bởi việc xây dựng của F ta thu được A → {bi} ∈ F+ với mỗi i=l,...,t. Vì không có phụ thuộc hàm tầm thường {a} → {a} trong F, dễ thấy với mọi i=1,...,t, nếu
không có phụ thuộc hàm B → {bi} ∈ F , ở đây B ⊆
U - bi, thì bi ∈ A. Từ đó ta có A → B ∈ F+.
Có thể thấy Er, Nr, Na với a ∈ R được xây trong thời gian đa thức theo kích thước của r. Rõ ràng, việc xây dựng F phụ thuộc vào kích thước của Ha( ∀ a ∈
R). Do đó, độ phức tạp thời gian tồi nhất của Thuật toán 20 là n mi - 1 O ( n i n = ∑ 1 ( q mi = − ∑ 1 1 (kili q + nti q ui q ) + ki2 + n)) ở đây R = { a1,..., an}, Nai = ki , Hai = mi, ý nghĩa của các li q, ti q, ui q xem các Mệnh đề 3 và 18.
Dễ thấy, nếu li q ≤ ki ( ∀ i, ∀ q : 1≤ q ≤ mi - 1), thì độ phức tạp thời gian của thuật toán của chúng ta là O (n2 i n = ∑ 1 ki2 mi )
Bởi vì ki là đa thức theo kích thước của r, trong các trường hợp nếu is mi là đa thức theo kích thước của r, thì thuật toán của chúng ta là hiệu quả. Lúc đó độ phức tạp của nó là đa thức theo kích thước của r. Nếu Ha là nhỏ thì thuật toán của ta rất hiệu quả.
Bây giờ, nhờ Thuật toán 20 chúng ta xây dựng SĐQH s = <R,F> cho quan hệ sau đây.
Ví dụ 22 r là quan hệ sau đây trên R = {a, b, c, d}: a b c d 6 6 6 0 0 2 0 2 0 0 0 0 0 0 0 3 4 4 0 0 5 0 5 5 1 0 0 0 Dễ thấy là ER = {{a,b,c}, {b,c,d}. { a,c}, { b,c}, {c,d}.{b}, {c},{d}, ∅}, NR = {[a,b,c}, {b,c,d},{a,c},{c,d},{b},{d}}, Na = {b,c,d}, Nb= {{a,c},{c,d}}, Nc = {{b},{d}}, Nd ={a,b,c}
Ta có Ha = {a}, Hb = {{b}, {a,d}}, Hc = {{a}, {b,d},{c}}, Hd = {d}.
Ta xây dựng s = (R,F) như sau:
R = {a,b,c,d}, F = {{a,d} → {b},{a} → {c},{b,d}
→ {c}}.
Chúng ta trình bày hai kết quả cơ bản về độ phức tạp thuật toán cho việc xây dựng quan hệ Armstrong cho một SĐQH cho trước và ngược lại.
Định lí 23
Độ phức tạp thời gian cho việc tìm kiếm một quan hệ Armstrong của một SĐQH cho trước là hàm số mũ theo số lượng của các thuộc tính.
Định lí 24