Sự khác biệt giữa Caching và Memoization là gì?


114

Tôi muốn biết sự khác biệt thực tế giữa cachingmemoizationlà gì.
Như tôi thấy, cả hai đều liên quan đến việc tránh các lệnh gọi hàm lặp lại để lấy dữ liệu bằng cách lưu trữ nó .

Sự khác biệt cốt lõi giữa cả hai là gì?


Tôi tự hỏi nếu bạn có thể nói "memoization is to caching" như "array is to thin array". Nói cách khác, bạn chỉ lưu trữ những thứ "theo yêu cầu" hơn là liệt kê mọi kết hợp đầu vào có thể có.
Sridhar Sarnobat

Câu trả lời:


110

Memoization là một dạng bộ nhớ đệm cụ thể liên quan đến bộ nhớ đệm giá trị trả về của một hàm dựa trên các tham số của nó .

Bộ nhớ đệm là một thuật ngữ chung chung hơn; ví dụ: bộ nhớ đệm HTTP là bộ nhớ đệm nhưng không phải là bản ghi nhớ.

Wikipedia cho biết :

Mặc dù liên quan đến bộ nhớ đệm, ghi nhớ đề cập đến một trường hợp cụ thể của việc tối ưu hóa này, phân biệt nó với các hình thức bộ nhớ đệm như đệm hoặc thay thế trang.


2
nhưng bạn luôn có thể lướt qua phần nơi bộ nhớ đệm được sử dụng với một hàm và đặt tên nó là 'memoization'. mặc dù sự khác biệt là bạn kiểm soát chính sách bộ nhớ đệm trong chức năng của mình, trong khi ghi nhớ là thứ tự cao hơn và xảy ra bên ngoài chức năng, tôi đoán.
nicolas

Tại sao HTTP Caching không phải là memorisation? điều đó cũng dựa trên tham số (URL của tài nguyên được yêu cầu).
topo Phục hồi Monica

@topomorto: Vì các tính năng như If-Matchvà hết hạn. Ghi nhớ chỉ có ý nghĩa đối với chức năng thuần túy, mà HTTP hiếm khi có.
SLaks

@nicolas, tôi nghĩ là không hoàn toàn. Tôi nghĩ rằng trong ghi nhớ thuật ngữ "hàm" được sử dụng theo nghĩa thuần túy / toán học. Tải xuống trang web từ một địa chỉ nhất định không thể được coi là một chức năng, vì có thể xảy ra trường hợp trang thay đổi.
Alexey,

@Alexey không áp dụng cùng một nhận xét cho bộ nhớ đệm? tất cả các chiến lược đó dựa trên cùng một lệnh gọi hàm cho cùng một kết quả, không có tác dụng phụ ngược dòng .
nicolas,

47

Như tôi đã thấy chúng được sử dụng, "ghi nhớ" là "bộ nhớ đệm kết quả của một hàm xác định" có thể được sao chép bất kỳ lúc nào với cùng một chức năng và đầu vào.

"Bộ nhớ đệm" về cơ bản bao gồm bất kỳ chiến lược đệm đầu ra nào, cho dù giá trị nguồn có thể tái tạo được hay không tại một thời điểm nhất định. Trên thực tế, bộ nhớ đệm cũng được sử dụng để chỉ các chiến lược đệm đầu vào , chẳng hạn như bộ đệm ghi trên đĩa hoặc bộ nhớ. Vì vậy, nó là một thuật ngữ tổng quát hơn nhiều.


Bạn có chắc rằng hàm phải xác định không?
Gherman

4
@ Đức, vâng, khả năng ghi nhớ phụ thuộc vào thuyết xác định. Ví dụ cổ điển là một thuật toán đệ quy, chẳng hạn như dãy Fibonacci hoặc giai thừa. Thay vì tính toán lại tất cả các trường hợp cơ sở, một hàm được ghi nhớ sẽ ngắn mạch bằng cách sử dụng lại các kết quả trước đó cho các giá trị mà nó đã được tính toán. Điều này rõ ràng phụ thuộc vào cùng một đầu vào luôn mang lại cùng một đầu ra, đó là định nghĩa của thuyết tất định. Mặt khác, bộ nhớ đệm thường được sử dụng cho các quy trình không xác định (ví dụ: ngẫu nhiên hoặc dấu thời gian), với hiểu rằng kết quả có thể không khớp với giá trị "được làm mới".
harpo

6

Tôi nghĩ rằng thuật ngữ bộ nhớ đệm thường được sử dụng khi bạn lưu trữ kết quả của các hoạt động IO hoặc về cơ bản là bất kỳ dữ liệu nào đến với bạn từ bên ngoài (tệp, mạng, truy vấn db). Ghi nhớ thuật ngữ thường áp dụng cho việc lưu trữ các kết quả tính toán của riêng bạn, chẳng hạn như trong ngữ cảnh của lập trình động.


1

Ghi nhớ là một dạng đặc biệt của bộ nhớ đệm kết quả của một hàm xác định. Điều này có nghĩa là bộ nhớ đệm kết quả bên ngoài hàm không phải là bản ghi nhớ vì hàm sẽ phải thay đổi bộ đệm khi tính toán một kết quả mới (chưa có trong bộ đệm) vì vậy nó sẽ không còn là một hàm (thuần túy) nữa. Memoization thường ngụ ý truyền bộ nhớ cache như một đối số bổ sung (trong một hàm trợ giúp). Memoization sẽ tối ưu hóa các chức năng cần tính giá trị nhiều lần cho một lần truy cập. Bộ nhớ đệm sẽ tối ưu hóa các chức năng được gọi nhiều lần với các tham số giống nhau. Nói cách khác, Memoization sẽ tối ưu hóa truy cập đầu tiên cho dù bộ đệm sẽ chỉ tối ưu hóa các truy cập lặp lại.


0

Tôi muốn thêm vào các câu trả lời tuyệt vời khác memoization còn được gọi là vẫn tuân theo . Tôi nghĩ rằng điều quan trọng là phải biết thuật ngữ đó đối với những người học ghi nhớ và bộ nhớ đệm là gì.

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.