(Khi nào) là bảng băm tra cứu O (1)?


71

Người ta thường nói rằng tra cứu bảng băm hoạt động trong thời gian không đổi: bạn tính toán giá trị băm, cung cấp cho bạn một chỉ mục cho một tra cứu mảng. Tuy nhiên, điều này bỏ qua va chạm; trong trường hợp xấu nhất, tất cả các mục sẽ xảy ra với đất trong xô cùng và thời gian tra cứu trở nên tuyến tính ( ).Θ(n)

Có các điều kiện trên dữ liệu có thể thực hiện tra cứu bảng băm thực sự không? Có phải đó chỉ là trung bình, hoặc một bảng băm có thể tra cứu trường hợp xấu nhất O ( 1 ) không?O(1)O(1)

Lưu ý: Tôi đến từ quan điểm của một lập trình viên ở đây; Khi tôi lưu trữ dữ liệu trong bảng băm, hầu như luôn luôn là chuỗi hoặc một số cấu trúc dữ liệu tổng hợp và dữ liệu thay đổi trong suốt vòng đời của bảng băm. Vì vậy, trong khi tôi đánh giá cao câu trả lời về băm hoàn hảo, chúng dễ thương nhưng là giai thoại và không thực tế theo quan điểm của tôi.

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


3
Bạn có thể sống với thời gian truy cập được khấu hao không? Nói chung, hiệu suất của bảng băm sẽ phụ thuộc rất nhiều vào số lượng chi phí cho các hàm băm thưa thớt mà bạn chuẩn bị chịu đựng và cách phân phối các giá trị băm thực tế. O(1)
Raphael

5
Ồ, btw: bạn có thể tránh hành vi xấu nhất tuyến tính bằng cách sử dụng cây tìm kiếm (cân bằng) thay vì danh sách.
Raphael

1
@Raphael Tôi sẽ rất thích thú với câu trả lời giải thích (dọc theo đường rộng) khi tôi có thể tin tưởng vào được khấu hao và khi nào tôi không thể. Đối với cách các giá trị băm được phân phối, đó thực sự là một phần của câu hỏi của tôi: làm thế nào tôi có thể biết? Tôi biết các hàm băm được cho là phân phối giá trị tốt; nhưng nếu họ luôn luôn làm điều tồi tệ nhất sẽ không bao giờ đạt được, điều đó không có ý nghĩa. O(1)
Gilles

1
Cũng cẩn thận tối ưu hóa sớm; đối với dữ liệu nhỏ (vài nghìn phần tử) tôi thường thấy các cây nhị phân cân bằng vượt trội hơn các hàm băm do chi phí thấp hơn (so sánh chuỗi rẻ hơn rất nhiều so với giá trị băm chuỗi). O(logn)
isturdy

Câu trả lời:


41

Có hai cài đặt theo đó bạn có thể nhận được lần trong trường hợp xấu nhất.O(1)

  1. Nếu thiết lập của bạn là tĩnh, thì băm FKS sẽ giúp bạn đảm bảo trường hợp xấu nhất . Nhưng như bạn đã chỉ ra, cài đặt của bạn không tĩnh.O(1)

  2. Nếu bạn sử dụng băm Cuckoo, thì các truy vấn và xóa là trường hợp xấu nhất , nhưng việc chèn chỉ là O ( 1 ) . Băm cuckoo hoạt động khá tốt nếu bạn có giới hạn trên của tổng số lần chèn và đặt kích thước bảng lớn hơn khoảng 25%.O(1)O(1)

Có nhiều thông tin hơn ở đây .


3
Bạn có thể mở rộng trên FKS và Cuckoo không? Cả hai điều khoản đều mới đối với tôi.
Gilles

1
Thế còn băm hoàn hảo năng động? Nó có tra cứu trường hợp xấu nhất và O ( 1 ) chèn và xóa khấu hao. ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.8165 )O(1)O(1)
Joe

2
FKS là tên viết tắt của (Fredman, Komlós, Szemerédi) và Cuckoo là tên của một loài cầu. Nó được sử dụng cho kiểu băm này, bởi vì chim cu gáy đẩy trứng ra khỏi tổ. Điều này giống như cách thức hoạt động của phương thức này.
uli

1
@Suresh: Thật sao? Tôi nghĩ bạn cần chức năng -independent, mà tôi luôn gắn liền với tăng thể cần. Tôi đứng sửa. Sẽ xóa bình luận của tôi trong một chút. logn
Louis

1
Để đưa ra nhận xét hữu ích hơn cho câu trả lời này, như @Suresh chỉ ra, băm cuckoo sẽ hoạt động tốt mà không cần các hàm băm ưa thích (và lớn) được sử dụng để phân tích về mặt lý thuyết.
Louis

21

Câu trả lời này tóm tắt các phần của TAoCP Vol 3, Ch 6.4.

Giả sử chúng ta có một tập hợp các giá trị , n trong đó chúng ta muốn lưu trữ trong một mảng A có kích thước m . Chúng tôi sử dụng hàm băm h : V [ 0 .. M ) ; thường, M « | V | . Chúng tôi gọi là α = nVnAmh:V[0..M)M|V| cáchệ số tảicủaMột. Ở đây, chúng ta sẽ giả sửm=M; trong các kịch bản thực tế, chúng ta cómM, tuy nhiên, và phải tự vẽ bản đồ xuốngm.α=nmAm=MmMm

hO(1)

[0..M)CnSCnU

Xâu chuỗi

nm

CnS1+α2 and CnU1+α22.

Probing tuyến tính

Khi chèn (resp. Tìm kiếm một giá trị) , hãy kiểm tra các vị trí h ( v ) , h ( v ) - 1 , Vượt , 0 , m - 1 , Điên , h (v

h(v),h(v)1,,0,m1,,h(v)+1
vα1
CnS12(1+11α) and CnU12(1+(11α)2).
α<0.75

Băm đôi

M

CnS1αln(11α) and CnU11α.

Lưu ý rằng việc loại bỏ các phần tử khỏi và mở rộng các bảng có mức độ khó khác nhau cho các phương thức tương ứng.

O(1)αh


h
Hashtable


10

S{0,1,2,...,n}O(1)O(1)lSlxxSO(|l|)SO(|S|)O(|l|+|S|)O(|l||S|)O(log(|l|)|S|)O(|l|)l

O(|l|)

lUNSUxSllh:U{true,false}hh(x)=falsexUylh(y)=trueO(|l|)O(|U|)

lO(|U|)O(|1|)O(|U|)

Uh


O(|l|)O(|S|)O(|l||S|)

hh:U{false,true}h

@Gilles Về cơ bản, nó chỉ được sử dụng như một bảng tra cứu cho danh sách thành viên. Khi bạn có một hàm băm hoàn hảo với nghịch đảo đã biết & rẻ tiền, thay vì tự lưu trữ thứ đó, bạn chỉ cần lưu trữ 1 bit (cho dù điều đó với hàm băm duy nhất đã được thêm vào). Nếu có thể va chạm, tôi nghĩ rằng việc này được gọi là bộ lọc Bloom, nhưng trong mọi trường hợp có thể cung cấp "không" nhất định cho câu hỏi về tư cách thành viên, điều này vẫn hữu ích trong nhiều tình huống.
Patrick87

9

O(1)

O(1)O(1)O(1)O(1)


Một hàm băm hoàn hảo sẽ là hoàn hảo, nhưng làm thế nào để tôi có được một hàm? Tôi sẽ phải trả bao nhiêu cho nó? Và làm thế nào để tôi biết số lượng va chạm tối đa hoặc dự kiến ​​là gì?
Gilles

2
@Gilles một hàm băm hoàn hảo là bất kỳ hàm nào sẽ tạo ra một hàm băm duy nhất cho tất cả các đầu vào có thể. Nếu đầu vào có thể của bạn là hữu hạn (và duy nhất), điều này rất dễ thực hiện.
Rafe Kettler

1
@RafeKettler Đầu vào của tôi thường là các chuỗi hoặc cấu trúc dữ liệu hỗn hợp và tôi thường thêm và xóa các mục nhập khi dữ liệu của tôi phát triển. Làm thế nào để tôi tạo ra một hàm băm hoàn hảo cho việc này?
Gilles

4
Vâng, nhưng đó là điểm. Hàm băm hoàn hảo xác định không tồn tại nếu miền lớn hơn phạm vi.
Suresh

@Suresh: Nếu bạn được phép chọn một hàm băm mới và tăng kích thước của bảng bất cứ khi nào có xung đột, bạn luôn có thể tìm thấy hàm băm (xác định) - cho dữ liệu đã có trong bảng cộng với một dữ liệu mới mục bạn đang cố gắng chèn - không có va chạm (là "hoàn hảo"). Đó là lý do tại sao băm hoàn hảo động định kỳ chọn một hàm băm mới ngẫu nhiên.
David Cary
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.