ข้อกำหนดหน่วยความจำสำหรับการคูณเมทริกซ์ที่รวดเร็ว


12

สมมติว่าเราต้องการที่จะคูณเมทริกซ์ อัลกอริทึมการคูณเมทริกซ์ที่ช้าทำงานในเวลาO ( n 3 )และใช้หน่วยความจำO ( n 2 ) การคูณเมทริกซ์ที่เร็วที่สุดจะทำงานในเวลาn ω + o ( 1 )โดยที่ωคือค่าคงที่พีชคณิตเชิงเส้น แต่สิ่งที่รู้เกี่ยวกับความซับซ้อนของหน่วยความจำn×nO(n3)O(n2)nω+o(1)ω

ดูเหมือนว่าอาจเป็นไปได้ที่การนิรนัยที่การคูณเมทริกซ์เร็วจะใช้หน่วยความจำมีการรับประกันว่าสามารถทำได้ในหน่วยความจำO ( n 2 )หรือไม่? เป็นกรณีที่อัลกอริทึมการคูณเมทริกซ์รู้จักกันในปัจจุบันใช้หน่วยความจำO ( n 2 )หรือไม่?nωO(n2)O(n2)

(จริง ๆ แล้วฉันสนใจในการคูณเมทริกซ์สี่เหลี่ยม แต่ฉันคิดว่าคำตอบจะเหมือนกันในกรณีนั้นสำหรับกรณีสี่เหลี่ยมจัตุรัสและกรณีสี่เหลี่ยมจะศึกษาดีกว่า)

คำตอบ:


16

การใช้พื้นที่เป็นอย่างมากสำหรับอัลกอริธึม Strassen ที่เหมือนกันทั้งหมด (เช่นที่อิงตามขอบเขตบนของการคูณเมทริกซ์พีชคณิต) ดูความซับซ้อนของอวกาศของอัลกอริทึม Coppersmith – WinogradO(n2)

อย่างไรก็ตามฉันรู้ว่าในคำตอบก่อนหน้าของฉันว่าฉันไม่ได้อธิบายว่าทำไมการใช้พื้นที่เป็น ... ดังนั้นนี่จึงเป็นเรื่องมือหยัก พิจารณาสิ่งที่อัลกอริทึมคล้าย Strassen ทำ มันเริ่มต้นจากขั้นตอนวิธีการคงที่สำหรับK × Kคูณเมทริกซ์ที่ใช้K คูณสำหรับบางคนคง< 3 โดยเฉพาะอัลกอริทึมนี้ (ไม่ว่าจะเป็นอะไร) สามารถเขียน WLOG เพื่อO(n2)K×KKcc<3

  1. มันคำนวณเมทริกซ์ที่แตกต่างกันL 1 , ... , L K ซึ่งรายการคูณแรกเมทริกซ์โดยเกลาต่างๆและK เมทริกซ์R 1 , ... , R K จากเมทริกซ์ที่สองBของรูปแบบที่คล้ายกันKcL1,,LKcAKcR1,,RKcB

  2. มันคูณชุดค่าผสมเชิงเส้นเหล่านั้นแล้วLiRi

  3. มันคูณรายการของโดยเกลาต่างๆแล้วเพิ่มการฝึกอบรมเหล่านี้ทั้งหมดขึ้น entrywise ที่จะได้รับ BLiRiAB

(นี่คืออัลกอริธึมที่เรียกว่า "bilinear" แต่ปรากฎว่าอัลกอริทึมการคูณเมทริกซ์ "พีชคณิต" ทุกตัวสามารถเขียนด้วยวิธีนี้ได้) สำหรับอัลกอริทึมนี้จะต้องเก็บ ผลิตภัณฑ์ในปัจจุบันL ฉันR ฉันและมูลค่าปัจจุบันของB (ตั้งค่าเริ่มต้นของทุก-เลขศูนย์) ในหน่วยความจำที่จุดใดก็ตามดังนั้นการใช้พื้นที่เป็นO ( K 2 )i=1,,KcLiRiABO(K2)

ที่กำหนดขั้นตอนวิธีการ จำกัด นี้ก็จะขยายออกไปแล้วโดยพลเมทริกซ์โดยการทำลายเมทริกซ์ขนาดใหญ่เป็นK × Kบล็อกของมิติK - 1 × K - 1 , การใช้ จำกัดK × Kขั้นตอนวิธีการบล็อก เมทริกซ์และเรียกอัลกอริทึมแบบเรียกซ้ำทุกครั้งที่ต้องการคูณสองบล็อก ในการเรียกซ้ำแต่ละระดับเราต้องเก็บองค์ประกอบฟิลด์O ( K 2 )ไว้ในหน่วยความจำเท่านั้น (เก็บO ( 1 )K×KK×KK1×K1K×KO(K2)O(1)เมทริกซ์ต่างกัน) สมมติว่าการใช้พื้นที่สำหรับK - 1 × K - 1 การคูณเมทริกซ์คือS ( - 1 )การใช้พื้นที่ของอัลกอริทึมแบบเรียกซ้ำนี้คือS ( ) S ( - 1 ) + O ( K 2 )ซึ่งสำหรับS ( 1 ) = 2 K 2K×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2แก้เพื่อ )S()O(K2)


nωωnωω(n2)

1
O(nω+δ)O(n2)δ>0

f(i)n2i=0,...,knω+o(1)n2+o(1)

kfkf1fkkn2+o(1)

nkknf(k(n))=no(1)k(n)nnω+o(1)

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