Câu hỏi:
Làm thế nào các giá trị của bảng băm được lưu trữ trong bộ nhớ sao cho không gian nếu được sử dụng hiệu quả và các giá trị không phải di dời thường xuyên?
Hiểu biết hiện tại của tôi (có thể sai):
Giả sử tôi có 3 đối tượng được lưu trữ trong bảng băm. Hàm băm của chúng tạo ra các giá trị này:
- 0
- 10
- 20
Tôi sẽ cho rằng các con trỏ của các đối tượng này sẽ không được lưu trữ tại các địa chỉ bộ nhớ sau bởi vì sẽ có những khoảng trống lớn giữa chúng:
- startOfHashTable + 0
- startOfHashTable + 10
- startOfHashTable + 20
Các bài viết trên Wikipedia về bảng băm nói rằng "chỉ số" được tính toán như vậy:
hash = hashfunc(key)
index = hash % array_size
Vì vậy, trong ví dụ của tôi, các chỉ số sẽ là:
- 0% 3 = 0
- 10% 3 = 1
- 20% 3 = 2
Điều này được thoát khỏi những khoảng trống lớn mà tôi đã đề cập trước đó. Ngay cả với sơ đồ modulo này, vẫn có vấn đề khi bạn thêm nhiều đối tượng vào bảng băm. Nếu tôi thêm một đối tượng thứ tư vào bảng băm, tôi sẽ cần áp dụng% 4 để lấy chỉ mục. Điều đó có làm mất hiệu lực tất cả các% 3 mà tôi đã làm trong quá khứ không? Tất cả những người trước đây của% 3 có cần được chuyển đến vị trí của% 4 không?
hash % table size
nên phân phối đồng đều, không phải là băm chinh no.