1. Trang chủ
  2. » Công Nghệ Thông Tin

Tiểu luận phân tích và thiết kế thuật toán (bảng băm)

28 22 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 28
Dung lượng 747,5 KB

Nội dung

TRƯỜNG ĐẠI HỌC KHOA HỌC HUẾ KHOA CÔNG NGHỆ THÔNG TIN TIỂU LUẬN: BẢNG BĂM MÔN: THIẾT KẾ VÀ PHÂN TÍCH THUẬT TỐN Nhóm 1: Trần Ngự Bình Tơ Thanh Hải (Trưởng nhóm) Trần Văn Long Đồn Thị Thu Minh Vũ Đức Tuấn Huế, 10/2014 Mục lục Mở đầu Nội dung 2.1 Các bảng địa trực tiếp (direct-address tables) .5 2.2 Bảng băm (hash tables) .6 2.2.1 Giải xung đột kỹ thuật dây chuyền 2.2.2 Phân tích kỹ thuật băm dây chuyền 2.3 Hàm băm (hash functions) 10 2.3.1 Phương pháp chia .11 2.3.2 Phương pháp nhân 12 2.3.3 Kỹ thuật phổ băm .12 2.4 Định địa mở (open addressing) 16 2.4.1 Phương pháp thăm dị tuyến tính 18 2.4.2 Phương pháp thăm dò bậc hai 18 2.4.3 Kỹ thuật băm đôi 19 2.4.4 Phân tích kỹ thuật băm địa mở 20 2.5 Kỹ thuật băm hoàn hảo (perfect hashing) .23 Kết luận 28 Mở đầu Tập hợp khái niệm khoa học máy tính tốn học Về mặt tốn học, tập hợp không thay đổi Nhưng khoa học máy tính, tác động thuật toán, tập hợp thường xuyên thay đổi (các phần tử tập hợp nhiều lên lại) Chúng ta gọi tập hợp thường xuyên thay đổi tập hợp động (dynamic sets) Các thuật tốn địi hỏi số phép tốn khác phải thực tập hợp Chẳng hạn, nhiều thuật toán cần phép toán như: chèn số phần tử vào tập hợp, xóa số phần tử từ tập hợp, kiểm tra xem phần tử có thuộc tập hợp Một tập hợp động hỗ trợ phép toán vừa nêu gọi từ điển Nhiều ứng dụng yêu cầu tập hợp động hỗ trợ phép toán từ điển INSERT (chèn), SEARCH (tìm kiếm), DELETE (xóa) Chẳng hạn, trình biên dịch ngơn ngữ máy trì bảng ký hiệu, khóa phần tử chuỗi ký tự tùy ý tương ứng với định danh (identifiers) ngơn ngữ máy Có số cấu trúc liệu sử dụng để biểu diễn (implement) tập hợp động Và số đó, bảng băm (hash table) cấu trúc liệu tốt dùng cho từ điển Mặc dù thao tác tìm kiếm phần tử bảng băm có độ phức tạp tương đương với việc tìm kiếm danh sách liên kết (độ phức tạp O(n) trường hợp xấu nhất), với giả thiết hợp lý, thời gian tìm kiếm phần tử bảng băm O(1) Bảng băm tổng quát hóa từ khái niệm đơn giản mảng thơng thường Việc định địa trực tiếp vào mảng thông thường hiệu tiến hành kiểm tra vị trí mảng với thời gian O(1) Phần 2.1 trình bày chi tiết kỹ thuật định địa trực tiếp Việc định địa trực tiếp vào mảng thích hợp có khả xác định rõ mảng có vị trí tương ứng với khóa (possible key) Khi số lượng khóa thực tế lưu trữ nhỏ so với tổng số khóa có thể, bảng băm trở thành lựa chọn thay hiệu cho phương án định địa trực tiếp vào mảng, bảng băm thường sử dụng mảng có kích thước cân xứng với số khóa thực tế lưu trữ Phần 2.2 trình bày chi tiết bảng băm, tập trung vào kỹ thuật dây chuyền (chaining), kỹ thuật đơn giản dùng để giải xung đột Phần 2.3 giải thích cách tính số mảng từ khóa cách dùng hàm băm Trong Phần 2.4, khảo sát chi tiết kỹ thuật giải xung đột khác mang tên định địa mở (open addressing) Phần cuối trình bày kỹ thuật băm hoàn hảo (perfect hashing), cho phép thực phép toán SEARCH với độ phức tạp O(1) trường hợp xấu nhất, tập hợp khóa lưu trữ trạng thái tĩnh (khơng thay đổi) Nội dung tiểu luận dịch từ Chương 11 - Hash Tables sách Introduction to Algorithms, cơng trình lớn tác giả Thomas H Cormen, Charles E Leiserson, Ronald L Rivest Clifford Stein Tuy nhiên, giới hạn mặt thời gian hạn chế kỹ dịch, nên tiểu luận chắn khơng tránh khỏi thiếu sót Rất mong ý kiến đóng góp Thầy bạn để chúng tơi hồn thiện tiểu luận Xin chân thành cảm ơn TS Hoàng Quang giúp đỡ chúng tơi hồn thành tiểu luận Nội dung 2.1 Các bảng địa trực tiếp (direct-address tables) Định địa trực tiếp kỹ thuật đơn giản, thực tốt không gian U nhỏ mức độ vừa phải (U chứa khóa) Giả sử ứng dụng cần tập hợp động, phần tử có khóa lấy từ khơng gian U = {0, 1, , m - 1}, với m không lớn Chúng ta giả sử khơng có hai phần tử có khóa Để biểu diễn tập động vừa nêu, sử dụng mảng, bảng địa trực tiếp, biểu thị T[0 m-1], vị trí, khe (slot) tương ứng với khóa khơng gian U Hình bên minh họa cách tiếp cận đó; khe k trỏ đến phần tử tập hợp có khóa k Nếu tập hợp khơng chứa thành phần có khóa k, T[k] = NIL Hình Biểu diễn tập hợp động bảng địa trực tiếp T Trong đó, khóa khơng gian U = {0, 1, , 9} tương ứng với khe bảng Tập hợp K = {2, 3, 5, 8} gồm khóa thực xác định khe bảng chứa biến trỏ đến phần tử Các khe khác, tơ bóng đậm, chứa NIL Các phép toán từ điển thực cách bình thường: DIRECT-ADDRESS-SEARCH(T, k) return T [k] DIRECT-ADDRESS-INSERT(T, x) T[key[x]] ← x DIRECT-ADDRESS-DELETE(T, x) T[key[x]] ← NIL  Mỗi phép toán thực nhanh với độ phức tạp O(1) 2.2 Bảng băm (hash tables) Hiển nhiên, việc sử dụng bảng địa trực tiếp gặp khó khăn khơng gian U lớn việc lưu trữ bảng T có kích cỡ |U| khơng thực Hơn nữa, tập hợp K khóa lưu trữ thực tế nhỏ so với U đến mức hầu hết không gian phân bổ cho T bị lãng phí Khi tập hợp K khóa lưu trữ từ điển nhỏ nhiều so với không gian U tất khóa có thể, bảng băm yêu cầu khơng gian lưu trữ nhiều so với bảng địa trực tiếp Cụ thể, yêu cầu khơng gian lưu trữ giảm tới mức Θ(|K|), việc tìm kiếm thành phần bảng băm có độ phức tạp O(1) Hạn chế với bảng băm ta áp dụng cho trường hợp trung bình, bảng địa trực tiếp áp dụng cho trường hợp xấu Với kỹ thuật định địa trực tiếp, thành phần có khóa k lưu trữ khe k Với kỹ thuật bảng băm, thành phần lưu trữ khe h(k); nghĩa hàm băm (hash function) h dùng để tính tốn giá trị lưu khe dựa vào khóa k Ở h ánh xạ (map) khóa khơng gian U vào khe bảng băm T[0 m-1], với kích thước m: h: U → {0, 1, …, m-1} Ta nói thành phần có khóa k băm (hash) theo khe h(k), hay h(k) giá trị băm (hash value) khóa k Hình minh họa khái niệm Cốt lõi của hàm băm rút gọn miền số mảng cần quản lý Thay |U| giá trị ta cần quản lý m (|U| > m) giá trị Nhờ đó, yêu cầu không gian lưu trữ giảm tương ứng Hình Dùng hàm băm h để ánh xạ khóa theo khe bảng băm Các khóa k1 k5 ánh xạ theo khe nên chúng xung đột Điểm cần lưu ý hai khóa băm theo khe Chúng ta gọi xung đột (collision) Và ta có kỹ thuật để giải xung đột cách hiệu Tất nhiên, giải pháp lý tưởng tránh xung đột Ta cố gắng đạt mục tiêu cách chọn hàm băm h thích hợp Có ý tưởng cho nên để h xuất “ngẫu nhiên”, nhờ tránh xung đột hay giảm số lần xung đột giá trị băm (Thuật ngữ “to hash” (băm) gợi lên hình ảnh băm trộn cách ngẫu nhiên nêu tư tưởng phương pháp này) Tuy nhiên, |U| > m, nên chắn có khóa có giá trị băm; việc tránh hẳn xung đột Như vậy, hàm băm “ngẫu nhiên” đuợc thiết kế kỹ lưỡng để giảm thiểu số lần xung đột, song ta phải dùng phương pháp để giải xung đột xảy Sau đây, khảo sát kỹ thuật giải xung đột đơn giản nhất, có tên dây chuyền (cịn gọi phương pháp băm mở) Phần 2.4 tiếp tục giới thiệu phương pháp giải xung đột khác có tên định địa mở (còn gọi phương pháp băm đóng) 2.2.1 Giải xung đột kỹ thuật dây chuyền Trong kỹ thuật dây chuyền, ta đặt tất thành phần băm theo khe vào danh sách liên kết Hình Khe j chứa biến trỏ đến đầu danh sách chứa tất thành phần lưu trữ băm theo j; khơng có thành phần vậy, khe j chứa NIL Hình Giải xung đột dây chuyền Mỗi khe bảng băm T[j] chứa danh sách liên kết bao gồm tất khóa có giá trị băm j Các phép toán từ điển bảng băm T thường dễ thực thi xung đột giải kỹ thuật dây chuyền CHAINED-HASH-INSERT(T, x) Chèn x vào đầu danh sách T[h(key[x])] CHAINED-HASH-SEARCH(T, k) Tìm kiếm phần tử với khóa k danh sách T[h(k)] CHAINED-HASH-DELETE(T, x) Xóa x khỏi danh sách T[h(key[x])] Thời gian thực trường hợp xấu thủ tục chèn O(1) Với thủ tục tìm kiếm, thời gian thực trường hợp xấu tỷ lệ với chiều dài danh sách; phân tích thủ tục kỹ phần sau Việc xóa thành phần x hồn thành O(1) thời gian danh sách liên kết đơi Nếu danh sách liên kết đơn, thủ tục xóa tìm kiếm có thời gian thực 2.2.2 Phân tích kỹ thuật băm dây chuyền Kỹ thuật băm dây chuyền thực tốt tới mức nào? Cụ thể hơn, phải để tìm kiếm phần tử với khóa cho? Cho bảng băm T có m khe lưu trữ n thành phần, ta định nghĩa hệ số tải (load factor) T α = n/m, ta gọi số trung bình phần tử lưu trữ danh sách Phân tích dựa theo giá trị α, lớn hơn, nhỏ Trong trường hợp xấu nhất, cách xử lý kỹ thuật băm dây chuyền tệ: tất n khóa băm theo khe, tạo danh sách liên kết có chiều dài n Như vậy, thời gian để tìm kiếm trường hợp xấu O(n) cộng thời gian để tính tốn hàm băm - khơng tốt so với việc dùng danh sách liên kết cho tất thành phần Rõ ràng, bảng băm không dùng để thực cho trường hợp xấu chúng Khả thực trung bình kỹ thuật băm tùy thuộc vào mức độ tốt xấu hàm băm h phân phối tập hợp khóa lưu trữ m khe, tính trung bình Phần 2.3 giải thích chi tiết vấn đề Ở đây, ta giả định phần tử cho có khả để băm vào khe số m khe, chúng không phụ thuộc vào nơi mà phần tử khác băm đến Ta gọi giả thiết kỹ thuật băm (simple uniform hashing) Ta giả định giá trị băm h(k) tính tốn thời gian O(1), cho thời gian cần thiết để tìm kiếm phần tử có khóa k tùy thuộc vào chiều dài danh sách T[h(k)] Tạm thời bỏ qua thời gian O(1) cần thiết để tính tốn hàm băm truy cập khe h(k), ta tập trung vào số phần tử dự trù mà thuật tốn tìm kiếm xem xét, nghĩa là, số lượng phần tử danh sách T[h(k)] kiểm tra để xem khóa chúng có k hay không Ta xét trường hợp Đầu tiên, đợt tìm kiếm khơng thành cơng: khơng có phần tử bảng có khóa k Thứ hai, đợt tìm kiếm thành cơng: tìm phần tử có khóa k Định lý Trong bảng băm với xung đột giải kỹ thuật dây chuyền, đợt tìm kiếm khơng thành cơng bình qn thời gian O(1+α), giả thiết kỹ thuật băm Chứng minh Dưới giả thiết kỹ thuật băm đều, khóa k chưa lưu bảng có khả để băm theo khe số m khe Như vậy, thời gian trung bình để tìm khơng thành cơng khóa k thời gian trung bình để tìm đến cuối m danh sách Chiều dài trung bình danh sách hệ số tải α=n/m Như vậy, số thành phần dự trù xem xét đợt tìm kiếm khơng thành cơng α, tổng thời gian cần thiết (kể thời gian để tính toán h(k)) O(1+α) Định lý Trong bảng băm với xung đột giải kỹ thuật dây chuyền, đợt tìm kiếm thành cơng bình quân thời gian O(1+ α), giả thiết kỹ thuật băm Chứng minh Ta giả định phần tử tìm kiếm có khả để phần tử n phần tử lưu trữ bảng Ta giả định thủ tục CHAINED-HASH-INSERT chèn phần tử cuối thay đầu danh sách Số phần tử xem xét đợt tìm kiếm thành công phần tử x nhiều so với số lượng phần tử xuất danh sách trước x chèn vào Do đó, để tìm số phần tử dự kiến xem xét, ta lấy trung bình, n phần tử bảng, cộng với chiều dài dự kiến danh sách (i-1)/m, số phần tử dự kiến xem xét đợt tìm kiếm thành cơng là: n  i  1 n      m    i  1 n i 1  m.n i 1   (n  1)n  1     n.m   1    2m Như vậy, tổng thời gian cần thiết cho đợt tìm kiếm thành cơng (kể thời gian tính tốn hàm băm) O(2+ α/2 – 1/2m) = O(1+α) Kỹ thuật phân tích có ý nghĩa gì? Nếu số lượng khe bảng băm tỷ lệ với số lượng thành phần bảng, ta có n = O(m), lúc α = n/m = O(m)/m = O(1) Như vậy, tính trung bình việc tìm kiếm tốn lượng thời gian bất biến Do đó, việc chèn thời gian O(1) việc xóa thời gian O(1) trường hợp xấu danh sách thuộc dạng danh sách liên kết đơi Tất phép tốn từ điển thực thời gian O(1), tính trung bình 2.3 Hàm băm (hash functions) Trong phần này, đề cập vài vấn đề liên quan đến thiết kế hàm băm tốt sau trình bày ba lược đồ để tạo chúng: kỹ thuật băm phép chia, kỹ thuật băm phép nhân kỹ thuật phổ băm (universal hashing) Điều tạo nên hàm băm tốt? Một hàm băm tốt thỏa (xấp xỉ) giả thiết kỹ thuật băm đơn giản: khóa có khả để băm vào vị trí số m khe Chính thức hơn, ta mặc nhận khóa rút độc lập từ U theo phân phối xác suất P; nghĩa là, P(k) xác xuất mà k rút Như giả thiết kỹ thuật băm đơn giản là: j = 0, 1, …, m-1 (1) Đáng tiếc, ta thường kiểm tra điều kiện này, P thường chưa biết Đôi lúc ta biết phép phân phối P Ví dụ, giả sử khóa xem số thực ngẫu nhiên k phân phối độc lập đồng miền giá trị ≤ k < Trong trường hợp này, hàm băm: h(k) = ⌊km⌋ chứng tỏ thỏa phương trình (1) Trong thực tế, dùng kỹ thuật đốn (heuristic) để tạo hàm băm có khả thực tốt Thơng tin định tính P đơi lúc tỏ hữu ích tiến trình thiết kế Ví dụ, xét bảng ký hiệu biên dịch, khóa chuỗi ký tự tùy ý biểu thị cho dấu định danh (identifiers) chương trình Nói chung, ký hiệu liên quan mật thiết, pt pts, thường xảy chương trình Một hàm băm tốt giảm thiểu hội biến thể băm theo khe Một cách tiếp cận chung suy giá trị băm theo cách dự trù độc lập với khn mẫu tồn liệu Ví dụ, “phương pháp chia” (được thảo luận phần 2.3.1) tính tốn giá trị băm số dư khóa chia cho phần số nguyên tố định rõ Trừ phi số nguyên tố cách có liên quan đến khuôn mẫu phép phân phối xác xuất P, phương pháp cho kết tốt Cuối cùng, cần lưu ý có vài ứng dụng hàm băm u cầu tính chất mạnh so với tính chất mà kỹ thuật băm đơn giản cung cấp Ví dụ, ta muốn khóa phải “đóng” theo nghĩa giá trị băm tách xa (Tính chất đặc biệt thỏa đáng ta dùng phương pháp thăm dị tuyến tính, định nghĩa phần 2.4 Định địa mở) Vậy có Phần cịn lại việc chứng minh, ta xác định k có bảng T hay không  Nếu k ∉ T, nh(k) = Yk |{l : l ∈ T l ≠ k}| = n Vậy E[nh(k)] = E[Yk] ≤ n/m = α  Nếu k ∈ T , khóa k xuất T[h(k)] Y k khơng bao gồm k, ta có nh(k) = Yk + và|{l : l ∈ T l ≠ k}| = n - Vậy E[n h(k)] = E[Yk] + ≤ (n - 1)/m + = + α - 1/m < + α Hệ Sử dụng phổ băm giải xung đột bảng với m khe, phải thời gian dự kiến Θ(n) để xử lý n phép chèn, tìm kiếm xóa O(m) phép chèn Chứng minh Số phép chèn O(m), ta có n = O(m) α = O(1) Phép chèn phép xóa hoạt động liên tục thời gian Theo định lý 3, thời gian dự kiến cho phép tìm kiếm O(1) Bởi tính chất tuyến tính kỳ vọng, thời gian dự kiến cho toàn hoạt động O(n) Thiết kế lớp hàm phổ băm Khá dễ dàng để thiết kế lớp cho hàm phổ băm Đầu tiên chọn số nguyên tố p đủ lớn để khóa k có giá trị khoảng từ đến p-1 Zp tập hợp (0, 1, …, p-1) Z*p tập hợp {1, 2, …, p-1} Vì p số nguyên tố, giải phương trình module p với phương pháp đưa chương Số - Lý thuyết thuật tốn Bởi số lượng khóa lớn số lượng khe bảng băm, tức p > m Bây xác định hàm băm ha,b với b ∈ Zp sử dụng phép biến đổi tuyến tính rút gọn phân số phép chia modulo p modulo m: ha,b(k) = ((ak + b) mod p) mod m (2) Ví dụ: Với p = 17 m = Ta có H 3,4(8) = Các hàm băm tương tự có dạng: ℋp,m = { ha,b:a ∈ Z*p b ∈ Zp } (3) Mỗi hàm băm ℋp,m ánh xạ Zp đến Zm Có p -1 lựa chọn a p lựa chọn b, có p(p-1) hàm băm lớp ℋp,m Định lý Lớp hàm băm ℋp,m (2) (3) lớp phổ băm Chứng minh Xét hai khóa riêng biệt k l tập Zp, k ≠ l Xác định hàm băm ha,b: r = (ak + b) mod p s = (al + b) mod p Trước tiên, cần ý r ≠ s Vì vậy? r – s ≡ a(k - l) (mod p) Ta có r ≠ s p số nguyên tố, a mod p ≠ (k – l) mod p ≠ Vậy a(k-l) mod p ≠ Vì trình xác định bắt kỳ hàm băm h a,b lớp ℋp,m, giá trị phân biệt k l ánh xạ đến giá trị giá trị phân biệt phép chia lấy dư r s cho p; không xuất xung đột “mức mod p” Hơn p(p -1) lựa chọn cặp (a,b) với a ≠ tương ứng với kết khác cặp (r,s) với r ≠ s a = ((r - s)((k - l)-1 mod p)) mod p, b = (r - ak) mod p, Phép ((k - l)-1 mod p) phép nghịch đảo (k-1) sau mod p Vì p(p-1) cặp (r,s) với r ≠ s có mối quan hệ – với cặp (a,b) với a ≠ Vì vậy, cặp cho đầu vào k l, chọn (a, b) thống ngẫu nhiên từ Z*p×Zp, cặp kết (r, s) bình đẳng với khả nhận từ cặp giá trị khác biệt modulo p Khả xung đột khóa k l với khả r ≡ s (mod m) mà r s giá trị ngẫu nhiên từ phép modulo p Đối với giá trị định r, có p - lựa chọn giá trị cho s, số lượng giá trị s cho s ≠ r s ≡ r (mod m) nhiều là: ⌈p/m⌉ - ≤ ((p + m - 1)/m) - = (p - 1)/m Xác xuất s xung đột với r ((p − 1)/m)/(p − 1) = 1/m Vì với cặp phân biệt k l ∈ Zp, Pr{ha,b(k) = ha,b(l)} ≤ 1/m, Do lớp hàm băm ℋp,m thực lớp phổ băm 2.4 Định địa mở (open addressing) Trong kỹ thuật định địa mở, tất thành phần lưu trữ bảng băm Nghĩa là, khoản mục bảng chứa thành phần tập hợp động chứa NIL Khi tìm kiếm thành phần, ta xem xét có hệ thống khe bảng tìm thấy thành phần mong muốn rõ ràng thành phần khơng nằm bảng Khơng có danh sách thành phần lưu trữ bên bảng, kỹ thuật dây chuyền Như vậy, kỹ thuật định địa mở, bảng băm “lấp đầy” cho tiến hành chèn thêm; hệ số tải  khơng vượt q Tất nhiên, ta lưu trữ danh sách liên kết kỹ thuật dây chuyền bên bảng băm, khe bảng băm trống, ưu điểm kỹ thuật định địa mở tránh biến trỏ Thay theo biến trỏ, ta tính tốn dãy khe xem xét Bộ nhớ phụ trội giải phóng nhờ khơng lưu trữ biến trỏ cung cấp cho bảng băm số lượng khe lớn với lượng nhớ, có tiềm bị va chạm truy lục nhanh Để thực tác vụ chèn kỹ thuật định địa mở, ta xem xét thành cơng, thăm dị (probe), bảng băm tìm khe trống để đặt khóa Thay cố định theo thứ tự 0, 1,…, m-1 (yêu cầu  (n) thời gian tìm kiếm), dãy vị trí thăm dị tùy thuộc vào khóa chèn Để xác định khe thăm dò, ta mở rộng hàm băm để gộp số thăm dò (bắt đầu từ 0) dạng đầu vào thứ hai Như vậy, hàm băm trở thành: h:U x {0,1,…,m-1} {0,1,…,m-1} Với kỹ thuật định địa mở, ta yêu cầu với khóa k, dãy thăm dị: phép hoán vị (0, 1,…, m-1), cho vị trí bảng băm chung xem khe cho khóa bảng tràn đầy Trong mã giả đây, ta mặc nhận thành phần bảng băm T khóa khơng có liệu vệ tinh; khóa k đồng với thành phần chứa khóa k Mỗi khe chứa khóa NIL (nếu khe trống) HASH-INSERT(T,k) i repeat j h(k, i) if T[j] = NIL then T[j] k return j else i i+1 until i = m error “hash table overflow” Thuật toán để tìm khóa k thăm dị dãy khe mà thuật tốn chèn xem xét khóa k chèn Do đó, đợt tìm kiếm kết thúc (khơng thành cơng) tìm khe trống, k hẳn chèn khơng phải sau dãy thăm dị (Lưu ý, đối số mặc nhận khóa khơng xóa khỏi bảng băm.) Thủ tục HASH-SEARCH nhận bảng băm T khóa k làm đầu vào, trả j tìm thấy khe j chứa khóa k, NIL khóa k khơng diện bảng T HASH-SEARCH(T,k) i repeat j h(k, i) if T[j] = k then return j else i i+1 until T[j] = NIL i = m return NIL Xóa khỏi bảng băm địa mở tiến trình khó Khi xóa khóa khỏi khe i, ta khơng thể đơn giản đánh dấu khe trống cách lưu trữ NIL Nếu làm thế, ta khơng thể truy lục khóa k đợt chèn mà ta thăm dị khe i tìm thấy đầy Một giải pháp đánh dấu khe cách lưu trữ giá trị đặc biệt DELETED thay NIL Sau đó, ta phải sửa đổi thủ tục HASH-SEARCH để tiếp tục xem xét gặp giá trị DELETED, HASH-INSERT xem khe thể trống cho chèn khóa Tuy nhiên, làm thế, lần tìm kiếm khơng cịn phụ thuộc vào hệ số tải  , lý kỹ thuật dây chuyền thường lựa làm kỹ thuật giải va chạm phải xóa khóa Trong phân tích thực giả thiết kỹ thuật băm Ta mặc nhận khóa xét có khả để có số m! phép hốn vị {0, 1, …, m-1} làm dãy thăm dị Kỹ thuật băm tổng quát hóa khái niệm kỹ thuật băm đơn giản định nghĩa cho tình hàm băm khơng tạo số đơn, mà dãy thăm dò đầy đủ Tuy nhiên, kỹ thuật băm không dễ thực thi, thực tế ta thường dùng phép xấp xỉ (như kỹ thuật băm đôi, định nghĩa đây) Ba kỹ thuật thường dùng để tính tốn dãy thăm dị cần thiết cho kỹ thuật định địa mở: phương pháp thăm dị tuyến tính, thăm dị bậc hai (quadratic probing) kỹ thuật băm đôi Tất kỹ thuật vừa nêu bảo đảm phép hoán vị cho khóa k Tuy nhiên, khơng có kỹ thuật số đáp ứng giả thiết kỹ thuật băm đều, chúng phát sinh nhiều m2 dãy thăm dị khác (thay m! mà kỹ thuật băm yêu cầu) Kỹ thuật băm đơi có số lượng dãy thăm dị lơn và, dự kiến dường cho ta kết tốt 2.4.1 Phương pháp thăm dò tuyến tính Cho hàm băm thường h’: U {0, 1, …, m-1}, phương pháp thăm dị tuyến tính (linear probing) sử dụng hàm băm: h(k, i) = (h’(k) + i) mod m với i = 0, 1,…, m-1 Cho khóa k, khe thăm dò T[h’(k)] Kế tiếp ta thăm dò khe T[h’(k) + 1] tiếp tục cho lên đến khe T[m-1] Sau ta đóng khung (wrap around) theo khe T[0], T[1], …, chung thăm dò khe T[h’(k) - 1] Do vị trí thăm dị ban đầu xác định ngun dãy thăm dị, nên có m dãy thăm dò riêng biệt dùng với phương pháp thăm dò tuyến tính Phương pháp thăm dị tuyến tính dễ thực thi, song phải chịu vấn đề mệnh danh kết cụm sơ cấp (primary clustering) Các đợt chạy kéo dài khe đầy tăng lên, làm tăng thời gian tìm kiếm trung bình Ví dụ: ta có n = m/2 khóa bảng, khe lập mục chẵn đầy khe lập mục lẻ cịn trống, đợt tìm kiếm trung bình khơng thành cơng 1.5 thăm dị Tuy nhiên, n = m/2 vị trí đầy, số lần thăm dị trung bình gia tăng lên khoảng m/4 = m/8 Các cụm (clusters) nảy sinh, trước khe trống i khe đầy, xác suất mà khe trống khe khe đầy (i + 1)/m, so sánh với xác xuất 1/m khe đứng trước trống Như vậy, đợt chạy khe đầy có khuynh hướng kéo dài hơn, phương pháp thăm dị tuyến tính khơng phải phép xấp xỉ thật tốt kỹ thuật băm 2.4.2 Phương pháp thăm dò bậc hai Phương pháp thăm dò bậc hai sử dụng hàm băm theo dạng h(k, i) = (h’(k) + c1i + c2i2) mod m, (4) (như phương pháp thăm dị tuyến tính) h’ hàm băm phụ, c1 c2 0 số phụ, i = 0,1,…,m-1 Vị trí ban đầu thăm dị T[h’(k)]; vị trí sau độ dịch vị theo lượng tùy thuộc vào cách bậc hai (quadratic) số thăm dò i Phương pháp làm việc tốt phương pháp thăm dị tuyến tính, song để tận dụng đầy đủ bảng băm, giá trị c1, c2, m bị ràng buộc Ngoài ra, hai khóa có vị trí thăm dị ban đầu, dãy thăm dị chúng nhau, h(k1, 0) = h(k2, 0) hàm ý h(k1, i) = h(k2, i) Điều dẫn đến dạng ơn hịa tính kết cụm, có tên kết cụm thứ cấp (secondary clustering) Cũng phương pháp thăm dị tuyến tính, đợt thăm dị ban đầu xác định nguyên dãy, m dãy thăm dò riêng biệt dùng 2.4.3 Kỹ thuật băm đôi Kỹ thuật băm đôi (double hashing) phương pháp tốt sẵn có kỹ thuật định địa mở phép hốn vị tạo có nhiều đặc tính phép hoán vị chọn ngẫu nhiên Kỹ thuật băm đơi sử dụng hàm băm có dạng: h(k, i) = (h1 (k) + ih2 (k)) mod m, h1 h2 hàm băm phụ Vị trí ban đầu thăm dị T[h1 (k)]; vị trí thăm dị độ dịch vị từ vị trí trước theo lượng h2(k), modulo m Như vậy, khác với trường hợp thăm dị tuyến tính bậc hai, dãy thăm dị tùy thuộc vào khóa k theo hai cách, vị trí thăm dị bắt đầu, độ dịch vị, hai, thay đổi Hình có cung cấp ví dụ tác vụ chèn kỹ thuật băm đơi Hình 5: Chèn kỹ thuật băm đơi Ở ta có bảng băm có kích cỡ 13 với h1(k) = k mod 13 h2(k) = + (k mod 11) Bởi 14 – mod 13 14  mod 11, khóa 14 chèn vào khe trống 9, sau khe xét thấy đầy Giá trị h2(k) phải nguyên tố (relatively prime) kích cỡ bảng băm m ngun bảng băm tìm kiếm Bằng khơng, m h2(k) có số chia chung lớn d > với khóa k, đợt tìm kiếm khóa k xem xét thứ (1/d) bảng băm Một cách tiện dụng để bảo đảm điều kiện cho m lũy thừa thiết kế h2 cho ln tạo số lẻ Một cách khác cho m số nguyên tố thiết kế h2 cho ln trả số ngun dương nhỏ m Ví dụ, ta chọn số nguyên tố m cho: h1(k) = k mod m, h2(k) = + (k mod m’), m’ chọn nhỏ m ( giả sử, m – m – ) Ví dụ, k = 123456 , m = 701 m’ = 700, ta có h 1(k) = 80 h2(k) = 257, lần thăm định vị 80, khe thứ 257 (modulo m) xem xét tìm thấy khóa khe xem xét Kỹ thuật băm đôi cải thiện so với thăm dị tuyến tính bậc hai chỗ  (m2) dãy thăm dò dùng, thay  (m), cặp (h1(k)), h2(k)) cho dãy thăm dò riêng biệt, ta thay đổi khóa, vị trí thăm dị ban đầu h1(k) độ dịch vị h2(k) thay đổi cách độc lập Kết là, khả thực kỹ thuật băm đôi tỏ sát với khả thực lược đồ “ lý tưởng” kỹ thuật băm 2.4.4 Phân tích kỹ thuật băm địa mở Giống phân tích dây chuyền, việc phân tích kỹ thuật định địa mở diễn tả theo dạng hệ số tải  bảng băm, n m tiến đến vơ Chắc bạn cịn nhớ, n thành phần lưu trữ bảng có m khe, số thành phần trung bình khe  = n/m Tất nhiên, với kỹ thuật định địa mở, ta có tối đa thành phần khe, n m, hàm ý  1 Ta mặc nhận kỹ thuật băm dùng Trong lược đồ lý tưởng hóa này, dãy thăm dị khóa k có khả phép hoán vị Nghĩa là, xét phép phân phối xác suất khơng gian khóa phép tốn hàm băm khóa, dãy thăm dị có khả Giờ đây, ta phân tích số lần thăm dị dự trù kỹ thuật băm phương pháp định địa mở giả thiết kỹ thuật băm đều, ban đầu phân tích số lần thăm dị thực đợt tìm kiếm khơng thành cơng Định lý Cho bảng băm địa mở với hệ số tải  = n/m < 1, số lần thăm dò dự trù đợt tìm kiếm khơng thành cơng tối đa 1/ (1 -  ), mặc nhận kỹ thuật băm Chứng minh Trong đợt tìm kiếm khơng thành cơng, thăm dị ngoại trừ lần thăm dị cuối truy cập khe đầy khơng chứa khóa muốn có, khe cuối thăm dị trống Ta định nghĩa biến ngẫu nhiên X số thăm dị tạo tìm kiếm không thành công định nghĩa kiện Ai , với i = 1, 2,… đến số kiện mà lần thăm dị thứ i thăm dò khe đầy Sụ kiện {X i} giao kiện A1  A2  …  Ai-1 Chúng ta giới hạn Pr {X i} giới hạn Pr{A1  A2  …  Ai-1} Pr{A1  A2  …  Ai-1} = Pr{A1}· Pr{A2|A1}· Pr{A3|A1∩ A2}· · Pr{Ai-1| A1  A2  …  Ai-2} Ta có n thành phần m khe, Pr{A 1} = n/m Cho j>1, khả mà dị tìm thứ j khe đầy cho ta dị tìm j – mà khe đầy (n – j + 1)/ (m – j + 1) Khả xảy tìm thành phần lại (n – (j – 1)) thành phần (m – (j – 1)) khe không kiểm tra, với giả thiết băm đều, khả có tỷ lệ lớn số Nhận xét n

Ngày đăng: 23/06/2021, 13:33

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w