Giới thiệu Những nhược điểm với địa chỉ trực tiếp Nếu U lớn, việc tạo bảng T với kích cở |U| có thể không khả thi Tập hợp các khóa K có thể sẻ nhỏ hơn U rất nhiều Khi tập các khóa
Trang 1Vũ Đức Tuấn
Trang 2Mục tiêu
dữ liệu Bảng băm
phép toán chính trên từ điển: Chèn, Xóa, Tìm kiếm
Trang 4Mở đầu : Một số khái niệm
(dynamic sets): tập hợp thường xuyên thay đổi
Trang 5* Nhận xét: Có thể
sử dụng mảng hay
bảng địa chỉ trực tiếp
Trang 6Bảng địa chỉ trực tiếp (2)
0 1 2 3 4 5 6 7 8 9
có thành phần nào có khóa k
Trang 7Bảng địa chỉ trực tiếp (3)
0 1 2 3 4 5 6 7 8 9
INSERT(T, x) T[key[x]] x ← x
DELETE(T, x) T[key[x]] NIL ← x
Trang 8Bảng địa chỉ trực tiếp (4)
…
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Trang 10Giới thiệu
Những nhược điểm với địa chỉ trực tiếp
Nếu U lớn, việc tạo bảng T với kích cở |U| có thể không khả thi
Tập hợp các khóa K có thể sẻ nhỏ hơn U rất nhiều
Khi tập các khóa K được chứa trong từ điển nhỏ hơn rất nhiều so với các trường hợp có thể xảy ra U, bảng băm
sẻ tiêu tốn ít không gian lưu trữ hơn bảng địa chỉ trực tiếp
(|K|) không gian nhớ
O(1) thời gian trung bình để tìm kiếm 1 phần tử
(1) thời gian xấu nhất để tìm kiếm một phần tử trong bảng địa chỉ trực tiếp
Trang 11Bảng băm
Đối với địa chỉ trực tiếp: Một phần tử với khóa k T[k]
Bảng băm: một phần tử với khóa k T[h(k)]
h(k): hàm băm; tường được tính toán với độ phức tạp O(1)
h: U {0, 1, , m-1}
Một phần tử với khóa k được băm vào khe h(k)
h(k) là hàm băm của khóa k
Thay vì |U| giá trị, chúng ta chỉ cần quản lý m giá trị
Xung đột có thể xảy ra
Hai khóa khác nhau được băm vào cùng một khe (h(k 1 ) = h(k 2 )
= x)
Loại bỏ tất cả các xung đột là không thể
Tuy nhiên một thiết kế tốt là phải hạn chế tối đa khả năng xung đột có thể xảy ra
Trang 12(|K|)K|K|)) m << |U|
Sử dụng một hàm h để ánh xạ (map) các khóa vào các khe của bảng băm Các khóa k2 và k5 ánh xạ vào cùng một khe, chúng xung đột
Trang 14Hàm băm
nhiên
Trang 16Điều gì tạo nên một hàm băm tốt
Một hàm băm tốt thỏa (xấp xỉ) giả thiết của
kỹ thuật băm đều đơn giản: mỗi khóa có khả năng như nhau để băm vào bất kỳ vị trí nào trong số m khe
k: ( ) m
1
Trang 17Điều gì tạo nên một hàm băm tốt (t.t)
Một hàm băm tốt sẽ giảm thiểu việc các khóa được băm theo cùng khe
Một cách tiếp cận chung đó là suy ra giá trị băm độc lập với bất kỳ khuôn mẫu nào nào đó có thể tồn tại trong dữ liệu
Vài ứng dụng có thể yêu cầu các tính chất mạnh hơn
so với tính chất mà kỹ thuật băm đều đơn giản cung cấp Các khóa phải “đóng” theo một nghĩa nào đó để cho ra các giá trị băm tách xa nhau (Tính chất này
đề cập trong pp thăm dò tuyến tính)
Trang 18Chuyển các khóa dưới dạng
các số tự nhiên
Hầu hết các hàm băm đều mặc nhận không gian của các khóa là tập các số tự nhiên N={0, 1 ,2, }
Như vậy, nếu các khóa không phải là các số
tự nhiên, ta phải có 1 cách nào đó để chuyển chúng về dưới dạng các số tự nhiên Ví dụ, 1 khóa là một chuỗi ký tự, được chuyển về dưới dạng một số nguyên được biểu diễn theo cơ
số thích hợp
Trang 20Ví dụ của phương pháp chia
như sau: 5, 28, 19, 15, 20, 33, 12, 29,
10 vào bảng băm có 9 khe Sử dụng phương pháp chia, ta có hàm băm như sau:
h(k) = k mod 9
Trang 21Nhận xét đối với phương pháp chia
Trang 22 Nhân giá trị này với m và lấy sàn của kết quả
h(k) = m(kA mod 1) ⌊m(kA mod 1)⌋ ⌋
Trong đó “kA mod 1” có nghĩa là phần phân số của
kA, tức là, kA – kA ⌊kA⌋ ⌋.
Phương pháp này có độ phức tạp O(1)
Trang 23Nhận xét đối với phương pháp nhân
thường chọn giá trị m là một lũy thừa
vào các đặc tính của dữ liệu đang được băm Knuth đề cập chi tiết sự lựa chọn của A và gợi ý rằng: A≈ (√5 -1)/2 = 0.6180339887…
Trang 24Ví dụ
Giả sử ta có k = 123456, m = 10000.
Lúc này hàm băm h(k) sẽ được xác định theo phương pháp nhân như sau:
h(k) = m(kA mod 1) ⌊m(kA mod 1)⌋ ⌋
Với A≈ (√5 -1)/2 = 0.6180339887… (theo đề xuất của Knuth)
h(k) = ⌊m(kA mod 1)⌋10000*(1234568*0.6180339887 mod 1) ⌋
h(k) = ⌊m(kA mod 1)⌋ 10000 * 0.0041089472 ⌋ = 41
Trang 25Kỹ thuật phổ băm
Trường hợp xấu, nếu chọn n khóa mà tất cả đều băm theo cùng khe, cho ra một thời gian truy cập trung bình là Θ(n)
Mọi hàm băm cố định đều dễ bị tác động bởi trường hợp xấu như trên
Cách hiệu quả duy nhất để cải thiện tình huống: chọn hàm băm một cách ngẫu nhiên, độc lập với các khóa thực tế sẽ được lưu trữ Cách tiếp cận này có tên là kỹ thuật phổ băm.
Trang 26Kỹ thuật phổ băm (t.t)
vào thời gian thực hiện từ một lớp các hàm được thiết kế cẩn thận
thực hiện, thậm chí với cùng đầu
Trang 27Kỹ thuật phổ băm (t.t)
Cho là một tập hợp hữu hạn các hàm ℋ là một tập hợp hữu hạn các hàm băm ánh xạ đến một không gian U là các khóa đã cho vào miền giá trị {0, 1,
…, m-1}
có k, l U, số lượng hàm băm h ∈ U, số lượng hàm băm h ∈ ℋ ∈ U, số lượng hàm băm h ∈ ℋ ℋ là một tập hợp hữu hạn các hàm qua đó h(k) = h(l) chính xác là | |/m ℋ là một tập hợp hữu hạn các hàm
Trang 28Kỹ thuật phổ băm (t.t)
chọn ngẫu nhiên từ , cơ hội của một ℋ là một tập hợp hữu hạn các hàm đụng độ giữa k và l khi k ≠ l sẽ là 1/m
cơ hội của một xung đột nếu h(l) và h(k) được chọn ngẫu nhiên từ tập hợp {0, 1, …, m-1}.
Trang 29Thiết kế lớp phổ băm
Các bước thiết kế lớp phổ băm:
Chọn 1 số nguyên tố p đủ lớn sao cho k [0, p-1] và p > m
Mỗi hàm băm ℋ là một tập hợp hữu hạn các hàm p,m ánh xạ Z p đến Z m Có p -1 lựa chọn a và p lựa
chọn b, vì vậy có p(p-1) hàm băm trong lớp ℋ là một tập hợp hữu hạn các hàm p,m
Trang 31Phương pháp dây chuyền
CHAINED-HASH-INSERT(T, x): O(1) (không kiểm tra trùng)
Thêm x vào đầu danh sách T[h(key[x])]
CHAINED-HASH-SEARCH(T, k): phụ thuộc vào chiều dài danh
sách
Tìm kiếm một phần tử có khóa k trong danh sách T[h(k)]
CHAINED-HASH-DELETE(T, x): O(1) đối với danh sách nối đôi
Xóa x khỏi danh sách T[h(key[x])]
Trang 32Mỗi khe T[ j ] chứa một danh sách liên kết gồm tất cả các khóa
có giá trị băm là j Ví dụ h(k1) = h(k4), h(k5) = h(k2) = h(k7)
Trang 33Phân tích phép toán tìm kiếm trong kỹ thuật dây chuyền
Hệ số tải = n/m
Số trung bình của các phần tử chứa trong các danh sách
Trường hợp xấu nhất: (n) + thời gian tính toán giá trị băm
Xảy ra khi tất cả n khóa đều được băm vào cùng 1 khe
Tốc độ trung bình:
Giả định Kỹ thuật băm đều
Mọi phần tử đã cho đều có khả năng như nhau để băm vào bất kỳ khe nào trong số m khe, và chúng không phụ thuộc vào nơi mà bất kỳ phần
tử nào khác đã được băm đến
Thời gian cần thiết cho trường hợp tìm kiếm thành công và không thành công là (1+ )
(Các định lý này đã được chứng minh)
Trang 35Định địa chỉ mở
đột bằng băm lại Băm lại là tính toán lại vị trí lưu trữ khi một xung đột xảy ra và lưu trữ
dữ liệu mới ở đó nếu vị trí rỗng.
Trang 36Định địa chỉ mở (t.t)
Ví dụ: phần tử a, b, c được lưu trữ trong các vị trí riêng biệt (xác định bởi chỉ số) theo giá trị băm
được tính toán Tiếp theo, phần tử d có giá trị băm
là 1, nhưng vị trí 1 đã bị chiếm bởi phần tử a Ví dụ nếu phương pháp băm lại là “giá trị băm gốc + 1”, thì vị trí tiếp theo được chỉ ra bởi chỉ số 2 Nhưng
vị trí đó cũng bị chiếm, đi tiếp tới chỉ số 3 Tìm
kiếm vị trí 4, vị trí đó trống Như kết quả, phần tử
d được lưu trữ ở vị trí có chỉ số 4 Nếu xảy ra
trường hợp không có chỗ trống tới cuối của bảng băm, trở lại vị trí đầu tiên của bảng và tìm kiếm
chỗ trống đầu tiên theo cách tương tự
Trang 37Định địa chỉ mở (t.t)
Chỉ số Bảng băm (1) Giá trị băm của phần tử a = 1 1 a Băm lại (2) Giá trị băm của phần tử b = 2 2 b Băm lại (3) Giá trị băm của phần tử c = 3 3 c Lưu trữ (4) Giá trị băm của phần tử d = 1 4 d
5
n
Trang 38 Tìm kiếm: xem xét hệ thống các khe của bảng
cho đến khi tìm thấy thành phần mong muốn
hoặc rõ ràng thành phần đó không nằm trong
bảng
Không có danh sách và thành phần nào được lưu trữ bên ngoài bảng
Hệ số tải 1
Trang 39Định địa chỉ mở (t.t)
kỹ thuật kết xích bên trong bảng băm
Bộ nhớ phụ trội được giải phóng nhờ không lưu trữ các biến trỏ sẽ cung cấp cho bảng băm một
số lượng khe lớn hơn với cùng lượng bộ nhớ, có khả năng ít xung đột và truy cập nhanh hơn
Trang 40Thăm dò (probe) (Định địa chỉ mở)
thăm dò bảng băm cho đến khi tìm ra một khe trống để đặt khóa
Dãy vị trí được thăm dò tùy thuộc vào khóa
Trang 41INSERT & SEARCH (Định địa chỉ mở)
Trang 42Thí dụ
h’(k)=k mod 5 h(k,i)=(h’(k) + i) mod 5
14
9
0 1 2 3 4
2 14
HASH-DELETE(T, 9) HASH-SEARCH(T, 14)
DELETED
Chúng ta đánh dấu khe bằng cách lưu trữ trong nó giá trị đặc biệt DELETED thay vì NIL
Trang 43DELETE (Định địa chỉ mở)
Không thể đơn giản đánh dấu khe là trống bằng
cách lưu trữ giá trị NIL trong nó
Không thể truy lục bất kỳ khóa k nào trong đợt chèn của nó mà ta đã thăm dò khe i và tìm thấy nó đầy
Giải pháp: đánh dấu khe bằng cách lưu trữ
trong nó giá trị đặc biệt DELETED
Sửa thủ tục HASH-INSERT: xem 1 khe DELETED như
là khe NIL
Với thủ tục HASH-SEARCH khi làm như vậy thì:
Các lần tìm kiếm thông tin không còn phụ thuộc vào
Trang 44CÁC PHƯƠNG PHÁP THĂM DÒ
Trang 45Phương Pháp Thăm Dò Tuyến Tính
h(k, i) = (h’(k) + i) mod m
i = 0,1,…,m-1
Khe đầu tiên được thăm dò là: T[h’(k)]
Khe kế tiếp được thăm dò là: T[h’(k) + 1]
Khe cuối được thăm dò là: T[h’(k) - 1]
Trang 46Phương Pháp Thăm Dò Tuyến Tính (tt)
Ví dụ: Xét tiến trình chèn các khóa 10,
22, 31, 4, 15, 28, 17, 88, 59 vào một bảng băm T có băm T có chiều dài m = 11, với hàm băm sơ cấp h’(k) = k mod m
Minh họa kết quả bằng kỹ thuật thăm
dò tuyến tính
Trang 47Phương Pháp Thăm Dò Tuyến Tính (tt)
0 1 2 3 4 5 6 7 8 9 10
Trang 48Phương Pháp Thăm Dò Tuyến Tính (tt)
Vị trí thăm dò ban đầu xác định nguyên cả dãy thăm dò, nên chỉ có m dãy thăm dò
được dùng.
Các đợt chạy của các khe đầy có khuynh
hướng kéo dài hơn, làm tăng thời gian tìm
kiếm trung bình.
Phương pháp thăm dò tuyến tính không phải
là một phép xấp xỉ thật tốt đối với kỹ thuật băm đều.
Nhận xét:
Trang 49Phương Pháp Thăm Dò Bậc Hai
Phương pháp thăm dò Bậc Hai (Quadratic Probing)
Trang 50Phương Pháp Thăm Dò Bậc Hai (tt)
Cho khóa k
Vị trí thăm dò ban đầu là: T[h’(k)]
Các vị trí thăm dò tiếp theo tùy thuộc vào cách bậc 2 trên số thăm dò i
Ví dụ: Xét tiến trình chèn các khóa 10, 22,
31, 4, 15, 28, 17, 88, 59 vào một bảng băm
có chiều dài m = 11, với hàm băm sơ cấp h’(k) = k mod m
h’(k) = k mod m Với c1 = 1 và c2 = 3 Minh
họa kết quả bằng kỹ thuật thăm dò bậc hai
Trang 51Phương Pháp Thăm Dò Bậc Hai (tt)
.88
.59 10
0 1 2 3 4 5 6 7 8 9
28
59
Trang 52Phương Pháp Thăm Dò Bậc Hai (tt)
Phương pháp này làm việc tốt hơn phương pháp thăm dò tuyến tính
Đợt thăm dò ban đầu ứng với mỗi khóa sẽ xác định nguyên cả dãy thăm do, do đó chỉ m dãy thăm dò riêng biệt được dùng
Nếu hai khóa có cùng vị trí thăm dò ban đầu, thì các dãy thăm dò của chúng là như nhau, bởi
h(k1, 0) = h(k2, 0) thì h(k1, i) = h(k2, i)
Nhận xét:
Trang 53Phương Pháp Băm Đôi
Phương pháp Băm Đôi (Double Hashing) sử dụng
Vị trí thăm dò ban đầu là: T[h 1 (k)]
Các vị trí thăm dò tiếp theo là độ dịch vị từ các vị trí trước đó theo một lượng h2(k), mod m.
Trang 54Phương Pháp Băm Đôi (tt)
Khác với trường hợp của thăm dò tuyến tính hoặc bậc hai, dãy thăm dò ở đây tùy thuộc
vào khóa k theo hai cách, bởi vị trí thăm dò
ban đầu và độ dịch vị, hoặc cả hai.
4, 15, 28, 17, 88, 59 vào một bảng băm có
chiều dài m = 11, với hàm băm sơ cấp h1(k) =
k mod m,
k mod m, h h2(k) = 1 + (k mod (m – 1)) .Minh
họa kết quả bằng kỹ thuật băm đôi.
Trang 55Phương Pháp Băm Đôi (tt)
0 1 2 3 4 5 6 7 8 9
Trang 56Phương Pháp Băm Đôi (tt)
Giá trị h2(k) phải là nguyên tố cùng nhau (relatively prime) đối với kích cỡ bảng
Một cách để bảo đảm điều kiện này đó là
cho m là một lũy thừa của 2 và thiết kế h2
sao cho nó luôn tạo ra một số lẻ
Nhận xét:
Trang 57Phương Pháp Băm Đôi (tt)
Cách khác đó là cho m là số nguyên tố và
thiết kế h2 sao cho nó luôn trả về một số
nguyên dương nhỏ hơn m
Kỹ thuật băm đôi là một cải thiện so với thăm dò tuyến tính hoặc bậc hai bởi có m2 dãy thăm dò
được dùng, từng cặp (h1(k), h2(k)) cho ra một dãy thăm dò riêng biệt, khi thay đổi khóa, vị trí thăm
dò ban đầu h1(k) và độ dịch vị h2(k) có thể thay đổi một cách độc lập Do đó khả năng thực hiện của kỹ thuật băm đôi rất gần với kỹ thuật băm
đều
Nhận xét (tt):
Trang 58Phân tích kỹ thuật định địa chỉ mở
Với kỹ thuật định địa chỉ mở, ta có tối đa một
thành phần mỗi khe, và như vậy n m, hàm ý 1
Ta mặc nhận kỹ thuật băm đều được dùng Trong lược đồ này, dãy thăm dò<h(k,0), h(k,1),…,
h(k,m-1)> của mỗi khóa k có khả năng như nhau
để hoán vị bất kỳ trên <0, 1,…, m -1>
Ta phân tích số lần thăm dò được kỳ vọng của kỹ thuật băm bằng phương pháp định địa chỉ mở
dưới giả thiết của kỹ thuật băm đều bằng một
cuộc phân tích số lần thăm dò thực hiện trong
một đợt tìm kiếm không thành công
Trang 59Các Định Lý và Hệ Quả
Định lý 11.6
Cho một bảng băm địa chỉ mở với hệ số tải = n/m < 1, số lần thăm dò được
kỳ vọng trong một đợt tìm kiếm không thành công tối đa là 1/ (1 - ), mặc nhận
kỹ thuật băm đều.
Tiến trình chèn một thành phần vào một bảng băm địa chỉ mở có hệ số tải yêu cầu tối đa 1/(1 - ) lần thăm dò theo trung bình, mặc nhận kỹ thuật băm đều.
Trang 61Kỹ thuật băm hoàn hảo ( Perfect Hashing)
Trang 62BĂM HOÀN HẢO?
được lưu trữ trong bảng, tập các khóa
không bao giờ thay đổi (không có các phép toán INSERT hay DELETE), chúng ta gọi một
xấu nhất truy cập bộ nhớ cần thiết để thực
Ví dụ: xem xét việc đặt tên các từ trong một ngôn ngữ lập trình, hoặc đặt tên các tập tin trên đĩa CD-ROM…
Trang 63Ý TƯỞNG BĂM HOÀN HẢO
Ý tưởng cơ bản để tạo ra lược đồ băm
hoàn hảo là đơn giản Chúng ta sử dụng lược đồ băm hai cấp với phổ băm ở mỗi cấp
Trang 64Ý TƯỞNG BĂM HOÀN HẢO
Thí dụ: Sử dụng băm hoàn hảo để lưu trữ tập K = {10,
22, 37, 40, 60, 70, 75}
Trang 65Ý TƯỞNG BĂM HOÀN HẢO
Hàm băm bên ngoài h(k) = ((ak + b) mod p) mod m ,
ở đây a = 3, b = 42, p = 101, và m = 9
Ví dụ, h(75) = 2, do đó khóa 75 băm vào khe 2 của bảng T Một bảng băm phụ Sj lưu trữ tất cả các khóa băm vào khe j Kích thước của bảng băm S j là m j , và hàm băm liên quan là hj(k) = ((ajk + bj) mod p) mod
m j Vì h2(75) = 1, khóa 75 là đuợc lưu trữ ở khe 1 của bảng băm phụ S2 Không có những xung đột bất kì ở bảng băm phụ, và vì thế thời gian tìm kiếm trong trường hợp xấu nhất là một hằng số.
Trang 66Kết luận
đột với dây chuyền và định địa chỉ mở
trong trường hợp xấu nhất
(Java Library) HashMap Class: Số khe 16 và hệ
số tải 0.75
(PHP Library) md5(), sh1() Functions…
(.Net Framework) Hashtable Class
Trang 67Cảm ơn Thầy cùng các bạn
đã lắng nghe!