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

Bài giảng cấu trúc dữ liệu chương 8 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 (444.19 KB, 37 trang )

GV: NGUYỄN XUÂN VINH

CẤU TRÚC DỮ LIỆU
DATA STRUCTURES

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

[214331]

HASH TABLE

Nguyễn Xuân Vinh

1

/XX

12/3/15




GV: NGUYỄN XUÂN VINH

 Giới thiệu
 Các vấn đề cơ bản với ArrayList, Linked List
 Bảng băm “hoàn hảo”
 Hàm băm hoàn hảo
 Phương pháp xây dựng hàm băm
 Ưu điểm của bảng băm
 Các cách giải quyết xung đột (collision)


 Các bảng băm phổ biến (đọc them)
 Java Map Interface
 Map implementations in Java
 HashMap example

/XX

12/3/15

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

Nội dung

2

2


GV: NGUYỄN XUÂN VINH

Giới thiệu

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

Tất cả các thao tác

12/3/15

phải so sánh khoá!!!


/XX

Khắc phục?

3

3


 Bài toán: cần lưu trữ các mẫu tin và thực hiện các thao tác
 Thêm mẫu tin
 Xoá mẫu tin
 Tìm mẫu tin theo khóa
 Tìm cách thức thực hiện một cách hiệu quả?

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Vấn đề cơ bản

4

4



 Unsorted array
 Sử dụng mảng để lưu mẫu tin, không có thứ tự
 Thêm: thêm cuối nhanh O(1)
 Xoá: chậm do tìm rồi xoá O(n)
 Tìm kiếm: tuần tự chậm O(n)

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Vấn đề cơ bản

5

5


 Sorted array
 Sử dụng mảng lưu trữ mẫu tin, có thứ tự
 Thêm: chèn vào đúng vị trí, chậm O(n)
 Xoá: phải dời các phần tử phía sau, chậm O(n)
 Tìm: nhị phân, nhanh O(logn)

/XX

12/3/15


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

GV: NGUYỄN XUÂN VINH

Vấn đề cơ bản

6

6


 Linked list
 Lưu trữ mẫu tin trong danh sách liên kết
 Thêm: nhanh, O(1)
 Xoá: nhanh khi xoá nút, chậm khi tìm O(n)
 Tìm kiếm: tìm kiếm tuần tự O(n)

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Vấn đề cơ bản

7


7


 Cấu trúc dữ liệu phức tạp hơn, nhưng thực thi tốt hơn
 Tree BST
 Hash table

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Vấn đề cơ bản

8

8


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

Array as table

0012345

An


8.15

0033333

Binh

90

0056789

Danh

5.68

9801010

Phuong

2.0

9802020

Minh

10.0

9903030

Thao


7.3

9908080

Tung

4.9

...

9

/XX

12/3/15

...

Vấn đề: lưu trữ 10,000,000 mẫu tin sinh viên và tìm kiếm theo mã số sinh viên.
Vấn đề: lưu trữ 10,000,000 mẫu tin sinh viên và tìm kiếm theo mã số sinh viên.


GV: NGUYỄN XUÂN VINH

Array as table

0

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


:

:

:

An

8.15

:

:

Binh

9.0

:

:

Danh

5.68

:

:


:

:

:

:

Tung

4.9

:

:

12345
:
33333
:
56789

:
9999999

/XX

12/3/15


9908080

Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0..9999999
Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0..9999999
Index được sử dụng như là mã số sinh viên. Khi đó mẫu tin sv với
Index được sử dụng như là mã số sinh viên. Khi đó mẫu tin sv với
ms 0012345 được lưu trữ ở A[12345]!
ms 0012345 được lưu trữ ở A[12345]!

10

10




Dạng bảng băm với địa chỉ trực tiếp





Mỗi vị trí tương ứng một khoá trong U
Nếu 1 phần tử x có khoá k, thì T[k] chứa tham chiếu đến x
Ngược lại T[k] = Ø được thể hiện là null

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

GV: NGUYỄN XUÂN VINH


Array as table

-

U

-

0

1

(universe of key)
2

3

4

6

2

3

9

0
7


-

4

1
5

5

12/3/15

K (actual keys)

2

-

3
8

-

6

7

11

/XX


5
8

-

8

9
11


 Lưu trữ mẫu tin trong mảng lớn: chỉ mục tương đương khóa
 Thêm: rất nhanh O(1)
 Xóa: rất nhanh O(1)
 Tìm: rất nhanh O(1)
 Nhưng lãng phí rất nhiều bộ nhớ!

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Array as table

12

12



GV: NGUYỄN XUÂN VINH

Hàm băm “hoàn hảo”

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

int Hash(KeyType key)

H(‘0012345’) = 134
Giả sử có hàm “magic” hash. Nó ánh xạ mã số của 1000
Giả sử có hàm “magic” hash. Nó ánh xạ mã số của 1000

H(‘0033333’) = 67

sinh viên vào các số 0..999, ánh xạ one to one. Không có
sinh viên vào các số 0..999, ánh xạ one to one. Không có

H(‘0056789’) = 764

2 mã số cùng giá trị ánh xạ.
2 mã số cùng giá trị ánh xạ.



13

/XX


12/3/15

H(‘9908080’) = 3


GV: NGUYỄN XUÂN VINH

Hàm băm “hoàn hảo”

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

0

3
Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu
Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu

67

trữ vào vị trí Hash(stud_id) trong mảng.
trữ vào vị trí Hash(stud_id) trong mảng.
Để tìm một sinh viên, chỉ cần gọi
Để tìm một sinh viên, chỉ cần gọi
Hash(stud_id).
Hash(stud_id).

134

999


:

:

9908080

Tung

4.9

:

:

:

0033333

Binh

9.0

:

:

:

0012345


An

8.15

:

:

:

0056789

Danh

5.68

:

:

:

:

:

:

14


14

score

:

/XX

12/3/15

764

name


 Magic hash
 Thêm: rất nhanh O(1)
 Xóa: rất nhanh O(1)
 Tìm: rất nhanh O(1)
 Thực tế rất khó xây dựng được hàm băm hoàn hảo (khi không gian khóa quá lớn)

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Bảng băm với hàm băm hoàn hảo


15

15


 Dung hòa tốt giữa thời gian truy xuất và dung lượng bộ nhớ
 Nếu ko giới hạn bộ nhớ: one-to-one, truy xuất tức thì
 Nếu dung lượng bộ nhớ có giới hạn thì tổ chức khóa cùng địa chỉ
 Bảng băm ứng dụng nhiều trong thực tế, thích hợp tổ chức dữ liệu có kích thước lớn và lưu trữ ngoài

/XX

12/3/15

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

GV: NGUYỄN XUÂN VINH

Ưu điểm bảng băm

16

16


GV: NGUYỄN XUÂN VINH

 Hàm băm: biến đổi khóa thành chỉ mục trên bảng băm
 Khóa có thể là dạng số hay dạng chuỗi

 Chỉ mục được tính từ 0..M-1, với M là số chỉ mục của bảng băm
 Hàm băm thường dùng: key % M, với M là độ lớn của bảng băm
 Hàm băm tốt phải thoả yêu cầu
 Tính toán nhanh.
 Các khoá được phân bố đều trong bảng.
 Ít xảy ra đụng độ.
 Xử lý được các loại khóa có kiểu dữ liệu khác nhau.

/XX

12/3/15

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

Hàm băm

17

17


GV: NGUYỄN XUÂN VINH

Hàm băm: Một số PP xây dựng

 Hàm băm dạng bảng tra
 Ví dụ: cho bảng chữ cái alphabet, chữ cái a được băm vào địa chỉ 0, chữ cái b được băm vào địa chỉ 1,..., của
bảng băm

18


/XX

12/3/15

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

 Hàm băm sử dụng phương pháp chia
 Dùng số dư: h(x) = x % M
x là khóa, M là kích thước bảng băm (nên là số nguyên tố )


GV: NGUYỄN XUÂN VINH

Hàm băm: Một số PP xây dựng

 Sử dụng phương pháp trung phương(Middle Square)
k
Với M = 2 (k>=1) (M là kích thước của mảng)

19

/XX

12/3/15

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

w
W = 2 (w: là số lượng bit của một số int = 32)



GV: NGUYỄN XUÂN VINH

Hàm băm: Một số PP xây dựng

 Sử dụng phương pháp nhân
 Sử dụng công thức

20

/XX

12/3/15

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

x là khóa, M là kích thước bảng


GV: NGUYỄN XUÂN VINH

 Mỗi bảng băm ta cần xác định:
 Tập khóa k
 Tập địa chỉ M
 Hàm băm
 Khi xây dựng mong muốn các khóa ánh xạ vào các địa chỉ khác nhau
 Thực tế thường xảy ra hai khóa cùng địa chỉ ⇒ Gọi là xung đột (collision)
 Phải có chiến lược giải quyết xung đột!


/XX

12/3/15

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

Collision!!!

22

22


GV: NGUYỄN XUÂN VINH

Collision: PP kết nối trực tiếp

 Mỗi địa chỉ bảng băm tương ứng một DSLK
 Các nút bị xung đột nối kết với nhau trên một DSLK
 Danh sách liên kết từ 0 đến M-1
 Khi tìm địa chỉ hàm băm f(key) sẽ xác định địa chỉ i ∈[0..M-1], ứng với danh sách thứ i chứa phần tử ⇒ tiếp tục

/XX

12/3/15

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

tìm kiếm trên danh sách liên kết


23

23


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

Collision: PP kết nối trực tiếp



Bảng băm có tập khóa là số nguyên, tập địa chỉ có 10 địa chỉ

Bảng

0

30

50

1

11

21


2

32

62

3

33

53

4

54

74

5

25

55

6

36

56


7

27

47

8

48

98

9

39

59

41

74

địa chỉ

57

69



GV: NGUYỄN XUÂN VINH

Collision: PP dò tuyến tính (Linear Probe)

 Nếu băm lần đầu bị xung đột thì băm lại lần 1, nếu bị xung đột nữa thì băm lai lần 2,… Quá trình băm lại diễn ra
cho đến khi không còn xung đột nữa.

 Các phép băm lại (rehash function) thường sẽ chọn địa chỉ khác cho các phần tử.
hi(key)=(h(key)+i) %M

25

/XX

12/3/15

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

với h(key) là hàm băm chính của bảng băm


GV: NGUYỄN XUÂN VINH

Collision: PP dò bậc hai (Quadratic Probing)

 Hàm băm lại của phương pháp dò bậc hai là truy xuất các địa chỉ cách bậc 2.
 Hàm băm lại hàm i được biểu diễn bằng công thức sau:
2
hi(key)=( h(key) + i ) % M


26

/XX

12/3/15

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

với h(key) là hàm băm chính của bảng băm.

 Nếu đã dò đến cuối bảng thì trở về dò lại từ đầu bảng.
 M nên là số nguyên tố.


×