3. Cây chuẩn tắc một chiều trên tập khóa K
2.4 Bảng mã của cây n-chiều trên tập khóa K(n)
Giả sử T TREE. Bảng mã của T ta kí hiệu là m(T) và được định nghĩa sau: m(T) = { k | k K và d D, d có mặt trong T sao cho f(T, l) = d }.
Nếu T d D thì m (T) = { l0 |l0 K }
Nếu T kl <dl, k2< d2, ...,ks <ds, ds+l>...> thì m(T)={kl,k2, ..., ks} ở đây ki là mã của d (i = l,2,...,s), riêng mã của thông tin ds+l ta chọn là ks+l
2.5 Cây nhị phân n- chiều tối ƣu.
Trước hết ta đưa vào các định nghĩa sau:
a. (T) = số các đỉnh khác nhau của cây T (kể cả lá)(nếu có k đỉnh giống nhau trong cây T thì ta xem đó là một đỉnh.
b. Deep(T, T0) = số cung của đường đi từ gốc cây T đến gốc cây T0 là cây con của T.
c. h(T) là chiều cao của cây Tvà h(T)=max{Deep(T,d) | d là lá của T, d D} .
Định nghĩa 2.6: (Định nghĩa cây nhị phân n-chiều tối ưu).
Cây Rn TREE(n) được gọi là cây nhị phân n chiều tối ưu trên tập khoá K(n) nếu Rn
thoả mãn đồng thời các điều kiện sau: 1. (Rn) = min { (t) | T (K(n))Rn } .
2. h(Rn) = min { h(T) | T (K(n))Rn } .
3. Deep(Rn, Rin-1 ) - Deep(Rn, Rjn-l) 1 với mọi i j (i, j= 1,2,..., s+l), ở đây các Rin-l (i = 1,2,..., s+l) là cây tối ưu (n-1) chiều trên tập khoá K(n)
4. Khóa ở đỉnh cha bất kỳ trong cây Rn
nhỏ hơn khóa ở đỉnh cây con phải và lớn hơn khóa ở đỉnh cây con trái (nếu chúng cùng chỉ số khoá).
Định lý 2.5:
Với mỗi cây T TREE(n) luôn tồn tại duy nhất cây nhị phân n-chiều tối ưu Rn sao cho: T (K(n))Rn (l) và AX(n) ├ T = Rn (2).
Trang 75 Theo định lý 2.2 thì luôn tồn tại dạng chuẩn Nn
sao cho: AX(n) ├ T = Nn (*). Áp dụng tiên đề ax2 một số hữu hạn lần ta thu được cây tối ưu Rn sao cho AX(n) ├ Rn
= Nn (**) Từ (*)&(**) ta có (2).
2.6 Thuật toán phân rã xây dựng cây n-chiều tối ƣu trên tập khóa hữu hạn K(n).
2.6.1 Thuật toán chuyển về cây n-chiều chuẩn tắc trên tập khoá hữu hạn
Ki(n)(i=l, 2,..., m) (Thuật toán 2.l).
Input: Cây T TREE(n), tập.khóa Ki(n)=K x K x ... x K x Ki (n-l lần K). Output: Nn TREE(n) là cây n-chiều chuẩn tắc: Nn (K(n))T.
Bước 1: Cây Nn được khởi gán là cây ban đầu T.
Bước 2: Kiểm tra xem Nn
có phải là dạng chuẩn tắc không?
Nếu đúng thì chuyển sang bước 4. Nếu sai thì chuyển sang bước 3.
Bước 3: Thực hiện lần lượt các tiên đề sau:
+ Thực hiện tiên đề ax7 + Thực hiện tiên đề ax8 + Thực hiện tiên đề axl + Thực hiện tiên đề ax2 + Thực hiện tiên đề ax3 + Thực hiện tiên đề ax4 + Thực hiện tiên đề ax5 + Thực hiện tiên đề ax6 Quay lại bước 2.
2.6.2 Thuật toán nối các cây n-chiều chuẩn tắc Nin n
(Ki(n))T(i=l, ...,m) thành
cây n-chiều chuẩn tắc Nn (K(n))T (Thuật toán 2.2).
Input: Các cây n-chiều chuẩn tắc Nin (Ki(n))t (i=l,...,m). Output: Cây chuẩn tắc Nn
(K(n))T.
Bước 1 : Khởi tạo biến đếm i = 1 . Kiểm tra i < m? +Nếu đúng thì chuyển sang bước 2.
+ Nếu sai thì chuyển sang bước 5. Bước 2:Nếu Ni
n
di thì chuyển sang bước 3,ngược lại thì thực hiện như sau:
+ Thêm kimax vào làm đỉnh của Nin.
+ Cây con trái của kimax là di.
+ Cây con phải là cây Ni+1
n. Chuyển sang bước 4. Bước 3: Nếu kis < kimax thì thực hiện như sau:
+ Thêm kimax vào đỉnh con phải của kis
+ Cây con trái của kimax là dis+l
+ Cây con phải là cây Ni+l n
. Ngược lại thì thực hiện như sau:
+ Loại đỉnh dis+l ra khỏi cây Ni n
.
+ Cây con phải của kis là cây Ni+l
n. chuyển sang bước 4.
Bước 4: Nếu Ni+l n
- dis+l thì áp dụng tiên đề ax4 cho đỉnh kimax ngược lại, lần lượt
áp dụng tiên đề ax2 , ax4 cho đỉnh kimax . Quay lại bước 1.
Bước 5: Cây chuẩn tắc Nn
(K(n))T.
2.6.3 Thuật toán phân rã tập khóa K(n) thành m tập con Kl(n), K2(n), ...,
Km(n) (Thuật toán 2.3)
Trang 77
n - 1 lần
1. Kl K2 ... Km = K
2. Ki Kj = (i j và i, j = 1,2, ..., m)
3. Mọi phần tử x Ki và y Ki+l đều thỏa mãn x<y với i= l,2,...,m-l.
Các tập Kl,K2, ... ,Kn thỏa mãn ba điều kiện trên gọi là phân hoạch tương đương trên tập khóa K.
Lập Ki(n) = K x K x ... x K x Ki (i = 1, 2,..., m) và ta có:
Kl(n) K2(n) ... Km(n) = K(n), đồng thời Ki(n) Kj = (i # j và i, j = 1,2,..., m). Đây cũng là một phân hoạch tương đương trên K(n).
2.6.4 Thuật toán chuyển về cây n -chiều tối ƣu (Thuật toán 2.4).
Input: Cây n-chiều chuẩn tắc Nn TREE(n), tập khóa K(n) = K x K x ... x K (n lần)
Output: Rn TREE(n) là cây n-chiều tối ưu Rn (K(n))Nn.
áp dụng hữu hạn lần tiên đề ax2 với Nn ta thu được cây tối ưu Rn (K(n))T.
2.6.5 Thuật toán phân rã xây dựng cây n-chiều tối ƣu trên tập khóa K(n).
Input: T TREE(n) , tập khóa K(n). Output: Cây tối ưu Rn
(K(n))T.
Bước 1: áp dụng thuật toán 2.4 để phân rã tập khóa K(n) thành m tập con Kl(n), K2(n),..., Km(n).
Bước 2: áp dụng thuật toán 2.2 để xây dựng các cây n-chiều chuẩn tắc Nin
của T trên các tập khóa Ki (n) (i= 1 , . . . , m) .
Bước 3: áp dụng thuật toán 2.3 để ghép các cây Ni (i=l, ...,m) thành cây chuẩn tắc Nn
(K(n))T.
Bước 4: áp dụng thuật toán 2.5 để chuyển cây chuẩn tắc N (xây dựng ở bước 3)
về cây tối ưu Rn
(K(n))Nn (K(n))T.
2.7 Ví dụ minh hoạ.
2.7.1 Ví dụ mô phỏng thuật toán chuyển về cây 2-chiều chuẩn tắc trên tập
khóa hữu hạn Ki(2) (thuật toán 2.l).
Xét cây T trên tập khoá hữu hạn Ki(2)= K1 xK2
với Kl={2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, K2={2, 3, 4, 5, 6, 7, 8, 9}. Cây T có dạng như sau:
T [2, 8] [2, 7] [2, 9] [1,3] [1,6] [1,13] [1,14] d1 d2 d3 d4 d5 d6 d7 [1,17] d8 d9 Bước 1: Khởi gán N2 = T
Bước 2: N2 chưa phải là dạng 2 chiều chuẩn tắc. Chuyển sang bước 3.
Bước 3:
+ áp dụng tiên đề axi7 cho cây N2 ta có: N2 [2, 8]
[2, 7] [2, 9]
[1,3] [1,6] [1,13] [1,14] d1 d2 d3 d4 d5 d6 d7 d8
Trang 79 + áp dụng tiên đề axi1 cho cây N2 ta có:
N2 [2, 8]
[1, 3] [2, 9]
d1 d2 [1,13] [1,14] d5 d6 d7 d8 + áp dụng tiên đề axi2 cho cây N2 ta thấy N2 không đổi
+ áp dụng tiên đề axi3 cho cây N2 ta thấy N2 không đổi + áp dụng tiên đề axi4 cho cây N2 ta thấy N2 không đổi + áp dụng tiên đề axi5 cho cây N2 ta thấy N2 không đổi + áp dụng tiên đề axi6 cho cây N2 ta thấy N2 không đổi Quay lại bước 2, kiểm tra thấy N2
là dạng chuẩn tắc. Chuyển sang bước 4.
Bước 4: N2 là dạng chuẩn tắc của cây T trên tập khoá Ki(2) N2 [2, 8]
[1, 3] [2, 9]
d1 d2 [1,13] [1,14] d5 d6 d7 d8
2.2.7 Ví dụ mô phỏng thuật toán nối các cây chuẩn tắc Ni
2
(Ki( 2))T
thành cây chuẩn tắc N2
(K(2))T (Thuật toán 2.3).
Giả sử ta xét trên tập khoá hữu hạn K = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15}. Phân rã K(2) = K x K thành 3 tập con K1(2), K2(2),K3(2) với :
K1(2) = K x K1, K2(2) = K x K2 , K3(2) = K x K3
(K1 ={1, 2, 3, 4, 5}, K2 ={6, 7, 8, 9, 10}, K3 ={11, 12, 13, 14, 15} là các phân hoạch tương đương trên K)
Giả sử ta có 3 cây hai chiều chuẩn tắc N1 , N2 , N3 tương ứng trên các tập khoá K1(2), K2(2),K3(2) như sau:
N12 [2, 2] N22 [2, 7] N32 [2, 13]
[1, 7] [2, 4] d5 [1, 11] [1, 11] [1, 14] d2 d3 d4 d5 d6 d8 d2 d3 d4 d5 Bước 1: Khởi gán i = 1.
Bước 2: i < 4. Chuyển sang bước 3. Bước 3: N1
2
di D.Nối N12 vào N2 ta được N2 N12 . i =2. Quay lên bước 2. Bước 2 : i < 4. Chuyển sang bước 3.
Bước 3: N2 2
di D. Nối N22 vào N2 ta được N2 [2, 2] [1, 7] [2, 4] d2 d3 d4 [2, 5] d5 [2,7] d5 [1, 11] d6 d8
áp dụng lần lượt tiên đề ax2 , ax4 cho đỉnh [2,5] ta có: N2 [2, 2] [1, 7] [2, 4] d2 d3 d4 [2, 7] d5 [1,11] d6 d8 i =3. Quay lên bước 2
Trang 81 Bước 2 : i < 4. Chuyển sang bước 3.
Bước 3: N3 2
N2 [2, 2] [1, 7] [2, 4] d2 d3 d4 [2, 7] d5 [2,10] [1,11] [2, 13] d6 d8 [1,11] [1,14] d6 d8 d9 d10 áp dụng lần lượt tiên đề ax2 , ax4 cho đỉnh [2,10] ta có:
N2 [2, 2] [1, 7] [2, 4] d2 d3 d4 [2, 7] d5 [2,13] [1,11] [1, 14] d6 d8 d9 d10 i =4. Quay lên bước 2
Bước 2 : i = 4. Chuyển sang bước 4. Bước 4: N2
(K(2))T là dạng chuẩn cần tìm.
2.7.3 Ví dụ mô phỏng thuật toán chuyển cây 2 - chiều chuẩn tắc của T về cây tối ƣu ( thuật toán 2.5) tối ƣu ( thuật toán 2.5)
Giả sử ta có cây:N2 [2, 2] [1, 7] [2, 4] d2 d3 d4 [2, 7] d5 [2,13] [1,11] [1, 14]
Trang 83
d6 d8 d9 d10 h(N2) =4. Ta có: [4/2]+1 =3. Bẻ cây N2
tại đỉnh [2,7] bằng tiên đề ax2 ngược ta được: R2 [2, 7] [2, 4] [2, 13] [2,2] d5 [1,11] [1, 14] [1, 7] d4 d6 d8 d9 d10 d2 d3 Bẻ cây con trái của R2
tại đỉnh [2,2] bằng tiên đề ax2 ngược ta được: R2 [2, 7]
[2, 2] [2, 13] [1,7] [2,4] [1,11] [1, 14]
d2 d3 d4 d5 d6 d8 d9 d10
R2 (K(2))T là cây 2 - chiều tối ưu cần tìm.
2.4.1 Mô phỏng thuật toán phân rã xây dựng cây 2 - chiều tối ưu:
Ta xét một ví dụ mô phỏng hoạt động của thuật toán phân rã. Để đơn giản ta xét cây nhị phân 2 chiều T với các tập khoá K(2) = K x K với K = {5,6,7,8,9,10,11,12,13,14,15,16,17,18} hữu hạn. Cây T có dạng như sau:
T [2, 12]
[2,7] [2, 14]
[2,11] [2,9] [2,12] [2,16]
[2,13] [1,7] [1,13] [1,14] [1,16] 2,13] [2,19] [2,20]
d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 [1,9] d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 [1,16]
d27 d28 d29 d30
Bước 1: Phân hoạch K thành 2 tập con ( để đơn giản ta cho m=2) , ta có K1 và K2 như sau: K1 = {5,6,7,8,9,10,11} , K2 = { 12,13,14,15,16,17,18}
K1(2) = K1 x K1 , K2(2) = K2 x K2
dễ thấy K1max = 11, K1min = 5, K2max = 18, K2min = 12.
Bước 2: Lần lượt thực hiện thuật toán 2.1 trên các tập khoá K1(2) và K2(2) ta thu được các cây 2 chiều chuẩn tắc N12
, N22 như sau: N1, 2 [2,7] N2, 2 [2,12] d6 [2,9] [1,14] [2,13] [1,13] [1,14] d1 [1,16] d3 [2,14] d13 [1,15] d1 [1,16] d16 d17 [1,6] [2,16] d15 d28 d16 d17 d20 d21 d22 d4 Bước 3:
Thực hiện thuật toán 2.2 để ghép các cây N1 2
, N2 2
thành cây chuẩn tắc N2 (K(2))T. Ta có cây N2 như sau:
N2 [2,7]
d6 [2,9]
[1,13] [2,12]
d13 [1,15] [1,14] [2,13] d15 d28 d1 [1,16] d3 [2,14]
Trang 85
d16 d17 [1,6] [2,16] d20 d21 d22 d4 Bước 4: áp dụng thuật toán 4 để chuyển cây chuẩn tắc N2
( xây dựng ở bước 3) về cây tối ưu R2
(K(2))N2 (K(2))T ta có cây R2 như sau:
R2 [2, 12] [2,7] [2, 14] d6 [2,9] [2,13] [2,16] [1,13] [1,14] d3 [1,6] d22 d4 d13 [1,14] d1 [1,16] d20 d21 d15 d28 d16 d17
Khi tiến hành thuật toán xây dựng cây 2 chiều tối ưu mà không áp dụng thuật toán phân rã ta cũng thu được cùng một kết quả như trên. Thật vậy, áp dụng thuật toán 2.1 trên tập khoá ban đầu K(2) ta có cây chuẩn tắc sau:
N2’ [2,7] (K(2))T d6 [2,9] [1,13] [2,12] d13 [1,15] [1,14] [2,13] d15 d28 d1 [1,16] d3 [2,14] d16 d17 [1,6] [2,16] d20 d21 d22 d4
áp dụng thuật toán 2.5 cho cây N2’ ta thu được cây tối ưu R2’ của T trên K(2) là:
[2,7] [2, 14]
d6 [2,9] [2,13] [2,16] [1,13] [1,14] d3 [1,6] d22 d4
d13 [1,14] d1 [1,16] d20 d21
Trang 87
KẾT LUẬN
Dựa vào các kết quả trong [3] về tối ưu hóa cây nhị phân một chiều với thông tin chứa ở lá trên tập khóa hữu hạn, luận văn đã xây dựng thuật toán phân rã tìm cây nhị phân một chiều tối ưu với thông tin chứa lá trên tập khóa nhằm giảm đáng kể thời gian xây dựng cây nhị phân tìm kiếm tối ưu đồng thời xây dựng chương trình mô phỏng thuật toán phân rã, luận văn cũng đã tổng quát hóa thuật toán phân rã cho lớp các thông tin có cấu trúc dạng cây nhị phân n-chiều với thông tin chứa ở lá trên tập khóa hữu hạn và đã đạt được các kết quả sau:
Với cây nhị phân một chiều:
Xây dựng các khái niệm: cây nhị phân một chiều với thông tin lá, hàm kết quả, sự tương đương giữa các cây nhị phân, dạng chuẩn của cây nhị phân một chiều, bảng mã của cây nhị phân, cây nhị phân một chiều tối ưu.
Định nghĩa,các qui tắc dẫn xuất và hệ tiên đề của cây nhị phân một chiều. Phát biểu và chứng minh các định lý về sự tương đương giữa các cây nhị
phân, sự tồn tại duy nhất của dạng cây chuẩn tắc, sự tồn tại của cây nhị phân tối ưu.
Thuật toán kiểm tra tính tương đương giữa hai cây nhị phân bất kỳ. Thuật toán chuyển về cây nhị phân chuẩn tắc trên tập khóa hữu hạn. Thuật toán nối các cây nhị phân chuẩn tắc.
Thuật toán xây dựng cây nhị phân tối ưu ( bẻ đôi cây chuẩn tắc)
Thuật toán phân hoạch tập khóa ban đầu K thành n tập khóa con K1, K2 ,..., Kn.
Thuật toán phân rã xây dựng cây nhị phân một chiều tối ưu với thông tin chứa ở lá trên tập khóa hữu hạn.
Cài đặt chương trình mô phỏng thuật toán phân rã xây dựng cây nhị phân một chiều tối ưu với thông tin chứa ở lá
Với cây nhị phân n-chiều:
Xây dựng các khái niệm: cây nhị phân n-chiều với thông tin chứa ở lá, hàm kết quả, sự tương đương giữa các cây nhị phân n-chiều, dạng chuẩn của cây nhị phân n-chiều, bảng mã của cây nhị phân n-chiều, cây nhị phân n-chiều tối ưu.
Định nghĩa các qui tắc dẫn xuất và hệ tiên đề của cây nhị phân n-chiều.
Phát biểu và chứng minh các định lý về sự tương đương giữa các cây nhị phân n- chiều, sự tồn tại duy nhất của dạng cây chuẩn tắc n-chiều, sự tồn tại của cây nhị phân n-chiều tối ưu.
Thuật toán kiểm tra tính tương đương giữa hai cây nhị phân n-chiều bất kỳ. Thuật toán chuyển về cây nhị phân n-chiều chuẩn tắc trên tập khóa hữu hạn. Thuật toán nối các cây nhị phân n-chiều chuẩn tắc.
Thuật toán xây dựng cây nhị phân n-chiều tối ưu( bẻ đôi cây n-chiều chuẩn tắc)
Phân hoạch tập khóa ban đầu K(n) thành n tập khóa con Kl(n), ..., Km(n). Thuật toán phân rã xây dựng cây nhị phân n-chiều tối ưu với thông tin chứa ở
lá trên tập khóa hữu hạn.
Trang 89
TÀI LIỆU THAM KHẢO:
[ 1 ] Do Duc Giao: Optimization for n-dementional binary search trees .
Cybemetic and System '94 - Voi II, World Scientific (trang 1337 - 1384). [2] Do Duc Giao and A.M Thoa: Optimỉzation for one-dementional binary search trees. HNU. Joumal ofScience, Nat . Sci. 2 (1995) trang 45 - 61 .
[3] Đỗ Đức Giáo và Lê Anh Cường: Tối ưu hóa cây nhị phân một chiều với thông tin chứa ở đỉnh trong trên tập khóa vô hạn.
[4] Phạm Ngọc Hùng: Thuật toán về lớp các thông tin có cấu trúc dạng cây nhị phân n chiều trên tập khoá vô hạn - Khóa luận tốt nghiệp cử nhân hệ chính quy năm 2002 - Khoa Công Nghệ - Đại Học Quốc Gia Hà Nội.
[5] Trần Hoàng Hải: Tối ưu hoá cây nhị phân n-chiều với thông tin chứa Ở đỉnh trong trên tập khóa hữu hạn. - Khóa luận tốt nghiệp cử nhân hệ chính quy năm 2000 - Khoa Công Nghệ - Đại Học Quốc Gia Hà Nội.
[6] H.Thiele, equivalenl transformation of one demensional binary search trees with information in nodes.
PHỤ LỤC
MÔ PHỎNG THUẬT TOÁN VÀ CÀI ĐẶT CHƢƠNG TRÌNH
3.1Tổng quan về chƣơng trình
3.1.1 Ngôn ngữ sử dụng cài đặt: Pascal
Trong luận văn em đã sử dụng ngôn ngữ lập trình Pascal để thể hiện các thụat toán và cài đặt chương trình bởi nó là ngôn ngữ trong sáng, đơn giản, cấu trúc chặt chẽ, rất thuận lợi trong việc thể hiện thuật toán hơn nữa là ngôn ngữ lập trình nhiều người biết và em cũng quen dùng.
3.1.2 Lƣu trữ cây nhị phân
Vì T là cây nhị phân bất kỳ khi đưa vào nên ta dùng cách lưu trữ móc nối để lưu trữ cây. Mỗi nút của cây sẽ là một con trỏ gồm các trường như sau:
Type TREE = ^Node; Node = Record Value:integer; TT:String; Left: TREE; Right:TREE; Level:integer; X:integer; Y:integer; end; Trong đó:
Value : là khoá của nút
TT: Là thông tin được lưu tại nút Left: Là cây con trái của nút Right: Là cây con phải của nút Level: vị trí của nút so với nút cha
X, Y: Tọa độ của nút trên màn hình đồ họa
Lưu ý: chúng ta chỉ quan tâm đến 4 thuộc tính đầu, còn 3 thuộc tính sau chỉ dùng để hỗ trợ cho việc lập trình.
Ta kí hiệu lá của cây là nút có dạng như sau: l.value :=0;
Trang 91 l.left:=nil;
3.2 Chƣơng trình: Uses crt,graph; Type Pointer = ^node; Node=record value : byte;
left, right : pointer ; tt : string; level : integer; x, y : integer; end; Header_node = record title : string; link: pointer; end; tree =^header_node ; Var dic:tree;pd:pointer;t,tam,ll:byte; kmax,kmin:integer;temp:boolean; (**************************************) Procedure taotd(var header:tree);
begin
new(header);
header^.title:=' CAY NHI PHAN ' ;