Khác biệt giữa bản sửa đổi của “Cây 2-3-4”
Nội dung được xóa Nội dung được thêm vào
node-> nút |
|||
Dòng 1:
Trong [[khoa học máy tính]], '''cây 2-3-4''' là [[Cây (cấu trúc dữ liệu)|cây]] nhiều nhánh mà mỗi [[Cây (cấu trúc dữ liệu)|
Cây 2-3-4 là [[cây cân bằng (lý thuyết đồ thị)|cây cân bằng]] giống như [[cây đỏ-đen]], tuy nhiên ít hiệu quả hơn nhưng ngược lại dễ lập trình hơn.
Dòng 10:
==Tổ chức==
===Các khóa trong một nút===
Trong một nút lá hoặc nút trong có thể có 2-3-4 khóa đại diện cho mục dữ liệu. Các khóa trong mỗi
Còn với các nút không phải là lá, trong từng trường hợp có số nút con như sau:
* Một nút chứa một khóa luôn luôn có đúng 2 nút con. Nó được gọi là 2-
* Một nút chứa hai khóa luôn luôn có đúng 3 nút con. Nó được gọi là 3-
* Một nút chứa ba mục khóa luôn luôn có đúng 4 nút con. Nó được gọi là 4-
Như vậy, một nút không phải là lá phải luôn luôn có số nút con nhiều hơn 1, so với số khóa của nó. Nói cách khác, đối với mọi
[[Hình:2-3-4Tree.png|giữa]]
===Các khóa nằm trong các nút khác nhau===
Một đặc tính quan trọng của cấu trúc [[cây tìm kiếm nhị phân]] là mối liên hệ giữa các liên kết với giá trị khoá của cây con bên trái, có khoá nhỏ hơn khoá của
Trong cây 2-3-4 thì một cấu trúc tương tự như trên, thể hiện trong các tính chất sau:
Dòng 60:
[[Hình:234Split3.png|trái]]
*Phép biến đổi này tách một nút thành hai nút, nghĩa là thêm một nút anh em với nó. Như vậy số con của nút cha tăng thêm một, do đó số khóa của nút cha cũng tăng lên một. Khóa tăng thêm này được lấy từ chính nút con sẽ được tách ra. Do đó để có thể tách một nút, nút đó phải có đúng 3 khóa k1 < k2 < k3 (nó là 4-
*Trong trường hợp nút cần tách là nút gốc, vì nút gốc không có cha nên ngoài việc tách ra còn phải thêm một nút mới làm cha của nút ban đầu và nút mới tách ra.
Dòng 68:
Phép gộp hai nút anh em liền kề thành một nút. Khi đó số con của nút cha giảm đi một, do đó cả số khóa của nút cha cũng giảm một. Khóa này được đưa cả vào nút mới gộp. Do đó chỉ có thể gộp hai anh em liền kề thành một nút khi cả hai là các 2-
==Tìm một khóa trên cây 2-3-4==
Dòng 76:
[[Hình:234Inseart.png|trái]]
[[Hình:234Insert2.png|phải]]
Để chèn một khóa vào một cây 2-3-4 , trước hết tìm giá trị đó trong cây, nếu không thấy thì chèn khóa đó vào nút lá gặp tại cuối quá trình tìm kiếm. Nếu nút này có ít hơn 3 khóa thì việc thêm khóa đó vào nút đơn giản là việc sắp xếp nó cùng với các khóa đã có theo thứ tự tăng. Nếu nút là muốn chèn thêm là 4-
Dòng 92:
[[Hình:234Delete_2.png|Trái]]
Khóa k nằm trong nút lá u và u chỉ có một khóa và tồn tại nút anh em v của u có nhiều hơn một khóa thì bằng phép dịch chuyển dần có thể dịch chuyển một khóa của v đến u khiến u trở thành 3-
===Trường hợp 3===
[[Hình:234Delete3.png|Trái]]
Khóa k nằm trong nút lá u và u chỉ có một khóa và tất cả các nút anh em của u chỉ có một khóa thì bằng phép gộp u với nút anh em kề nó sẽ khiến u trở thành 3-
===Trường hợp 4===
[[Hình:234Delete4.png|Trái]]
Khóa k nằm trong nút trong u: Khi đó tìm khóa tiền nhiệm hoặc khóa kế vị của k (khóa này luôn nằm trong nút lá). Thay k bởi khóa đó, và giải phóng khóa đó tkhỏi nút chứa nó (quay về trường hợp 1). Tuy việc dùng khóa tiền nhiệm hay kế vị đều được, nhưng nên chọn khóa nào trong chúng nằm trong nút có hai khóa trở lên, nếu cả hai đều nằm trong các 2-
==Giả mã==
Dòng 182:
24.dispos(v);
=== Tăng số khóa cho 2-
Khi xóa một khóa trong hai nút, trước hết phải dùng phép chuyển khóa hoặc phép dồn nút để tăng số khóa của nút này. Nếu tìm được một khóa anh em có nhiều hơn một khóa có thể dùng phép dịch chuyển, nếu không có có thể dùng một phép gộp nút.
====Tìm nút anh em có nhiều hơn một khóa====
Dòng 194:
7.return k;
Nếu hàm trả về 0 thì tất cả các nút anh em đều là 2-
====Tăng số khóa cho 2-
'''Procedure TwoNodeAddKey(u);'''
1.If u.keys>1 then return false ;
|