1. Trang chủ
  2. » Công Nghệ Thông Tin

CTDL1 CH05 cay

16 109 0

Đ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

ðại Họ Học Sư Phạ Phạm Tp Hồ Hồ Chí Chí Minh CẤU TRÚC DỮ LIỆU Nội dung Cây Cây nhị phân Cây nhị phân tìm kiếm Cây cân Chương 5: CÂY Cây • ðịnh nghĩa 1: Cây tập hợp T phần tử (gọi nút cây) ñó: – Có nút ñặc biệt ñược gọi gốc – Các nút lại ñược chia thành tập rời T1, T2 , , Tn theo quan hệ phân cấp ñó Ti – Mỗi 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 5.1 Cây 5.1 Cây Ví dụ • ðịnh nghĩa 2: cấu trúc với kiểu sở T là: net fpt edu hcmup org java – Một nút cấu trúc rỗng ñược gọi rỗng (NULL) – Một nút mà thông tin có kiểu T, liên kết với số hữu hạn cấu trúc khác có kiểu sở T Các cấu trúc ñược gọi ñang xét com linux tuoitre Một số thuật ngữ Bậc nút số nút Bậc bậc lớn nút Nút gốc nút nút cha Nút nút có bậc Nút nhánh nút có bậc khác nút gốc Một số thuật ngữ Mức nút: Nút gốc (T) =0 Gọi T1, T2,…,Tn T0 Mức(T1) = Mức(T2) = … = Mức(Tn) = Mức(T0)+1 Một số thuật ngữ 5.2 Cây nhị phân • ðộ dài ñường ñi từ gốc ñến nút x: số nhánh cần ñi qua kể từ gốc ñến x • ðộ dài ñường ñi tổng cây: • ðịnh nghĩa: Cây nhị phân mà nút có tối ña ñó Px ñộ dài ñường ñi từ gốc ñến X • ðộ dài ñường ñi trung bình: PI = PT/n (n số nút T) • Rừng cây: tập hợp nhiều ñó thứ tự quan trọng Ví dụ ứng dụng nhị phân 5.2 Cây nhị phân * - Cây phải Cây trái * + - + * ((2+4)*2-5)*(2*1-(3+6)) 5.2 Cây nhị phân • Chiều cao h h=Max(mức)+1 • Tính chất 5.2 Cây nhị phân Mức – Số nút nằm mức i ≤ 2i – Số nút ≤ 2h-1, với h chiều cao – Số nút ≤ 2h-1 – Chiều cao h > log2(số nút cây) 2h-1=2h-1+2h-2+…+1 5.2 Cây nhị phân • Cách – Thông tin lưu trữ trữ nút – ðịa nút gốc trá trái nhớ – ðịa nút gốc phả phải nhớ • Cách – – – – Thông tin lưu trữ trữ nút ðịa nút cha ðịa nút gốc trá trái nhớ ðịa nút gốc phả phải nhớ Biểu diễn nhị phân 5.2 Cây nhị phân struct TNODE { DataType Key; TNODE *pLeft, *pRight; }; typedef TNODE* pTNODE; struct Tree{ pTNODE Root; }; Trong ñó DataType kiểu liệu ứng với thông tin lưu nút Biểu diễn nhị phân Biểu diễn nhị phân 5.2 Cây nhị phân 5.2 Cây nhị phân struct TNODE { DataType Key; TNODE* pParent; TNODE* pLeft; TNODE* pRight; }; typedef TNODE* TREE; Biểu diễn nhị phân 5.2 Cây nhị phân • Duyệt theo thứ tự trước (Node-Left-Right) - NLR • Duyệt theo thứ tự (Left- Node-Right) - LNR • Duyệt theo thứ tự sau (Left-Right-Node) - LRN Duyệt nhị phân Biểu diễn nhị phân 5.2 Cây nhị phân void NLR(TREE Root) { if (Root != NULL) { ;//Xử lý theo nhu cầu NLR(Root->pLeft); NLR(Root->pRight); } } Duyệt nhị phân - NLR 5.2 Cây nhị phân (3 + 1)×3/(9 – + 2) – (3×(7 – 4) + 6) = –13 -,/,x,+,3,1,3,+,-,9,5,2,+,x,3,-,7,4,6 Duyệt nhị phân - NLR 5.2 Cây nhị phân (3 + 1)×3/(9 – + 2) – (3×(7 – 4) + 6) = –13 3,+,1,x,3,/,9,-,5,+,2,-,3,x,7,-,4,+,6 Duyệt nhị phân - LN NR 5.2 Cây nhị phân void LNR(TREE Root) { if (Root != NULL) { LNR(Root->Left); ; //Xử lý theo nhu cầu LNR(Root->Right); } } Duyệt nhị phân - LN NR 5.2 Cây nhị phân void LRN (TREE Root) { if (Root != NULL) { LRN(Root->Left); LRN(Root->Right); ; //Xử lý theo nhu cầu } } Duyệt nhị phân - LRN N 5.2 Cây nhị phân (3 + 1)×3/(9 – + 2) – (3×(7 – 4) + 6) = –13 3,1,+,3,x,9,5,-,2,+,/,3,7,4,-,x,6,+,- 5.2 Cây nhị phân • Hãy so sánh thời gian tìm kiếm cho ba loại cấu trúc liệu: – Mảng – Danh sách liên kết – Cây nhị phân Duyệt nhị phân - LRN N 5.3 Cây nhị phân tìm kiếm • ðịnh nghĩa • Các thao tác – Duyệt – Tìm phần tử – Thêm phần tử vào – Hủy phần tử – Tạo nhị phân tìm kiếm – Hủy toàn nhị phân tìm kiếm 5.3 Cây nhị phân tìm kiếm • Cây nhị phân tìm kiếm (CNPTK) nhị phân ñó nút, khóa nút ñang 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 • 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ể Nếu số nút N chi phí tìm kiếm trung bình khoảng log2N ðịnh nghĩa Cây nhị phân tìm kiếm 5.3 Cây nhị phân tìm kiếm Dựng nhị phân LNR: B C D F A G I H E NLR: A C B F D H G I E A C F B Ví dụ Cây nhị phân tìm kiếm 5.3 Cây nhị phân tìm kiếm H G D 5.3 Cây nhị phân tìm kiếm • Thao tác duyệt nhị phân tìm kiếm hoàn toàn giống nhị phân • Khi duyệt theo thứ tự giữa, trình tự nút duyệt qua cho ta dãy nút theo thứ tự tăng dần khóa Thao tác – Duyệt Thao tác – Tìm phần tử E I 5.3 Cây nhị phân tìm kiếm TNODE* SearchNode(TREE T, DataType X) { if(T) { ðệ quy if(T->Key == X) return T; if(XKey) return SearchNode(T->pLeft, X); else return SearchNode(T->pRight, X); } return NULL; } Thao tác – Tìm phần tử 5.3 Cây nhị phân tìm kiếm • 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 chỗ khác cây, thêm vào nút tiện lợi ta thực hiên trình tương tự thao tác tìm kiếm • Khi chấm dứt trình tìm kiếm lúc tìm ñược chỗ cần thêm Thao tác – Thêm phần tử vào 5.3 Cây nhị phân tìm kiếm TNODE * searchNode(TREE Root, DataType x) { TNODE *p = Root; while (p!= NULL) { if(x == p->Key) return p; Sử dụng vòng lặp else ñể tìm kiếm if(x < p->Key) p = p->pLeft; else p = p->pRight; } return NULL; } Thao tác – Tìm phần tử 5.3 Cây nhị phân tìm kiếm Lưu ý phần tử có khóa 55 Còn có thành phần left,right left==right==NULL (nút lá) Thao tác – Thêm phần tử vào 5.3 Cây nhị phân tìm kiếm 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); } //Khi T==NULL thêm vào 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 } Thao tác – Thêm phần tử vào 5.3 Cây nhị phân tìm kiếm • X nút lá: ñơn giản hủy X không móc nối ñến phần tử khác Thao tác – Xóa phần tử khỏi 5.3 Cây nhị phân tìm kiếm • Có trường hợp xảy – X nút – X có (trái phải) – X có ñủ Thao tác – Xóa phần tử khỏi 5.3 Cây nhị phân tìm kiếm • X có (trái phải): i) trước hủy X ta móc nối cha X với Thao tác – Xóa phần tử khỏi 5.3 Cây nhị phân tìm kiếm 5.3 Cây nhị phân tìm kiếm • X có ñủ con: 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 ñược 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 Có phần tử thỏa mãn yêu cầu: – Phần tử nhỏ (tr trá nhấ nhất) phả phải – Phần tử lớn (ph phả ải nhấ nhất) trá trái Thao tác – Xóa phần tử khỏi 5.3 Cây nhị phân tìm kiếm • Ta tạo nhị phân tìm kiếm cách lặp lại trình thêm phần tử vào rỗng 44,18,88,13,37,59,108,15,23,40,55,71 Có thể dùng 15 ñể mạng Thao tác – Xóa phần tử khỏi 5.3 Cây nhị phân tìm kiếm • Việc toàn ñược thực void removeTree(TREE T) thông qua { if(T) thao tác duyệt { theo thứ tự removeTree(T->pLeft); sau Nghĩa ta removeTree(T->pRight); hủy delete(T); trái, } phải hủy } nút gốc Thao tác – Hủy toàn Thao tác – Tạo nhị phân tìm kiếm 5.3 Cây nhị phân tìm kiếm 5.4 Cây nhị phân cân • Cây nhị phân cân hoàn toàn Khi thì suy biến thành danh sách liên kết? ðể khắc phục ñiều ta cần làm gì? 5.4 Cây nhị phân cân • ðịnh nghĩa: Cây cân hoàn toàn nhị phân tìm kiếm mà nút nó, số nút trái chênh lệch không so với số nút phải Cây Cân Bằ Bằng Hoà Hoàn Toà Toàn Cây CCBHT h ~ log2n Cây nhị phân tìm kiếm cân bằ hoà hoàn toàn – ðịnh nghĩa – ðánh giá • Cây nhị phân cân (AVL) Adelson-Velskii Landis (Nga - 1962) – ðịnh nghĩa – Chiều cao AVL – Cấu trúc liệu – ðánh giá AVL 5.4 Cây nhị phân cân • ðánh giá – Một khó ñạt ñược trạng thái cân hoàn toàn dễ cân thêm hay hủy nút làm cân (xác suất lớn), chi phí cân lại lớn phải thao tác toàn – Trong trường hợp xấu ta phải tìm qua log2n phần tử (n số nút cây) – Do CCBHT cấu trúc ổn ñịnh nên thực tế sử dụng Nhưng ưu ñiểm lại quan trọng Vì vậy, cần ñưa CTDL khác có ñặc tính giống CCBHT ổn ñịnh Cây nhị phân tìm kiếm cân bằ hoà hoàn toàn 5.4 Cây nhị phân cân • ðịnh nghĩa: Cây nhị phân tìm kiếm cân mà nút ñộ cao trái phải chênh lệch không 5.4 Cây nhị phân cân Cây CBHT???? Cây AVL Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • Chiều cao AVL – Ta phải khẳng ñịnh AVL n nút phải có chiều cao khoảng log2(n) – ðể ñánh giá xác chiều cao AVL, ta xét toán: AVL có chiều cao h phải có tối thiểu nút? Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • Chiều cao AVL – Gọi N(h) số nút tối thiểu AVL có chiều cao h – Ta có N(0) = 0, N(1) = N(2) = – Cây AVL tối thiểu có chiều cao h có: • AVL tối thiểu chiều cao h-1 • AVL tối thiểu chiều cao h-2 – Như vậy: N(h) = + N(h-1) + N(h-2) Cây nhị phân tìm kiếm cân AVL Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • Chiều cao AVL 5.4 Cây nhị phân cân Cây AVL tối thiểu có chiều cao – Ta lại có: N(h-1) > N(h-2) nên: • • • • N(h) > 2N(h-2) N(h) > 22N(h-4) … N(h) > 2iN(h-2i) ðể h-2i=1 i=(h-1)/2 – Suy ra: N(h) > (h-1)/2 – Hay h-1 < 2*log2(N(h)) tức h < 2*log2(N(h)) + 1= 2*log2(n)+1 – Vậy AVL có chiều cao O(log2(n)) Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân struct AVLNode { char balFactor; Data key; AVLNode* pLeft; AVLNode* pRight; }; • CSCB(p) = ðộ cao trái (p) = ðộ cao phải (p) • CSCB(p) = ðộ cao trái (p) < ðộ cao phải (p) • CSCB(p) =-1 ðộ cao trái (p) > ðộ cao phải (p) typedef AVLNode *AVLTree; balFactor ==CSCB(p) Cấu trúc liệu cho AVL Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • ðánh giá – Cây cân CTDL ổn ñịnh hẳn CCBHT thêm hủy làm thay ñổi chiều cao trường hợp cân có khả xảy – Cây AVL với chiều cao ñược khống chế cho phép thực thi thao tác tìm thêm hủy với chi phí O(log2(n)) bảo ñảm không suy biến thành O(n) 5.4 Cây nhị phân cân • Các trường hợp cân – Ta không khảo sát tính cân nhị phân mà quan tâm ñến khả cân xảy rakhi thêm hủy nút AVL – Như vậy, cân bằng, ñộ lệch chiều cao Ta có khả (chia làm trường hợp) Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • Trườ Trường hợ hợp 2: T lệch bên phải(có khả năng) 5.4 Cây nhị phân cân • Trườ Trường hợ hợp 1: T lệch bên trái(có khả năng) Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân • Hướ Hướng giả giải quyế trường hợp tương tự nên ta giải trườ hợp trường hợ Quay ñơn Left - Left Cây nhị phân tìm kiếm cân AVL Cây nhị phân tìm kiếm cân AVL 5.4 Cây nhị phân cân 5.4 Cây nhị phân cân Quay kép Left - Right Quay ñơn Left - Left Cây nhị phân tìm kiếm cân AVL Nội dung ôn thi • Thực hành – Thêm code vào thuật toán ñể thực yêu cầu ñó – Danh sách liên kết • Tổ chức CTDL: phân số, ña thức biến, quản lý sinh viên • Sắp xếp theo thứ tự ñó Cây nhị phân tìm kiếm cân AVL Nội dung ôn thi • Lý thuyết – Thuật toán xếp, tìm kiếm • Tìm kiếm • Thực bước kết thuật toán (HeapSort,MergeSort, …) • ShakerSort có cải tiến so với BubleSort – Danh sách liên kết • Lý sử dụng CTDL ñộng • Tổ chức liệu cho toán nào ñó -> nêu hướng giải (từ ñiển, ña thức, …) • Chuyển trung tố hậu tố, ñịnh trị hậu tố – Cây • Dựng cây, Duyệt Cây • Thêm, Xóa phần tử cho • Hỏi

Ngày đăng: 22/12/2016, 12:41

Xem thêm: CTDL1 CH05 cay

w