Đây là một lời giải thích trong các điều khoản của giáo dân.
Giả sử bạn muốn lấp đầy thư viện bằng sách và không chỉ nhét chúng vào đó, mà bạn muốn có thể dễ dàng tìm lại chúng khi bạn cần.
Vì vậy, bạn quyết định rằng nếu người muốn đọc một cuốn sách biết tiêu đề của cuốn sách và tiêu đề chính xác để khởi động, thì đó là tất cả những gì nó nên làm. Với tiêu đề, người, với sự trợ giúp của thủ thư, có thể tìm thấy cuốn sách một cách dễ dàng và nhanh chóng.
Vì vậy, làm thế nào bạn có thể làm điều đó? Chà, rõ ràng bạn có thể giữ một số loại danh sách nơi bạn đặt mỗi cuốn sách, nhưng sau đó bạn có cùng một vấn đề như tìm kiếm thư viện, bạn cần tìm kiếm danh sách. Cấp, danh sách sẽ nhỏ hơn và dễ tìm kiếm hơn, nhưng bạn vẫn không muốn tìm kiếm tuần tự từ đầu này đến đầu kia của thư viện.
Bạn muốn một cái gì đó, với tiêu đề của cuốn sách, có thể cung cấp cho bạn vị trí phù hợp ngay lập tức, vì vậy tất cả những gì bạn phải làm chỉ là đi bộ đến kệ bên phải, và lấy cuốn sách.
Nhưng làm thế nào có thể được thực hiện? Vâng, với một chút suy nghĩ khi bạn điền vào thư viện và rất nhiều công việc khi bạn điền vào thư viện.
Thay vì chỉ bắt đầu lấp đầy thư viện từ đầu này sang đầu kia, bạn nghĩ ra một phương pháp nhỏ thông minh. Bạn lấy tiêu đề của cuốn sách, chạy nó thông qua một chương trình máy tính nhỏ, tạo ra số kệ và số vị trí trên giá đó. Đây là nơi bạn đặt cuốn sách.
Cái hay của chương trình này là sau này, khi một người quay lại để đọc cuốn sách, bạn đưa tiêu đề qua chương trình một lần nữa và lấy lại số kệ và số vị trí ban đầu mà bạn đã đưa ra, và đây là nơi cuốn sách được đặt.
Chương trình, như những người khác đã đề cập, được gọi là thuật toán băm hoặc tính toán băm và thường hoạt động bằng cách lấy dữ liệu được đưa vào (tiêu đề của cuốn sách trong trường hợp này) và tính toán một số từ nó.
Để đơn giản, hãy nói rằng nó chỉ chuyển đổi từng chữ cái và ký hiệu thành một số và tổng hợp tất cả chúng. Trong thực tế, nó phức tạp hơn thế nhiều, nhưng bây giờ chúng ta hãy để nó ở đó.
Cái hay của thuật toán này là nếu bạn cho cùng một đầu vào lặp đi lặp lại, nó sẽ tiếp tục phun ra cùng một số mỗi lần.
Ok, về cơ bản là cách bảng băm hoạt động.
Công cụ kỹ thuật sau.
Đầu tiên, có kích thước của số. Thông thường, đầu ra của thuật toán băm như vậy nằm trong một phạm vi một số lượng lớn, thường lớn hơn nhiều so với không gian bạn có trong bảng. Chẳng hạn, giả sử rằng chúng ta có chỗ cho chính xác một triệu cuốn sách trong thư viện. Đầu ra của phép tính băm có thể nằm trong khoảng từ 0 đến một tỷ, cao hơn rất nhiều.
Vậy ta phải làm sao? Chúng tôi sử dụng một cái gì đó gọi là tính toán mô đun, về cơ bản nói rằng nếu bạn tính đến số bạn muốn (nghĩa là số một tỷ) nhưng muốn ở trong phạm vi nhỏ hơn nhiều, mỗi lần bạn đạt đến giới hạn của phạm vi nhỏ hơn đó, bạn bắt đầu trở lại 0, nhưng bạn phải theo dõi khoảng cách trong chuỗi lớn bạn đã đến.
Giả sử đầu ra của thuật toán băm nằm trong phạm vi từ 0 đến 20 và bạn nhận được giá trị 17 từ một tiêu đề cụ thể. Nếu kích thước của thư viện chỉ có 7 cuốn sách, bạn đếm 1, 2, 3, 4, 5, 6 và khi bạn lên 7, bạn bắt đầu trở lại ở mức 0. Vì chúng ta cần đếm 17 lần, chúng ta có 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3 và số cuối cùng là 3.
Tất nhiên tính toán mô đun không được thực hiện như vậy, nó được thực hiện với phép chia và phần còn lại. Phần còn lại chia 17 cho 7 là 3 (7 đi 2 lần thành 17 tại 14 và chênh lệch giữa 17 và 14 là 3).
Vì vậy, bạn đặt cuốn sách vào khe số 3.
Điều này dẫn đến vấn đề tiếp theo. Sự va chạm. Vì thuật toán không có cách nào để loại bỏ các cuốn sách để chúng điền vào thư viện chính xác (hoặc bảng băm nếu bạn muốn), nên cuối cùng nó sẽ tính toán một số đã được sử dụng trước đó. Theo nghĩa thư viện, khi bạn đến kệ và số vị trí bạn muốn đặt một cuốn sách, đã có một cuốn sách ở đó.
Có nhiều phương thức xử lý va chạm khác nhau, bao gồm chạy dữ liệu vào một phép tính khác để có một vị trí khác trong bảng ( băm kép ) hoặc đơn giản là tìm một khoảng trắng gần với vị trí bạn đã đưa ra (tức là ngay bên cạnh cuốn sách trước đó giả sử vị trí đã có sẵn còn được gọi là thăm dò tuyến tính ). Điều này có nghĩa là bạn có một số công việc phải làm khi bạn cố gắng tìm cuốn sách sau đó, nhưng vẫn tốt hơn là bắt đầu ở một đầu của thư viện.
Cuối cùng, tại một số điểm, bạn có thể muốn đưa nhiều sách vào thư viện hơn thư viện cho phép. Nói cách khác, bạn cần xây dựng một thư viện lớn hơn. Vì vị trí chính xác trong thư viện được tính bằng kích thước chính xác và hiện tại của thư viện, nên theo bạn, nếu thay đổi kích thước thư viện, bạn có thể phải tìm điểm mới cho tất cả các sách kể từ khi tính toán xong để tìm điểm của chúng đã thay đổi.
Tôi hy vọng lời giải thích này là một chút xuống trái đất hơn so với xô và chức năng :)