Ấ Ữ Ệ

C U TRÚC D LI U DATA STRUCTURES [214331]

H N I V N Â U X N Ễ Y U G N

:

V G

T P H P Ậ Ợ (SET)

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

1

Teacher: Nguy n Xuân Vinh Email: nguyenxuanvinh@hcmuaf.edu. vn

N i dung

i Collection

H N I V N Â U X N Ễ Y U G N

:

V G

ạ ậ ợ

• Nh c l ắ ạ • 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 ế ằ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

2

Collection

H N I V N Â U X N Ễ Y U G N

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

:

V G

• Nó được phân thành 2 nhóm:

– Linear: stack, queue, set, hashtable… – Non-Linear: tree, graph…

Tree, Hashtable…

U Ệ I L Ữ D C Ú R T U Ấ C

:

Non-Linear collection

N Ô M

/

4 1 2 1

/

6

Linear collection

X X

/

3

Collection

• Vi c t

ch c các ph n t bên trong 1 collection th ầ ử ườ ng d a trên ự

H N I V N Â U X N Ễ Y U G N

:

V G

các ph n t ầ ử ứ ự thêm vào v t ch a ứ ậ

ố ầ ử

ệ ổ ứ sau: các y u t ế ố – Order: Th t – M i quan h gi a các ph n t ệ ữ – Unique: tính duy nh tấ

• Ví d : danh sách ng (alphabetical) hay đ

c s p x p d a trên th t tên ụ

i có th đ c l u tr ph thu c vào th t ứ ự thêm vào ườ ượ ư ể ượ ắ ế ự ữ ụ ứ ự ộ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

4

T p h p (Set) ợ

• T p h p là m t nhóm các ph n t ộ không đ

mà trong đó m i quan h gi a ệ ữ ố t c các ợ ầ ử ầ ử ế ượ ư ạ ố

H N I V N Â U X N Ễ Y U G N

:

là duy nh t.

V G

• T p h p là m t c u trúc d ng phi tuy n nh ng chúng ta v n có

c xét đ n. Gi ng nh b n ném t ấ ả ấ ừ

ộ ấ ế ẫ

vào trong 1 cái h p. Và t ng ph n t ầ ử ộ ư ạ th dùng m t c u trúc d ng tuy n tính đ hi n th c nó. ể ệ ộ ấ ự ế ạ các ph n t ph n t ầ ử ậ ợ ể

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

5

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 ớ

H N I V N Â U X N Ễ Y U G N

:

V G

ng là:

ể ỗ

U Ệ I L Ữ D C Ú R T U Ấ C

:

ề ng tác v i nó. ươ • Các phép toán này thông th ườ . – Thêm, xóa các ph n t ầ ử – Ki m tra xem collection đó có r ng hay không. c c a collection. – Tính kích th ướ ủ ừ ử – Các phép toán dùng đ t trong collection đó. ng tác v i các collection khác. Iterator, x lý t ng ph n t ầ ử ể ươ ớ

N Ô M

/

4 1 2 1

/

6

X X

/

6

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

Phép toán

Mô tả

H N I V N Â U X N Ễ Y U G N

:

Thêm 1 ph n t

vào trong t p h p

add

ầ ử

V G

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

addAll

ấ ả

ầ ử ủ

removeRandom

Xóa 1 ph n t

ng u nhiên trong t p h p

ầ ử

Xóa 1 ph n t

remove

ầ ử

ra kh i t p h p ỏ ậ

H p các ph n t

c a 2 t p h p vào 1 t p h p th 3

union

ầ ử ủ

Xác đ nh xem 1 ph n t

contains

ầ ử

có n m trong t p h p hay không ậ

gi ng nhau hay không

equals

Xác đ nh xem 2 t p h p có ch a các ph n t ợ

ầ ử ố

U Ệ I L Ữ D C Ú R T U Ấ C

:

isEmpty

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

N Ô M

Xác đ nh s ph n t

size

ầ ử

trong t p h p ậ

Đ a ra 1 cách duy t t

t c các ph n t

iterator

ệ ấ ả

ầ ử

ư

trong t p h p ậ

/

toString

Đ a ra 1 cách hi n th cho t p h p ể

ư

4 1 2 1

/

6

X X

/

7

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

H N I V N Â U X N Ễ Y U G N

:

<> SetADT

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

add() addAll() removeRandom() remove() union() contains() equals() isEmpty() size() iterator() toString()

8

SetADT.java

H N I V N Â U X N Ễ Y U G N

:

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

9

SetADT.java

H N I V N Â U X N Ễ Y U G N

:

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

0 1

Iterator

ng cho phép ng ườ i dùng tri u g i và s ử ệ ọ

H N I V N Â U X N Ễ Y U G N

:

V G

trong collection. t k đ xác đ nh: . Iterator là m t đ i t ộ ố ượ d ng t ng ph n t ừ ầ ử ụ ng trình thi • Ch ứ ự ủ

ng h p c a Set không có 1 th t đ c bi ế ế ể ươ c a các ph n t – Th t ầ ử – Cách mà iterator s hi n th c. ẽ ệ ợ ủ

ườ nên s s p x p c a các ph n t ệ ứ ự ặ trong iterator là ng u ự ắ ế ủ t nào cho các ẫ ầ ử

U Ệ I L Ữ D C Ú R T U Ấ C

• Trong tr ph n t ầ ử nhiên.

:

N Ô M

/

4 1 2 1

/

6

X X

/

1 1

Iterator

• Các collection h tr Iterator th

ng có ph ườ ươ ng th c iterator() tr ả ứ

ỗ ợ ể

H N I V N Â U X N Ễ Y U G N

:

V G

• Các ph

ố ượ ự ng ki u Iterator. ộ ộ ư ệ ị

trong iterator. v 1 đ i t ề Iterator th c ra là m t interface đ nh nghĩa trong b th vi n chu n c a Java. ẩ ủ ứ ươ ả ề ầ ử ế

ng th c trong Iterator: – hasNext(): tr v true n u còn ph n t – next(): tr v ph n t k ti p trong iterator. ả ề

U Ệ I L Ữ D C Ú R T U Ấ C

remove(Object obj): xóa m t ph n t trong collection. ầ ử ầ ử ế ế ộ

:

N Ô M

/

4 1 2 1

/

6

X X

/

2 1

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

ề ấ ả ố

H N I V N Â U X N Ễ Y U G N

:

V G

ỏ ả ậ ầ ử

ra kh i danh sách r ng. t k ra các collection có nhi m v quy t đ nh cách ế ị ỗ ụ ệ 1 cách th t c n th n. ậ ẩ – Ví d : xóa 1 ph n t ế ế

• Ng ườ i quy t cho nh ng v n đ này. gi ữ ả – Ta có th đ nh nghĩa ph ể ị

ụ i thi ế ấ

ề ươ ể ể

tr ướ c khi th c hi n xóa ph n t ệ

U Ệ I L Ữ D C Ú R T U Ấ C

ự – Ta cũng có th ném ra ngo i l ể ng th c isEmpty() dùng đ ki m tra ứ . ầ ử ạ ệ ế n u tình hu ng này x y ra. ố ả

:

N Ô M

/

4 1 2 1

/

6

X X

/

3 1

Cài đ t t p h p ặ ậ

H N I V N Â U X N Ễ Y U G N

:

V G

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

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

Danh sách liên k tế

M ngả

4 1

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

• M t m ng khi kh i t o c n bi

c kích th c c a nó, g i là ở ạ ầ t tr ế ướ ướ ủ ọ

H N I V N Â U X N Ễ Y U G N

:

V G

ả ộ 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 ầ ử ậ ố

U Ệ I L Ữ D C Ú R T U Ấ C

h p đã đ y: ầ ợ t l . – Ném bi ệ ệ – Tr v 1 tr ng thái ch th . ị ạ ả ề – T đ ng m r ng kích th ướ ở ộ ự ộ c m ng. ả

:

N Ô M

/

4 1 2 1

/

6

X X

/

5 1

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

ộ ậ ầ ự ườ ả ả ợ

và gi

H N I V N Â U X N Ễ Y U G N

:

V G

• S c ch a là m t v n đ c a hi n th c, không nên giao cho

• Hai cách l a ch n đ u bu c ng ọ i quy t v i các tình hu ng x y ra. ố ế ớ t là h tr chúng ta trong vi c tách r i t h n, đ c bi ặ ứ ố ơ ệ ớ ự ứ

ả • Cách th 3 t i dùng t p h p ph i c nh giác ả ỗ ợ ệ ệ ờ

ề ủ ự

i quy t n u không có lý do nào đ c bi i dùng gi t. ph n hi n th c và l p interface. ệ ộ ấ ả ầ ứ ng ườ ế ế ệ ặ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

6 1

1. Dùng m ng: Hi n th c t p h p

ự ậ

• Các ph n t m ng.ả

trong t p h p đ ậ ợ ượ ư c l u tr k nhau ữ ế ở 1 đ u c a ầ ủ ầ ử

H N I V N Â U X N Ễ Y U G N

:

V G

• Chúng ta c n:ầ

– 1 bi n count đ l u tr t ng s ph n t

– M t m ng content dùng đ ch a n i dung c a t p h p

hi n có trong t p ể ư ữ ổ ầ ử ệ ậ ố

ế h p.ợ ộ ể ứ ộ ủ ậ ả ợ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

Các ph n t

đ ầ ử ượ ư

c l u tr k nhau ữ ề

7 1

ươ

ng th c c n cài ứ ầ

1. Dùng m ng: Các ph ả đ tặ

H N I V N Â U X N Ễ Y U G N

:

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

8 1

1. Dùng m ng: Demo ả

H N I V N Â U X N Ễ Y U G N

:

V G

• SetADT.java • ArraySet.java • ArrayIterator.java • EmptySetException.java • ElementNotFoundException.java

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

9 1

ứ ạ

: O(1). ầ ử

H N I V N Â U X N Ễ Y U G N

:

V G

ị ỉ

c ch đ nh ra kh i t p h p: O(n). ỏ ậ ợ

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 ợ ư ầ ế ậ • M r ng 1 t p h p: O(n). ợ ở ộ đ • Lo i b m t ph n t ợ ầ ử ượ ạ ỏ ộ • 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. ứ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

0 2

2. Dùng Linked List: Hi n th c t p h p

ự ậ

hi n có c a t p h p ủ ậ ể ư ợ

H N I V N Â U X N Ễ Y U G N

:

V G

– M t bi n count đ l u tr s ph n t – M t bi n contents dùng đ l u tr node đ u tiên c a t p h p

• Chúng ta c n:ầ ộ ộ

ế ế ầ ừ ệ ầ ữ ữ ố ể ư ủ ậ ợ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

1 2

2. Dùng Linked List: UML

H N I V N Â U X N Ễ Y U G N

:

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

2 2

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

ứ ạ

, do đó đ ph c t p khi thêm 1 ế ứ ự ộ ứ ạ

ph n t

H N I V N Â U X N Ễ Y U G N

:

V G

ầ ử • Xóa 1 ph n t ộ ứ ạ ướ ệ ả

• Xóa 1 ph n t

• Vì ta không quan tâm đ n th t vào t p h p là O(1) ậ ợ cho tr ầ ử qua danh sách đ tìm ph n t ể b t kì cũng có đ ph c t p là O(n) ầ ử ấ

c có đ ph c t p là O(n) vì ph i duy t ầ ử

ộ ứ ạ

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

3 2

3. Set implementations in Java

• Set is an interface; you can't say new Set() • There are two implementations:

H N I V N Â U X N Ễ Y U G N

:

V G

– 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

• contains method runs in constant time! (How?!)

fast to search for elements in them

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

• Preferred: Set s = new HashSet();

Not: HashSet s = new HashSet();

/

4 1 2 1

/

6

X X

/

4 2

24

Limitations of Sets

• Why are these methods missing from Set?

H N I V N Â U X N Ễ Y U G N

:

V G

– 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?

U Ệ I L Ữ D C Ú R T U Ấ C

:

• What happens when we print a Set? Why does it print what it

N Ô M

does?

/

4 1 2 1

/

6

X X

/

5 2

25

Iterators for Sets

• A set has a method iterator to create an iterator over the

elements in the set

H N I V N Â U X N Ễ Y U G N

:

V G

• The iterator has the usual methods: – boolean hasNext() – Object next() – void remove()

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

6 2

26

Typical set operations

• Sometimes it is useful to compare sets:

– subset: S1 is a subset of S2 if S2 contains every element from

H N I V N Â U X N Ễ Y U G N

:

S1.

V G

• Many times it is useful to combine sets in the following

ways: – union: S1 union S2 contains all elements that are in S1 or S2.

intersection: S1 intersect S2 contains only the elements that are in both S1 and S2.

U Ệ I L Ữ D C Ú R T U Ấ C

:

– difference: S1 difference S2 contains the elements that are in S1

N Ô M

that are not in S2.

/

• How could we implement these operations using the

4 1 2 1

/

6

methods in Java's Set interface?

X X

/

7 2

27

How does a HashSet work?

• every object has a reasonably-unique associated

H N I V N Â U X N Ễ Y U G N

:

V G

number called a hash code – public int hashCode() in class Object • HashSet stores its elements in an array a such

that a given element o is stored at index o.hashCode() % array.length – any element in the set must be placed in one exact

index of the array

U Ệ I L Ữ D C Ú R T U Ấ C

– searching for this element later, we just have

:

to check that one place to see if it's there (O(1))

N Ô M

• "Tom Katz".hashCode() % 10 == 6 • "Sarah Jones".hashCode() % 10 == 8 • "Tony Balognie".hashCode() % 10 == 9

/

4 1 2 1

/

• you don't need to understand this...

6

X X

/

8 2

28

Membership testing in HashSets • When testing whether a HashSet contains a given

H N I V N Â U X N Ễ Y U G N

:

V G

object: – Java computes the hashCode for the given object looks in that index of the HashSet's internal array

• Java compares the given object with the object in the HashSet's array

using equals; if they are equal, returns true

• Hence, an object will be considered to be in the set only

if both:

U Ệ I L Ữ D C Ú R T U Ấ C

:

It has the same hash code as an element in the set, and

N Ô M

– The equals comparison returns true

• an object that is put into a HashSet works best if it has

/

4 1 2 1

/

6

a public int hashCode()method defined – String, Integer, Double, etc. have this already

X X

/

9 2

29

H I ĐÁP

H N I V N Â U X N Ễ Y U G N

:

V G

U Ệ I L Ữ D C Ú R T U Ấ C

:

N Ô M

/

4 1 2 1

/

6

X X

/

0 3