0
Tải bản đầy đủ (.pdf) (117 trang)

Thuật toán phân rã tập khóa K(n) thành m tập con Kl(n), K2(n), ,

Một phần của tài liệu TỐI ƯU HOÁ LỚP CÁC THÔNG TIN CÓ CẤU TRÚC DẠNG CÂY NHỊ NGUYÊN 1 VÀ N CHIỀU VỚI THÔNG TIN CHỨA Ở LÁ TRÊN TẬP KHÓA HỮU HẠN BẰNG MÔ HÌNH XỬ LÝ SONG SONG (Trang 79 -79 )

3. Cây chuẩn tắc một chiều trên tập khóa K

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 ' ; header^.link:=nil;

end;

(**************************************) Procedure chentu(var p:pointer;word:integer; tt:string;level:integer;x:integer;y:integer); Begin if p=nil then begin new(p); if word = 0 then begin p^.value:=word; p^.left:=nil; p^.right:=nil; p^.tt:=tt; p^.level:=level;

Trang 93 p^.x:=x;

p^.y:=y; end

else if (word<>0) then begin p^.value:=word; p^.left:=nil; p^.right:=nil; p^.tt:=''; p^.level:=level; p^.x:=x; p^.y:=y; end; end

else if level <=p^.level then begin

if p^.value=0 then writeln('la khong co con') else chentu(p^.left,word,tt,level,x,y);

end

else if level > p^.level then begin

if p^.value=0 then writeln('la khong co con') else chentu(p^.right,word,tt,level,x,y); end;

End;

(**************************************) procedure cong(var p:pointer;a,b:integer);

Begin if p <> nil then begin p^.x:=p^.x+a; p^.y:=p^.y+b; cong(p^.left,a,b);cong(p^.right,a,b); end; End; (*******************************************) Procedure tru(var p:pointer;a,b:integer);

Begin

if p <> nil then begin

p^.x:=p^.x-a; p^.y:=p^.y-b; tru(p^.left,a,b);tru(p^.right,a,b);

end; End;

(*******************************************) Procedure ax1(var p:pointer);

Var a,b:integer; Begin

if p <> nil then begin

if (p^.left=nil) and (p^.right=nil) then else

begin

if p^.left = nil then else

if p^.left^.value=0 then ax1(p^.right) else

if (p^.left^.left <> nil ) or (p^.left^.right <> nil )then begin

ax1(p^.left);

if p^.left^.value >= p^.value then begin cong(p^.left^.left,p^.left^.x - p^.left^.left^.x, p^.left^.y - p^.left^.left^.y); p^.left:=p^.left^.left; end; ax1(p^.right); end; end; end; End; (**************************************) Function ktax1(var p:pointer):boolean;

Begin

ktax1:=false; if p <> nil then begin

if (p^.left = nil) and (p^.right = nil) then else begin

if p^.left = nil then else if p^.left^.value = 0 then ktax1:=ktax1(p^.right) else

if (p^.left^.left <> nil) or (p^.left^.right <> nil) then begin

Trang 95 ktax1:=ktax1(p^.left);

if (p^.value <= p^.left^.value) then begin ktax1:=true; exit; end; ktax1:=ktax1(p^.right); end; end; end; End; (**************************************************) Procedure tdax1(var p:pointer);

Var kt:boolean; Begin ax1(p); kt:=ktax1(p); while kt=true do begin ax1(p); kt:=ktax1(p); end; End; (************************************************) Procedure ax2_thuan(var p:pointer);

Var store,tam1,tam2:pointer;

l,m,n,kc,a,b,c,d,e,f,g,h,i,k:integer; Begin

if p<> nil then begin

if (p^.left=nil) and (p^.right=nil) then else

begin

if p^.left=nil then else

if p^.left^.value=0 then ax2_thuan(p^.right)

else if (p^.left^.left <> nil ) or (p^.left^.right <> nil ) then begin

ax2_thuan(p^.left);

if (p^.left^.value <p^.value) and (p^.left^.value <> 0) then begin

a:=p^.x; b:=p^.y; c:=p^.left^.x; d:=p^.left^.y; e:=p^.left^.left^.x;

f:=p^.left^.left^.y ; g:=p^.left^.right^.x; h:=p^.left^.right^.y;

i:=p^.right^.x; k:=p^.right^.y; l:=g-c; m:=i+l; n:=i-l; kc:=n-g; tam1:=p^.right;tam2:=p^.left^.right; store:=p; cong(p^.left^.left,c-e,d-f); cong(p^.right,(a+(a-e))-i,f-d); cong(p^.left^.right,kc,0); p:=p^.left; p^.x:=a; p^.y:=b; p^.right:=store; p^.right^.x:=i; p^.right^.y:=k; p^.right^.left:=tam2; p^.right^.right:=tam1; end; ax2_thuan(p^.right); end; end; end; End; (***********************************************) Function numr(p:pointer):integer; Var num:integer; Begin num:=0;

while p^.right <> nil do begin p:=p^.right; num:=num+1; end; numr:=num; End; (***********************************************) Function numl(p:pointer):integer; Var num:integer; Begin num:=0;

while p^.left <> nil do begin p:=p^.left; num:=num+1; end; numl:=num; End; (*************************************************)

Trang 97 Procedure ax2_nghich(var p:pointer);

Var store,tam1,tam2:pointer;

dct,dcp,a,b,c,d,e,f,g,h,l,m,o:integer; Begin

if p<> nil then begin

if (p^.left=nil) and (p^.right=nil) then else

begin

if p^.right=nil then else

if p^.right^.value=0 then ax2_nghich(p^.left)

else if ((p^.right^.left <> nil ) or (p^.right^.right <> nil )) and (p^.right^.right^.value<>0) then

begin dct:=numl(p); dcp:=numr(p); if (dct=dcp) or (dcp=dct+1) then else begin ax2_nghich(p^.left);

if p^.value < p^.right^.value then begin

a:=p^.x; b:=p^.y; c:=p^.left^.x; d:=p^.left^.y; e:=p^.right^.right^.x - p^.right^.x; f:=p^.right^.right^.y - p^.right^.y; g:=p^.x-e; h:=p^.y+f; l:=p^.right^.left^.x - p^.right^.x; m:=p^.right^.left^.y - p^.right^.y; o:=(p^.left^.x-l); cong(p^.left,-e,f); tru(p^.right^.right,p^.right^.right^.x - p^.right^.x, p^.right^.right^.y - p^.right^.y); tru(p^.right^.left,p^.right^.left^.x -o,0); tam1:=p^.left; tam2:=p^.right^.left; store:=p;

p:=p^.right; p^.x:=a; p^.y:=b; p^.left:=store;

p^.left^.x:=c; p^.left^.y:=d; p^.left^.right:=tam2;

p^.left^.left:=tam1; end;

ax2_nghich(p^.right); end; end; end; end; End; (*******************************************) Procedure ax3(var p:pointer);

Var a,b:integer; Begin

if p <> nil then begin

if (p^.left=nil) and (p^.right=nil) then else

begin

if p^.right = nil then else

if p^.right^.value=0 then ax3(p^.left) else

if (p^.right^.left <> nil ) or (p^.right^.right <> nil) then begin

ax3(p^.left);

if p^.right^.value <= p^.value then begin tru(p^.right^.right,p^.right^.right^.x - p^.right^.x, p^.right^.right^.y - p^.right^.y); p^.right:=p^.right^.right; end; ax3(p^.right); end; end; end; End; (**************************************) Function ktax3(var p:pointer):boolean;

Begin

ktax3:=false; if p <> nil then begin

if (p^.left = nil) and (p^.right = nil) then else begin

if p^.right = nil then else if p^.right^.value = 0 then

Trang 99 ktax3:=ktax3(p^.left)

else

if (p^.right^.left <> nil) or (p^.right^.right <> nil) then begin

ktax3:=ktax3(p^.left);

if (p^.right^.value <= p^.value) then begin ktax3:=true; exit; end; ktax3:=ktax3(p^.right); end; end; end; End; (************************************************) Procedure tdax3(var p:pointer);

Var kt:boolean; Begin ax3(p); kt:=ktax3(p); while kt=true do begin ax3(p); kt:=ktax3(p); end; End; (*******************************************) Procedure ax4(var p:pointer);

Var a,b:integer; Begin

if p <> nil then begin

if (p^.left=nil) and (p^.right=nil) then else

begin

if (p^.left <> nil ) and (p^.right <> nil) then begin

ax4(p^.left);

if (p^.left^.value = p^.right^.value) and (p^.left^.value =0) then

begin

if (p^.left^.tt = p^.right^.tt) then begin

a:=p^.x; b:=p^.y; p:=p^.left; p^.x:=a; p^.y:=b; end; end; ax4(p^.right); end; end; end; End; (**************************************) Function ktax4(var p:pointer):boolean;

Begin

ktax4:=false; if p <> nil then begin

if (p^.left = nil) and (p^.right = nil) then else begin

if (p^.right^.left <> nil) and (p^.right^.right <> nil) then begin

ktax4:=ktax4(p^.left);

if (p^.left^.value = p^.right^.value) and (p^.left^.value=0) then

if p^.left^.tt=p^.right^.tt then begin ktax4:=true; exit; end; end; end; end; End; (************************************************) Procedure tdax4(var p:pointer);

Var kt:boolean; Begin ax4(p); kt:=ktax4(p); while kt=true do begin ax4(p); kt:=ktax4(p); end; End; (************************************************)

Trang 101 Procedure ax5(var p:pointer);

Var a,b:integer; Begin

Một phần của tài liệu TỐI ƯU HOÁ LỚP CÁC THÔNG TIN CÓ CẤU TRÚC DẠNG CÂY NHỊ NGUYÊN 1 VÀ N CHIỀU VỚI THÔNG TIN CHỨA Ở LÁ TRÊN TẬP KHÓA HỮU HẠN BẰNG MÔ HÌNH XỬ LÝ SONG SONG (Trang 79 -79 )

×