Tải bản đầy đủ (.pdf) (21 trang)

Hàm Băm – Bảng Băm

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 (89.43 KB, 21 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>Bài 14: Hàm b</b>

<b>ă</b>

<b>m</b>



<b>N</b>

<b>ộ</b>

<b>i dung:</b>



<b>14.1</b>

<b>. Bài toán.</b>



<b>14.2</b>

<b>. Hàm b</b>

<b>ă</b>

<b>m.</b>



<b>14.3</b>

<b>. Gi</b>

<b>ả</b>

<b>i quy</b>

<b>ế</b>

<b>t xung</b>

<b>độ</b>

<b>t.</b>



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>14.1. Bài toán (1/9)</b>



Gi

s

c

n l

ư

u tr

m

t s

b

n ghi và th

c hi

n các thao tác:



<b>Thêm</b>: thêm một bản ghi


<b>Xóa</b>: xóa một bản ghi


<b>Tìm kiếm</b>: tìm kiếm một bản ghi


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<b>14.1. Bài toán (2/9) – S</b>

<b>ử</b>

<b>d</b>

<b>ụ</b>

<b>ng m</b>

<b>ả</b>

<b>ng</b>



<b>S</b>

<b>ử</b>

<b> d</b>

<b>ụ</b>

<b>ng m</b>

<b>ả</b>

<b>ng khơng </b>

<b>đượ</b>

<b>c s</b>

<b>ắ</b>

<b>p x</b>

<b>ế</b>

<b>p</b>


<b>Thêm: thêm vào cu</b>ối mảng->O(1)


<b>Xóa: m</b>ất nhiều thời gian tìm vị trí cần xóa và dồn mảng->O(n)


<b>Tìm kiếm: tìm ki</b>ếm tuần tự->O(n)


<b>S</b>

<b>ử</b>

<b> d</b>

<b>ụ</b>

<b>ng m</b>

<b>ả</b>

<b>ng </b>

<b>đượ</b>

<b>c s</b>

<b>ắ</b>

<b>p x</b>

<b>ế</b>

<b>p</b>




<b>Thêm: ph</b>ải tìm vị trí thêm vào->O(n)


<b>Xóa: m</b>ất nhiều thời gian tìm vị trí cần xóa và dồn mảng->O(n)


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>14.1. Bài toán (3/9) – S</b>

<b>ử</b>

<b>d</b>

<b>ụ</b>

<b>ng DSLK</b>


<b>Thêm: thêm vào v</b>

trí b

t k

nhanh->O(1)



<b>Xóa: nhanh trong t</b>

ch

c các nút, nh

ư

ng ch

m trong tìm ki

ế

m


nút c

n khóa->O(n)



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<b>14.1. Bài tốn (4/9) – dùng nh</b>

<b>ư</b>

<b>b</b>

<b>ả</b>

<b>ng</b>



Gi

s

c

n l

ư

u tr

1000 b

n ghi v

sinh viên và tìm ki

ế

m


chúng theo ID



<b>ID</b> <b>Họ và tên</b> <b>Điểm</b>


0012345 Nguyễn Văn A 10
0033333 Nguyễn Văn B 9
0056789 Nguyễn Văn C 8


… … …


9801010 Nguyễn Thị A 7
9802020 Nguyễn Thị B 8


… … …


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<b>14.1. Bài toán (5/9) – dùng nh</b>

<b>ư</b>

<b>b</b>

<b>ả</b>

<b>ng</b>




Dùng một mảng rất lớn để lưu trữ (index 0..9999999). Chỉ số của mảng bằng với
chỉ số id của sinh viên, i.e. ví dụ sinh viên với studid 0012345 thì được lưu trữ tại
A[12345]


<b>Tên</b> <b>Điểm</b>


… … …


12345 Nguyễn Văn A 10


… … …


33333 Nguyễn Văn B 9


… … …


56789 Nguyễn Văn C 8


… … …


9801010 Nguyễn Thị A 7


… … …


9802020 Nguyễn Thị B 8


… … …


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<b>14.1. Bài toán (6/9) – dùng nh</b>

<b>ư</b>

<b>b</b>

<b>ả</b>

<b>ng</b>




<b>M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b> nh</b>

<b>ậ</b>

<b>n xét:</b>



<i><b>Đ</b></i>

<i><b>ánh giá các thao tác</b></i>


<b>Thêm</b>: rấ<i>t nhanh O(1)</i>


<b>Xóa</b>: rấ<i>t nhanh O(1)</i>


<b>Tìm kiếm</b>: rấ<i>t nhanh O(1)</i>


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>14.1. Bài toán (7/9) – dùng hàm b</b>

<b>ă</b>

<b>m</b>



function Hash(key: KeyType): integer;


Giả sử có 1 hàm băm lý tưởng. Nó
ánh xạ khóa (ID) của 1000 bản ghi
vào các giá trị nguyên 0..999, hai
khóa khác nhau cho hai số nguyên
khác nhau.


H(‘0012345’) = 134
H(‘0033333’) = 67
H(‘0056789’) = 764


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

<b>14.1. Bài toán (8/9) – dùng hàm b</b>

<b>ă</b>

<b>m</b>



• Để lưu trữ một bản ghi,
tính Hash(ID) cho bản
ghi và lưu trữ nó tại vị trí
Hash(ID) của mảng.



•Để tìm kiếm một sinh
viên, chỉ cần truy cập đến
vị trí Hash(target ID).


0 … …


… … …


3 Trần Văn B 10


… … …


67 Nguyễn Văn B 9


… … …


134 Nguyễn Văn A 10


… … …


764 Nguyễn Văn C 8


… … …


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

<b>14.1. Bài toán (9/9) – dùng hàm b</b>

<b>ă</b>

<b>m</b>


<b>V</b>

<b>ớ</b>

<b>i hàm b</b>

<b>ă</b>

<b>m lý t</b>

<b>ưở</b>

<b>ng</b>



<b>Thêm</b>: O(1)



<b>Xóa</b>: O(1)


<b>Tìm kiếm</b>: O(1)


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (1/6)</b>



<b>Khái niệm:</b>


Hàm băm là giải thuật nhằm sinh ra các giá trị băm tương ứng với
mỗi khối dữ liệu.


Giá trị băm đóng vai gần như một khóa để phân biệt các khối dữ


liệu.


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (2/6)</b>



<b>u c</b>

<b>ầ</b>

<b>u </b>

<b>đố</b>

<b>i v</b>

<b>ớ</b>

<b>i hàm b</b>

<b>ă</b>

<b>m:</b>


Tính tốn nhanh.


Các khóa được phân bố đều trong bảng.
Ít xảy ra đụng độ.


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (3/6)</b>



<b>M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b> l</b>

<b>ĩ</b>

<b>nh v</b>

<b>ự</b>

<b>c s</b>

<b>ử</b>

<b> d</b>

<b>ụ</b>

<b>ng hàm b</b>

<b>ă</b>

<b>m:</b>


Mật mã học


Bảng băm



</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (4/6) – M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b>hàm b</b>

<b>ă</b>

<b>m</b>


<b>Hàm c</b>

<b>ắ</b>

<b>t b</b>

<b>ỏ</b>

<b>:</b>



Cho khóa là số nguyên, bỏ bớt một phần nào đó của khóa.


Ví dụ: khóa là một số ngun có 6 chữ số x=842615. Ta có thể


quy ước là bỏ bớt chẳng hạn các chữ số hàng lẻ (1,3,5…), số còn
lại sẽ là 821. Vậy H(x) = H(842615) = 821.


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (5/6) – M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b>hàm b</b>

<b>ă</b>

<b>m</b>


<b>Hàm ph</b>

<b>ầ</b>

<b>n d</b>

<b>ư</b>

<b>:</b>



Khóa có giá trị nguyên và bảng băm B có m phần tử, ta lấy phần
dư của phép chia x/m làm giá trị hàm băm. Để đảm bảo tính chất
thứ hai của hàm băm nên chọn m là số nguyên tố.


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

<b>14.2. Hàm b</b>

<b>ă</b>

<b>m (6/6) – M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b>hàm b</b>

<b>ă</b>

<b>m</b>


<b>Hàm g</b>

<b>ấ</b>

<b>p:</b>



Cho khóa là số nguyên, chia số nguyên đó thành một số đoạn tùy
chọn, sau đó kết hợp các phần đó lại theo một quy ước nào đó.
Ví dụ: Số các hàng lẻ: 465 và số các hàng chẵn: 821, vậy


H(x)=465+821=1286.


<i><b>Nh</b><b>ậ</b><b>n xét: Tính ch</b></i>ất thứ nhất của hàm băm được thỏa mãn. Do
các chữ số của khóa đều có sử dụng, nên tính chất thứ hai có thể


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

<b>14.3. Xung</b>

<b>độ</b>

<b>t và gi</b>

<b>ả</b>

<b>i quy</b>

<b>ế</b>

<b>t xung</b>

<b>độ</b>

<b>t (1/4)</b>



Trong hầu hết các trường hợp đều không tránh được xung


đột



H(‘0012345’) = 134
H(‘0033333’) = 67
H(‘0056789’) = 764


H(‘9903030’) = <b>3</b>


H(‘9908080’) = <b>3</b>


• Xử lý thế nào khi hai khóa khác nhau lại ánh xạ đến một


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

<b>14.3. Xung</b>

<b>độ</b>

<b>t và gi</b>

<b>ả</b>

<b>i quy</b>

<b>ế</b>

<b>t xung</b>

<b>độ</b>

<b>t (2/4)</b>



<i><b>Ph</b></i>

<i><b>ươ</b></i>

<i><b>ng pháp dị tuy</b></i>

<i><b>ế</b></i>

<i><b>n tính</b></i>

: ý t

ưở

ng là dị tìm v

trí tr

ng ti

ế

p



theo r

i chèn ph

n t

b

đụ

ng

độ

vào

đ

ó. Khi m

ng

đầ

y thì


resize l

i m

ng.



<i><b>Ph</b></i>

<i><b>ươ</b></i>

<i><b>ng pháp dây chuy</b></i>

<i><b>ề</b></i>

<i><b>n</b></i>

: Thay vì c

g

ng tìm trong danh



sách m

t v

trí cịn tr

ng k

ế

ti

ế

p, ph

ươ

ng pháp dây chuy

n liên


k

ế

t các danh sách có các khóa khác nhau nh

ư

ng có cùng giá tr



</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

<b>14.3. Xung</b>

<b>độ</b>

<b>t và gi</b>

<b>ả</b>

<b>i quy</b>

<b>ế</b>

<b>t xung</b>

<b>độ</b>

<b>t (3/4)</b>


89
18
89

49
18
89
49
58
18
89
49
58
9
18
89


Insert: 89, 18, 49, 58, 9 to table size=10, hash function is: %tablesize


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

<i><b>Ph</b></i>

<i><b>ươ</b></i>

<i><b>ng pháp dây chuy</b></i>

<i><b>ề</b></i>

<i><b>n:</b></i>



<b>14.3. Xung</b>

<b>độ</b>

<b>t và gi</b>

<b>ả</b>

<b>i quy</b>

<b>ế</b>

<b>t xung</b>

<b>độ</b>

<b>t (4/4)</b>



2
4
1
0
3
null
null
null
5
null
:



HASHMAX ID: 9903030


Tên: Trần Văn A


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

<b>14.4. M</b>

<b>ộ</b>

<b>t s</b>

<b>ố</b>

<b>ví d</b>

<b>ụ</b>

<b>s</b>

<b>ử</b>

<b>d</b>

<b>ụ</b>

<b>ng hàm b</b>

<b>ă</b>

<b>m</b>



</div>

<!--links-->

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×