Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1)...

36
Chương 4 CÁC PHÉP TOÁN CƠ BN TRÊN TP HP N.C.Danh

Transcript of Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1)...

Page 1: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

Chương 4CÁC PHÉP TOÁN CƠ BẢN

TRÊN TẬP HỢPN.C.Danh

Page 2: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

NỘI DUNG SẼ HỌC

• 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

Page 3: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

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

• 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<b hoặc b<a• Với mọi a, b, c trong S, nếu a<b và b<c thì a<c

Page 4: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

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

• 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}

Page 5: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

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

MAKENULLSET(A) Tạo tập A rỗngEMPTY(A) Kiểm tra xem tập A có rỗng?MEMBER(x,A) Kiểm tra xem x có thuộc A?INSERTSET(x, A) Thêm x vào tập ADELETESET(x, A) Xóa x khỏi tập AASSIGN(A, B) Gán B=AMIN(A) Trả về phần tử nhỏ nhất trong tập hợpEQUAL(A,B) Trả về TRUE nếu A=BUNION(A,B,C) C=A∪BINTERSECTION(A,B,C) C=A∩BDIFFERENCE(A,B,C) C=A\BMERGE(A,B,C) C=A∪B, nhưng có quan tâm thứ tự

Page 6: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP

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

Page 7: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1)

• 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à:

Page 8: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI TẬP HỢP ĐẶT BẰNG VECTƠ BIT (2)

• Khai báoconst 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<maxlength;i++) a[i]=0;

}• Tìm hợp

void SET_union (SET a,SET b,SET c){int i;for (i=0;i<maxlength;i++)if((a[i]==1)||(b[i]==1))c[i]=1;else c[i]=0;

}

Page 9: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (3)

• Tìm giaovoid SET_intersection(SET a,SET b,SET c){

int i;for (i=0;i<maxlength;i++)if((a[i]==1)&&(b[i]==1)) c[i]=1;else c[i]=0;

}• Tìm hiệu

void SET_difference(SET a,SET b,SET c){int i;for (i=0;i<maxlength;i++)if((a[i]==1)&& !(b[i]==1)) c[i]=1;else c[i]=0;

}

Page 10: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK(1)

• Khai báotypedef int ElementType;typedef struct Node{ElementType Data;Node * Next;};

typedef Node * Position;typedef Position SET;//LIST//typedef List SET;

Page 11: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK(2)Tìm hợpvoid UnionSET(SET A, SET B, SET *C){ Position p;

MakeNullSET(C);p=First(A);while (p!=EndSET(A))

{ InsertSET (Retrieve(p,A),*C);p=Next(p,A);

}p=First(B);while (p!=EndSET (B))

{ if (Member(Retrieve(p,B),*C)==0)InsertSET (Retrieve(p,B),*C);

p=Next(p,B);}

}

Page 12: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK(3)

• Tìm giaovoid IntersectionSET(SET A, SET B, SET *C){

Position p;MakeNullSET(C);p=First(A);while (p!=EndSET(A))

{ if (Member(Retrieve(p,A),B)==1) InsertSET (Retrieve(p,A),&(*C));

p=Next(p,A);}

}

Page 13: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK(4)

• Thêm một phần tử vào tập hợpvoid InsertSET(ElementType X, SET L){ Position T,P;

int finish=0;P=L;while ((P->Next!=NULL)&&(finish==0))if (P->Next->Data<=X)P=P->Next;

else finish=1;// P dang luu tru vi tri de xen phan tu X vaoT=(Node*)malloc(sizeof(Node));T->Data=X;T->Next=P->Next;P->Next=T;

}

Page 14: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK(5)

• Xóa một phần tử khỏi tậpvoid DeleteSET(ElementType X, SET L){

Position T,P=L;int finish=0;while ((P->Next!=NULL)&& (finish==0))

if (P->Next->Data<=X) P=P->Next;else finish=1;if ((finish==1) && (P->Next->Data==X)){

T=P->Next;P->Next=T->Next;free(T);

}}

Page 15: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TẬP HỢP BẰNG DSLK (6)

• 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 != EndSET(L)) && (Found == 0))

if (Retrieve(P,L) >= X) Found = 1;else P = Next(P, L);

if (Found==1) if Retrieve(P,L)==X return 1;else return 0;

else return 0;}

Page 16: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

TỪ ĐIỂN• 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

Page 17: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG (1)

• Khai báo#define MaxLength ... //So phan tu toi datypedef ... ElementType; //Kieu du lieu typedef int Position;typedef struct{ElementType Data[MaxLength];Position Last;

} SET;

Page 18: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG (2)

• Khởi tạo rỗngvoid MakeNullSET(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;

}

Page 19: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG (2)

• Thêm 1 phần tử vào từ điển:void InsertSET(ElementType X, SET *L){ if (FullSET(*L))

printf("Tap hop day");else if (Member(X,*L)==0){

(*L).Last++;(*L).Data[(*L).Last-1]=X;

}elseprintf("\nPhantu da ton tai trong tudien");

}

Page 20: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TỪ ĐIỂN BẰNG MẢNG (3)• Xóa 1 phần tử khỏi từ điển:

void DeleteSET(ElementType X, SET *L){ if (EmptySET(*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}

Page 21: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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ÀI ĐẶT TỪ ĐIỂN BẰNG BẢNG BĂM (4)

• BĂM ĐÓNG• BĂM MỞ

Page 22: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (1)

19B-1

…266

5344

321

200Chỉsố

H(x)=x%B

Page 23: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (1)

• Khai báo#define B 100#define Deleted –1000//Gia dinh gia tri cho o da bi xoa#define Empty 1000 //Gia dinh gia tri cho o chua su dungtypedef int ElementType;

typedef int Dictionary [B];

Page 24: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (2)• Tạo tự điển rỗng

// Tao tu dien rongvoid MakeNullDic(Dictionary D)for (int i=0 ;i<B; i++)

D[i]=Empty;}

Page 25: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (1)Thêm vào giá trị 29

19B-1EE…266E5344E3E2E1200Chỉ

số H(x)=x%B

i=0 H(29) = 9

i=1 H(29) = 0

i=2 H(29)=1

29

Page 26: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (1)Thêm vào giá trị 30

19B-1EE…266E5344D3122291200 i=0 H(30) = 0

i=1 H(30) = 1

i=2 H(30)=2

i=3 H(30)=3

30

Page 27: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (2)• Kiểm tra sự tồn tại của phần tử trong tự điển

int Member(ElementType X, Dictionary L){Position P=H(X);int Found = 0,i=0;while ((i<L.Last)) && (Found == 0))

if (L.Data[(P+i)%B]==X) ||(L.Data[(P+i)%B]==Empty)

Found = 1;else i++;

return (L.Data[(P+i)%B] == X) ;}

Page 28: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (3)• Thêm phần tử vào tự điểnvoid InsertDic(ElementType X, Dictionary D){

int i=0,init;if (FullDic(D))

printf("Bang bam day");else if (Member(X,D)==0){

init=H(X);while((i<B)&& (D[(i+init)%B]!=Empty)&&

(D[(i+init)%B]!=Deleted)) i++;D[(i+init)%B]=X;

} elseprintf("\nPhan tu da ton tai");

}

Page 29: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (1)Xóa giá trị 30

19B-1EE…266E5344303122291200 i=0 H(30) = 0

i=1 H(30) = 1

i=2 H(30)=2

i=3 H(30)=3

Deleted

Page 30: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM ĐÓNG (4)• Xóa từ ra khỏi tự điểnvoid DeleteDic(ElementType X, Dictionary D){

if (EmptyDic(D))printf("\nBang bam rong!");

else{

int i=0,init =H(X);while ((i<B)&&

(D[(i+init)%B]!=X)&&(D[(i+init)%B]!=Empty)) i++;

if ( D[(i+init)%B]==X)D[(i+init)%B]=Deleted;

}}

Page 31: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM MỞ (1)• Khai báo

#define B ...typedef ... ElementType;typedef struct Node{ElementType Data;Node* Next;

};typedef Node* Position;

typedef Position Dictionary[B];

Page 32: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM MỞ (2)

• Khởi tạo bảng băm mở rỗngvoid MakeNullSet(Dictionary *D){for(int i=0;i<B;i++)(*D)[i]=NULL;

}

Page 33: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM MỞ (3)• Kiểm tra một thành viên trong từ điển

int Member(ElementType X, Dictionary D){

Position P;int Found=0;P=D[H(X)]; //Tim o muc H(X)//Duyet tren ds thu H(X)while((P!=NULL) && (!Found))

if (P->Data==X) Found=1;else P=P->Next;

return Found;}

Page 34: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM MỞ (4)• Thêm một phần tử vào từ điển

void InsertSet(ElementType X,Dictionary *D){

int Bucket;Position P;if (!Member(X,*D)){

Bucket=H(X);P=(*D)[Bucket];//Cap phat o nho moi cho *D[Bucket](*D)[Bucket]=(Node*)malloc(sizeof(Node));(*D)[Bucket]->Data=X;(*D)[Bucket]->Next=P;

}}

Page 35: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

BĂM MỞ (5)• Xoá một phần tử trong từ điển

void DeleteSet(ElementType X,Dictionary *D){ int Bucket, Done;

Position P,Q;Bucket=H(X);if((*D)[Bucket]!=NULL)//danh sach ton tai{ if ((*D)[Bucket]->Data==X) //X dau dsach{ Q=(*D)[Bucket];(*D)[Bucket]=(*D)[Bucket]->Next;free(Q);

}else // Tim X

{ Done=0;P=(*D)[Bucket];while ((P->Next!=NULL) && (!Done))

if (P->Next->Data==X) Done=1; else P=P->Next;if(Done) // Neu tim thay{ Q=P->Next; //Xoa P->Next

P->Next=Q->Next;free(Q);

}}}}

Page 36: Ch CÁC PHÉP TOÁN CƠ BẢN TRÊN TẬP HỢP · CÀI ĐẶT TẬP HỢP BẰNG VECTƠ BIT (1) •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,

Hết chương