Bài giảng Cấu trúc dữ liệu: Chương 4 - TS. Trần Cao Đệ
lượt xem 6
download
Chương 4 - Tập hợp của bài giảng Cấu trúc dữ liệu trình bày khái niệm tập hợp, kiểu dữ liệu trừu tượng tập hợp, cài đặt tập hợp, cài đặt bằng danh sách liên kết và các nội dung liên quan khác.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu: Chương 4 - TS. Trần Cao Đệ
- Chương 4: TẬP HỢP TS. Trần Cao Đệ Năm 2007 1
- KHÁI NIỆM TẬP HỢP • Khái niệm tập hợp cũng như trong toán học, đó là sự tập hợp các thành viên (members) hoặc phần tử (elements). – Tất cả các phần tử của tập hợp là khác nhau. – Tập hợp có thể có thứ tự hoặc không có thứ tự. 2
- KIỂU DỮ LIỆU TRỪU TƯỢNG TẬP HỢP • Thủ tục UNION(A,B,C) nhận vào 3 tham số là A,B,C; trả ra kết quả là tập hợp C = A ∪B. • Thủ tục INTERSECTION(A,B,C) nhận vào 3 tham số là A,B,C; kết quả là tập hợp C = A ∩ B. • Thủ tục DIFFERENCE(A,B,C) nhận vào 3 tham số là A,B,C; kết quả là tập hợp C = A\B • Hàm MEMBER(x,A) Nếu x ∈ A thì hàm cho kết quả là 1 (đúng), ngược lại cho kết quả 0 (sai). • Thủ tục MAKENULL_SET(A) tạo tập hợp A tập rỗng • Thủ tục INSERT_SET(x,A) thêm x vào tập hợp A • Thủ tục DELETE_SET(x,A) xoá x khỏi tập hợp A • Thủ tục ASSIGN(A,B) gán A cho B ( tức là B:=A ) • Hàm MIN(A) cho phần tử bé nhất trong tập A • Hàm EQUAL(A,B) cho kết quả TRUE nếu A=B ngược lại cho kết quả FALSE 3
- CÀI ĐẶT TẬP HỢP • Cài đặt tập hợp bằng vector Bit – Khi toàn thể tập hợp là tập hợp con của một tập hợp các số nguyên nằm trong phạm vi nhỏ từ 1.. n chẳng hạn – Dùng một mảng kiểu Boolean có n phần tử để cài đặt tập hợp (ta gọi là vectơ bít), • Phần tử thứ i của mảng này giá trị TRUE nếu i thuộc tập hợp • Phần tử thứ i của mảng này giá trị FALSE nếu i KHÔNG thuộc tập hợp 4
- • Chẳng hạn tập hợp A={1,3,5,8} được biểu diễn trong mảng có 10 phần tử như sau: 1 2 3 4 5 6 7 8 9 10 1 0 1 0 1 0 0 1 0 0 const maxlength = 100; // giá trị phần tử lớn nhất trong tập hợp số nguyên không âm typedef int SET [maxlength]; Tạo một tập hợp rỗng void MAKENULL_SET(SET& a){ int i; for(i=0;i
- void UNION (SET a,SET b,SET& c) { int i; for (i=0;i
- Cài đặt bằng danh sách liên kết • Tập hợp có thể cài đặt bằng danh sách liên kết, trong đó mỗi phần tử của danh sách là một thành viên của tập hợp. – Mặc dù thứ tự của các phần tử trong tập hợp là không quan trọng nhưng nếu một danh sách liên kết có thứ tự nó có thể trợ giúp tốt cho các phép duyệt danh sách. • Chẳng hạn nếu tập hợp A được biểu diễn bằng một danh sách có thứ tự tăng thì hàm MEMBER(x,A) có thể thực hiện việc so sánh x một cách tuần tự từ đầu danh sách cho đến khi gặp một phần tử y ≥ x chứ không cần so sánh với tất cả các phần tử trong tập hợp. 7
- • A = {1 3 5 6 7 9 10 } • B=A 8
- • Tìm giao của hai tâp hợp – Nếu ds không có thứ tự for (mỗi x thuộc A ) { Duyệt danh sách B xem x có thuộc B không. Nếu có thì x thuộc giao của hai tập hợp A và B; } – Nếu danh sách có thứ tự tăng thì đối với một phần tử e∈A ta chỉ tìm kiếm trong B cho đến khi gặp phần tử x ≥ e. – Quan trọng hơn nếu f đứng ngay sau e trong A thì để tìm kiếm f trong B ta chỉ cần tìm từ phần tử x trở đi chứ không phải từ đầu danh sách lưu trữ tập hợp B. 9
- • 1 3 5 8 9 10 10
- Khai báo typedef … ElementType; typedef struct Cell { ElementType element; Cell* next; }; typedef Cell* SET; Thủ tục INTERSECTION(A,B,C) trong trường hợp cài tập hợp đặt bằng danh sách liên kết có thứ tự tăng void INTERSECTION( SET Aheader, SET Bheader, SET& C){ SET Acurrent, Bcurrent, Ccurrent; C = (SET)malloc(sizeof(Cell)); Acurrent=Aheader->next; Bcurrent=Bheader->next; Ccurrent=C; 11
- while ((Acurrent!=NULL) && (Bcurrent!=NULL)) { if (Acurrent->element==Bcurrent->element){ Ccurrent->next= (SET)malloc(sizeof(Cell)); Ccurrent=Ccurrent->next; Ccurrent->element=Acurrent->element; Acurrent=Acurrent->next; Bcurrent=Bcurrent->next; } else if (Acurrent->elementelement) Acurrent=Acurrent->next; A: 1, 4, 6, 7, 8, 11 else Bcurrent=Bcurrent->next; } B: 1,3,4,5,7,10 Ccurrent->next=NULL; } A ∩ B = 1, 4, 7 12
- • Phép toán hop, hiệu có thể viết tương tự (xem như bài tập). • Phép ASSIGN(A,B) chép các các phần tử của tập A sang tập B, chú ý rằng ta không được làm bằng lệnh gán đơn giản B=A! • Toán tử MIN(A) chỉ cần trả ra phần tử đầu danh sách (tức là A->next->element). • Toán tử DELETE_SET là hoàn toàn giống như DELETE_LIST. • Phép INSERT_SET(x,A) cũng tương tự INSERT_LIST tuy nhiên ta phải chú ý rằng khi xen x vào A phải đảm bảo thứ tự của danh sách. 13
- Thêm phần tử vào tập hợp tổ chức như danh sách có thứ tự tăng void INSERT_SET(ElementType X, SET& L){ SET T,P; P=L; while (P->next!=NULL) if (P->next->element next; else break; // P dang luu tru vi tri de xen phan tu X vao if (P->next!=NULL) && (P->next->element!=x){ T=(SET)malloc(sizeof(Cell)); T->element=X; T->next=P->next; P->next=T; } } 14
- Xoá phần tử ra khỏi tập hợp tổ chức như danh sách có thứ tự tăng void DELETE_SET(ElementType X, SET& L) { SET T,P; P=L; while (P->next!=NULL) if (P->next->elementnext; else break; if (P->next!=NULL) &&(P->next->element ==X) { T=P->next; P->next=T->next; free(T); } } 15
- Kiểm tra sự hiện diện của phần tử trong tập hợp (ds không có thứ tự) int MEMBER(ElementType X, SET L){ SET P; P = L->next; while (P != NULL) if (P->element == X) return 1; else P = P->next; return 0; } Kiểm tra sự hiện diện của phần tử trong tập hợp (ds có thứ tự) int MEMBER(ElementType X, SET L){ SET P; P = L->next; while (P != NULL) if (P->element >= X) break; else P = P->next; return (P->element == X); } 16
- TỪ ĐIỂN (DICTIONARY) • Từ điển là một kiểu dữ liệu trừu tượng tập hợp đặc biệt với phép toán – INSERT_SET, – DELETE_SET, – MEMBER và – MAKENULL_SET. 17
- Cài đặt từ điển bằng mảng Khai báo #define MaxLength ... // So phan tu toi da typedef ... ElementType; // Kieu du lieu trong tu dien typedef int Position; typedef struct { ElementType Data[MaxLength]; Position Last; } SET; Khởi tạo cấu trúc rỗng void MAKENULL_SET(SET& L){ L.Last=0; } Hàm kiểm tra thành viên của tập hợp int MEMBER(ElementType X, SET L){ for (Position P=1; P
- Thêm một phần tử vào tập hợp Vì danh sách không có thứ tự nên ta có thể thêm phần tử mới vào cuối danh sách. void INSERT_SET(ElementType X, SET& L){ if (L.Last==MaxLength) printf("Mang day"); else if (Member(X,L)==0) { L.Last++; L.Data[L.Last-1]=X; } else printf ("\nPhan tu da ton tai trong tu dien"); } void DELETE_SET(ElementType X, SET& L){ if (L.Last==0) printf("Tap hop rong!\n"); else { for (Position Q=1; (Q
- • Cài đặt tự điển bằng mảng đòi hỏi tốn n phép so sánh để xác định xem một phần tử có thuộc từ điển n phần tử hay không thông qua hàm MEMBER. • Trên từ điển, việc tìm kiếm một phần tử được xác định bằng hàm MEMBER sẽ thường xuyên được sử dụng. Do đó, nếu hàm MEMBER thực hiện không hiệu quả sẽ làm giảm đi ý nghĩa của từ điển (vì nói đến từ điển là phải tìm kiếm nhanh chóng). • Mặt khác hàm MEMBER còn được gọi từ trong thủ tục INSERT_SET và nó cũng dẫn đến là thủ tục này cũng không hiệu quả. Î Tìm cách khác để cài đặt cho hiệu quả 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 175 | 17
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 8: Cấu trúc dữ liệu ngăn xếp
28 p | 77 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 116 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây đỏ đen - Bùi Tiến Lên
25 p | 81 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 17: Cấu trúc dữ liệu dạng cây
21 p | 77 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 58 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 159 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 58 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AA - Bùi Tiến Lên
30 p | 35 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 106 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây - Bùi Tiến Lên
68 p | 40 | 4
-
Bài giảng Cấu trúc dữ liệu: Chương 1 - ThS. Thiều Quang Trung (2018)
44 p | 43 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AVL - Bùi Tiến Lên
38 p | 47 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 68 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 50 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn