Tải bản đầy đủ (.pdf) (5 trang)

Chương 3 tập hợp phần 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (447.2 KB, 5 trang )

NỘI DUNG

CÁC PHÉP TOÁN CƠ BẢN
TRÊN TẬP HỢP







Khái niệm tập hợp
Các kiểu dữ liệu trừu tượng trên tập hợp
Cài đặt tập hợp
Từ điển
Bảng băm

Bộ môn Công nghệ phần mềm,
Khoa CNTT&TT, Đại học Cần Thơ

KHÁI NIỆM TẬP HỢP

BIỂU DIỄN TẬP HỢP
• Liệt kê các phần tử trong cặp dấu ngoặc {}

• Là tập hợp các thành viên (members) hoặc phần tử
(elements)
• Các phần tử của tập hợp phải khác nhau
• Các phần tử của tập hợp có quan hệ tuyến tính, tức
là trên tập hợp S có các quan hệ < thỏa mãn:
– Với mọi a, b trong S thì a


– Với mọi a, b, c trong S, nếu a





x S : x là một thành viên của tập hợp S
x S : x không là một thành viên của tập hợp S
 : tập hợp rỗng, không có thành viên
VD: A={1,2} B= {1,2,3}

• Cho hai tập hợp A và B:
– A là 1 bộ phận của B, kí hiệu A  B: nếu mọi thành
viên của A đều là thành viên của B
• VD: A  B

– Tập hợp A và B bằng nhau, kí hiệu A = B:nếu A B
và B A
– Hợp của hai tập hợp: AB={x| | xA hoặc xB}
– Giao của hai tập hợp: AB={x| xA và xB}
– Hiệu của hai tập hợp: A\B={x| xA và xB}

1


CÀI ĐẶT TẬP HỢP

KIỂU DỮ LIỆU TRỪU TƯỢNG TẬP HỢP
Tên hàm/thủ tục


Diễn giải

MAKENULLSET(A)

Tạo tập A rỗng

EMPTY(A)
MEMBER(x,A)

Kiểm tra xem tập A có rỗng?
Kiểm tra xem x có thuộc A?

INSERTSET(x, A)

Thêm x vào tập A

DELETESET(x, A)

Xóa x khỏi tập A
Gán B=A

ASSIGN(A, B)
MIN(A)
UNION(A,B,C)

Trả về phần tử nhỏ nhất trong tập hợp
Trả về TRUE nếu A=B
C=AB


INTERSECTION(A,B,C)

C=AB

DIFFERENCE(A,B,C)

C=A\B
C=AB, nhưng có quan tâm thứ tự

EQUAL(A,B)

MERGE(A,B,C)

CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT
• Thường được dùng khi tập hợp của ta là 1 tập con của
tập số nguyên, có giá trị từ 1..n. Khi đó ta sẽ dùng 1
mảng kiểu boolean có kích thước n để lưu trữ tập
• Phần tử thứ i của mảng có giá trị TRUE nếu i thuộc tập
hợp
• VD: muốn lưu trữ các tập có giá trị phần tử từ 1..10.
Ta dùng mng có tối đa 10 phần tử.
• Mô hình cho A={2,5,7,9} là:






CÀI
CÀI

CÀI
CÀI

ĐẶT
ĐẶT
ĐẶT
ĐẶT

BẰNG
BẰNG
BẰNG
BẰNG

VECTƠ BIT
DANH SÁCH LIÊN KẾT
TỪ ĐIỂN
BẢNG BĂM

CÀI TẬP HỢP ĐẶT BẰNG VECTƠ BIT
• Khai báo
const maxlength = 100; //giá trị phần tử lớn nhất
typedef
int SET [maxlength];

• Tạo tập hợp rỗng:
void MakeNull(SET a) {
int i;
for(i=0;i}


a[i]=0;

• Tìm hợp
void Union(SET a,SET b,SET c){
int i;
for (i=0;iif((a[i]==1)||(b[i]==1))
else
c[i]=0;
}

c[i]=1;

2


CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT

CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Khai báo

• Tìm giao
void Intersection(SET a,SET b,SET c) {
int i;
for (i=0;iif((a[i]==1)&&(b[i]==1))
c[i]=1;
else
c[i]=0;
}


• Tìm hiệu
void Difference(SET a,SET b,SET c){
int i;
for (i=0;iif((a[i]==1)&& !(b[i]==1)) c[i]=1;
else c[i]=0;
}

CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Kiểm tra một phẩn tử có thuộc tập không?
int Member(ElementType X, SET L) {
Position P;
int Found = 0;
P = First(L);
while ((P != End(L)) && (!Found))
if (Retrieve(P,L) == X) Found = 1;
else P = Next(P, L);
return Found
}

typedef int ElementType;
typedef struct Node* NodeType;
struct Node {
ElementType
Data;
NodeType
Next;
};
typedef NodeType Position;

typedef Position SET;//LIST
//typedef List SET;

CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Thêm một phần tử vào tập hợp
void Insert(ElementType X, SET *L) {
Position T,P;
int Finish=0;
P=*L;
while ((P->Next!=NULL)&&(!Finish))
if (P->Next->Data<=X)
P=P->Next;
else Finish=1;
// P dang luu tru vi tri de xen phan tu X vao
T=(NodeType)malloc(sizeof(struct Node));
T->Data=X;
T->Next=P->Next;
P->Next=T;
}

3


CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Tìm hợp
void Union(SET A, SET B, SET *C) {
Position p;
MakeNull(C);
p=First(A);
while (p!=End(A)) {

Insert(Retrieve(p,A),C);
p=Next(p,A);
}
p=First(B);
while (p!=End(B)) {
if (!Member(Retrieve(p,B),*C))
Insert(Retrieve(p,B),C);
p=Next(p,B);
}
}

CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Tìm giao
void Intersection(SET A, SET B, SET *C) {
Position p;
MakeNull(C);
p=First(A);
while (p!=End(A)) {
if (Member(Retrieve(p,A),B))
Insert(Retrieve(p,A),C);
p=Next(p,A);
}
}

TỪ ĐIỂN

CÀI ĐẶT TẬP HỢP BẰNG DSLK
• Xóa một phần tử khỏi tập
void Delete(ElementType X, SET *L) {
Position T,P;

P=*L;
int Finish=0;
while ((P->Next!=NULL)&& (!Finish))
if (P->Next->Data P=P->Next;
else Finish=1;
if (Finish) {
if (P->Next->Data == X) {
T=P->Next;
P->Next=T->Next;
free(T);
}
}
}

• Khái niệm: là một tập hợp đơn giản với các phép
toán INSERT, DELETE và MEMBER
• Có thể cài đặt từ điển bằng:





Véctơ-bít
Danh sách đặc (mảng)
Danh sách liên kết có thứ tự hoặc không thứ tự
Mảng có kích thước cố định với con nháy chỉ đến vị trí
cuối cùng:
• Khuyết điểm:






kích thước không thể lớn tùy ý
xóa một phần tử chậm
dùng bộ nhớ không hiệu quả
Tương tự cài đặt danh sách bằng mảng

4


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
typedef int Position;
typedef struct {
ElementType Data[MaxLength];
Position
Last;
} SET;

CÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG
• Thêm 1 phần tử vào từ điển
void Insert(ElementType X, SET *L) {
if (Full(*L))
printf("Tap hop day");
else if (Member(X,*L)==0) {
(*L).Last++;

(*L).Data[(*L).Last-1]=X;
}
else
printf("\nPhantu da ton tai trong tudien");

}

CÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG
• Khởi tạo rỗng
void MakeNull(SET *L){
(*L).Last=0;
}

• Hàm kiểm tra 1 phần tử có trong từ điển không?
int Member(ElementType X, SET L){
Position P=1, Found=0;
while ((P <= (L.Last)) && (Found == 0))
if ((L.Data[P-1]) == X) Found = 1;
else P++;
return Found;
}

CÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG
• Xóa 1 phần tử khỏi từ điển
void Delete(ElementType X, SET *L){
if (Empty(*L))
printf("Tap hop rong!");
else {
Position Q=1;
while((Q<=(*L).Last)&&((*L).Data[Q-1]!=X))

Q++;
if ((*L).Data[Q-1]==X){
(*L).Data[Q-1]=(*L).Data[(*L).Last-1];
(*L).Last--;
}//if
}

5



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×