Professional Documents
Culture Documents
Giới thiệu
Khái niệm:
+ Cấu trúc dữ liệu tập hợp (Set Data Structure) là một cấu trúc dữ liệu được sử
dụng để lưu trữ một tập hợp các phần tử duy nhất. Một tập hợp không có các
phần tử trùng lập và không có thứ tự định sẳn của các phần tử.
+ Cấu trúc dữ liệu tập hợp bao gồm các hoạt động như thêm phần tử mới vào
tập hợp, xóa phần tử khỏi tập hợp, tìm kiếm phần tử trong tập hợp, kiểm tra
xem tập hợp có rỗng hay không, lấy số lượng các phần tử trong tập hợp, lấy
toàn bộ các phần tử trong tập hợp,…
+ Cấu trúc dữ liệu tập hợp được sử dụng rội rãi trong các ứng dụng như các
thuật toán tìm kiếm, phân tích dữ liệu, xử lý hình ảnh và quản lý bộ nhớ
cache của các trình duyệt.
Cấu trúc dữ liệu tập hợp là một cấu trúc dữ liệu dùng để lưu trữ một tập các phần
tử không trùng nhau. Có nhiều cách để cài đặt cấu trúc dữ liệu này, như sử dụng
cây nhị phân tìm kiếm, bảng băm, hoặc danh sách liên kết. Cấu trúc dữ liệu tập hợp
có nhiều ứng dụng trong lập trình và giải thuật, ví dụ như:
+ Đếm số phần tử khác nhau trong một mảng hoặc một danh sách. Bằng cách
chèn các phần tử vào tập hợp, ta có thể loại bỏ các phần tử trùng lặp và lấy
kích thước của tập hợp làm kết quả.
+ Kiểm tra xem một phần tử có thuộc một tập hợp hay không. Bằng cách sử
dụng các phép toán tìm kiếm trên tập hợp, ta có thể kiểm tra nhanh chóng
xem một phần tử có nằm trong tập hợp hay không.
+ Lưu trữ dữ liệu phân cấp, như là cấu trúc thư mục trên máy tính, cấu trúc của
một tổ chức, hay dữ liệu XML/HTML. Bằng cách sử dụng cây nhị phân làm
cấu trúc dữ liệu tập hợp, ta có thể biểu diễn được các quan hệ cha-con giữa
các phần tử.
+ Thực hiện các phép toán hợp, giao, bù của hai tập hợp. Bằng cách duyệt qua
các phần tử của hai tập hợp và so sánh chúng với nhau, ta có thể tạo ra một
tập hợp mới chứa các phần tử thuộc hoặc không thuộc hai tập hợp ban đầu.
#include <bits/stdc++.h>
int main(){
while(t--){
set<int> se;
se.insert(x);
return 0;
}
Bài 2: Cho một mảng số nguyên gồm n phần tử, với mỗi truy vấn này hãy kiểm tra
xem một số nào đó có nằm trong mảng hay không.
#include <bits/stdc++.h>
int main(){
while(t--){
set<int> se;
se.insert(x);
while(q--){
if(se.count(x) == 1){
return 0;
Cài đặt dữ liệu tập hợp bằng danh sách liên kết
• Khai báo
#include<stdlib.h>
#include<iostream>
struct Node {
ElementType Data;
NodeType Next;
};
(*A)=(NodeType)malloc(sizeof(struct Node));
(*A)->Next= NULL;
return A;
return P->Next->Data;
Position p;
p = First(A);
p=p->Next ;
return p;
}
return p->Next;
Position P;
int Found = 0;
P = First(A);
if (Retrieve(P, A) == X) Found = 1;
return Found;
Position T;
T=(NodeType)malloc(sizeof(struct Node));
T->Data=X;
T->Next=(*A)->Next;
(*A)->Next=T;
• Phép hợp
Position p;
MakeNull(C);
p=First(A);
while (p!=End(A)) {
p=Next(p,A);
p=First(B);
while (p!=End(B)) {
p=Next(p,B);
}
• Phép giao
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);
• Phép hiệu
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);
MakeNull(A);
Position p;
int i=0,m;
while(i!=m){
if(Member(x,*A)==0){
Insert(x,A);
i++;
• In Tập Hợp
void prin(SET C){
Position p;
ElementType x;
p = First(C);
printf("{ ");
while (p != End(C)){
x=p->Next->Data;
printf("%d ",x );
p= Next(p, C);
printf("}");
printf("\n");
• Hàm Main
int main() {
SET A;
SET B;
SET C;
ElementType x;
reads(x,&A);
prin(A);
reads(x,&B);
prin(B);
Union(A,B,&C);
prin(C);
Intersection(A,B,&C);
prin(C);
Difference(A,B,&C);
prin(C);
Difference(B,A,&C);
prin(C);
return 0;
}
So sánh tập hợp với danh sách
Cả tập hợp và danh sách đều là cấu trúc dữ liệu được sử dụng để lưu trữ một tập
hợp các phần tử dữ liệu. Tuy nhiên, chúng có những điểm khác nhau sau:
Tập hợp là một cấu trúc dữ liệu không có thứ tự, không chứa các phần tử trùng
lặp và được sắp xếp theo thứ tự tăng dần. Truy cập ngẫu nhiên vào phần tử
trong tập hợp là khả thi.
Danh sách là một cấu trúc dữ liệu có thứ tự, có thể chứa các phần tử trùng lặp
và được sắp xếp theo thứ tự tuyến tính. Truy cập ngẫu nhiên vào phần tử trong
danh sách là không khả thi
Truy cập ngẫu nhiên vào phần tử trong tập hợp là khả thi.
Có thể thực hiện các phép toán như hợp, giao, hiệu và phép đối xứng giữa các
tập hợp.
Có thể sử dụng các thuật toán tối ưu để tìm kiếm và sắp xếp các phần tử trong
tập hợp.
Có thể tăng hoặc giảm số lượng phần tử trong quá trình thực thi chương trình.
Tối ưu dung lượng bộ nhớ.
Thời gian truy cập là tuyến tính và khó thực thi ống dẫn.
Truy cập ngẫu nhiên vào phần tử trong danh sách là không khả thi