1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bảng băm cấu trúc dữ liệu và giải thuật INT2210 24

21 9 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 164,66 KB

Nội dung

Bảng băm Cấu trúc liệu giải thuật – INT2210 24 Lê Duy Quang – 21020380 Trần Hồng Quân – 21020555 Nguyễn Đức Tân – 21020392 1/11/2022 Mục lục I – Khái niệm II – Cấu tạo Hàm băm a﴿ Hàm băm sử dụng phép chia lấy dư b﴿ Hàm băm sử dụng phương pháp nhân c﴿ Hàm băm đa thức d﴿ Hàm băm phổ quát Bảng băm 2 2 3 III – Đặc điểm tính chất IV – Ví dụ hoạt động V – Ví dụ cài đặt sử dụng Cài đặt Tìm phần tử xuất nhiều danh sách Kiểm tra hai danh sách có chứa phần tử không 10 VI – Sử dụng bảng băm số ngơn ngữ lập trình C++ Java Python JavaScript 12 12 12 13 13 VII – So sánh với số cấu trúc liệu khác Mảng danh sách Cây tìm kiếm nhị phân cân Danh sách nhảy cóc ﴾skip list﴿ Trie Kết luận 14 14 14 15 16 17 VIII – Câu hỏi ôn tập 18 I – Khái niệm Trong nhiều toán thực tế, thường nảy sinh nhu cầu gán giá trị nguồn ﴾khóa﴿ tương ứng với giá trị đích ﴾giá trị﴿ Cách đơn giản sử dụng mảng để lưu trữ cặp khóa – giá trị, rõ ràng dùng cách cho số lượng lớn giá trị phải truy cập vào phần tử mảng Có nhiều giải pháp để làm tăng hiệu tìm kiếm khóa theo giá trị tương ứng, số sử dụng cấu trúc liệu bảng băm player map {"steamid":76561198979175580,"name":"MasterOfOneHitKills… {"state":"planted","position":"-1634.723, 592.346, 11490… round grenades bomb {"mode":"competitive","name":"de_vertigo","phase":"bomb"… {"657":{"owner":76561197994129426,"position":"-1926.875,… {"phase":"bomb","bomb":"planted"} Hàm băm Hình Minh họa bảng băm Bảng băm cấu trúc liệu dạng từ điển: phần tử cặp khóa – giá trị cách truy vấn sử dụng khóa lấy giá trị tương ứng Kĩ thuật chủ đạo cấu trúc liệu kĩ thuật băm ﴾hashing﴿: giá trị khóa sử dụng làm tham số đầu vào cho hàm tính tốn gọi hàm băm, kết hàm số tự nhiên nằm khoảng cụ thể gọi giá trị băm Giá trị băm sử dụng để truy cập bảng băm tìm giá trị đích tương ứng, thường bảng băm mảng với giá trị băm sử dụng làm số truy cập vào mảng Do đó, tính tốn giá trị băm việc truy cập giá trị đích trở nên dễ dàng II – Cấu tạo Hàm băm Một hàm băm h(k) nhận vào giá trị khóa k cho số tự nhiên nằm khoảng [0; m) Giới hạn m cho phép biểu diễn giá trị băm với độ dài cố định thường kích cỡ bảng băm Một hàm băm coi tốt phải thỏa mãn điều kiện sau: Tốc độ tính tốn cao Các giá trị băm phân bố miền giá trị Xử lí loại giá trị khóa khác Điều kiện cần thiết hàm băm thực cho thao tác bảng băm Điều kiện cần thiết để giảm thiểu trường hợp có nhiều giá trị khóa sinh chung giá trị băm, gây đụng độ Điều kiện cho phép dễ dàng sử dụng bảng băm cho nhiều kiểu liệu khác Dưới số ví dụ hàm sử dụng làm hàm băm cho bảng băm a﴿ Hàm băm sử dụng phép chia lấy dư Đây hàm băm đơn giản nhất, có dạng h(k) = k mod m, với k số nguyên dương Nếu chọn m = bd với b d số nguyên dương h(k) d chữ số cuối k biểu diễn số b, tức khơng phụ thuộc hồn tồn vào tất nội dung k, cần phải tránh trường hợp Tốt nên chọn m cho h(k) phụ thuộc đầy đủ vào khóa k, thơng thường m chọn số nguyên tố b﴿ Hàm băm sử dụng phương pháp nhân Hàm băm có dạng h(k) = ⌊m frac(kA)⌋, với√0 < A < k số nguyên 5−1 ; giá trị coi tốt dương Một giá trị coi tốt cho A cho m 2p với p số nguyên dương c﴿ Hàm băm đa thức Hàm băm áp dụng cho khóa có độ dài khác Hàm băm có dạng: h(k) = n−1 ∑ (ki pi ) mod m i=0 với n độ dài khóa, ki giá trị phần tử có vị trí i khóa k, p số ngun dương Thơng thường, p số nguyên tố nhỏ không nhỏ số khóa, tức số giá trị có phần tử khóa; ví dụ phần tử 26 chữ thường bảng chữ tiếng Anh p = 31, 52 chữ hoa thường bảng chữ tiếng Anh p = 53 Đối với m, giá trị 264 chọn phép tốn làm tràn kiểu số ngun khơng dấu 64 bit hoạt động theo nguyên tắc chia lấy dư cho 264 , nhiên có phương pháp tạo chuỗi va chạm với mà không phụ thuộc vào giá trị p, nên giá trị không cho tốt Một lựa chọn hiệu chọn số nguyên tố lớn cho m; ví dụ 109 + 9, số nguyên tố lớn vừa đủ nhỏ để thực phép nhân sử dụng số nguyên 64 bit d﴿ Hàm băm phổ quát Nếu lựa chọn tập hợp hàm băm H cho với hàm h(k) thuộc H hai khóa phân biệt k1 k2 xác suất h(k1 ) = h(k2 ) m-1 , H gọi tập hợp hàm băm phổ quát Khi sử dụng hàm băm ngẫu nhiên từ H cho khóa khả xảy đụng độ thấp Bảng băm Bảng băm bên mảng có kích cỡ xác định chứa giá trị đích Giá trị khóa sử dụng làm số để truy cập vào mảng đến giá trị đích tương ứng với khóa Các thao tác bảng băm là: • Thêm phần tử: tìm chỗ trống bảng băm tương ứng với khóa đặt giá trị đích vào chỗ • Tra cứu: tìm vị trí bảng ứng với khóa cho trả giá trị đích vị trí có • Xỏa phần tử: tra cứu tra vị trí bảng tương ứng với khóa, tồn tại, loại bỏ phần tử vị trí khỏi bảng Do khơng gian giá trị khóa thường lớn khơng gian giá trị băm, nên chắn có tập hợp giá trị khóa với giá trị băm giống nhau, gọi đụng độ Khi đó, cần thiết phải có chế xử lí để bảng băm hoạt động hiệu Một số phương pháp xử lí là: • Kết nối trực tiếp: vị trí bảng băm chứa danh sách liên kết, chứa khóa có giá trị băm tương ứng với vị trí với giá trị đích tương ứng • Dị tuần tự: vị trí bảng băm chứa phần tử, thêm phần tử mà vị trí tương ứng có phần tử khác, vị trí xét đến tìm thấy vị trí trống để đặt phần tử vào; tìm kiếm, thực xét vị trí vị trí tương ứng với giá trị băm tìm thấy vị trí chứa khóa cần tìm tìm thấy trống • Dị tuyến tính: tương tự dị tuần tự, với vị trí để xét cách khoảng cố định D vị trí so với vị trí trước • Băm kép: tương tự dị tuần tự, với vị trí để xét cách d(k) vị trí so với vị trí trước đó, d(k) hàm băm khác Các phương pháp dò gọi chung phương pháp đánh địa mở, ngược lại phương pháp kết nối trực tiếp phương pháp đánh địa đóng Đối với phương pháp đánh địa mở, thực xóa phần tử nảy sinh vấn đề: phần tử có giá trị băm phía sau phần tử bị xóa khơng xét đến tìm kiếm, vị trí phần tử bị xóa trở thành trống, khiến cho lầm tưởng khóa tìm kiếm không tồn Một phương pháp giải vấn đề đánh dấu vị trí có phần tử mà bị xóa; thực tìm kiếm, vị trí đánh dấu khơng coi khơng tìm thấy khóa mà tiếp tục kiểm tra vị trí tiếp theo; thực thêm phần tử đưa phần tử vào vị trí đánh dấu bình thường; số lượng đánh dấu trở nên q lớn thực VN AR BR CN MX AU NZ IN US KR UK JP CA Hình Minh họa bảng băm sử dụng phương pháp kết nối trực tiếp băm lại phần tử III – Đặc điểm tính chất Bảng băm khơng giữ lại thứ tự phần tử, hàm băm thực xáo trộn rải phần tử vào vị trí bảng Một thơng số đáng lưu tâm bảng băm hệ số tải, tỉ lệ số phần tử lưu trữ bảng băm thời điểm số vị trí bảng băm Với hàm băm đạt chất lượng, thao tác tra cứu giá trị bảng băm thực với chi phí khơng đổi hệ số tải không 1; trường hợp lại, xung đột làm cho thao tác phải tốn thời gian để giải quyết, trường hợp sử dụng phương pháp đánh địa mở, khơng cịn chỗ bảng băm để chứa thêm phần tử Khi đó, cần phải tạo bảng băm có kích cỡ lớn hơn, kéo theo m lớn hơn, nên cần phải băm lại khóa phần tử để đưa chúng vào bảng băm Theo chiều ngược lại, hệ số tải nhỏ có nghĩa phần lớn vị trí khơng dùng đến, gây lãng phí; tạo lại bảng băm nhỏ băm lại phần tử vào bảng IV – Ví dụ hoạt động Phần đưa ví dụ cách thức hoạt động bảng băm Bảng băm lưu trữ số nguyên, sử dụng phương pháp dò tuần tự, với hàm băm phép chia lấy dư kích cỡ bảng băm 10 Các giá trị 32; 53; 22; 92; 17; 34; 24; 37; 56 thêm vào bảng Vị trí Bước 56 32 32 32 32 32 32 32 32 32 53 53 53 53 53 53 53 53 22 22 22 22 22 22 22 92 92 92 92 92 92 34 34 34 34 17 17 17 17 17 24 24 24 37 37 Hình Nội dung bảng băm qua lần thêm phần tử Đầu tiên, 32 53 thêm vào bảng cách bình thường ﴾bước 2﴿ Khi đến phần tử 22 ﴾bước 3﴿, vị trí trùng với 32, nên vị trí kiểm tra đến tìm thấy chỗ trống vị trí số 4, 22 đặt vào vị trí Phần tử 92 xảy va chạm tương tự đặt vào vị trí số ﴾bước 4﴿ Phần tử 17 đặt bình thường vào vị trí số trống ﴾bước 5﴿ Phần tử 34 va chạm với phần tử 22 đặt vị trí số 4, vị trí gần trống vị trí số 6, 34 đặt vào vị trí số ﴾bước 6﴿ Xử lí tương tự 24 37, thêm vào hai vị trí số số ﴾bước 8﴿ Cuối ﴾bước 9﴿, phần tử 56 va chạm với 34 vị trí số 6, tiếp tục khảo sát vị trí 7; 8; không trống; quay ngược trở lại sang vị trí số tìm thấy trống, 56 đặt vào vị trí số V – Ví dụ cài đặt sử dụng Phần đưa số đoạn mã nguồn ngôn ngữ C++ để minh họa cho việc thực hóa thiết kế bảng băm thực số thao tác bảng băm Cài đặt Bảng băm cài đặt đoạn mã ánh xạ giá trị số nguyên đến giá trị số nguyên, sử dụng phương pháp kết nối trực tiếp, với hàm băm phép chia lấy dư kích cỡ bảng băm số nguyên tố nhỏ mà không nhỏ yêu cầu kích cỡ tối thiểu cho tạo bảng #include #include #include #include #include #include using Element = std pair; class HashTable final { private: int size; std vector maxCount) { maxCount = newCount; max = element; } } return max; } Đoạn mã Cài đặt hai phương pháp tìm phần tử xuất nhiều Phương pháp thông thường thực duyệt tất phần tử mảng, phần tử lại thực duyệt tất phần tử mảng lần để đếm số lần xuất phần tử bên mảng Do độ phức tạp phương pháp lên đến O(n2 ) Phương pháp sử dụng bảng băm lưu phần tử riêng biệt xuất bên danh sách với số lần xuất thời điểm Thực duyệt phần tử danh sách, phần tử chưa xuất bảng băm gán giá trị ứng với phần tử vào bảng, phần tử xuất cập nhật giá trị tương ứng với tăng thêm đơn vị Từ đó, cập nhật biến theo dõi phần tử số lần xuất nhiều Với phương pháp này, độ phức tạp toán O(n), cải thiện đáng kể Kiểm tra hai danh sách có chứa phần tử khơng Đoạn mã sử dụng bảng băm cài đặt phần để thực kiểm tra xem hai danh sách số nguyên có chứa phần tử giống hay khơng, tức là, danh sách có phải hoán vị danh sách hay không bool containSameElements( const std vector &list1, const std vector &list2 ) { if (list1.size() list2.size()) return false; const int size = list1.size(); HashTable table(size); 10 for (const int element : list1) { const auto result = table.search(element); int newCount; if (result) { newCount = *result + 1; table.erase(element); } else { newCount = 1; } table.insert({element, newCount}); } for (const int element : list2) { const auto result = table.search(element); if (result) { const int newCount = *result - 1; table.erase(element); if (newCount 0) table.insert({element, newCount}); } else { return false; } } return true; } Đoạn mã Cài đặt kiểm tra hai danh sách chứa phần tử Lần duyệt qua mảng thứ tạo bảng băm lưu giữ phần tử riêng biệt danh sách thứ với số lần xuất chúng, quy trình tương tự với tốn tìm phần tử xuất nhiều trình bày Sau đó, phần tử danh sách thứ hai, thực giảm giá trị đếm phần tử bảng băm xuống đơn vị Tuy nhiên, giá trị đếm 0, thể qua việc phần tử khơng có khơng cịn bảng băm nữa, kết luận có phần tử danh sách thứ hai xuất nhiều so với danh sách thứ Sau duyệt hết phần tử danh sách thứ hai, kiểm tra hai danh sách có số phần tử từ đầu nên chắn hai danh sách có chứa phần tử giống nhau, bảng băm rỗng 11 VI – Sử dụng bảng băm số ngơn ngữ lập trình Bảng băm cấu trúc liệu thường xuyên sử dụng, nên nhiều ngơn ngữ lập trình cung cấp phiên bảng băm cài đặt sẵn C++ Thư viện chuẩn C++ cung cấp mẫu lớp std unordered_map Bảng băm sử dụng phương pháp kết nối trực tiếp; người sử dụng cung cấp hàm làm hàm băm, khơng mặc định std hash std unordered_map có nhiều hàm thành viên sử dụng để tra cứu phần tử at trả giá trị tương ứng với khóa cho khóa tồn bảng, ngược lại ném ngoại lệ std out_of_range find tìm phần tử tương ứng với khóa trả dạng trỏ duyệt, trỏ duyệt khóa khơng tồn operator[] trả giá trị tương ứng với khóa, nhiên khóa khơng tồn tại, chèn vào bảng giá trị đích mặc định khởi tạo trả contains thực kiểm tra xem khóa có tồn bên bảng hay khơng Người dùng có hai lựa chọn hành vi thêm liệu vào std unordered_map Lựa chọn thứ chèn khóa chưa tồn bảng băm, hàm insert, emplace try_emplace Lựa chọn thứ hai ghi đè liệu vào bảng băm liệu tương ứng với khóa tồn tại, hàm insert_or_assign Để xóa phần tử tương ứng với khóa bảng băm, sử dụng hàm erase Java Thư viện chuẩn Java cung cấp lớp tổng quát java.util.HashMap Bảng băm sử dụng phương pháp kết nối trực tiếp; hàm băm hàm hashCode kiểu đối tượng sử dụng làm khóa Thao tác tra cứu thực sử dụng phương thức get, với giá trị tương ứng với khóa trả tồn null khơng containsKey 12 sử dụng để kiểm tra xem khóa có tồn hay khơng, phương thức cần thiết giá trị đích đưa vào bảng băm null Phương thức put thực đưa cặp khóa – giá trị vào bảng, thay giá trị cũ khóa tồn trả giá trị cũ remove xóa phần tử tương ứng với khóa cho khỏi bảng băm Python Ngôn ngữ Python cung cấp kiểu liệu dict Hàm băm hàm đặc biệt hash đối tượng khóa Bảng băm sử dụng phương pháp đánh địa mở Kích cỡ bảng 2i với i nguyên dương, xảy đụng độ, vị trí xác định công thức j1 = (5j0 + + p) mod 2i , với p ban đầu giá trị băm khóa thay đổi theo công thức p1 = ⌊p0 : 32⌋ trước sử dụng cơng thức trên; q trình cho đảm bảo xáo trộn hiệu quả, tránh xung đột liên tiếp giá trị băm liên tiếp [3] Thao tác tra cứu thực cách sử dụng toán tử [] với khóa, giá trị đích tương ứng trả tồn tại, ngược lại ngoại lệ KeyError ném Một khóa kiểm tra xem có tồn bảng băm hay khơng sử dụng toán tử in Việc đưa liệu vào bảng sử dụng tốn tử [] theo sau phép gán, giá trị đích chèn vào khóa chưa tồn thay giá trị đích cũ khóa tồn Việc xóa phần tử với khóa cho thực sử dụng phương thức pop JavaScript Thư viện chuẩn JavaScript cung cấp lớp Map Bảng băm sử dụng phương pháp kết nối trực tiếp; nhiên hàm băm lại không thực băm giá trị khóa, thay vào đó, số nguyên ngẫu nhiên tạo gán cho đối tượng sử dụng làm khóa Thao tác Map thực thông qua phương thức get tra cứu giá trị ứng với khóa trả undefined khóa khơng tồn tại; has kiểm tra khóa có tồn bảng hay khơng; set gán giá trị đích tương ứng với khóa; delete xóa phần tử tương ứng với khóa khỏi bảng 13 VII – So sánh với số cấu trúc liệu khác Mảng danh sách Với việc phải duyệt qua toàn phần tử mảng để tìm phần tử mong muốn lợi mặt chi phí bảng băm so với mảng rõ ràng Tuy nhiên số trường hợp có u cầu giữ lại trình tự chèn vào phần tử, giải pháp sử dụng kết hợp mảng với bảng băm; phép chèn có độ phức tạp O(1) phép xóa O(n) Về mặt chất, bảng băm thực chất mảng, có điều phần tử xếp theo quy luật cho tìm kiếm nhanh vị trí chúng bên mảng Cây tìm kiếm nhị phân cân Việc tìm kiếm phần tử nhị phân cần O(log(n)) bước, ứng với bước phép so sánh phần tử cần tìm kiếm với phần tử trỏ tới cây, tức lần truy cập tới liệu nút Đối với kiểu liệu có kích thước lớn việc so sánh trở thành chi phí chủ yếu cho việc tìm kiếm Trong đó, bảng băm thiết kế hợp lí phần lớn trường hợp cần lần tính tốn giá trị băm giá trị cần tìm, lần truy cập vào ô tương ứng với giá trị băm hay vài lần so sánh với phần tử Vì mặt chi phí, bảng băm thường tốn chi phí so với tìm kiếm nhị phân Về độ thân thiện với đệm, phần tử tìm kiếm nhị phân duyệt thường nằm rải rác nhớ, mà lần tìm kiếm lại có số tương đối phần tử cần phải truy cập liệu nên nhìn chung tìm kiếm nhị phân không thân thiện với nhớ đệm CPU, điều làm tăng thêm chi phí mặt thời gian để tìm kiếm phần tử Bảng băm thưởng truy cập số phần tử nên ảnh hưởng việc trượt đệm có không đáng kể Khi thêm phần tử mới, nhị phân cần phải thực bước duyệt tương tự tìm kiếm, sau phải thực di chuyển nút để thiết lập lại trạng thái cân bằng, thường khơng phải tất nút bị di chuyển mà 14 nút nằm lân cận với nhánh chứa phần tử vừa thêm vào cây, nhiên thực hóa sử dụng mảng mảng hết chỗ, tất phần tử phải di chuyển sang mảng có kích thước lớn Bảng băm cần chèn phần tử vào vị trí tương ứng với giá trị băm tìm được, nhiên hết dung lượng lưu trữ, phần tử di chuyển sang vị trí lưu trữ mới, mà cịn phải tính tốn lại giá trị băm để xếp vào số ô lưu trữ với số lượng lớn hơn, trừ giá trị băm lưu trữ với phần tử Nhìn chung, bảng băm tốn chi phí thêm phần tử so với tìm kiếm nhị phân Khi xóa phần tử, hai cấu trúc liệu trước hết phải thực thao tác tìm kiếm vị trí phần tử để loại bỏ; sau đó, tìm kiếm nhị phân phải thực loại bỏ nút tìm khỏi cây, thao tác ảnh hưởng đến nút khác làm cho chúng phải di chuyển, sau lại cịn phải tiếp tục thực thao tác cân lại cây; bảng băm cần đơn giản xóa liệu phần tử ô lưu trữ Như vậy, nhiệm vụ xóa phần tử bảng băm chí cịn tốn chi phí so với tìm kiếm nhị phân Tuy vậy, đặc điểm tìm kiếm nhị phân có mà bảng băm khơng có thứ tự phần tử khơi phục cách dễ dàng Khi có nhu cầu mặt thực tế độ chênh lệch chi phí tìm kiếm khơng phải lớn, nên không thực cần thiết phải kết hợp với bảng băm Danh sách nhảy cóc ﴾skip list﴿ 3 44 3 14 14 44 21 44 72 57 Hình Ví dụ danh sách nhảy cóc 15 72 90 Dựa ngun lí “chia để trị”, danh sách nhảy cóc gồm nhiều tầng, tầng danh sách liên kết Tầng thấp chứa phần tử xếp theo thứ tự tăng dần, tầng phía chứa tỉ lệ định phần tử tầng bên dưới, phân bố cho vị trí phần tử cách nhau, tầng cuối chứa số tuyệt đối phần tử Khi tìm kiếm, tầng duyệt qua trước, từ định phần danh sách chứa phần tử cần tìm kiếm phạm vi tìm kiếm thu hẹp, tầng bên duyệt vị trí tương ứng tìm tầng bên trên, tìm thấy giá trị yêu cầu hết tầng cuối mà khơng tìm thấy Do phạm vi tìm kiếm chia nhỏ theo tỉ lệ qua tầng, độ phức tạp tìm kiếm trung bình O(log(n)) Độ phức tạp thêm xóa phần tử trung bình O(log(n)), danh sách nhảy cóc có chi phí hoạt động cao bảng băm Và cấu tạo từ danh sách liên kết nên cấu trúc liệu chịu bất lợi liên quan đến đệm CPU Tuy nhiên danh sách nhảy cóc bảo tồn thứ tự xếp phần tử tính chất mang lại thuận lợi thiết kế ứng dụng đa luồng [4] Trie Ø a ab k s an ke so and key Hình Ví dụ trie Các nút màu xám biểu thị phần tử tồn Đối với giá trị có kiểu liệu chuỗi, trie trở thành lựa chọn cho việc tìm kiếm Trie biểu diễn với nút có giá trị 16 chuỗi cờ cho biết có phần tử ứng với chuỗi hay khơng Nút gốc chuỗi rỗng, nút có nút có chuỗi dài mắt xích có mắt xích cịn lại trùng với nút cha Thông thường giá trị mắt xích số khơng lớn nên nút lưu vào mảng có kích cỡ số giá trị thơng qua số giá trị mắt xích cuối Để tìm kiếm, thực thăm gốc cây, tìm kiếm nút có nút có giá trị trùng với phần mở đầu độ dài tương ứng giá trị cần tìm hay khơng, thực chất cần so sánh giá trị mắt xích cuối Nếu có thực thăm nút tương ứng lặp lại đến khơng tìm thấy độ dài với độ dài giá trị cần tìm, kiểm tra giá trị cờ nút để xác định xem giá trị cần tìm có tồn hay khơng Số lần thăm trường hợp xấu với số mắt xích giá trị cần tìm, bảng băm ln ln phải duyệt tồn mắt xích để tính tốn giá trị băm, mặt trie tỏ có lợi hơn, thể rõ giá trị phần tử có xu hướng rời rạc làm cho phần lớn lần tìm kiếm gặp ngõ cụt trước duyệt hết mắt xích Hơn việc cài đặt trie không yêu cầu dùng đến hàm băm, vừa giảm độ phức tạp cài đặt, vừa giảm chi phí thực hàm băm Tuy nhiên nên trie gặp bất lợi truy cập nhớ phải truy cập nhiều lần vị trí liệu rời rạc Một mặt khác giá trị có xu hướng rời rạc số lượng không nhỏ ô bảng tra cứu nút nút ô trống, gây lãng phí nhớ Và trie có đặc điểm thứ tự xếp phần tử khơi phục thơng qua việc duyệt theo chiều sâu, cho phép liệt kê phần tử có giá trị bắt đầu tiền tố Kết luận Bảng băm có ưu chi phí hoạt động so với phần lớn cấu trúc liệu khác, nhiên khơng có tính đặc biệt mà cấu trúc liệu khác mang lại, chủ yếu tính đảm bảo trật tự phần tử, hàm băm tốn chi phí định để thực Do phải tùy vào yêu cầu cụ thể để chọn cấu trúc liệu phù hợp, với bảng băm chọn liệu có số lượng khơng q nhỏ phần tử khơng có u cầu xếp theo trình tự 17 VIII – Câu hỏi ơn tập Nếu có bảng băm có kích cỡ m hàm băm cho giá trị băm nằm khoảng [0; r) với r > m hàm băm có sử dụng cho bảng băm hay khơng? Nếu có cách nào? Viết mã giả để thực tính tốn giá trị băm cho giá trị khóa dạng chuỗi theo công thức hàm băm đa thức với p m cho trước Một bảng băm có kích cỡ 11 sử dụng hàm băm phép chia lấy dư cho 11 Thực chèn giá trị 63; 23; 33; 57; 44; 98; 15; 80; 5; 42 vào bảng Tính so sánh tổng số lần đụng độ tổng số vị trí phải kiểm tra sử dụng phương pháp: kết nối trực tiếp, dò tuần tự, băm kép với hàm băm thứ hai phép chia lấy dư cho Ví dụ bảng băm phần IV có hệ số tải bao nhiêu? Giả sử thực tạo lại bảng băm với kích cỡ gấp đơi, tính tổng số lần đụng độ tổng số vị trí phải kiểm tra thực băm lại phần tử với thứ tự từ vị trí đến vị trí bảng băm cũ Với cài đặt mẫu bảng băm lớp HashTable, viết hàm thực thao tác cập nhật giá trị đích tương ứng với khóa chỉnh sửa hai đoạn mã tìm phần tử xuất nhiều kiểm tra hai danh sách chứa phần tử để sử dụng hàm Nếu sử dụng kết hợp bảng băm với tìm kiếm nhị phân cân ﴾AVL﴿, độ phức tạp thực thao tác chèn, tìm kiếm xóa nào? So sánh độ phức tạp với sử dụng bảng băm sử dụng tìm kiếm nhị phân cân 18 Tham khảo [1] GeeksforGeeks, Hashtable in Java, https://www.geeksforgeeks.org/hashtable‐in‐java/ [2] TopDev, Bảng băm C++, https://topdev.vn/blog/bang‐bam‐trong‐c/ [3] Mã nguồn CPython, Objects/dictobject.c, https://github.com/python/cpython/blob/3.11/Objects/dictobject.c#L143 [4] Fomitchev Mikhail, Lock‐free linked lists and skip lists, York University, 2003 19 ... {"phase":"bomb","bomb":"planted"} Hàm băm Hình Minh họa bảng băm Bảng băm cấu trúc liệu dạng từ điển: phần tử cặp khóa – giá trị cách truy vấn sử dụng khóa lấy giá trị tương ứng Kĩ thuật chủ đạo cấu trúc liệu kĩ thuật băm ﴾hashing﴿:... phần tử giống nhau, bảng băm rỗng 11 VI – Sử dụng bảng băm số ngơn ngữ lập trình Bảng băm cấu trúc liệu thường xun sử dụng, nên nhiều ngơn ngữ lập trình cung cấp phiên bảng băm cài đặt sẵn C++... phí; tạo lại bảng băm nhỏ băm lại phần tử vào bảng IV – Ví dụ hoạt động Phần đưa ví dụ cách thức hoạt động bảng băm Bảng băm lưu trữ số nguyên, sử dụng phương pháp dò tuần tự, với hàm băm phép chia

Ngày đăng: 02/11/2022, 18:22

TỪ KHÓA LIÊN QUAN

w