Tính chất

Một phần của tài liệu Xây dựng chương trình mô phỏng các thuật toán cơ bản trên cây đỏ đen (Trang 31)

Mỗi nút của cây đỏ-đen có thuộc tính "màu" nhận một trong hai giá trị "đỏ" hoặc "đen".

Ngoài ra:

+ Một nút hoặc là đỏ hoặc đen. + Gốc là đen.

+ Tất cả các lá là đen.

+ Cả hai con của mọi nút đỏ là đen và suy ra mọi nút đỏ có nút cha là đen. 11 2 14 15 1 7 5 8

24

+ Tất cả các đường đi từ một nút đã cho tới các lá chứa một số như nhau các nút đen.

Tính chất 5 còn được gọi là tính chất "cân bằng đen". Số các nút đen trên một đường đi từ gốc tới mỗi lá được gọi là độ dài đen của đường đi đó. Trong bài này chỉ xét các đường đi từ gốc tới các lá vì vậy sẽ gọi tắt các đường đi như vậy là đường đi. Sức mạnh của cây đỏ đen nằm trong các tính chất trên. Từ các tính chất này suy ra trong các đường đi từ gốc tới các lá đường đi dài nhất không vượt quá hai lần đường đi ngắn nhất. Do đó cây đỏ đen là gần cân bằng. Vì các thuật toán chèn, xóa, tìm kiếm trong trường hợp xấu nhất đều tỷ lệ với chiều cao của cây nên cây đỏ đen rất hiệu quả trong các trường hợp xấu nhất, không giống như cây tìm kiếm nhị phân thông thường.

Để thấy rõ sức mạnh này, thì không có đường đi nào từ gốc tới một lá chứa hai nút đỏ liền nhau (theo tính chất 4). Do đó trên mỗi đường số nút đỏ không nhiều hơn số nút đen. Đường đi ngắn nhất là đường đi chỉ có nút đen, đường đi dài nhất có thể là đường đi xen kẽ giữa các nút đỏ và đen. Theo tính chất 5, số các nút đen trên hai đường đi đó bằng nhau, và do đó đường đi dài nhất không vượt quá hai lần đường đi ngắn nhất.

Trong nhiều biểu diễn của dữ liệu cây, có thể có các nút chỉ có một con và có các lá có chứa dữ liệu. Tuy nhiên có thể biểu diễn cây đỏ đen, có một chút thay đổi mà không làm thay đổi tính chất cơ bản của cây và độ phức tạp của các thuật toán. Với mục đích này, đưa thêm các lá null vào làm con phải hoặc con trái hoặc cả hai của những nút không có chúng, các lá này không chứa dữ liệu mà chỉ làm nhiệm vụ thông báo rằng tại đây cây đã kết thúc, như hình vẽ ở trên. Việc thêm các nút này làm cho tất cả các nút trong của cây đều chứa dữ liệu và có hai con, hay khác đi cây đỏ đen cùng với các lá null là cây nhị phân đầy dủ. Khi đó số các "lá null" nhiều hơn số các nút chứa dữ liệu của cây một lá.

25

Một số người định nghĩa cây đỏ đen bằng cách gán màu đỏ, đen cho các cạnh chứ không phải các nút. Tuy nhiên điều đó không tạo nên sự khác biệt. Khi ấy màu của mỗi nút tương ứng với màu của cạnh nối nó với nút cha. 2.4 . Tính hiệu quả của cây đỏ đen

Khi cây một nhánh, sẽ trở thành một danh sách liên kết, dữ liệu sẽ là một chiều thay vì hai chiều. Trong trường hợp này, thời gian truy xuất giảm về O(N), thay vì O(log ) đối với cây cân bằng.

Để bảo đảm thời gian truy xuất nhanh O(log ) của cây, cần phải bảo đảm cây luôn luôn cân bằng (ít ra cũng là cây gần cân bằng). Điều này có nghĩa là mỗi nút trên cây phải có xấp xỉ số nút con bên phải bằng số nút con bên trái.

Một cách tiếp cận giải quyết vấn đề cân bằng lại cây: Đó là cây đỏ đen là cây tìm kiếm nhị phân vì thế nó có các tính chất của cây tìm kiếm nhị phân.

Ví dụ: Nút con trái nhỏ hơn nút cha, nút cha nhỏ hơn nút con phải, bên cạnh đó cây đỏ đen còn được bổ sung một số đặc điểm.

Trong cây đỏ đen, việc cân bằng được thực thi trong khi chèn, xóa. Khi thêm một phần tử thì thủ tục chèn sẽ kiểm tra xem tính chất cân bằng của cây có bị vi phạm hay không. Nếu có, sẽ xây dựng lại cấu trúc cây. Bằng cách này, cây luôn luôn được giữ cân bằng.

2.5. Các thuật toán cơ bản trên cây đỏ đen 2.5.1. Thêm một nút mới 2.5.1. Thêm một nút mới

2.5.1.1. Các phép lật trên đường đi xuống

Phép thêm vào trong cây đỏ đen bắt đầu như trên cây tìm kiếm nhị phân thông thường: Đi theo một đường dẫn từ nút gốc đến vị trí cần chèn, đi qua phải hay trái tùy vào giá trị của khóa nút và khóa tìm kiếm.

Tuy nhiên, trong cây đỏ đen, để đến được điểm chèn là phức tạp bởi các phép lật màu và quay.

Để đảm bảo không vi phạm các tính chất, cần phải tiến hành phép lật màu khi cần theo quy tắc sau:

26

Nếu phép thêm vào làm xuất hiện tình trạng một nút đen có hai nút con đỏ, phải đổi các nút con thành đen và nút cha thành đỏ (trừ khi nút cha là nút gốc, nó vẫn giữ nguyên màu đen).

Một phép lật màu ảnh hưởng đến các tính chất đỏ đen ra sao? Gọi nút ở đỉnh tam giác, nút có màu đen trước phép lật màu P (P thay cho nút cha). Gọi hai nút con trái và phải của P là x1 và x2. Xem hình 2.3.a

Hình 20.3. Lật màu

Nhận thấy sau khi lật màu chiều cao đen của cây không đổi, như vậy phép lật màu không vi phạm tính chất 4.

Mặc dù tính chất 4 không bị vi phạm qua phép lật, nhưng tính chất 3 (một nút con và nút cha không thể đồng thời màu đỏ) lại có khả năng bị vi phạm. Nếu nút cha của P là đen, không có vấn đề vi phạm khi P được đổi từ đỏ sang đen, nhưng nếu nút cha của P là đỏ, sau khi đổi màu thì sẽ có hai nút đỏ trên một hàng.

Điều này cần phải được chuẩn bị trước khi đi xuống theo cây để chèn nút mới. Có thể giải quyết trường hợp này bằng phép quay.

Đối với nút gốc thì phép lật màu nút gốc và hai nút con của nó vẫn làm cho nút gốc cũng như hai nút con có màu đen. Điều này tránh sự vi phạm tính chất 2 và tính chất 4 (xung đột đỏ - đỏ). Trong trường hợp này, chiều cao đen

a) X1, X2 đỏ b) X1, X2 đổi sang đen (adsbygoogle = window.adsbygoogle || []).push({});

P

X1 X2

P

27

trên mỗi đường đi từ nút gốc tăng lên 1, do đó tính chất 4 cũng không vi phạm.

2.5.1.2. Các phép quay nút

Thao tác chèn nút mới có thể làm cho quy tắc đỏ - đen bị vi phạm. Do vậy sau khi chèn, cần phải kiểm tra xem có phạm quy tắc không và có thực hiện những thao tác hợp lý.

Như đã xét ở trên, nút mới được chèn mà gọi là nút x, luôn luôn đỏ. Nút x có thể nằm ở những vị trí khác nhau đối với P và G, như trong hình 2.4.

Hình 21.4. Các biến dạng của nút khi được chèn với x là cháu ngoại

Hình 22.5. Các biến dạng của nút khi được chèn với x là cháu nội.

G P X 1 G P X G P X G P X 1

28

X là một nút cháu ngoại nếu nó nằm cùng bên nút cha P và P cùng bên nút cha G. Điều này có nghĩa là, x là nút cháu ngoại nếu hoặc nó là nút con trái của P và P là nút con trái của G, hoặc nó là nút con phải của P, và P là nút con phải của G. Ngược lại, x là một nút cháu nội.

Nếu x là nút cháu ngoại, nó có thể hoặc bên trái hoặc bên phải của P, tùy vào việc nút P ở bên trái hay bên phải của G. Có hai khả năng tương tự nếu x là một nút cháu nội. Bốn trường hợp này trình bày trong hình 2.4, hình 2.5.

Thao tác phục hồi quy tắc đỏ - đen được xác định bởi các màu và cấu hình của nút x và những bà con của nó. Có các khả năng xảy ra được xem xét như sau: (Hình 2.6.)

a) P đen b) P đỏ, X là cháu ngoại

c) P đỏ, X là cháu nội Hình 23.6. Các khả năng khi chèn nút G x P G x P G x P

29

Xét các khả năng trên một cách cụ thể như sau: a) Khả năng 1: P đen

P đen là trường hợp đơn giản. Nút thêm vào luôn đỏ. Nếu nút cha đen, không xung khắc đỏ - đỏ (tính chất 3), và không có cộng thêm vào số nút đen (tính chất 4). Do vậy, không bị vi phạm quy tắc về màu. Thao tác chèn đã hoàn toàn.

b) Khả năng 2: P đỏ và x là cháu ngoại của G

Nếu nút P đỏ và x là nút cháu ngoại, cho nên cần một phép quay đơn giản và một vài thay đổi về màu. Bắt đầu với giá trị tại nút gốc, và chèn các nút 25, 75 và 12. Cần phải làm một phép lật mày trước khi chèn nút 12.

Bây giờ, chèn nút mới x là 6 (hình 2.5.a) xuất hiện lỗi: Cha và con đều đỏ, vì vậy cần phải có thao tác như sau:

Trong trường hợp này, có thể áp dụng ba bước để phục hồi tính đỏ - đen và làm cho cân bằng cây. Sau đây là các bước:

+ Đổi màu nút G – nút ông bà của nút x (trong ví dụ này là nút 25). + Đổi màu nút P – nút cha của nút x (nút 12).

+ Quay với nút G (nút 25) ở vị trí đỉnh, theo hướng làm nâng nút x lên (nút 6). Đây là một phép quay phải.

Khi hoàn thành ba bước trên sẽ được một cây đỏ đen cân bằng (hình 2.7.b)

30

a) Đổi màu và quay

b) Tái cân bằng cây (adsbygoogle = window.adsbygoogle || []).push({});

Hình 24.7. Nút P đỏ và X là cháu ngoại c) Khả năng 3: P đỏ và X là cháu nội của G

Nếu nút P đỏ và x là cháu nội của G, cần thực hiện phép quay và một vài phép đổi màu. Cây đỏ đen được tạo thành từ các nút 50, 25, 75, 12 và 18 (cần phải lật màu trước khi chèn nút 12) xem hình 2.8a.

Nút 18 là nút cháu nội. Nút này và nút cha đều đỏ (cha và con đều đỏ). Chỉnh lại sự sắp xếp này cũng khá rắc rối hơn. Nếu cố quay phải nút ông bà G (nút 25) ở đỉnh, như đã làm trong khả năng 2, nút cháu trong x (nút 18) đi ngang hơn là đi lên, như thế cây không cân bằng như trước (thử làm

Đổi màu Quay Đổi màu 12 6 50 75 25 75 6 25 50 12

31

điều này, rồi quay trở lại với nút 12 ở đỉnh, để phục hồi cây như cũ). Phải cần một cách khác.

Phương pháp cần dùng khi x là nút cháu nội là tiến hành hai phép quay hơn là một phép. Phép quay đầu biến x từ một nút cháu nội thành nút cháu ngoại, như hình 2.8b. Bây giờ, trường hợp là tương tự như khả năng 1, và có thể áp dụng cùng một phép quay, với nút ông bà ở đỉnh, như đã làm trước đây. Kết quả như hình 2.8c.

Cũng cần tô màu lại các nút trước khi thực hiện bất cứ phép quay nào (thứ tự không quan trọng, nhưng nếu đợi đến khi quay mới tô màu lại các nút thì khó mà biết phải gọi chúng như thế nào) các bước là:

+ Đổi màu nút ông bà của nút x (nút 25). + Đổi màu nút x (nút 18)

+ Quay trái nút P - nút cha của nút x - ở đỉnh (nút cha đây là nút 12).

32

a)Đổi màu và quay

b) Quay

c) Tái cân bằng cây

Hình 25.8. P đỏ và x là nút cháu nội 50 25 75 18 12 G P X Quay Đổi màu Đổi màu 50 18 75 25 12 50 18 75 25 12 2

33 2.5.2. Xóa một nút

Trong cây tìm kiếm nhị phân bình thường khi xóa một nút có cả hai con (không là lá NULL), tìm phần tử lớn nhất trong cây con trái hoặc phần tử nhỏ nhất trong cây con phải, chuyển giá trị của nó vào nút đang muốn xóa. Khi đó xóa đi nút đã được copy giá trị, nút này có ít hơn hai con (không là lá NULL). Vì việc copy giá trị không làm mất tính chất đỏ đen nên không cần phải sửa chữa gì cho thao tác này. Việc này chỉ đặt ra khi xóa các nút có nhiều nhất một con (không là lá NULL). Về việc xóa một nút có nhiều nhất một con (không là lá NULL). Nếu xóa một nút đỏ, có thể chắc chắn rằng con của nó là nút đen. Tất cả các đường đi đi qua nút bị xóa chỉ đơn giản bớt đi một nút đỏ do đó tính chất 5 không thay đổi. Ngoài ra, cả nút cha và nút con của nút bị xóa đều là nút đen, do đó tính chất 3 và tính chất 4 vẫn giữ nguyên. Một trường hợp đơn giản khác là khi xóa một nút đen chỉ có một con là nút đỏ. Khi xóa nút đó các tính chất 4 và tính chất 5 bị phá vỡ, nhưng nếu gán lại màu cho nút con là đen thì chúng lại được khôi phục.

Trường hợp phức tạp xảy ra khi cả nút bị xóa và nút con của nó đều đen. Sẽ bắt đầu bằng việc thay nút bị xóa bằng nút con của nó. Nút con này được gọi là S (trong vị trí mới của nó là N, và anh em với nó, con khác của nút cha mới). Tiếp theo vẫn dùng P chỉ cha mới của N, chỉ con trái của S và

chỉ con phải của S (nó tồn tại vì S không thể là lá).

Giữa các trường hợp khác nhau, vai trò và nhãn của các nút có thể thay đổi. Trong hình vẽ các màu đỏ đen được thể hiện khi màu của nút đã rõ ràng, các đường thẳng gạch biểu thị các nút chưa rõ màu (hoặc đỏ hoặc đen). Vì thế, cần hoàn chỉnh các lá NULL sau mọi phép thay đổi. Nếu nút bị xóa không có con N khác “lá NULL”, dễ dàng thấy rằng các tính chất được thỏa mãn. Còn nếu N là một “lá NULL”, có thể sửa chữa lược đồ để trong tất cả các trường hợp các tính chất thỏa mãn.

34

Nếu tất cả N và gốc ban đầu của nó là đen thì sau khi xóa các đường qua “N” giảm bớt một nút đen. Do đó vi phạm tính chất 5, cây cần phải cân bằng lại.

Có các trường hợp sau:

Trường hợp 1: N là gốc mới. Trong trường hợp này dừng lại và đã giải phóng một nút đen khỏi mọi đường đi và gốc mới lại là đen. Không tính chất nào bị vi phạm.

Như vậy, trong các trường hợp 2, 5 và 6 quy ước N là con trái của P. Nếu nó là con phải thì left và right sẽ trao đổi cho nhau.

Trường hợp 2: S là đỏ. Trong trường hợp này tráo đổi màu của P và S, sau đó quay trái tại P, nó sẽ làm cho S trở thành nút ông của N. P có màu đen và có một con màu đỏ. Tất cả các đường đi có số các nút đen giống nhau, bây giờ N có một anh em màu đen và cha màu đỏ, có thể tiếp tục với các trường hợp 4, 5 và 6 (anh em mới của nó là đen và chỉ có một con của nút đỏ là S). Trong trường hợp sau anh em mới của N được gọi là S.

Hình 26.9. Minh họa trường hợp 2

Trường hợp 3: P, S và các con của S là đen. Trong trường hợp này, gán lại màu đỏ. Kết quả là mọi đường đi qua S (tất nhiên không qua N, có ít hơn một nút đen). Vì việc xóa đi cha trước đây của N làm tất cả các đường đi qua N bớt đi một nút đen, nên bằng nhau. Tuy nhiên, tất cả các đường đi qua P

P S S S N S S P N S

35 (adsbygoogle = window.adsbygoogle || []).push({});

bầy giờ có ít hơn một nút đen so với các đường không qua P, do đó tính chất 5 (tất cả các đường đi từ gốc tới các nút lá có cùng số nút đen) sẽ bị vi phạm. Để sửa chữa nó thì phải tái cân bằng P, bắt đầu từ trường hợp 1.

Hình 27.10 Minh họa trường hợp 3

Trường hợp 4: S và các con của S là đen nhưng P là đỏ. Trong trường hợp này, phải đổi ngược màu của S và P. Điều này không ảnh hưởng tới số nút đen trên các đường đi thông qua N, nhưng thêm một nút đen trên các đường đi qua N, thay cho nút đã bị xóa trên các đường này,

Hình 28.11. Minh họa trường hợp 4

Trường hợp 5: S là đen, con trái của S là đỏ, con phải của S là đen, còn

Một phần của tài liệu Xây dựng chương trình mô phỏng các thuật toán cơ bản trên cây đỏ đen (Trang 31)