Bài giảng cấu trúc dữ liệu và giải thuật cây, cây nhị phân, cây tìm kiếm

11 300 2
Bài giảng cấu trúc dữ liệu và giải thuật   cây, cây nhị phân, cây tìm kiếm

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

www.kenbon.net Bài 4:CÂY, CÂY NHỊ PHÂN, CÂY NHỊ PHÂN TÌM KIẾM Cấu trúc 1.1 Định nghĩa 1: Cây tập hợp T phần tử (nút cây) có nút đặc biệt T0 gọi gốc, nút khác chia thành tập rời T1, T2 , , Tn theo quan hệ phân cấp Ti Nút cấp i quản lý số nút cấp i+1 Quan hệ người ta gọi quan hệ cha-con 1.2 Một số khái niệm - Bậc nút: số nút - Bậc cây: bậc lớn nút Cây có bậc n gọi n-phân - Nút gốc: nút nút cha - Nút lá: nút có bậc - Nút nhánh: nút có bậc khác gốc - Mức nút: Mức (T0 ) = Gọi T1, T2, T3, , Tn T0 Mức (T1) = Mức (T2) = = Mức (Tn) = Mức (T0) + - Độ dài đường từ gốc đến nút x: số nhánh cần qua kể từ gốc đến x - Chiều cao h cây: mức lớn nút 1.3 Một số ví dụ đối tượng cấu trúc dạng - Sơ đồ tổ chức doanh nghiệp - Sơ đồ tổ chức thư mục www.kenbon.net CÂY NHỊ PHÂN 2.1 Định nghĩa Cây nhị phân mà nút có tối đa Cây nhị phân ứng dụng nhiều toán thông dụng Ví dụ cho ta hình ảnh biểu thức toán học: www.kenbon.net 2.2 Một số tính chất nhị phân: - Số nút mức I ≤ 2I-1 - Số nút mức ≤ 2h-1, với h chiều cao - Chiều cao h ≥ log2N (N - số nút cây) 2.3 Biểu diễn nhị phân T Cây nhị phân cấu trúc bao gồm phần tử (nút) kết nối với theo quan hệ “cha-con” với cha có tối đa Để biểu diễn nhị phân ta chọn phương pháp cấp phát liên kết Ứng với nút, ta dùng biến động lưu trữ thông tin: + Thông tin lưu trữ nút + Địa nút gốc trái nhớ + Địa nút gốc phải nhớ Khai báo sau: typedef struct tagTNODE { Data Key;//Data kiểu liệu ứng với thông tin lưu nút struct tagNODE *pLeft, *pRight; www.kenbon.net }TNODE; typedef TNODE *TREE; 2.4 Các thao tác nhị phân Thăm nút theo thứ tự trước (Node-Left-Right) void NLR(TREE Root) { if (Root != NULL) { //Xử lý tương ứng theo nhu cầu ; NLR(Root->pLeft); NLR(Root->pRight); } } Thăm nút theo thứ tự (Left- Node-Right) void LNR(TREE Root) { if (Root != NULL) { LNR(Root->Left); ; LNR(Root->Right); //Xử lý tương ứng theo nhu cầu } } Thăm nút theo thứ tự sau (Left-Right-Node) void LRN(TREE Root) { www.kenbon.net if (Root != NULL) { LRN(Root->Left); LRN(Root->Right); ; //Xử lý tương ứng theo nhu cầu } } Ứng dụng phương pháp việc tính tổng kích thước thư mục Ứng dụng tính toán giá trị biểu thức (3 + 1)×3/(9 – + 2) – (3×(7 – 4) + 6) = –13 www.kenbon.net 2.5 Biểu diễn tổng quát nhị phân Nhược điểm cấu trúc tổng quát bậc nút khác ⇒ việc biểu diễn gặp nhiều khó khăn lãng phí Hơn nữa, việc xây dựng thao tác tổng quát phức tạp nhị phân nhiều Vì vậy, không cần thiết phải sử dụng tổng quát, người ta biến đổi tổng quát thành nhị phân Ta biến đổi thành nhị phân theo qui tắc sau: - Giữ nút trái làm trái - Các nút lại biển đổi thành nút phải VD: Giả sử có tổng quát hình sau: Cây nhị phân tương ứng sau: 2.6 Một cách biểu diễn nhị phân khác Đôi khi, nhị phân, người ta quan tâm đến quan hệ chiều cha Khi đó, cấu trúc nhị phân định nghĩa lại sau: www.kenbon.net typedef struct tagTNode { DataType Key; struct tagTNode* pParent; struct tagTNode* pLeft; struct tagTNode* pRight; }TNODE; typedef TNODE *TREE; CÂY NHỊ PHÂN TÌM KIẾM 3.1 Định nghĩa: Cây nhị phân tìm kiếm (CNPTK) nhị phân nút, khóa nút xét lớn khóa tất nút thuộc trái nhỏ khóa tất nút thuộc phải Dưới ví dụ nhị phân tìm kiếm: Nhờ ràng buộc khóa CNPTK, việc tìm kiếm trở nên có định hướng Hơn nữa, cấu trúc việc tìm kiếm trở nên nhanh đáng kể Chi phí tìm kiếm trung bình khoảng log2N www.kenbon.net Trong thực tế, xét đến nhị phân chủ yếu người ta xét CNPTK 3.2 Các thao tác 3.2.1 Thăm nút 3.2.2 Tìm phần tử x TToán: Dễ dàng thấy số lần so sánh tối đa phải thực để tìm phần tử X h, với h chiều cao Ví dụ: Tìm phần tử 55 3.3.3 Thêm phần tử x vào Việc thêm phần tử X vào phải bảo đảm điều kiện ràng buộc CNPTK Ta thêm vào nhiều vị trí khác cây, thêm vào nút dễ ta thực trình tương tự thao tác tìm kiếm Khi chấm dứt trình tìm kiếm ta tìm vị trí cần thêm www.kenbon.net Hàm insert trả giá trị –1, 0, không đủ nhớ, gặp nút cũ hay thành công: int insertNode(TREE &T, Data X) { if(T) { if(T->Key == X) return 0; //đã có if(T->Key > X) return insertNode(T->pLeft, X); else return insertNode(T->pRight, X); } T = new TNode; if(T == NULL) return -1; //thiếu nhớ T->Key = X; T->pLeft =T->pRight = NULL; return 1; //thêm vào thành công } 2.4 Hủy phần tử có khóa x Việc hủy phần tử X khỏi phải bảo đảm điều kiện ràng buộc CNPTK Có trường hợp hủy nút X xảy ra: X - nút X - có (trái phải) X có đủ Trường hợp thứ nhất: đơn giản hủy X không móc nối đến phần tử khác www.kenbon.net Trường hợp thứ hai: trước hủy X ta móc nối cha X với Trường hợp cuối cùng: ta hủy trực tiếp X có đủ ⇒ Ta hủy gián tiếp Thay hủy X, ta tìm phần tử mạng Y Phần tử có tối đa Thông tin lưu Y chuyển lên lưu X Sau đó, nút bị hủy thật Y giống trường hợp đầu Vấn đề phải chọn Y cho lưu Y vào vị trí X, CNPTK 10 www.kenbon.net Có phần tử thỏa mãn yêu cầu: Phần tử nhỏ (trái nhất) phải Phần tử lớn (phải nhất) trái Việc chọn lựa phần tử phần tử mạng hoàn toàn phụ thuộc vào ý thích người lập trình Ở đây, cháng chọn phần tử (phải trái làm phân tử mạng VD: Cần hủy phần tử 18 2.5 ĐÁNH GIÁ Tất thao tác Tìm kiếm, Thêm mới, Xóa CNPTK có độ phức tạp trung bình O(h), với h chiều cao Trong trường hợp tốt nhất, CNPTK có n nút có độ cao h = log2(n) Chi phí tìm kiếm tương đương tìm kiếm nhị phân mảng có thứ tự Tuy nhiên, trường hợp xấu nhất, bị suy biến thành DSLK Lúc thao tác có độ phức tạp O(n) Vì cần có cải tiến cấu trúc CNPTK để đạt chi phí cho thao tác log2(n) 11 [...]... cao của cây Trong trong trường hợp tốt nhất, CNPTK có n nút sẽ có độ cao h = log2(n) Chi phí tìm kiếm khi đó sẽ tương đương tìm kiếm nhị phân trên mảng có thứ tự Tuy nhiên, trong trường hợp xấu nhất, cây có thể bị suy biến thành 1 DSLK Lúc đó các thao tác trên sẽ có độ phức tạp O(n) Vì vậy cần có cải tiến cấu trúc của CNPTK để đạt được chi phí cho các thao tác là log2(n) 11 ... trên cây con phải Phần tử lớn nhất (phải nhất) trên cây con trái Việc chọn lựa phần tử nào là phần tử thế mạng hoàn toàn phụ thuộc vào ý thích của người lập trình Ở đây, cháng tôi sẽ chọn phần tử (phải nhất trên cây con trái làm phân tử thế mạng VD: Cần hủy phần tử 18 2.5 ĐÁNH GIÁ Tất cả các thao tác Tìm kiếm, Thêm mới, Xóa trên CNPTK đều có độ phức tạp trung bình O(h), với h là chiều cao của cây Trong ... TNODE *TREE; CÂY NHỊ PHÂN TÌM KIẾM 3.1 Định nghĩa: Cây nhị phân tìm kiếm (CNPTK) nhị phân nút, khóa nút xét lớn khóa tất nút thuộc trái nhỏ khóa tất nút thuộc phải Dưới ví dụ nhị phân tìm kiếm: Nhờ... khóa CNPTK, việc tìm kiếm trở nên có định hướng Hơn nữa, cấu trúc việc tìm kiếm trở nên nhanh đáng kể Chi phí tìm kiếm trung bình khoảng log2N www.kenbon.net Trong thực tế, xét đến nhị phân chủ yếu... đảm điều kiện ràng buộc CNPTK Ta thêm vào nhiều vị trí khác cây, thêm vào nút dễ ta thực trình tương tự thao tác tìm kiếm Khi chấm dứt trình tìm kiếm ta tìm vị trí cần thêm www.kenbon.net Hàm

Ngày đăng: 08/01/2016, 11:45

Tài liệu cùng người dùng

Tài liệu liên quan