Tải bản đầy đủ (.ppt) (67 trang)

Tiểu luận phân tích và thiết kế thuật toán BẢNG BĂM HASH TABLES

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 (817.93 KB, 67 trang )

BẢNG BĂM
(HASH TABLES)
Nhóm 1:
Trần Ngự Bình
Tô Thanh Hải
Trần Văn Long
Đoàn Thị Thu Minh
Vũ Đức Tuấn
Mục tiêu

Hiểu được cơ sở lý thuyết về cấu trúc
dữ liệu Bảng băm

Áp dụng cho các bài toán hỗ trợ các
phép toán chính trên từ điển: Chèn,
Xóa, Tìm kiếm
Nội dung

Bảng địa chỉ trực tiếp

Bảng băm

Hàm băm

Giải quyết xung đột: Dây chuyền & Định địa chỉ
mở

Kỹ thuật băm hoàn hảo
Mở đầu: Một số khái niệm

Tập hợp động


(dynamic sets): tập hợp
thường xuyên thay đổi

Tập hợp động hỗ trợ
các phép toán chèn,
tìm kiếm, xóa gọi là
một từ điển

Bảng băm là một cấu
trúc dữ liệu phù hợp
với các từ điển
Từ điển StarDict
Bảng địa chỉ trực tiếp
(direct-address tables)

Bài toán:
9  0  7 
1  4  6 
2  3 
5  8 
U
K
- |U| không quá lớn
- Không có 2 phần
tử trùng khóa
Hãy biểu diễn tập
hợp động K vừa
nêu?
* Nhận xét: Có thể
sử dụng mảng hay

bảng địa chỉ trực
tiếp
Bảng địa chỉ trực tiếp (2)
0
1
2
3
4
5
6
7
8
9
9  0  7 
1  4  6 
2  3 
5 
8 
U
K
T[0 9]
Khe, vị trí
Khe k trỏ đến phần tử
trong tập hợp có khóa k
T[k] = NIL khi
tập hợp không
có thành phần
nào có khóa k
Bảng địa chỉ trực tiếp (3)
0

1
2
3
4
5
6
7
8
9
9  0  7 
1  4  6 
2  3 
5 
8 
U
K

SEARCH(T, k)
return T[k]

INSERT(T, x)
T[key[x]] x ←

DELETE(T, x)
T[key[x]] NIL←

Độ phức tạp của mỗi phép toán: O(1)
Bả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

         
           
            
            
             
              
              

              
             
2  3 
5 
8 
U
K
- Tốt với |U| không
quá lớn
- |U| = 10.000.000.000?

Lãng phí
bộ nhớ
Nội dung

Bảng địa chỉ trực tiếp

Bảng băm

Hàm băm

Giải quyết xung đột: Dây chuyền & Định địa chỉ
mở

Kỹ thuật băm hoàn hảo
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 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
Bả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
Θ(|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
Nội dung

Bảng địa chỉ trực tiếp

Bảng băm

Hàm băm

Giải quyết xung đột: Dây chuyền & Định địa chỉ
mở


Kỹ thuật băm hoàn hảo
Hàm băm

Điều gì tạo nên một hàm băm tốt

Chuyển các khóa dưới dạng các số
tự nhiên

Phương pháp chia

Phương pháp nhân

Phổ băm
Thế nào là hàm băm tốt

Tính đơn giản

Giảm thiểu các khóa được băm cùng
khe

Độ phức tạp O(1)
Đ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.


j = 0, 1, …, m-1 (1)

=
=
jkhk
m
)(:
1
Đ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)
Chuyể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.
Phương pháp chia

Ánh xạ một khóa k vào một trong số m khe
bằng cách lấy số dư của k chia cho m:
h(k) = k mod m.

Phương pháp này có
độ phức tạp O(1)
do
nó chỉ yêu cầu 1 phép chia đơn lẻ

Ví dụ, nếu bảng băm có kích cỡ m = 12 và
khóa là k = 100, thì h(k) = 4. Bởi vì nó yêu
cầu một phép chia đơn lẻ, kỹ thuật băm bằng
phép chia chạy khá nhanh.
Ví dụ của phương pháp chia

Giả sử cần chèn các khóa k có giá trị
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
Nhận xét đối với phương pháp

chia

Các giá trị cần tránh của m:

m = 2
p
. Với số nguyên p

m = 10
p
. Với số nguyên p
Cả 2 cách chọn trên giá trị h(k)
không phụ thuộc
đầy đủ
vào khóa k.

Các giá trị tốt cho m là các số
nguyên tố
không quá
sát với các lũy thừa chính xác của 2.
Phương pháp nhân

Trong
phương pháp nhân
, các hàm được thiết lập
thông qua hai bước.

Nhân khóa k với một hằng A trong miền giá trị
0<A<1 và trích phần phân số của kA.


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)⌊ ⌋
Trong đó “kA mod 1” có nghĩa là phần phân số của
kA, tức là, kA – kA .⌊ ⌋

Phương pháp này có
độ phức tạp O(1)
Nhận xét đối với phương pháp
nhân

Giá trị của m là không tới hạn. Ta
thường chọn giá trị m là một lũy thừa
của 2 (m = 2
p
với một số nguyên p).

Chọn lựa tối giá trị của A ưu tùy thuộc
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…
Ví 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)⌊ ⌋
Với A≈ (√5 -1)/2 = 0.6180339887… (theo đề xuất của
Knuth)

h(k) = ⌊10000*(1234568*0.6180339887 mod 1) ⌋
h(k) = ⌊ 10000 * 0.0041089472 ⌋ = 41
Kỹ 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.

×