Câu chuyện mà bảng băm được khấu hao theo là một lời nói dối một sự đơn giản hóa. Θ(1)
Điều này chỉ đúng nếu:
- Lượng dữ liệu để băm trên mỗi mục là không đáng kể so với số lượng K eys và tốc độ băm của một mắt K là nhanh - .
- Số lượng ollutions C nhỏ - c .
- Chúng tôi không tính đến thời gian cần thiết để R esize bảng băm - r .k
c
r
Chuỗi lớn để băm
Nếu giả thiết đầu tiên là sai thời gian chạy sẽ đi lên đến .
Điều này chắc chắn đúng với các chuỗi lớn, nhưng đối với các chuỗi lớn, một phép so sánh đơn giản cũng sẽ có thời gian chạy là Θ ( k ) . Vì vậy, một băm không là tiệm chậm, mặc dù băm sẽ luôn chậm hơn so với một so sánh đơn giản, bởi vì so sánh có một lựa chọn đầu ra ergo O ( 1 ) , Ω ( k ) và băm luôn luôn phải băm đầy đủ chuỗi O ( k ) , Ω ( k )Θ(k)
Θ(k)O(1)Ω(k)O(k)Ω(k).
Lưu ý rằng số nguyên tăng trưởng rất chậm. 8 byte có thể lưu trữ giá trị lên tới ; 8 byte là một lượng nhỏ để băm.
Nếu bạn muốn lưu trữ các gợi ý thì chỉ cần nghĩ về chúng như các chuỗi. 1018
Thuật toán băm chậm
Nếu số tiền băm chi tiêu là không đáng kể so với việc lưu trữ dữ liệu thì rõ ràng giả định trở nên không thể thực hiện được.
Trừ khi băm mật mã được sử dụng, điều này không phải là một vấn đề.Θ(1)
Rằng điều quan trọng là > > k . Chừng nào chứa Θ ( 1 ) là một tuyên bố công bằng.n >> kΘ(1)
Nhiều va chạm
Nếu chức năng băm kém, hoặc bảng băm nhỏ hoặc kích thước của bảng băm là va chạm vụng về sẽ xảy ra thường xuyên và thời gian chạy sẽ chuyển sang .
Nên chọn chức năng băm để các va chạm hiếm khi xảy ra trong khi vẫn nhanh nhất có thể, khi nghi ngờ lựa chọn ít va chạm hơn với chi phí băm chậm hơn.
Một nguyên tắc nhỏ là bảng băm phải luôn đầy dưới 75%.
Và kích thước của bảng băm không nên có bất kỳ mối tương quan nào với chức năng băm.
Thông thường kích thước của bảng băm là (tương đối) nguyên tố. O(log(n))
Thay đổi kích thước bảng băm
Vì một bảng băm gần đầy sẽ tạo ra quá nhiều va chạm và bảng băm lớn (trống) là một sự lãng phí không gian, nhiều triển khai cho phép bảng băm phát triển (và thu nhỏ!) Khi cần.
Sự phát triển của một bảng có thể liên quan đến một bản sao đầy đủ của tất cả các mục (và có thể là cải tổ lại), vì việc lưu trữ cần phải liên tục vì lý do hiệu suất.
Chỉ trong các trường hợp bệnh lý, việc thay đổi kích thước của bảng băm mới là một vấn đề để thay đổi kích thước (tốn kém nhưng hiếm) được khấu hao qua nhiều cuộc gọi.
Chạy thời gian
Vì vậy, thực tế thời gian chạy của một bảng băm là .
Trung bình mỗi k , c , r được giả sử là hằng số (nhỏ) trong thời gian chạy được khấu hao và do đó chúng tôi nói rằng Θ ( 1 ) là một tuyên bố công bằng. Θ(kcr)
kcrΘ(1)
Để quay lại câu hỏi của bạn
Xin vui lòng cho tôi biết cách diễn giải, tôi đã cố gắng trích xuất các bộ ý nghĩa khác nhau, hãy bình luận nếu tôi bỏ lỡ một số
Bạn dường như quan tâm đến độ dài của đầu ra của hàm băm. Hãy gọi đây là ( n thường được coi là số lượng vật phẩm được băm). m sẽ là l o g ( n ) vì m cần xác định duy nhất một mục trong bảng băm.
Điều này có nghĩa là m phát triển rất chậm. Với 64 bit, số lượng mục băm sẽ chiếm một phần lớn của RAM có sẵn trên toàn thế giới. Với 128 bit, nó sẽ vượt xa lưu trữ đĩa có sẵn trên trái đất.
Tạo băm 128 bit không khó hơn băm 32 bit, vì vậy không , thời gian để tạo băm không phải là O (mnmlog(n)
(hoặc O ( l o g ( n ) ) nếu bạn muốn). O(m)O(log(n))
Hàm băm đi qua các bit của phần tử sẽ mất thời gian Θ ( l o g ( n ) ) . log(n)Θ(log(n))
Nhưng hàm băm không đi qua các bit của các phần tử.
Mỗi một mục (!!) nó chỉ đi qua dữ liệu .
Ngoài ra độ dài của đầu vào (k) không liên quan đến số lượng phần tử. Điều này quan trọng, bởi vì một số thuật toán không băm phải kiểm tra nhiều phần tử trong bộ sưu tập để tìm phần tử phù hợp (không).
Bảng băm chỉ thực hiện trung bình 1 hoặc 2 so sánh cho mỗi mục được xem xét trung bình trước khi đưa ra kết luận. O ( k )log(n)
O(k)
Tại sao các bảng băm hiệu quả để lưu trữ các phần tử có độ dài thay đổi?
Bởi vì không phân biệt độ dài của đầu vào ( ), độ dài của đầu ra ( ) luôn giống nhau, va chạm rất hiếm và thời gian tra cứu là không đổi.
Tuy nhiên, khi độ dài khóa tăng lên so với số lượng vật phẩm trong bảng băm ( ) thì câu chuyện thay đổi ...m k nkm
kn
Tại sao các bảng băm hiệu quả để lưu trữ các chuỗi lớn?
Các bảng băm không hiệu quả lắm đối với các chuỗi rất lớn.
not n>>kΘ(k)k1 ≠ k2
Θ(1)
Θ(1)