- Bài trước: Phân rã cây và độ rộng cây.
- Bài kế tiếp: logic bậc nhất và truy vấn hội (conjunctive queries).
Bài trước lược khảo các khái niệm độ rộng cây, phân rã cây, đồ thị dây cung và một vài bổ đề quan trọng để hiểu thêm về các khái niệm này. Bài cũng đề cập đến một thuật toán thời gian đa thức nhận dạng đồ thị dây cung và xây dựng phân rã cây tối ưu của một đồ thị dây cung. Bài này nói về một thuật toán thời gian tuyến tính để nhận dạng đồ thị dây cung; sau đó ta đề cập đến siêu đồ thị phi chu trình (acyclic hypergraph). Các kết quả này sẽ được dùng đến để thiết kế các thuật toán định trị phép kết nối (join evaluation) trong cơ sở dữ liệu.
1. Nhận dạng đồ thị dây cung
Trong bài trước ta đã chứng minh rằng một đồ thị là dây cung nếu và chỉ nếu tồn tại một thứ tự loại trừ hoàn hảo (perfect elimination order) cho nó. Năm 1984, Robert Tarjan và Mihalis Yannakakis thiết kế một thuật toán rất đơn giản để nhận diện một đồ thị dây cung trong thời gian tuyến tính. (Khi đọc lịch sử lý thuyết cơ sở dữ liệu và xem danh sách những người hiện đang đóng góp nhiều cho ngành cơ sở dữ liệu, bạn sẽ thấy rất nhiều người gốc Hy Lạp! Tôi hy vọng 10 năm nữa sẽ có một anh Hy Lạp viết thế này về người Việt.)
Thuật toán của Tarjan-Yannakakis gồm hai bước đơn giản.
- Bước 1: xây dựng một thứ tự các đỉnh đồ thị
dùng một thuật toán gọi là thuật toán tìm kiếm lực lượng cực đại (maximum cardinality search, viết tắt là MCS). Ta sẽ chứng minh rằng thứ tự đỉnh mà thuật toán MCS in ra sẽ là thứ tự loại trừ hoàn hảo của
nếu và chỉ nếu
là đồ thị dây cung.
- Bước 2: kiểm tra xem thứ tự sinh bởi MCS có phải là thứ tự loại trừ hoàn hảo không.
Cả thuật toán MCS và bước kiểm tra đều có thời gian chạy là , trong đó
là số đỉnh của đồ thị và
là số cạnh.
1.1. Bước 1
Gọi đồ thị nhập là ; giả sử nó có
đỉnh và
cạnh. Thuật toán MCS rất đơn giản. Nó sẽ tạo một thứ tự
, nghĩa là
, gọi là nhãn
của đỉnh
, chính là vị trí của
trong thứ tự đó. Đầu tiên ta chọn một đỉnh
tuỳ hỉ và gán
. Sau đó, với
, tuần tự chọn một đỉnh
chưa có nhãn kề với nhiều đỉnh đã có nhãn nhất và gán nhãn
. Nếu có hoà thì chọn tuỳ hỉ.
Định lý 1 Thứ tự
sinh bởi thuật toán MCS là thứ tự loại trừ hoàn hảo nếu và chỉ nếu
là đồ thị dây cung.
Chứng minh: Nếu là thứ tự loại trừ hoàn hảo thì tất nhiên
là đồ thị dây cung như đã chứng minh trong bài trước. Để chứng minh điều ngược lại ta cần một khái niệm sau đây. Một đường dẫn (path)
với
của đồ thị
được gọi là một thung lũng nếu tồn tại một giá trị
sao cho
và không có cạnh nào của nối hai đỉnh không kề nhau trên đường dẫn này. (Đây là một đường dẫn không có dây cung.) Giá trị
gọi là độ cao bên phải của thung lũng.
Giả sử là đồ thị dây cung nhưng
lại không phải là thứ tự loại trừ hoàn hảo. Như vậy, tồn tại ba đỉnh
sao cho
,
, và
. Như vậy
là một thung lũng với độ cao bên phải là
.
Tại thời điểm MCS chọn gán nhãn cho thì
phải kề với một đỉnh
đã có nhãn và
không kề với
. Nếu không thì ta đã chọn gán nhãn cho
thay vì
. Hơn nữa,
cũng không kề với
tại vì nếu
thì ta có một chu trình không có dây cung. Do đó, nếu
thì
là một thung lũng; còn nếu
thì
là một thung lũng. Lưu ý rằng so với thung lũng
ban đầu thì thung lũng mới này (hoặc
hoặc
) có độ cao bên phải lớn hơn.
Tổng quát hơn, xét một thung lũng có chiều dài :
. Với cùng lý luận như trên, tại thời điểm
được dán nhãn phải tồn tại một đỉnh
đã được gán nhãn kề với
mà không kề với
, nếu không thì
đã được chọn thay vì
. Gọi
là số nhỏ nhất từ
đến
sao cho
kề với
. Dễ thấy
và
không kề nhau vì nếu không thì ta có một chu trình không có dây cung
. Tùy theo
hay ngược lại mà ta có hoặc
hoặc
là một thung lũng mới. Và thung lũng mới này có chiều cao bên phải lớn hơn chiều cao bên phải của thung lũng
ban đầu.
Do đó, từ thung lũng đầu tiên ta có thể tạo liên tục các thung lũng với chiều cao bên phải lớn dần. Điều này hiển nhiên là vô lý.
Bài tập 1 Chỉ ra cách hiện thực thuật toán MCS chạy trong thời gian
.
1.2. Bước 2
Kiểm tra xem thứ tự có phải là thứ tự loại trừ hoàn hảo không cũng là một bài tập thiết kế thuật toán cực kỳ thú vị. Đại khái, ta quét các đỉnh của
từ nhãn số
đến nhãn số
. Với mỗi đỉnh
, ta lưu trữ hai con trỏ
định nghĩa như sau. Giả sử nhãn của
là
, và hiện nay ta đã quét đến đỉnh có nhãn
. Con trỏ
trỏ đến hàng xóm của
có nhãn nhỏ nhất trong đoạn
; con trỏ
trỏ đến hàng xóm của
có nhãn lớn nhất trong đoạn
. Nếu không tồn tại hàng xóm nào của
có nhãn trong đoạn
thì hai con trỏ này gán bằng
.
Khi quét đến đỉnh , ta cập nhật các con trỏ
của các đỉnh
với nhãn
. Với mỗi hàng xóm
của
sao cho
, nếu
thì ta gán
. Nếu
(và vì thế cả
) có giá trị lớn hơn
thì ta gán
.
Sau khi cập nhật xong các con trỏ , ta lại xét từng hàng xóm
của
. Nếu tồn tại một hàng xóm
với
sao cho
và
thì ta “báo lỗi” rằng
không phải là thứ tự loại trừ hoàn hảo. (Tại sao?)
Nếu sau khi đã quét hết các đỉnh mà không bị báo cáo lỗi thì ta báo cáo là đồ thị dây cung, vì
là thứ tự loại trừ hoàn hảo.
Bài tập 2 Chứng minh rằng thuật toán trên chạy đúng cho Bước 2, và có thể thiết kế để nó chạy trong thời gian
.
2. Siêu đồ thị phi chu trình
2.1. Định nghĩa và vài tính chất
Ta thảo luận siêu đồ thị phi chu trình (acyclic hypergraph) vì ít nhất 2 lý do. Một là (đồ thị Gaifman của) nó tương đương với đồ thị dây cung. Hai là ta sẽ dùng nó để thiết kế thuật toán kết nối (join algorithm) cho các truy vấn hội (conjunctive query) trong cơ sở dữ liệu, sẽ thảo luận trong bài kế tiếp.
Định nghĩa 2 Một siêu đồ thị
là phi chu trình nếu tồn tại một phân rã cây
sao cho mỗi khối
là một siêu cạnh nào đó của
; nói cách khác
với mọi
. Cụ thể hơn,
là một cây thoả hai tính chất: (a) với mọi siêu cạnh
thì
với một đỉnh cây
nào đó, và (b) với mọi đỉnh
thì tập
là khác rỗng và tạo thành một cây con của
.
Mục tiêu của chúng ta trong phần này của bài là tìm một thuật toán hiệu quả để xem một siêu đồ thị cho trước có phải là phi chu trình hay không, và xây dựng một phân rã cây cho nó. Các kết quả cũng của Tarjan và Yannakakis. Để thiết kế được thuật toán, chúng ta cần phân tích một số thuộc tính của siêu đồ thị phi chu trình. Cho một siêu đồ thị bất kỳ , đồ thị Gaifman
của
là một đồ thị thông thường (không phải siêu đồ thị) với tập đỉnh là
và
là một cạnh của
nếu và chỉ nếu
với
là một siêu cạnh nào đó của
. Định lý sau đây cho ta ít nhất ba cách để định nghĩa đồ thị phi chu trình.
Định lý 3 Gọi
là một siêu đồ thị. Ba điều sau đây tương đương nhau.
- (i)
là phi chu trình
- (ii) ta có thể xoá tất cả các đỉnh của
bằng cách lập đi lập lại một trong hai tác vụ: (a) xoá một đỉnh chỉ thuộc về một siêu cạnh duy nhất, (b) xoá một siêu cạnh là tập con của một siêu cạnh khác.
- (iii) đồ thị Gaifman
của
là một đồ thị dây cung, và mọi clique của
đều là tập con của một siêu cạnh nào đó của
.
Chứng minh: Xét phân rã cây
của
thoả điều kiện trong định nghĩa đồ thị phi chu trình. Trước hết, ta xoá tất cả các siêu cạnh
của
thoả điều kiện: siêu cạnh
không phải là một khối của
và
với
nào đó. Kế đến, xét một lá
tuỳ ý của phân rã cây
. Lưu ý rằng
là một cạnh của
. Gọi
là đỉnh kề với
trên phân rã cây. Ta xoá các phần tử trong
. Từ định nghĩa của phân rã cây ta biết rằng tại thời điểm này thì các phần tử thuộc
chỉ thuộc về một mình
. Sau đó xoá
và xoá đỉnh
khỏi phân rã cây. Lập lại quá trình này với cây mới.
Thứ tự xoá các đỉnh thoả điều kiện
là thứ tự loại trừ hoàn hảo của đồ thị
. Do đó
là đồ thị dây cung. Xét một cái clique
bất kỳ của
. Tất nhiên nếu
thì tồn tại siêu cạnh chứa
. Xét
và giả sử không có siêu cạnh nào chứa
. Bằng quy nạp, ta có thể giả sử rằng với mọi
thì tồn tại một siêu cạnh chứa
(cũng là một clique). Chọn một siêu cạnh
tuỳ hỉ sao cho
. Với mỗi
thì
thuộc về
với mọi
; do
có ít nhất
cạnh
chứa
. Giả sử
là đỉnh đầu tiên của
bị xoá. Ta không thể xoá đỉnh
bằng tác vụ (a) cho đến khi
các cạnh
đã được xoá. Để xoá
bằng tác vụ (b) thì tại thời điểm đó nó phải là tập con của một
nào đó, mà như vậy thì
vẫn chứa toàn bộ
. Sau khi xoá xong
, thay
bằng
thì ta lại vẫn có một bộ các cạnh chứa đám
như cũ. Tóm lại, ta không có cách nào xoá khối ràng buộc này được.
Ta dùng thuật toán giải Bài toán (2) trong bài trước để xây dựng một phân rã cây cho
. Trong phân rã cây này thì các khối
đều là các cliques cực đại. Mà các cliques cực đại thì đều là các cạnh của
.
2.2. Thuật toán nhận dạng
Từ thuộc tính của định lý 3, ta có thể thiết kế một thuật toán thời gian đa thức để xác minh xem một siêu đồ thị cho trước có phải là siêu đồ thị phi chu trình hay không. Tuy nhiên, thuật toán này có thời gian chạy không tốt. Trong phần này của bài, ta trình bày thuật toán thời gian tuyến tính để xác minh xem một siêu đồ thị có phải phi chu trình hay không.
- Chọn một siêu cạnh
tuỳ hỉ. Tất cả các đỉnh nằm trong cạnh này được gán nhãn bằng
. Để dùng về sau, ta sẽ dùng hàm
để chỉ cái nhãn này; nghĩa là ta gán
với mọi
. Sau đó loại đi tất cả các cạnh chỉ chứa các đỉnh có nhãn
bằng
.
- Với
, trong khi vẫn còn đỉnh chưa có nhãn thì chọn cạnh
chứa nhiều đỉnh đã có nhãn
nhất. Cạnh mới
sẽ phủ một số đỉnh chưa có nhãn. Ta gán cho các đỉnh mới này nhãn
. Rồi lại loại đi các cạnh chỉ chứa các đỉnh đã gán nhãn. Tăng
lên
và lặp lại bước này.
- Giả sử sau khi vòng lặp trên chạy xong thì ta đã chọn các cạnh
; các cạnh này phủ tất cả các đỉnh.
- Với mọi tập đỉnh
, định nghĩa
, và
.
- Thuật toán kết luận rằng
là đồ thị phi chu trình nếu và chỉ nếu
- với mọi
ta có
, và
- với mọi
, nếu
thì
.
- với mọi
Để chứng minh rằng thuật toán chạy đúng, ta cần một bổ đề.
Bổ đề 4 Giả sử
là đồ thị phi chu trình. Gọi
là một thứ tự của tất cả các đỉnh định nghĩa bằng cách xếp các đỉnh trong
trước theo một trật tự bất kỳ, rồi đến các đỉnh của
, rồi đến
, vân vân, cho đến
. Thì
là một output hợp lệ của thuật toán MCS chạy trên đồ thị Gaifman của
.
Chứng minh: Trước hết, gán nhãn
cho các đỉnh trong
. Dễ thấy rằng các nhãn này không mâu thuẫn với MCS. Giả sử nhãn
của các đỉnh từ
đến
cũng đều thống nhất với MCS. Xét một đỉnh
tuỳ ý trong
. Giả sử ta chạy MCS và MCS không chọn
mà chọn
. Như vậy,
phải có ít nhất nhiều hàng xóm đã có nhãn
như
. (Tại thời điểm này, các hàng xóm đã có nhãn
là các hàng xóm đã có nhãn
từ
đến
.) Gọi tập các hàng xóm của
đã có nhãn
là
. Do
là phi chu trình, đồ thị Gaifman của
là đồ thị dây cung, và MCS trả về một thứ tự loại trừ hoàn hảo. Vì thế
là một clique của đồ thị Gaifman của
. Do Tính chất
trong định lý 3, phải tồn tại một siêu cạnh
sao cho
.
Tại thời điểm sắp được chọn thì
chưa được chọn (vì
chứa đỉnh
chưa có nhãn
). Do đó, số đỉnh đã có nhãn
của
nhỏ hơn hoặc bằng số đỉnh đã có nhãn
của
. Từ đó dễ thấy rằng số hàng xóm đã có nhãn
của
nhỏ hơn hoặc bằng số hàng xóm đã có nhãn
của
. Và vì thế MCS có thể chọn
cũng được. Tóm lại,
là một chọn lựa không mâu thuẫn với MCS. Khi
đã không mâu thuẫn với MCS thì tất cả các đỉnh còn lại trong
chọn theo bất kỳ thứ tự nào cũng không mâu thuẫn với MCS vì mỗi lần chọn thêm một đỉnh
từ
thì số hàng xóm đã có nhãn
của
tăng lên
so với
trước đó.
Định lý 5 Thuật toán trên trả về câu trả lời đúng. Nghĩa là,
là đồ thị phi chu trình nếu và chỉ nếu
- với mọi
ta có
, và
- với mọi
, nếu
thì
.
Chứng minh: Trước hết, giả sử là đồ thị phi chu trình. Xét
trước. Đặt
cho tiện. Ta phải chứng minh rằng
. Nếu
có nghĩa là tất cả các đỉnh trong
đều được phủ ở cùng bước
thì hiển nhiên
. Như vậy chỉ còn trường hợp
. Giả sử
, thì
. Gọi
là đỉnh tuỳ ý. Do
được chọn ở bước
, ta phải có
. Trong đồ thị Gaifman của
thì
kề với tất cả các đỉnh trong
và với tất cả các đỉnh trong
. Vì
là đồ thị phi chu trình, theo Bổ đề 4 thì
tạo thành một clique. Do đó, tồn tại một siêu cạnh
sao cho
. Mà như vậy thì
chứa nhiều đỉnh đã có nhãn
hơn
, vô lý! Kế đến, xét
tuỳ hỉ sao cho
. Định nghĩa
và giả sử
, nghĩa là
. Tương tự như trên gọi
là đỉnh tuỳ ý trong
và lập luận như trên ta sẽ có điều vô lý.
Ngược lại, giả sử hai điều kiện trong phát biểu định lý là đúng. Ta sẽ chứng minh rằng thoả tính chất
trong trong Định lý 3 để chứng minh rằng
là đồ thị phi chu trình. Chạy chỉ số
. Trước hết, ta loại đi tất cả các cạnh
sao cho
. Sau đó, loại đi các đỉnh nằm trong
vì lúc này ta biết chắc chúng là các đỉnh chỉ thuộc về
. Rồi giảm
đi
. Dễ thấy rằng bằng cách như vậy ta có thể loại hết các đỉnh của
.
Bài tập 3 Hiện thực hoá thuật toán xác minh đồ thị phi chu trình như mô tả ở trên sao cho nó có thời gian chạy là
.
2.3. Thuật toán xây dựng phân rã cây của một đồ thị phi chu trình
Để xây dựng phân rã cây cho đồ thị phi chu trình , ta chạy thuật toán xác minh như trong phần trước. Sau đó, ta tạo một phân rã cây mà các khối là các siêu cạnh của
. Với mỗi khối
, ta nối
với
. Với mỗi khối
sao cho
, ta nối
với
. Đến đây ta được một cái rừng. Nối các cây trong rừng này theo một cách bất kỳ thành một cây lớn.
Bài tập 4 Chứng minh rằng cách xây dựng như trên trả về một phân rã cây của đồ thị phi chu trình
. Thời gian chạy của thuật toán là
.
Thật ra để xây dựng phân rã cây thì ta không cần nối với
cho đám
. Một phân rã cây
bất kỳ của siêu đồ thị
cũng là một siêu đồ thị của
. Đám
không có tập nào chứa tập nào, và chúng tạo thành bộ khung cho phân rã cây của
. Phân rã cây
gọi là phân rã cây không dư thừa vì không có khối nào là tập con của khối nào. Thuật toán trên cho phép ta xây dựng phân rã cây không dư thừa cho một đồ thị phi chu trình trong thời gian tuyến tính. Cũng dễ thấy rằng
, do đó
Định lý 6 Phân rã cây không dư thừa của đồ thị phi chu trình
có số đỉnh nhỏ hơn
, và ta có thể xây dựng một phân rã cây như vậy trong thời gian tuyến tính.
