Giáo trình Cấu trúc dữ liệu và giải thuật - Chương 12: Bảng và truy xuất thông tin

Trong chương 7 chúng ta đã thấy rằng, bằng cách so sánh khóa, trung bình

việc tìm kiếm trong n phần tử không thể có ít hơn lg n lần so sánh. Nhưng kết

quả này chỉ nói đến việc tìm kiếm bằng cách so sánh các khóa. Bằng một vài

phương pháp khác, chúng ta có thể tổ chức các dữ liệu sao cho vị trí của một phần

tử có thể được xác định nhanh hơn.

Thật vậy, chúng ta thường làm thế. Nếu chúng ta có 500 phần tử khác nhau có

các khóa từ 0 đến 499, thì chúng ta sẽ không bao giờ nghĩ đến việc tìm kiếm tuần

tự hoặc tìm kiếm nhị phân để xác định vị trí một phần tử. Đơn giản chúng ta chỉ

lưu các phần tử này trong một mảng kích thước là 500, và sử dụng chỉ số n để xác

định phần tử có khóa là n bằng cách tra cứu bình thường đối với một bảng.

Việc tra cứu trong bảng cũng như việc tìm kiếm có chung một mục đích, đó là

truy xuất thông tin. Chúng ta bắt đầu từ một khóa và mong muốn tìm một phần

tử chứa khóa này

Trong chương này chúng ta tìm hiểu cách hiện thực và truy xuất các bảng

trong vùng nhớ liên tục, bắt đầu từ các bảng hình chữ nhật thông thường, sau đó

đến các bảng có một số vị trí hạn chế như các bảng tam giác, bảng lồi lõm. Sau

đó chúng ta chuyển sang các vấn đề mang tính tổng quát hơn, với mục đích tìm

hiểu cách sử dụng các mảng truy xuất và các bảng băm để truy xuất thông tin.

 

pdf34 trang | Chuyên mục: Cấu Trúc Dữ Liệu & Giải Thuật | Chia sẻ: tuando | Lượt xem: 365 | Lượt tải: 0download
Tóm tắt nội dung Giáo trình Cấu trúc dữ liệu và giải thuật - Chương 12: Bảng và truy xuất thông tin, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
trúc dữ liệu và Giải thuật 333
danh sách), số phần tử được mong đợi trong danh sách đang được tìm kiếm là λ = 
n/t. Do đó số lần thử trung bình của một lần tìm kiếm không thành công là λ. 
Bây giờ chúng ta hãy giả sử là việc tìm kiếm sẽ thành sông. Từ phân tích của 
việc tìm tuần tự, chúng ta đã biết rằng số lần so sánh trung bình là 
2
1 (k+1), với 
k là chiều dài của danh sách chứa phần tử cần tìm. Nhưng chiều dài mong đợi của 
danh sách này không lớn hơn λ, và chúng ta biết trước là nó chứa ít nhất một 
phần tử (phần tử cần tìm). Ngoại trừ phần tử cần tìm, n –1 phần tử còn lại được 
phân phối như nhau trên tất cả t danh sách; vậy số phần tử mong đợi trên danh 
sách có chứa phần tử cần tìm là 1+(n-1)/t. Không kể các bảng có kích thước 
nhỏ, chúng ta lấy xấp xỉ (n-1)/t bằng n/t=λ. Vậy số lần thử trung bình cho 
một lần tìm kiếm thành công gần với 
2
1 (k+1) ≈ 
2
1 (1 + λ + 1) = 1 + 
2
1 λ. 
Tóm lại, việc truy xuất một bảng băm nối kết có hệ số tải λ trung bình cần 
đến 1 + 
2
1 λ lần thử cho một lần tìm kiếm thành công và λ lần thử cho một lần 
tìm kiếm không thành công. 
12.6.4. Phân tích phương pháp địa chỉ mở 
Để phân tích số lần thử trong bảng băm địa chỉ mở, trước hết chúng ta bỏ qua 
vấn đề gom tụ với giả thiết rằng không chỉ lần thử đầu tiên là ngẫu nhiên mà 
ngay cả sau khi xảy ra đụng độ, lần thử kế tiếp cũng ngẫu nhiên trên khắp các vị 
trí còn lại của bảng. Nói cách khác, giả sử rằng bảng băm có kích thước rất lớn 
sao cho mọi lần thử có thể được xem là độc lập nhau. Kết quả tính được như sau: 
Việc truy xuất từ bảng băm địa chỉ mở, với phép thử ngẫu nhiên và hệ số tải 
λ, có số lần thử trung bình xấp xỉ bằng 
 1 1 
 ⎯ ln ⎯⎯ 
 λ 1 - λ 
trong trường hợp tìm kiếm thành công và 1/(1-λ) trong trường hợp tìm kiếm 
không thành công. 
Trong trường hợp bảng băm địa chỉ mở với phép thử tuyến tính, lưu ý rằng giả 
thiết các lần thử độc lập nhau là không thể chấp nhận. Kết quả tính được như 
sau: 
Việc truy xuất bảng băm địa chỉ mở với phép thử tuyến tính và hệ số tải λ 
cần số lần thử trung bình xấp xỉ bằng 
Chương 12 – Bảng và truy xuất thông tin 
Giáo trình Cấu trúc dữ liệu và Giải thuật 334
 1 1 
 ⎯ 1 + ⎯⎯ 
 2 1 - λ 
trong trường hợp thành công và 
 1 1 
 ⎯ 1 + ⎯⎯⎯ 
 2 (1 - λ)2 
trong trường hợp không thành công. 
12.6.5. Các so sánh lý thuyết 
Hình 12.13 cho thấy các giá trị của các biểu thức trên với các trị khác nhau 
của hệ số tải λ. 
Chúng ta có thể thấy được một vài kết luận từ bảng này. Trước hết, rõ ràng là 
bảng băm nối kết cần ít lần thử hơn bảng băm địa chỉ mở. Mặt khác, việc duyệt 
các danh sách liên kết thường chậm hơn là truy xuất mảng, điều này làm giảm ưu 
điểm của bảng băm nối kết, nhất là trong những trường hợp mà việc so sánh 
khóa có thể được thực hiện rất nhanh. Phương pháp nối kết trở nên hợp lý khi 
các phần tử có kích thước lớn và thời gian cần để so sánh các khóa là nhiều. 
Ngoài ra, nó còn tỏ ra có lợi thế khi việc tìm kiếm không thành công thường xảy 
ra, do những lúc quá trình tìm kiếm gặp được một danh sách rỗng hoặc một danh 
sách thật ngắn và có thể kết thúc nhanh với rất ít lần so sánh khóa. 
Đối với việc tìm kiếm thành công trong bảng băm địa chỉ mở, phương pháp 
thử tuyến tính đơn giản không làm chậm quá trình tìm kiếm đi nhiều so với các 
phương pháp giải quyết đụng độ phức tạp khác, ít nhất là cho đến khi bảng gần 
Hình 12.13 – So sánh lý thuyết các phương pháp băm
Chương 12 – Bảng và truy xuất thông tin 
Giáo trình Cấu trúc dữ liệu và Giải thuật 335
như đầy. Tuy nhiên, đối với việc tìm kiếm không thành công, hiện tượng gom tụ 
nhanh chóng làm cho phép thử tuyến tính suy thoái thành quá trình tìm kiếm 
tuần tự. Vì thế, chúng ta có thể kết luận rằng nếu việc tìm kiếm thường thành 
công, và hệ số tải vừa phải, thì phép thử tuyến tính sẽ đáp ứng được; còn trong 
những trường hợp khác, nên sử dụng những phương pháp giải quyết đụng độ khác 
như phương pháp thử bậc hai chẳng hạn. 
12.6.6. Các so sánh thực nghiệm 
Một điều quan trọng cần nhớ là các tính toán trong hình 12.13 chỉ là các con 
số xấp xỉ, và trong thực tế không có gì là hoàn toàn ngẫu nhiên, do đó chúng ta 
luôn biết rằng sẽ có một vài điều khác nhau giữa các kết quả lý thuyết và việc 
tính toán thực sự. Vì vậy, để so sánh, hình 12.14 cho thấy kết quả của việc 
nghiên cứu bằng thực nghiệm với 900 khóa lấy ngẫu nhiên giữa 0 và 1. 
Nếu so sánh các con số trong hai bảng 12.15 và 12.16, chúng ta thấy rằng kết 
quả thực nghiệm trên bảng băm nối kết gần giống với kết quả lý thuyết. Các kết 
quả của phép thử bậc hai lại gần giống với kết quả lý thuyết của việc thử ngẫu 
nhiên; sự khác nhau có thể được giải thích dễ dàng là vì thử bậc hai chưa thật sự 
ngẫu nhiên. Đối với thử tuyến tính, các kết quả tương tự khi bảng còn tương đối 
trống, nhưng khi bảng gần như đầy thì các con số xấp xỉ được tính bằng lý thuyết 
khác nhiều so với thực nghiệm. Đó là hậu quả của các giả thiết đã được đơn giản 
hóa trong toán học. 
So sánh với các phương pháp truy xuất thông tin khác, điều quan trọng cần lưu 
ý về tất cả những con số này là chúng chỉ phụ thuộc vào hệ số tải, mà không phụ 
thuộc vào số phần tử thực sự có trong bảng. Việc truy xuất từ bảng băm có 20,000 
phần tử trong 40,000 vị trí có thể có của bảng, xét trung bình, không chậm hơn 
Hình 12.14 – So sánh thực nghiệm các phương pháp băm. 
Chương 12 – Bảng và truy xuất thông tin 
Giáo trình Cấu trúc dữ liệu và Giải thuật 336
việc tìm kiếm trong 20 phần tử trong 40 vị trí có thể có. Với việc tìm tuần tự, một 
danh sách có kích thước lớn gấp 1000 lần sẽ làm cho quá trình tìm lâu hơn 1000 
lần. Với tìm kiếm nhị phân, tỉ lệ này giảm xuống 10 (chính xác hơn là lg1000), 
nhưng thời gian tìm kiếm vẫn luôn phụ thuộc vào kích thước của danh sách, điều 
này không có ở bảng băm. 
Chúng ta có thể tổng kết những khảo sát về việc truy xuất từ n phần tử như 
sau: 
• Tìm tuần tự là θ(n). 
• Tìm nhị phân là θ(log n). 
• Truy xuất bảng băm là θ(1). 
Cuối cùng, chúng ta nhấn mạnh về tầm quan trọng của việc lựa chọn một hàm 
băm tốt, một hàm băm thực hiện tính toán nhanh và rải đều các khóa trong 
bảng. Nếu hàm băm không tốt thì băm sẽ suy thoái về tìm kiếm tuần tự. 
12.7. Kết luận: so sánh các phương pháp 
Trong chương này và chương 7, chúng ta đã xem xét bốn phương pháp khác 
nhau để truy xuất thông tin: 
• Tìm tuần tự, 
• Tìm nhị phân, 
• Tra cứu bảng, và 
• Băm. 
Nếu được hỏi rằng phương pháp nào là tốt nhất, trước hết chúng ta cần chọn 
ra các tiêu chí để đánh giá. Các tiêu chí gồm các yêu cầu của ứng dụng, và các mối 
quan tâm khác có ảnh hưởng lên sự chọn lựa cấu trúc dữ liệu, do hai phương pháp 
đầu chỉ có thể áp dụng với các danh sách còn hai phương pháp sau chỉ dành cho 
các bảng. Trong nhiều ứng dụng, chúng ta cũng được tự do trong việc chọn lựa 
giữa danh sách và bảng. 
Về mặt tốc độ cũng như tính thuận lợi, việc tra cứu theo thứ tự trong các bảng 
chắc chắn là tốt nhất, nhưng có nhiều ứng dụng mà điều này lại không áp dụng 
được do tập các khóa khá thưa thớt hoặc đối với chúng danh sách tỏ ra ưu thế 
hơn. Một điều không thích ứng nữa là khi việc thêm và loại phần tử xảy ra 
thường xuyên, trong vùng nhớ liên tục các tác vụ này đòi hỏi phải di chuyển một 
số lớn dữ liệu. 
Trong ba phương pháp còn lại, phương pháp nào là tốt nhất phụ thuộc vào tiêu 
chí khác như dạng của dữ liệu. 
Chương 12 – Bảng và truy xuất thông tin 
Giáo trình Cấu trúc dữ liệu và Giải thuật 337
Tìm tuần tự là phương pháp mềm dẻo nhất trong các phương pháp. Dữ liệu có 
thể được lưu theo bất kỳ thứ tự nào, trong hiện thực liên tục hoặc liên kết. Tìm 
nhị phân đòi hỏi nhiều hơn, các khóa phải lưu theo thứ tự và dữ liệu phải lưu 
trong vùng nhớ cho phép truy xuất ngẫu nhiên (vùng nhớ liên tục). Băm còn đòi 
hỏi nhiều hơn nữa, tuy thứ tự khác thường của các khóa vẫn đáp ứng được việc 
truy xuất từ bảng băm, nhưng nói chung nó không có lợi cho bất kỳ một mục đích 
nào khác. Nếu như dữ liệu cần phải luôn sẵn sàng cho một sự khảo sát thì một 
thứ tự nào đó là cần thiết, và như vậy bảng băm không đáp ứng. 
Cuối cùng là vấn đề liên quan đến việc tìm kiếm không thành công. Tìm tuần 
tự và băm khi không thành công thì xem như không có kết quả gì. Trong khi đó, 
nếu thất bại thì tìm nhị phân sẽ cho biết dữ liệu có khóa gần với khóa cần tìm, 
và như vậy nó có thể cung cấp thông tin hữu ích. Trong chương 9 và 10 chúng ta 
đã nghiên cứu các phương pháp lưu trữ dữ liệu dựa trên cơ sở cây, có kết hợp tính 
hiệu quả của tìm nhị phân với sự mềm dẻo của các cấu trúc liên kết. 
Chương 12 – Bảng và truy xuất thông tin 
Giáo trình Cấu trúc dữ liệu và Giải thuật 338

File đính kèm:

  • pdfgiao_trinh_cau_truc_du_lieu_va_giai_thuat_chuong_12_bang_va.pdf