Ch−ơng 1 Sắp xếp ngoạị
2.2. Các ph−ơng phỏp trỏnh đụng độ
Khi cú tập khúa K, ta phải xõy dựng bảng băm, hàm băm sao cho trỏnh đ−ỵc hiƯn t−ỵng đụng độ. Sau đõy là một số ph−ơng phỏp thờng dùng:
2.2.1. Dùng danh sỏch liờn kết
Cũng giống nh− trong phần cấu trỳc danh sỏch chỳng ta đà núi đến, danh sỏch liờn kết là một tập hợp cỏc bản ghi đợc sắp tuyến tớnh; mỗi bản ghi cú 2 phần: phần chứa thụng tin và phần chứa địa chỉ của bản ghi tiếp the Thụng th−ờng bản ghi cuối cựng chỉ đến bản ghi rỗng tức là NULL.
ạ Ph−ơng phỏp liờn kết ngoài
Cỏc thành phần của H chứa địa chỉ đầu của cỏc danh sỏch liờn kết. Cỏc nỳt bị xung đột tại vị trí i sẽ đợc kết nối thành danh sỏch liờn kết do con trỏ tại i trỏ tớ
Khi thêm một nút mới vào bảng băm, hàm băm h(k) sẽ xỏc định vị trí i trong khoảng từ 0 đến m-1, sau đó nỳt này sẽ đợc thờm vào danh sỏch Thớ dụ nếu hàm băm là hàm lấy phần d− khi chia k cho m thỡ nỳt i sẽ trỏ đến danh sỏch liờn kết chứa cỏc bản ghi cú khúa k chia cho m d−
Hỡnh 2.1 sau đõy minh họa bảng băm với hàm băm chia d và m = 3
Hỡnh 2.1 Bảng băm liờn kết ngoà
ở đõy cỏc ụ 0 đ−ợc hiểu là địa chỉ nỳt đầu của danh sỏch cỏc khúa đồng d với 0 mod 3, ô 1 đ−ỵc hiểu là địa chỉ nỳt đầu của danh sỏch cỏc khóa đồng d− với 1 mod 3.
b. Ph−ơng phỏp liờn kết trong
Ta vẫn dựng danh sỏch liờn kết đĨ tránh đơng độ, nh−ng ta chỉ dùng các nút trong bảng H mà thụ Mỗi nỳt của H bõy giờ có 2 tr−ờng: tr−ờng thứ nhất Pkey chỉ đến bản ghi chứa dữ liệu, còn tr−ờng thứ 2 là tr−ờng next chỉ đến nút tiếp theo trong danh sách các nút có giỏ trị khúa bị đụng độ. Khi khởi động các con trỏ Pkey chỉ tới NULL, các tr−ờng next = -1 để ỏm chỉ là khụng cú nỳt nào liờn kết với nỳt đú. Khi thờm một nỳt cú khúa k tr−ớc hết ta tính hàm i = h(k). Nếu vị trí i ch−a có nút, nghĩa là tr−ờng Pkey chỉ đến NULL thỡ ta đặt nỳt mới vào vị trớ Nếu nỳt đú đà bị chiếm thỡ ta phân biƯt 2 tr−ờng hỵp:
Nếu giỏ trị khúa trong bản ghi do H[i].Pkey chỉ tới (ví dơ khóa này là x) cùng họ với k (tức là h(x)=h(k)) ta lần theo tr−ờng next để đi tới bản ghi cuối cựng trong danh sỏch con; sau đú ta tỡm một nỳt trống cuối bảng để đặt nỳt mới vào đú. Đặt con trỏ next của phần tử cuối cùng tr−ớc đó trỏ tới nỳt này và đặt con trỏ next của nỳt này bằng -1 và kết thúc.
b. Nếu giỏ trị khúa trong bản ghi do H[i].Pkey chỉ tới không cùng họ với k (tức là h(x)≠h(k)) ta tỡm một nỳt trống cuối bảng để đặt nỳt mới vào đú. Đặt con trỏ next của nỳt này bằng -1 và kết thức.
Khi cần tỡm kiếm khúa x trờn bảng băm, trớc hết ta đặt i = h(x). Nếu tr−ờng Pkey trong vị trớ này chỉ đến nỳt cú khúa = x việc tỡm kiếm thành cụng và kết thỳc; Cũn nếu khụng nh− vậy thỡ ta xem khúa do ụ này trỏ tới có cùng họ với x khụng. Nếu cú thỡ ta lần theo tr−ờng next , cho đến khi gặp khúa x thỡ việc tỡm kiếm thành cụng kết thỳc; nếu gặp next = -1 mà vẫn khụng tỡm
0 1 2 6 15 18 7 5 23
http://www.ebook.edụvn
Cấu trúc dữ liƯu 2 – Chơng 2. Bảng băm
31 thấy thỡ việc tỡm kiếm khụng thành cụng. Nếu ô thứ i không cùng họ với x thỡ ta bắt đầu xuất phỏt từ đỏy của bảng, tức là vị trớ max-1 đi dần lờn phớa trờn để tỡm và dừng lại khi gặp ụ đầu tiờn cũn trống. Kết quả tỡm kiếm phụ thuộc vào việc tỡm thấy x hay khụng.
Hỡnh sau biểu diễn cỏch thờm cỏc nỳt 35, 15,45 vào bảng chia d− có m=10. i pkey next 0 -1 1 -1 2 -1 3 -1 4 -1 5 35 9 6 -1 7 -1 8 45 -1 9 15 8
Hỡnh 2.2 Bảng băm liờn kết trong.
ở đõy ta ghi giỏ trị khúa thay cho địa chỉ của cỏc nỳt thụng tin chứa khóạ Nh− vậy số 35 sẽ đợc hiểu là địa chỉ của khóa 35.
2.2.2. Dùng danh sách kỊ ngoài
Phơng phỏp này về cơ bản giống với phơng phỏp liờn kết ngoà Ta cịng dùng một mảng H, nh−ng cỏc thành phần của H bõy giờ là cỏc danh sỏch kề cài đặt bằng mảng động. Cỏc danh sỏch con này tuy cú cỡ cố định nh−ng ta có thể dùng tỏc vụ grow để tăng lờn khi cần thiết. Nh− vậy khi khai báo, để khỏi lÃng phớ bộ nhớ ta chỉ cần đặt cỡ của danh sỏch khỏ nhỏ; khi cần thiết tỏc vụ grow sẽ tự động tăng cỡ của danh sỏch lờn.
Cú thể mụ tả bảng băm dựng danh sách kỊ với kích th−ớc và cỏc khúa nh− ở hình 2.1. nh− sau:
Hình 2.3 Bảng băm dùng danh sách kỊ
ngoàị
Khi dựng danh sỏch liờn kết ngoài hoặc danh sỏch kề ngoài ta thấy rằng nếu cỡ của bảng băm là M thỡ ta cần M danh sỏch. Kinh nghiệm cho thấy rằng nờn chọn M đủ lớn sao cho độ dài cỏc danh sỏch chỉ khoảng 10 phần tử. Nh− vậy M bằng khoảng 1/10 số khóa sư dơng.
2.2.3. Phơng phỏp dũ tuyến tính (linear probing method)
Bản chất cđa ph−ơng phỏp này là nờu ra quy tắc để dựng cỏc nỳt cũn trống trong bảng để chứa cỏc nỳt bị đụng độ. Với một khóa k bất kỳ ta tớnh hàm băm i = h(k) và thực hiện các b−ớc sau: - Nếu nỳt i trống thỡ thờm nỳt mới tại địa chỉ nà
- Nếu bị xung đột thỡ dựng hàm băm lại h1(k) = (h(k)+1)%m - Nếu vẫn bị xung đột thỡ dựng hàm băm lại h2(k) = (h(k)+2)%m
0 1 2 6 15 18 7 5 23
Cứ nh− vậy đến b−ớc thứ j ta dựng hàm băm lại hj(k) = (h(k)+j) % m cho đến khi tỡm đ−ỵc vị trí trống. L−u ý là nếu dũ đến cuối bảng thỡ ta lại quay lại từ đầu (bản thõn hàm hj(k) đã bao hàm điều này).
Nhận xột bảng băm dựng phơng phỏp dũ tuyến tớnh:
- Khi tìm một nút có khóa k, tr−ớc hết ta tính i = h(k) để xỏc định vị trớ xuất phỏt trong bảng băm. Sau đú ta xột từng nỳt trong khối đặc chứa cỏc nỳt xuất phỏt từ i, nút nào có khóa trùng với k là nỳt cần tỡm.
- Tỏc vụ xúa nỳt khỏ phức tạp.
- Bảng băm cài đặt kiểu này khi chỉ cú cỏc nỳt th−a thớt trên bảng. Tr−ờng hợp xấu nhất là bảng băm gần đầy, lỳc này hỡnh thành một khối đặc cú n nỳt nờn tốc độ truy xuất có bậc O(n).
2.2.4. Phơng phỏp dũ bậc hai (quadratic probing method)
Bảng băm dũ tuyến tớnh bị hạn chế là cỏc nỳt rải khụng đề Ngời ta dựng hàm băm lại bậc 2 với hy vọng rải cỏc nỳt đều hơn. Cỏch thực hiện nh− sau: Khi cần thờm nỳt cú khúa k vào bảng, tr−ớc hết ta tính i = h(k), là một giỏ trị trong khoảng từ 0 đến m-1
- Nếu vị trí i cũn trống thỡ đặt nỳt cần thờm vào vị trí ị
- Nếu bị xung đột thỡ lần lợt tỡm tỡm ở cỏc vị trí i+12 , i+22 , i+32 ,..., i+j2 với l−u ý là đến cuối bảng ta trở về dũ từ đầu bảng, thực chất là dũ ở vị trớ (i+j2) % m. Khi thấy vị trớ trống đầu tiờn thỡ ta đặt nỳt mới vào vị trớ đú. Khi tìm một khóa thì tr−ớc hết ta tìm ở vị trớ i = h(k), nếu khụng thấy thỡ tỡm ở cỏc vị trớ hj(k) = (h(k)+j) % m , j=1,2,... Khi rơi vào vị trớ trống thỡ cú nghĩa là khụng tìm thấỵ
Chú ý: Bảng băm với phơng phỏp dũ bậc 2 nờn chọn m là số nguyờn tố.