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

this site is individual site for ueh students of information management faculty this site provides some students resources of it courses such as computer network data structure and algorithm enterprise resource planning

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (390.53 KB, 7 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>Cây AVL</b>



<b>Trong khoa học máy tính, một cây AVL là một cây tìm kiếm nhị phân tự cân bằng, và là cấu truc dữ liệu đầu tiên có</b>
khả năng này. Trong một cây AVL, tại mỗi nút chiều cao của hai cây con sai khác nhau không quá một. Hiệu quả là
<i>các phép chèn (insertion), và xóa (deletion) luôn chỉ tốn thời gian O(log n) trong cả trường hợp trung bình và trường</i>
hợp xấu nhất. Phép bổ sung và loại bỏ có thể cần đến việc tái cân bằng bằng một hoặc nhiều phép quay.


Cây AVL được gọi theo tên của hai người đề xuất chúng, G.M. Adelson-Velsky và E.M. Landis, được công bố trong
<i>bài báo của họ vào năm 1962: "An algorithm for the organization of information." (Một thuật tốn về tổ chức thơng</i>


<i>tin)</i>


Cây AVL thường được so sánh với cây đỏ đen vì chúng hỗ trợ các phép toán như nhau và cùng tốn thời gian O(log


<i>n) cho các phép toán cơ sở. Cây AVL thường thi hành tốt hơn cây đỏ đen đối với các ứng dụng sâu sắc.</i>[1] Các thuật
toán cân bằng cây AVL được cung cấp trong nhiều giáo trình về khoa học máy tính.


<b>Định nghĩa</b>



<b>Hệ số cân bằng</b>



Hệ số cân bằng của cây T là hiệu số giữa các chiều cao của cây con trái và cây con phải của nó. Ký hiệu hệ số cân
<i><b>bằng của cây con gôc u là balance(u). Hệ số cân bằng của cây T là balance(T).</b></i>


<b>balance(u)= height(u.left)-height(u.right)</b>


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>Cân bằng AVL và cây AVL</b>



Các cây tìm kiếm nhị phân được xây dựng theo phương pháp chèn thơng thường có thể có những biến dạng mất cân
đối nghiêm trọng, chẳng hạn có thể hồn tồn lệch phải (tất cả các nút trong chỉ có con phải) hoặc lệch trái (tất cả
các nút trong chỉ có con trái). Trong các trường hợp này chi phí cho việc tìm kiếm trong trường hợp xấu nhất đạt tới


n ( n là số nút trên cây). Nếu có một cây tìm kiếm nhị phân cân bằng hồn tồn, chi phí đó chỉ xấp xỉ log2n. Tuy
nhiên nhiều khi khơng thể xây dựng một cây tìm kiếm nhị phân như vậy cho mọi dãy khóa. G.M. Adelson-Velsky và
E.M. Landis đã đề xuất một tiêu chuẩn cân bằng (sau này gọi là cân bằng AVL), giảm nhẹ hơn so với cân bằng hoàn
toàn. Cây T được gọi là cân bằng AVL nếu tại mỗi nút u của nó hệ số cân bằng có trị số tuyệt đối khơng vượt q 1.
<b>Điều đó cũng có nghĩa là với mọi nút u của T, balance(u) chỉ nhận một trong ba giá trị -1, 0, 1. Khi đó cây T cũng</b>
được gọi là cây AVL. Nếu cây con gốc tại đỉnh u là cân bằng AVL, ta cũng gọi đỉnh u là cân bằng AVL. Như vậy
các lá là cân bằng AVL, cây chỉ gồm một nút gốc là cây AVL, cây chỉ gồm 2 nút là cây AVL. Cây gồm 3 nút có thể
cân bằng AVL, cũng có thể khơng.


<b>Phép chèn</b>



<b>Phép chèn và tính cân bằng AVL</b>



<b>Giả sử có một cây tìm kiếm nhị phân cân bằng AVL và u là một nút của T và một nút mới v được chèn vào u. Do v</b>
<b>chỉ có thể được chèn vào đúng một trong hai cây con của u nên nhiều nhất là v có thể làm tăng chiều cao của một</b>
trong hai cây con đó. Nếu v khơng làm tăng chiều cao của cây con nào hoặc v làm tăng chiều cao của một cây con
nhưng trước đó cây con này có chiều cao nhỏ hơn hoặc bằng chiều cao của cây con kia thì tính cân bằng AVL tại
<b>đỉnh u vẫn giữ ngun. Tính cân bằng AVL tại u chỉ có thể bị phá vỡ khi v làm tăng chiều cao của cây con có chiều</b>
cao lớn hơn trong hai cây con của u.


<b>Cũng như vậy, nếu v không làm tăng chiều cao của chính u thì v khơng làm thay đổi hệ số cân bằng tại các đỉnh tiền</b>
bối của u.


<b>Mặt khác, nút v luôn được thêm vào với tư cách là con của một nút trước đó là lá hoặc nửa lá. Nếu cha của v trước</b>
khi thêm v là nửa lá thì chiều cao của cây con gốc cha của v không thay đổi sau khi thêm v còn hệ số cân bằng tại
đỉnh cha này bằng 0. Khi đó tất cả các nút tiền bối của cha của v khơng thay đổi hệ số cân bằng. Tính cân bằng AVL
được giữ vững trên toàn bộ cây T.


<b>Nếu đỉnh cha của v trước khi chèn v là lá, goi u là đỉnh tiền bối của v có mức cao nhất mà tính cân bằng AVL bị phá</b>
vỡ.



<b>Như vậy bốn trường hợp sau có thể phá vỡ tính cân bằng AVL tại u</b>


1. Trước khi chèn cây con gốc u lệch trái và v làm tăng chiều cao của cây con trái.
1. .Sau khi chèn cây con trái lệch trái (Case LL);


2. .Sau khi chèn cây con trái lệch phải (Case LR).


2. .Trước khi chèn cây con gốc u lệch phải và v làm tăng chiều cao của cây con phải.
1. .Sau khi chèn cây con phải lệch phải (Case RR);


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<b>Tái cân bằng sau phép chèn</b>



Khi tính cân bằng AVL tại u bị phá vỡ, cần một hoặc hai phép quay để tái cân bằng AVL cây con gốc u và biến đổi
cây T trở thành cân bằng AVL.


<b>Trường hợp 1 (LL)</b>


Case LL
Thực hiện phép quay phải tại u.


<b>Trường hợp 2 (LR)</b>


Trước hết thực hiện phép quay trái tại u.left để đưa về TH1 (LL) sau đó thực hiện phép quay phải tại u.


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>Trường hợp 3 (RR)</b>


Thực hiện phép quay trái tại u.


Case RR



<b>Trường hợp 4 (RL)</b>


Trước hết thực hiện phép quay phải tại u.right để đưa về TH3 (RR) sau đó thực hiện phép quay trái tại u.


Case RL


<b>Giả mã</b>



<b>Trong đoạn giả mã sau, height(u) là chiều cao của cây con của u. Khi đỉnh u là lá, height(u)=1. Với mỗi đỉnh u</b>
<b>khơng là lá height(u)=max{height(u.left),height(u.right)}+1. Có thể dùng một phép duyệt hậu thứ tự để tính hàm</b>
height(u) tại mọi đỉnh trên cây T. Tuy nhiên, khi mỗi đỉnh mới được chèn vào cây (ln là lá) ta sẽ tính lại giá trị
hàm height(v) với mọi v là tiên bối của đỉnh đó.


CALCULATE-BALANCE(u)


// Tính hệ số cân bằng và chiều cao cây con tại đỉnh u.


if u.right = Null and u.left=Null then begin height(u)=1; balance(u)=0 end
else


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

begin height(u)=height(u.left)+1; balance(u)=height(u) end
else


if u.left = Null and u.right<>Null then


begin height(u)=height(u.right)+1; balance(u)=-height(u) end;
else begin height(u)=max(height(u.left),height(u.right))+1;


balance(u)=height(u.left)-height(u.right) ; end;



REBALANCE(v)


// Thủ tục này tái cân bằng AVL (nếu bị mất cân bằng) các một đỉnh tiền bối của v bị mất cân bằng AVL.
// Sau đó các bậc tiền


bối trên nữa sẽ không thay đổi hệ số cân bằng so với trước khi đỉnh v được chèn vào.
// v là lá


//Tìm đỉnh tiền bối v sao cho v có tri số tuyệt đối của v
u= v


while u<> T.root and abs(balance(u)) ≤1 do
begin


CALCULATE-BALACE(u)
u=u.parent;
end;


if balance(u)>2 then


if balance(u.left)>0 then RIGHT-ROTATE(u)


else begin LEFT-ROTATE(u.left); RIGHT-ROTATE(u); end;
else


if balance(u)<-2 then


if balance(u.right)< 0 then LEFT-ROTATE(u)



else begin RIGHT-ROTATE(u.right); LEFT-ROTATE(u); end;


<b>Phép xóa trên cây AVL</b>



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<b>Tham khảo</b>



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<b>Nguồn và người đóng góp vào bài</b>



<i><b>Cây AVL  Nguồn:  Người đóng góp: Conbo, DHN, Hoàng Cầm, Magnifier, Mekong Bluesman, Nxqd3051990, 9 sửa đổi vơ danh</b></i>


<b>Nguồn, giấy phép, và người đóng góp vào hình</b>



<i><b>Tập tin:TreeBSTAndAVL.jpg  Nguồn:  Giấy phép: Creative Commons AttributionSharealike 3.0  Người đóng góp: </b></i>
<i><b>Tập tin:AVL_Insert1.jpg  Nguồn:  Giấy phép: Creative Commons AttributionSharealike 3.0  Người đóng góp: </b></i>
<i><b>Tập tin:AVL_Insert2.jpg  Nguồn:  Giấy phép: Creative Commons AttributionSharealike 3.0  Người đóng góp: </b></i>
<i><b>Tập tin:AVL_Insert3.jpg  Nguồn:  Giấy phép: Creative Commons AttributionSharealike 3.0  Người đóng góp: </b></i>
<i><b>Tập tin:AVL_Insert4.jpg  Nguồn:  Giấy phép: Creative Commons AttributionSharealike 3.0  Người đóng góp: </b></i>
<i><b>-Tập tin:AVL_delete.jpg  Nguồn:  Giấy phép: GNU Free Documentation License  Người đóng góp: Hồng Cầm</b></i>


</div>

<!--links-->
EXERCISES FOR EXECELLENT STUDENTS 9.doc
  • 4
  • 690
  • 1
  • ×