Làm thế nào để tránh xếp tầng thay đổi kích thước khi thay đổi kích thước bảng băm?


8

Với các phương pháp giải quyết va chạm thông thường như tách chuỗi và thăm dò tuyến tính / bậc hai, trình tự thăm dò cho một khóa có thể dài tùy ý - đơn giản là nó được giữ ngắn với xác suất cao bằng cách giữ hệ số tải của bảng thấp. Do đó, va chạm trong quá trình luyện lại không phải là vấn đề vì chúng không ảnh hưởng đến hệ số tải.

Tuy nhiên, với băm cuckoo (và các phương pháp khác cung cấp thời gian tra cứu O (1) trong trường hợp xấu nhất?), Việc thay đổi kích thước phải xảy ra khi trình tự thăm dò cho một khóa quá dài. Nhưng khi các phím bị xáo trộn trong quá trình thử lại, có thể là chúng tạo ra một chuỗi thăm dò quá dài cho một phím, yêu cầu thay đổi kích thước khác - có thể nhiều lần, nếu điều này xảy ra nhiều lần liên tiếp. Xác suất là nhỏ, đặc biệt là với hàm băm tốt, nhưng tôi đã thấy điều đó xảy ra.

Có cách nào - không rõ ràng tạo ra một hàm băm hoàn hảo trong quá trình thử lại - để đảm bảo rằng thay đổi kích thước không thể xếp tầng theo cách này? Có thể cụ thể cho một kế hoạch giải quyết va chạm nhất định? Các tài liệu tôi đã gặp cho đến nay dường như hoàn toàn che đậy vấn đề. Hãy nhớ rằng tôi cũng quan tâm đến việc thu nhỏ các bảng băm, không chỉ phát triển chúng.

Câu trả lời:


1

Bạn hỏi làm thế nào để tránh xếp tầng, nhưng bạn đã đưa ra câu trả lời trong bài viết của mình. Bạn giữ xác suất rằng các sự kiện xấu xảy ra nhỏ.

Kể từ khi bạn đề cập đến băm cuckoo. Xác suất mà bạn nhận được một chuỗi thăm dò dài là . Vì vậy, nếu bạn làm lại, bạn đang chèn phần tử từ đầu. Xác suất làm lại không thành công là , vì vậy với xác suất rất cao bạn thành công. Trong kỳ vọng bạn chỉ cần một số lần thử không đổi. Nếu bạn quan sát thấy bạn có vấn đề với việc luyện lại, thì bạn nên tăng kích thước bảng và sửa đổi hệ số tải của mình. Ngoài ra, bạn có thể chọn một họ hàm băm tốt hơn.Ôi(1/n2)nÔi(1/n)


-1

Tôi tin rằng tôi có một giải pháp, lấy cảm hứng từ băm tuyến tính :

Nếu (các) hàm băm được giữ cố định (nghĩa là không thay đổi khi thay đổi kích thước) và bảng luôn được tăng lên bằng cách nhân đôi các vị trí, thì sau khi bảng được tăng lên, nó sẽ giữ

Hmod2L= ={HmodL+Lhoặc làHmodL

Trong đó là hàm băm của khóa và là số vị trí cũ. Điều này có nghĩa là một khóa sẽ ở đúng vị trí của nó hoặc di chuyển đến một vị trí duy nhất trong khu vực mới được phân bổ, được đảm bảo trống.HL

Để áp dụng điều này cho băm cuckoo (d-ary), chỉ cần thay đổi kích thước từng phụ đề riêng lẻ và không di chuyển các phím giữa các phụ đề.

Để thu nhỏ bảng, bạn cần xác nhận rằng một trong là bỏ trống cho mọi khóa trong bảng và nếu vậy, hãy di chuyển tất cả chúng vào các khe . Tất nhiên, đây là ... Tôi không chắc có cách nào tốt hơn để thực hiện việc kiểm tra cho mỗi lần xóa sau khi hệ số tải giảm xuống dưới một nửa.{HmodL2+L2, HmodL2}HmodL2Ôi(n)


Tôi không chắc điều này hoạt động. Nếu hàm băm của bạn là h (x) = c, đối với một số c không đổi thì sao?
jbapple
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.