Có một hàm băm cho một tập hợp (nghĩa là nhiều tập hợp) các số nguyên có đảm bảo lý thuyết tốt không?


36

Tôi tò mò liệu có cách nào để lưu trữ hàm băm của nhiều bộ số nguyên có các thuộc tính sau không, lý tưởng nhất là:

  1. Nó sử dụng không gian O (1)
  2. Nó có thể được cập nhật để phản ánh việc chèn hoặc xóa trong thời gian O (1)
  3. Hai bộ sưu tập giống hệt nhau (nghĩa là các bộ sưu tập có cùng các phần tử có cùng bội số) phải luôn luôn băm với cùng một giá trị và hai bộ sưu tập riêng biệt nên băm thành các giá trị khác nhau với xác suất cao (nghĩa là hàm độc lập hoặc độc lập theo cặp)

Một nỗ lực ban đầu ở đây sẽ là lưu trữ modulo sản phẩm một số nguyên tố ngẫu nhiên trong số băm của các phần tử riêng lẻ. Điều này thỏa mãn 1 và 2 nhưng không rõ liệu nó hay biến thể gần đúng sẽ thỏa mãn 3.

Ban đầu tôi đã đăng bài này lên StackOverflow .

* Thuộc tính 1 và 2 có thể được nới lỏng một chút, giả sử O (log n) hoặc đa thức tuyến tính nhỏ. Vấn đề là để xem liệu chúng ta có thể xác định nhiều bộ và kiểm tra sự bình đẳng một cách đáng tin cậy mà không cần lưu trữ các phần tử không.


Đại diện của bạn của multisets là gì? Tức là, làm thế nào để bạn mã hóa một multiset dưới dạng một chuỗi bit? Nếu bạn thực sự muốn có các hoạt động thời gian (độc lập với kích thước của multiset), tôi nghĩ bạn nên làm cho mã hóa rõ ràng. O(1)
Jukka Suomela

Mã hóa của các bộ là không quan trọng. Hàm băm phải độc lập với biểu diễn của các tập hợp. Nếu tôi đang sử dụng biểu diễn chính tắc của tập băm, thì bất kỳ hàm băm tiêu chuẩn nào trên biểu diễn bit của tập hợp sẽ thỏa mãn 3 và có thể là 1, nhưng không phải 2. Tôi nên thêm rằng hai tập hợp bằng nhau sẽ luôn luôn băm với cùng một giá trị.
jonderry

Chính xác ý bạn là gì bởi 2? Bạn có nhận được bộ cũ, mã băm cũ và phần tử mới và bạn muốn tính mã băm mới không? Hay bạn chỉ nhận được mã băm cũ và phần tử mới?
Mihai

Lý tưởng nhất, bạn sẽ không cần bộ cũ. Bạn thậm chí không cần phải có khả năng thực hiện các truy vấn thành viên (quan trọng, được đưa ra giới hạn không gian), chỉ cần kiểm tra tính bằng, có thể thông qua so sánh các giá trị băm có xác suất dương tính giả thấp.
jonderry

Câu trả lời:


17

Nếu bạn nghĩ rằng các bộ như sống trong vũ trụ , thì khá dễ dàng để giải quyết vấn đề của bạn với thời gian cập nhật . Tất cả những gì bạn cần là một hàm băm nhanh cho một vectơ số , với "cập nhật cục bộ" nhanh.O ( lg u ) bạn[u]O(lgu)u

Wikipedia / Universal băm gợi ý , trong đó là một số nguyên tố đủ lớn và được rút ra đồng đều từ . Khi bạn thêm hoặc xóa phần tử , bạn phải thêm / bớt khỏi mã băm, mất thời gian bằng cách sử dụng phép chia và chinh phục cho phép lũy thừa. Do đa thức bậc chỉ có thể có gốc , nên xác suất va chạm cho hai tập hợp riêng biệt là . Điều này có thể được thực hiện rất nhỏ bằng cách lấy đủ lớn (ví dụ: p a [ p ] i a i O ( lg i ) u u O ( u / p ) p p = u 2 [ u ]h(x)=(i=1uxiai)modppa[p]iaiO(lgi)uuO(u/p)pp=u2và bạn làm việc trong "độ chính xác kép"). Nếu các bộ nhỏ hơn nhiều so với , tất nhiên bạn có thể bắt đầu bằng cách băm vũ trụ xuống vũ trụ nhỏ hơn.[u]

Có ai biết một giải pháp với xác suất va chạm khi băm đến phạm vi không? Điều này nên có thể.[ p ]O(1/p)[p]


0

Carter và Wegman trình bày điều này trong các hàm băm mới và việc sử dụng chúng trong xác thực và thiết lập sự bình đẳng ; nó rất giống với những gì bạn mô tả. Về cơ bản, hàm băm giao hoán có thể được cập nhật một yếu tố tại một thời điểm để chèn và xóa và khớp xác suất cao, trong O (1).


Tôi nghĩ rằng điều này chỉ hoạt động trên các bộ, không phải là multisets (như câu hỏi yêu cầu). Từ Phần 5, ở cuối trang 274: "THÊM (x, S) -Thêm phần tử x vào tập hợp có tên S. Thao tác này có thể không được sử dụng nếu x đã là thành viên của S."
jbapple

Bạn đúng; Tôi đã bỏ lỡ phần "đa". Có vẻ như hàm băm có thể xử lý các bản sao, mặc dù tôi không có trích dẫn cho nó.
Máy xay sinh tố

-2

Chất lượng của hàm băm sẽ luôn phụ thuộc vào các thuộc tính của các phần tử mà nó phải băm. Bạn có thể nói điều gì về điều này? Chẳng hạn, đề xuất sản phẩm của bạn có thể là hàm băm kém nếu các phần tử x_i của multiset của bạn thường có nhiều thừa số nguyên tố nhỏ. Nhưng bạn có thể cải thiện nó trong trường hợp này chỉ bằng cách lấy sản phẩm của tất cả x_i + p mod q cho một số số nguyên tố p và q.


1
Vâng, đó là lý do để lấy băm của các yếu tố riêng lẻ trước khi nhân chúng lại với nhau.
jonderry

Gì? Đề xuất của OP chỉ đơn giản là nhân tất cả chúng lại với nhau, phải không? Tôi đang nói rằng nếu bạn thêm một hằng số cho mỗi trước khi bạn làm điều này, bạn có thể có được hàm băm tốt hơn.
TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

tổng cho phép chúng ta có nhiều lần xuất hiện của cùng một giá trị
, xor cho phép chúng ta có các tập hợp với cùng một số tiền

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.