Đối với loại dữ liệu nào là bảng băm hoạt động O (1)?


18

Từ câu trả lời đến (Khi nào) là bảng băm tra cứu O (1)? , Tôi tập hợp rằng các bảng băm có hành vi trong trường hợp xấu nhất , ít nhất là được khấu hao, khi dữ liệu thỏa mãn các điều kiện thống kê nhất định và có các kỹ thuật để giúp các điều kiện này được mở rộng.Ôi(1)

Tuy nhiên, từ quan điểm của một lập trình viên, tôi không biết trước dữ liệu của mình sẽ là gì: nó thường đến từ một số nguồn bên ngoài. Và tôi hiếm khi có tất cả dữ liệu cùng một lúc: thường việc chèn và xóa xảy ra với tốc độ không quá thấp so với tốc độ tra cứu, do đó, tiền xử lý dữ liệu để tinh chỉnh chức năng băm đã hết.

Vì vậy, thực hiện một bước: đưa ra một số kiến ​​thức về nguồn dữ liệu, làm cách nào tôi có thể xác định liệu bảng băm có cơ hội có các hoạt động hay không và có thể sử dụng các kỹ thuật nào trên hàm băm của tôi?Ôi(1)


Ồ, và bảng Hash so với cây nhị phân có liên quan, nhưng ở đây tôi đang tập trung vào bảng băm và khi nào chúng (hoặc không) ở mức tốt nhất.
Gilles 'SO- ngừng trở thành ác quỷ'

Trường hợp tốt nhất cho bất kỳ hàm băm nào là khi dữ liệu được phân phối đồng đều.
0x0

@Sunil: Không đúng. Bạn có thể có các hàm băm phù hợp.
Raphael

Tôi nghĩ rằng câu hỏi này là quá rộng. Cụ thể, bạn có thể cụ thể hóa kiến ​​thức về các nguồn dữ liệu sẽ như thế nào không?
Raphael

@Raphael Ví dụ: nếu các khóa là các chuỗi: tên người, tên tệp trong một thư mục, thẻ XML, băm tệp, thì
SO - dừng lại là xấu xa '

Câu trả lời:


4

Có một số kỹ thuật đảm bảo rằng việc tra cứu sẽ luôn yêu cầu các thao tác O (1), ngay cả trong trường hợp xấu nhất.

Làm cách nào tôi có thể xác định liệu bảng băm có cơ hội có các hoạt động O (1) hay không và có thể sử dụng các kỹ thuật nào trên hàm băm của tôi không?

Trường hợp xấu nhất xảy ra khi một số kẻ tấn công độc hại (Mallory) cố tình cung cấp cho bạn dữ liệu mà Mallory đã chọn cụ thể để làm cho hệ thống chạy chậm.

Khi bạn đã chọn một số hàm băm cụ thể, có thể quá lạc quan khi cho rằng Mallory sẽ không bao giờ tìm ra hàm băm nào bạn đã chọn. Khi Mallory phát hiện ra hàm băm nào bạn đã chọn, nếu bạn cho phép Mallory cung cấp cho bạn nhiều dữ liệu được chèn vào bảng băm của bạn bằng hàm băm đó, thì bạn sẽ bị tiêu diệt: Mallory có thể nhanh chóng tạo ra hàng tỷ mục dữ liệu, băm chúng với Hàm băm để tìm mục dữ liệu nào có khả năng va chạm và sau đó cung cấp cho bạn hàng triệu mục dữ liệu có khả năng va chạm, dẫn đến việc tra cứu chạy chậm hơn O (1).

Tất cả các kỹ thuật đảm bảo "tra cứu O (1) ngay cả trong trường hợp xấu nhất" đều tránh được vấn đề này bằng cách thực hiện thêm một chút công việc trên mỗi lần chèn để đảm bảo rằng, trong tương lai, mọi tra cứu có thể có thể thành công trong thời gian O (1) . Cụ thể, chúng tôi giả định (trường hợp xấu nhất) rằng Mallory sẽ sớm phát hiện ra hàm băm nào chúng tôi đang sử dụng; nhưng anh ta chỉ có cơ hội chèn một vài mục dữ liệu trước khi chúng tôi chọn một hàm băm khác - băm bảng hoặc một số băm phổ quát khác - một mục mà chúng tôi đặc biệt chọn sao cho tất cả dữ liệu chúng tôi có thể tìm kiếm trong 2 hoặc 3 đầu dò - tức là O (1). Vì chúng tôi chọn ngẫu nhiên chức năng này, chúng tôi có thể khá chắc chắn rằng Mallory sẽ không biết chúng tôi đã chọn chức năng nào trong một thời gian. Ngay cả khi Malloryngay lập tức cung cấp cho chúng tôi dữ liệu rằng, ngay cả với hàm băm mới này, va chạm với dữ liệu trước đó, sau đó chúng tôi có thể chọn một hàm băm mới khác để sau khi thử lại, tất cả dữ liệu trước đây mà anh ấy và mọi người đã cung cấp cho chúng tôi có thể được xem trong 2 hoặc 3 đầu dò trong trường hợp xấu nhất - nghĩa là tra cứu O (1) trong trường hợp xấu nhất.

Thật dễ dàng để chọn ngẫu nhiên một hàm băm mới và thường xuyên kiểm tra lại toàn bộ bảng để đảm bảo rằng mỗi lần tra cứu luôn là O (1). Mặc dù điều này đảm bảo rằng mỗi lần tra cứu luôn là O (1), nhưng các kỹ thuật này, khi chèn mục thứ N vào bảng băm có chứa các mục N-1, đôi khi có thể cần thời gian O (N) cho lần chèn đó. Tuy nhiên, có thể thiết kế hệ thống sao cho ngay cả khi Mallory cố tình cung cấp cho bạn dữ liệu mới, bằng cách sử dụng hàm băm mới, va chạm với dữ liệu trước đó, hệ thống có thể chấp nhận nhiều mục từ Mallory và các mục khác trước khi cần thực hiện xây dựng lại toàn bộ O (N). Các kỹ thuật bảng băm chọn một chức năng mới và thử nghiệm lại để đảm bảo tra cứu O (1), ngay cả trong trường hợp xấu nhất, bao gồm:

  • băm cuckoo đảm bảo rằng mỗi lần tra cứu khóa thành công với tối đa 2 phép tính băm và 2 lần tra cứu bảng.
  • băm hopscotch đảm bảo rằng mỗi lần tra cứu khóa thành công sau khi kiểm tra các mục nhỏ H (có lẽ H = 32) liên tiếp trong bảng.
  • băm hoàn hảo năng động - bài báo năm 1994 của Dietzfelbinger là bài đầu tiên tôi đọc đã chỉ ra rằng, mặc dù nó diễn tập "thường xuyên" để đảm bảo rằng mỗi lần tra cứu khóa luôn thành công với 2 phép tính băm và 2 lần tra cứu, điều đó là có thể để thực hiện một bản phát lại đầy đủ, hiếm khi mặc dù mỗi bản phát lại đầy đủ sử dụng thời gian O (n), chi phí trung bình dự kiến ​​của việc chèn và xóa được khấu hao O (1).

Cấu trúc dữ liệu / Bảng băm




5

hmột,b(x)= =mộtx+bmodp

Trước đây, theo một bài báo Usenix của Crosby và Wallach , các ngôn ngữ lập trình phổ biến đã không làm bất cứ điều gì như thế này, khiến nhiều ứng dụng web (và các máy chủ khác) mở ra một cuộc tấn công DoS dựa trên các va chạm sản xuất. (Bài viết từ năm 2003, nhưng nó cho thấy Dan Bernstein đã phát hiện ra ý tưởng tương tự sớm hơn một chút.)

Một tìm kiếm nhanh trên google cung cấp các tuyên bố rằng trạng thái hiện đại về mặt triển khai vừa được cải thiện vừa không được cải thiện .

Một khía cạnh khác là trong một thế giới băng thông cao, các cuộc tấn công thời gian làm cho việc tìm kiếm va chạm trực tuyến không quá khó khăn (trái ngược với ngoại tuyến như liên kết Crosby-Wallach gợi ý). Tôi dường như nhớ rằng Daniel Golovin đã có kết quả vài năm trước về các cấu trúc dữ liệu không dễ bị tấn công thời gian, nhưng tôi không biết liệu chúng có được sử dụng rộng rãi không.


0

Phân tích trường hợp trung bình cho các bảng băm được thực hiện theo giả định thông thường về tính đồng nhất của các yếu tố đầu vào, điều này từng xảy ra do dao cạo của thỉnh thoảng.

Nếu bạn có kiến ​​thức bổ sung về tên miền và phân phối khóa, bạn có thể thực hiện phân tích trường hợp trung bình tương tự và thay thế phân phối thống nhất bằng phân phối của bạn và tính toán lại các kỳ vọng, ít nhất là trên lý thuyết.

Tất nhiên, khó khăn bắt nguồn từ thực tế là phân tích trường hợp avaerage không đồng nhất 'rất khó thực hiện. Và kiến ​​thức của bạn, có thể không thể diễn đạt thuận tiện như một bản phân phối có thể được sử dụng dễ dàng trong phân tích như vậy.

Rõ ràng điều dễ nhất để làm là mô phỏng. Triển khai các bảng băm và tuân theo cách chúng thực hiện cho bộ đầu vào điển hình của bạn.


8
Tôi phải không đồng ý với câu đầu tiên. Giả định tiêu chuẩn là hàm băm là ngẫu nhiên, không phải dữ liệu đầu vào. Giả sử dữ liệu phân phối đồng đều đẩy phân tích vào vương quốc của dữ liệu thế giới thực giả tưởng không bao giờ thống nhất! Nhưng có những kỹ thuật sách giáo khoa để làm cho hàm băm đủ thống nhất. Xem băm phổ quátbăm lập bảng cụ thể .
JeffE

@JeffE Hãy nhìn vào phân tích trường hợp trung bình trong câu trả lời của Raphael, ông nêu giả định về tính đồng nhất này. Bạn không thể thực hiện phân tích trường hợp trung bình mà không có phân phối. Bạn phải chọn một và nếu không được đưa ra, dao cạo của thỉnh thoảng gợi ý đồng phục.
uli

6
Tất nhiên bạn có một bản phân phối; đó là phân phối bạn sử dụng để chọn hàm băm. Chọn phân phối cho dữ liệu đầu vào cũng giống như tìm kiếm các khóa bị mất của bạn dưới cột đèn; chắc chắn, ánh sáng tốt hơn, nhưng đó có lẽ không phải là nơi bạn đánh rơi chúng.
JeffE

@JeffE Đó là cách phân tích trường hợp trung bình được thực hiện, chọn phân phối và bắt đầu tính toán. Như mọi khi sự lựa chọn của phân phối là tranh cãi. Bạn rất hoan nghênh thực hiện phân tích trường hợp trung bình không đồng nhất.
uli

4
Vâng, tôi biết làm thế nào nó được thực hiện. (Kiểm tra hồ sơ của tôi.) Nếu bạn muốn phân tích của mình mang tính dự đoán (đó là toàn bộ điểm phân tích), bạn phải chọn ngẫu nhiên hàm băm. Sau đó, bạn biết phân phối chính xác, bởi vì bạn đã chọn nó.
JeffE

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.