13. L[Z]=L ∪ L[Z];
3.4.3. Lưu cây ra bộ nhớ ngoài và khôi phục cây vào bộ nhớ trong.
Khi dữ liệu tăng trưởng đủ lớn, với bất kỳ cách duyệt cây nào (LNR, NLR, …) ta lưu cây ra bộ nhớ ngoài dưới tập tin F, record có cấu trúc (X, C) với X là tập mục dữ liệu và C là số đếm của X tại mỗi nút trên cây.
Vì trong cây, tập mục dữ liệu tại một nút là tập con của tập mục dữ liệu tại nút cha của nó, nên số mục dữ liệu của tập mục dữ liệu trong nút giảm dần theo độ sâu của cây và khi thay đổi vị trí của nút trong cây không làm thay đổi kết quả. Do đó, để thực hiện việc khôi phục cây, ta thực hiện các bước:
- Phân các phần tử (X, C) của F thành k nhóm Gi, với i [1..k], nhóm thứ i - gồm các phần tử mà X có i mục dữ liệu.
- Sắp xếp các phần tử trong Gi tăng dần theo thứ tự ≼I. - Tạo nút gốc của cây (I, 0, Null).
- Chèn nhóm Gk vào các nút con của nút gốc.
- Tiềp tục chèn các nhóm Gi, i [1..k-1] vào cây bằng cách: Ứng với phần tử (X, C) của nhóm Gi, duyệt trên các nút của nhóm Gi+1, nếu tìm được nút N là nút đầu tiên thỏa X
N.ItemSet thì thêm một nút (X, C) là nút con của N, ngược lại, nghĩa là X không là tập con bất kỳ nút nào của nhóm Gi+1, ta duyệt lại từ gốc và chỉ xét các nút N ở bậc i nhưng N.Count không phải k-i+1 phần tử, nếu có nút N thỏa X N.ItemSet thì thêm một nút (X, C, Null) là nút con của N, ngược lại, thêm (X, C, Null) là nút con của nút gốc.
* Thủ tục chuyển cây sang tập tin ( Tree_To_File)
Input: Root: Pointer; Output: I : Tập các mục dữ liệu;
F: File Of (X, C), với X I và C = Supp(X);
Method: 1. F := ; 2. I := Root^.ItemSet; 3. Find_All_Node(Root, F); * Thủ tục tìm tất cả các nút (Find_All_Node) Input: Pt: Pointer;
Output: F: File Of (N.ItemSet, N.Count), N ID-Tree;
Method:
1. For each ( P in Pt^.ListPointer) 2. {
3. Write(F, (P^.ItemSet, P^.Count)); 4. Find_All_Node(P, F, S0);
5. }
6. Sort_D(F); // Sắp xếp F giảm dần theo thứ tự ≼I
7. Foreach ( group G = (X, *) in F ) 8. {
9. Cm := Max({C | (X, C) G}; 10. Write(Fr, (X, Cm));
11. }
* Thủ tục chuyển tập tin sang cây (File_To_Tree)
Input: I : Tập các mục dữ liệu
F: File Of (X, C), với X I và C = Supp(X); Output: Root: ID-Tree;
Method:
1. New(Root);
2. Root^.ItemSet := I; 3. Root^.Count := 0;
4. k := Max(‖X‖ | (X, C) F}; 5. For ( i:= 1; i<= k; i++) 6. {
8. }
9. Return(F);
10. While Not Eof(F) do 11. { 12. Read(F, (X, C)); 13. i := ||X||; 14. Gi := Gi {(X, C)} ; 15. } 16. Foreach ((X, C) in Gk ) 17. { 18. Add_node(X, Root, C); 19. }
20. For ( i:= k-1; i>=1; i - -) 21. {
22. Insert_G(Gi); 23. }
Procedure Insert_G(Gi);
Input: Gi: Tập các tập mục dữ liệu có i phần tử; Output: Root: ID-Tree;
Method:
1. For each ((X,C) in Gi ) 2. {
3. Tìm một nút lá N đầu tiên có X N.ItemSet và thêm (X, C, Null) là một nút con của N.
4. }