Tải bản đầy đủ (.pptx) (30 trang)

Bài giảng cấu trúc dữ liệu chương 6 nguyễn xuân vinh

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 (404.64 KB, 30 trang )

GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU

CẤU TRÚC DỮ LIỆU
DATA STRUCTURES
[214331]

TẬP HỢP
(SET)

1

/XX

12/3/15

Teacher: Nguyễn Xuân Vinh
Email:


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
2

Nội dung

 Nhắc lại Collection
 Tập hợp là gì?
 Phân loại tập hợp


 Set (tập hợp) và các phép toán trên nó
 Hiện thực Set
 Bằng mảng
 Bằng danh sách liên kết


 Collection là một cấu trúc gồm nhiều phần tử.
 Có nhiều kiểu collection: Stack, Queue, List, Set, Graph, Tree, Hashtable…
 Nó được phân thành 2 nhóm:
 Linear: stack, queue, set, hashtable…
 Non-Linear: tree, graph…

MÔN: CẤU TRÚC DỮ LIỆU

GV: NGUYỄN XUÂN VINH

Collection

3

/XX

12/3/15

Non-Linear
Non-Linear collection
collection

Linear
Linear collection

collection


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
4

Collection

 Việc tổ chức các phần tử bên trong 1 collection thường dựa trên các yếu tố sau:
 Order: Thứ tự các phần tử thêm vào vật chứa
 Mối quan hệ giữa các phần tử
 Unique: tính duy nhất
 Ví dụ: danh sách người có thể được sắp xếp dựa trên thứ tự tên (alphabetical) hay được lưu trữ phụ thuộc vào thứ
tự thêm vào


GV: NGUYỄN XUÂN VINH

Tập hợp (Set)

 Tập hợp là một nhóm các phần tử mà trong đó mối quan hệ giữa các phần tử không được xét đến. Giống như bạn
ném tất cả các phần tử vào trong 1 cái hộp. Và từng phần tử là duy nhất.

 Tập hợp là một cấu trúc dạng phi tuyến nhưng chúng ta vẫn có thể dùng một cấu trúc dạng tuyến tính để hiện thực

5


/XX

12/3/15

MÔN: CẤU TRÚC DỮ LIỆU

nó.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
6

Các phép toán trên Collection

 Mỗi 1 collection đều định nghĩa 1 tập hợp các phép toán giúp chúng ta tương tác với nó.
 Các phép toán này thông thường là:
 Thêm, xóa các phần tử.
 Kiểm tra xem collection đó có rỗng hay không.
 Tính kích thước của collection.
 Iterator, xử lý từng phần tử trong collection đó.
 Các phép toán dùng để tương tác với các collection khác.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX

7

Các phép toán trên Set

Phép toán

Mô tả

add

Thêm 1 phần tử vào trong tập hợp

addAll

Thêm tất cả các phần tử của 1 tập hợp vào trong 1 tập hợp khác

removeRandom

Xóa 1 phần tử ngẫu nhiên trong tập hợp

remove

Xóa 1 phần tử ra khỏi tập hợp

union

Hợp các phần tử của 2 tập hợp vào 1 tập hợp thứ 3

contains


Xác định xem 1 phần tử có nằm trong tập hợp hay không

equals

Xác định xem 2 tập hợp có chứa các phần tử giống nhau hay không

isEmpty

Xác định xem tập hợp có rỗng hay không

size

Xác định số phần tử trong tập hợp

iterator

Đưa ra 1 cách duyệt tất cả các phần tử trong tập hợp

toString

Đưa ra 1 cách hiển thị cho tập hợp


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
8

Mô hình UML của lớp SetADT<T>


<<interface>>

SetADT<T>
add()
addAll()
removeRandom()
remove()
union()
contains()
equals()
isEmpty()
size()
iterator()
toString()


9

/XX

12/3/15
MÔN: CẤU TRÚC DỮ LIỆU

GV: NGUYỄN XUÂN VINH

SetADT.java


10


/XX

12/3/15
MÔN: CẤU TRÚC DỮ LIỆU

GV: NGUYỄN XUÂN VINH

SetADT.java


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
11

Iterator

 Iterator là một đối tượng cho phép người dùng triệu gọi và sử dụng từng phần tử trong collection.
 Chương trình thiết kế để xác định:
 Thứ tự của các phần tử.
 Cách mà iterator sẽ hiện thực.
 Trong trường hợp của Set không có 1 thứ tự đặc biệt nào cho các phần tử nên sự sắp xếp của các phần tử trong
iterator là ngẫu nhiên.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15

/XX
12

Iterator

 Các collection hỗ trợ Iterator thường có phương thức iterator() trả về 1 đối tượng kiểu Iterator.
 Iterator thực ra là một interface định nghĩa trong bộ thư viện chuẩn của Java.
 Các phương thức trong Iterator:
 hasNext(): trả về true nếu còn phần tử trong iterator.
 next(): trả về phần tử kế tiếp trong iterator.
 remove(Object obj): xóa một phần tử trong collection.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
13

Các lỗi trên Tập hợp (Set)

 Các collection phải luôn quản lý các vấn đề trong các tình huống 1 cách thật cẩn thận.
 Ví dụ: xóa 1 phần tử ra khỏi danh sách rỗng.
 Người thiết kế ra các collection có nhiệm vụ quyết định cách giải quyết cho những vấn đề này.
 Ta có thể định nghĩa phương thức isEmpty() dùng để kiểm tra trước khi thực hiện xóa phần tử.
 Ta cũng có thể ném ra ngoại lệ nếu tình huống này xảy ra.


 Có nhiều cách để hiện thực tập hợp.
 Dùng mảng

 Dùng danh sách liên kết

GV: NGUYỄN XUÂN VINH
/XX

12/3/15

MÔN: CẤU TRÚC DỮ LIỆU

Cài đặt tập hợp

14

Danh sách liên kết

Mảng


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
15

1. Dùng mảng: Quản lý sức chứa

 Một mảng khi khởi tạo cần biết trước kích thước của nó, gọi là sức chứa (capacity).
 Sức chứa của mảng cũng chính là sức chứa của tập hợp.
 Chúng ta nên làm gì khi người dùng cố thêm 1 phần tử vào tập hợp đã đầy:
 Ném biệt lệ.

 Trả về 1 trạng thái chỉ thị.
 Tự động mở rộng kích thước mảng.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
16

1. Dùng mảng: Quản lý sức chứa

 Hai cách lựa chọn đầu buộc người dùng tập hợp phải cảnh giác và giải quyết với các tình huống xảy ra.
 Cách thứ 3 tốt hơn, đặc biệt là hỗ trợ chúng ta trong việc tách rời phần hiện thực và lớp interface.
 Sức chứa là một vấn đề của hiện thực, không nên giao cho người dùng giải quyết nếu không có lý do nào đặc biệt.


 Các phần tử trong tập hợp được lưu trữ kế nhau ở 1 đầu của mảng.
 Chúng ta cần:
 1 biến count để lưu trữ tổng số phần tử hiện có trong tập hợp.
 Một mảng content dùng để chứa nội dung của tập hợp

17

/XX

12/3/15

MÔN: CẤU TRÚC DỮ LIỆU


GV: NGUYỄN XUÂN VINH

1. Dùng mảng: Hiện thực tập hợp

Các phần tử được lưu trữ kề nhau


18

/XX

12/3/15
MÔN: CẤU TRÚC DỮ LIỆU

GV: NGUYỄN XUÂN VINH

1. Dùng mảng: Các phương thức cần cài đặt


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
19

1. Dùng mảng: Demo

 SetADT.java
 ArraySet.java
 ArrayIterator.java

 EmptySetException.java
 ElementNotFoundException.java


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
20

1. Dùng mảng: Độ phức tạp của các phép toán

 Nếu tập hợp chưa đầy, phép thêm 1 phần tử: O(1).
 Mở rộng 1 tập hợp: O(n).
 Loại bỏ một phần tử được chỉ định ra khỏi tập hợp: O(n).
 Loại bỏ một phần tử bất kỳ ra khỏi tập hợp: O(1).
 Thêm 1 tập hợp vào tập hợp này: O(n)
 Phép hợp hai tập hợp: O(m+n) với m là kích thước của tập hợp thứ hai.


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
21

2. Dùng Linked List: Hiện thực tập hợp

 Chúng ta cần:
 Một biến count để lưu trữ số phần từ hiện có của tập hợp

 Một biến contents dùng để lưu trữ node đầu tiên của tập hợp


22

/XX

12/3/15
MÔN: CẤU TRÚC DỮ LIỆU

GV: NGUYỄN XUÂN VINH

2. Dùng Linked List: UML


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
23

2. Dùng Linked List: Độ phức tạp

 Vì ta không quan tâm đến thứ tự, do đó độ phức tạp khi thêm 1 phần tử vào tập hợp là O(1)
 Xóa 1 phần tử cho trước có độ phức tạp là O(n) vì phải duyệt qua danh sách để tìm phần tử
 Xóa 1 phần tử bất kì cũng có độ phức tạp là O(n)


GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU


3. Set implementations in Java

 Set is an interface; you can't say new Set()
 There are two implementations:
 java.util.HashSet is best for most purposes
 we won't use the other one: TreeSet
 Java's set implementations have been optimized so that it is very fast to search for elements in them
contains method runs in constant time! (How?!)
 Preferred:

HashSet s = new HashSet();

24

/XX

12/3/15

Not:

Set s = new HashSet();

24


GV: NGUYỄN XUÂN VINH

 Why are these methods missing from Set?
 get(int index)

 add(int index, Object o)
 remove(int index)
 How do we access the elements of the set?
 How do we get a particular element out of the set, such as element 0 or element 7?
 What happens when we print a Set? Why does it print what it does?

25

/XX

12/3/15

MÔN: CẤU TRÚC DỮ LIỆU

Limitations of Sets

25


×