ความแตกต่างระหว่าง Caching และ Memoization คืออะไร?


114

ฉันต้องการทราบความแตกต่างที่แท้จริงระหว่างcachingและmemoizationคืออะไร
ขณะที่ผมเห็นมันทั้งสองเกี่ยวข้องกับการหลีกเลี่ยงการทำซ้ำสายงานที่จะได้รับข้อมูลโดยการจัดเก็บ

อะไรคือความแตกต่างหลักระหว่างทั้งสอง?


ฉันสงสัยว่าคุณสามารถพูดว่า "การบันทึกคือการแคช" เป็น "อาร์เรย์คือการกระจายอาร์เรย์" กล่าวอีกนัยหนึ่งคือคุณจัดเก็บเฉพาะสิ่งต่างๆ "ตามความต้องการ" แทนที่จะระบุทุกชุดอินพุตที่เป็นไปได้
Sridhar Sarnobat

คำตอบ:


110

memoization เป็นรูปแบบเฉพาะของแคชที่เกี่ยวข้องกับการแคชค่าตอบแทนของฟังก์ชั่นที่อยู่บนพื้นฐานของพารามิเตอร์

การแคชเป็นคำทั่วไป ตัวอย่างเช่นการแคช HTTP เป็นการแคช แต่ไม่ใช่การบันทึก

Wikipedia พูดว่า :

แม้ว่าจะเกี่ยวข้องกับการแคช แต่การบันทึกจะหมายถึงกรณีเฉพาะของการเพิ่มประสิทธิภาพนี้โดยแยกความแตกต่างจากรูปแบบของการแคชเช่นการบัฟเฟอร์หรือการแทนที่เพจ


2
แต่คุณสามารถเอาชนะส่วนที่แคชใช้กับฟังก์ชันได้เสมอและตั้งชื่อมันว่า 'การบันทึก' แม้ว่าความแตกต่างคือคุณเป็นผู้ควบคุมนโยบายการแคชในฟังก์ชันของคุณในขณะที่การบันทึกช่วยจำมีลำดับที่สูงกว่าและเกิดขึ้นนอกฟังก์ชันที่ฉันเดา
ลัส

เหตุใดการแคช HTTP จึงไม่จดจำ ซึ่งขึ้นอยู่กับพารามิเตอร์ด้วย (URL ของทรัพยากรที่ร้องขอ)
topo Reinstate Monica

@topomorto: เนื่องจากคุณสมบัติเช่นIf-Matchและการหมดอายุ การบันทึกช่วยจำมีความหมายสำหรับฟังก์ชันบริสุทธิ์ซึ่ง HTTP ไม่ค่อยเป็นเช่นนั้น
SLaks

@nicolas ไม่มากฉันคิดว่า ฉันคิดว่าในการท่องจำคำว่า "ฟังก์ชัน" ถูกใช้ในความหมายที่บริสุทธิ์ / คณิตศาสตร์ การดาวน์โหลดหน้าเว็บจากที่อยู่ที่ระบุไม่ถือเป็นฟังก์ชันเพราะอาจเกิดขึ้นได้ว่าหน้าเปลี่ยนไป
Alexey

@ Alexey ไม่ได้ใช้คำพูดเดียวกันกับการแคช? กลยุทธ์ทั้งหมดนั้นขึ้นอยู่กับการเรียกใช้ฟังก์ชันเดียวกันที่ให้ผลลัพธ์เดียวกันหรือที่เรียกว่าไม่มีผลข้างเคียงของต้นน้ำ
nicolas

47

อย่างที่ฉันเคยเห็นพวกเขาใช้ "การบันทึก" คือ "การแคชผลลัพธ์ของฟังก์ชันดีเทอร์มินิสติก" ที่สามารถทำซ้ำได้ตลอดเวลาโดยมีฟังก์ชันและอินพุตเดียวกัน

"การแคช" รวมถึงกลยุทธ์การบัฟเฟอร์เอาต์พุตโดยทั่วไปไม่ว่าค่าต้นทางจะสามารถทำซ้ำได้ในเวลาที่กำหนดหรือไม่ก็ตาม ในความเป็นจริงการแคชยังใช้เพื่ออ้างถึงกลยุทธ์การบัฟเฟอร์อินพุตเช่นการเขียนแคชบนดิสก์หรือหน่วยความจำ ดังนั้นมันจึงเป็นคำทั่วไปมากกว่า


แน่ใจหรือว่าฟังก์ชันจะต้องถูกกำหนด?
Gherman

4
@ เยอรมันใช่การท่องจำขึ้นอยู่กับปัจจัยกำหนด ตัวอย่างคลาสสิกคืออัลกอริทึมแบบวนซ้ำเช่นลำดับฟีโบนักชีหรือแฟกทอเรียล แทนที่จะคำนวณซ้ำจนถึงกรณีพื้นฐานฟังก์ชันที่บันทึกไว้จะลัดวงจรโดยการนำผลลัพธ์ก่อนหน้านี้กลับมาใช้ใหม่สำหรับค่าที่คำนวณแล้ว เห็นได้ชัดว่าสิ่งนี้ขึ้นอยู่กับอินพุตเดียวกันที่ให้ผลลัพธ์เดียวกันเสมอซึ่งเป็นคำจำกัดความของดีเทอร์มินิซึม ในทางกลับกันการแคชมักใช้สำหรับกระบวนการที่ไม่ได้กำหนด (เช่นสุ่มหรือประทับเวลา) ด้วยความเข้าใจว่าผลลัพธ์อาจไม่ตรงกับค่าที่ "รีเฟรช"
harpo

6

ฉันคิดว่าการแคชคำมักจะใช้เมื่อคุณจัดเก็บผลลัพธ์ของการดำเนินการ IO หรือโดยพื้นฐานแล้วข้อมูลใด ๆ ที่มาถึงคุณจากภายนอก (ไฟล์, เครือข่าย, แบบสอบถามฐานข้อมูล) การบันทึกคำศัพท์มักใช้กับการจัดเก็บผลลัพธ์ของการคำนวณของคุณเองตัวอย่างเช่นในบริบทของการเขียนโปรแกรมแบบไดนามิก


1

การบันทึกเป็นรูปแบบพิเศษของการแคชผลลัพธ์ของฟังก์ชันดีเทอร์มินิสติก ซึ่งหมายความว่าการแคชผลลัพธ์ภายนอกฟังก์ชันไม่ใช่การบันทึกเนื่องจากฟังก์ชันจะต้องกลายพันธุ์แคชเมื่อคำนวณผลลัพธ์ใหม่ (ไม่ได้อยู่ในแคช) ดังนั้นจึงไม่เป็นฟังก์ชัน (บริสุทธิ์) อีกต่อไป การบันทึกโดยทั่วไปหมายถึงการส่งแคชเป็นอาร์กิวเมนต์เพิ่มเติม (ในฟังก์ชันตัวช่วย) การบันทึกช่วยจำจะเพิ่มประสิทธิภาพฟังก์ชันที่ต้องคำนวณค่าหลาย ๆ ครั้งสำหรับการเข้าถึงครั้งเดียว การแคชจะเพิ่มประสิทธิภาพฟังก์ชันที่เรียกหลายครั้งด้วยพารามิเตอร์เดียวกัน กล่าวอีกนัยหนึ่ง Memoization จะเพิ่มประสิทธิภาพการเข้าถึงครั้งแรกไม่ว่าการแคชจะเพิ่มประสิทธิภาพการเข้าถึงที่เกิดขึ้นซ้ำเท่านั้น


0

ฉันต้องการเพิ่มคำตอบที่ยอดเยี่ยมอื่น ๆ ที่การบันทึกช่วยจำเรียกอีกอย่างว่าแท็บ ฉันคิดว่าสิ่งสำคัญคือต้องรู้คำศัพท์นั้นสำหรับผู้ที่เรียนรู้ว่าการช่วยจำและการแคชคืออะไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.