Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Băm chia (Hashing by Division) trong cấu trúc dữ liệu


Thảo luận về băm chia. Hàm băm:

h(x) = x mod m

Để dùng hàm này, ta duy trì mảng A[0…m-1], mỗi phần tử là con trỏ đến đầu danh sách liên kết. Danh sách Li được trỏ bởi A[i] chứa tất cả x sao cho h(x) = i. Kỹ thuật này gọi là băm xâu chuỗi (chaining).

Trong bảng băm này, chèn phần tử x mất O(1). Tính i = h(x), thêm x vào đầu Li. Tìm/xóa phần tử không dễ dàng: tính i = h(x), duyệt Li cho đến khi tìm thấy hoặc hết danh sách. Thời gian tương ứng kích thước Li. Nếu tập S chứa 0, m, 2m, 3m… nm, tất cả lưu ở L0, tìm/xóa mất thời gian tuyến tính.

Trường hợp này hiếm. Nếu S phân bố đều độc lập trong U, và u là bội của m, kỳ vọng kích thước mỗi Li chỉ n/m. Lúc này tìm/xóa mất O(1 + α). Để tránh kịch bản xấu, chọn m khôn ngoan: tránh m là lũy thừa của 2, nên chọn m là số nguyên tố không quá gần lũy thừa của 2.