Yêu cầu bộ nhớ để nhân ma trận nhanh


12

Giả sử chúng ta muốn nhân n×n ma trận. Thuật toán nhân ma trận chậm chạy trong thời gian O(n3) và sử dụng bộ nhớ O(n2) . Nhanh nhất nhân ma trận chạy trong thời gian nω+o(1) , nơi ω là đại số tuyến tính liên tục, nhưng những gì được biết về sự phức tạp bộ nhớ của nó?

Dường như có thể có một tiên nghiệm rằng phép nhân ma trận nhanh tiêu tốn nω bộ nhớ. Có bất kỳ đảm bảo rằng nó có thể được thực hiện trong bộ nhớ O(n2) không? Đây có phải là trường hợp thuật toán nhân ma trận được biết đến hiện nay sử dụng bộ nhớ O(n2) không?

(Tôi thực sự quan tâm đến phép nhân ma trận hình chữ nhật, nhưng tôi cho rằng câu trả lời sẽ giống trong trường hợp đó như đối với trường hợp vuông và trường hợp vuông được nghiên cứu tốt hơn.)

Câu trả lời:


16

Việc sử dụng không gian nhiều nhất là O(n2) cho tất cả các thuật toán giống Strassen (tức là các thuật toán dựa trên giới hạn trên của cấp số nhân của ma trận theo đại số). Xem độ phức tạp không gian của thuật toán Coppersmith từ Winograd

Tuy nhiên, tôi nhận ra trong câu trả lời trước của mình rằng tôi đã không giải thích lý do tại sao việc sử dụng không gian là ... vì vậy ở đây có một cái gì đó lượn sóng bằng tay. Xem xét những gì một thuật toán giống như Strassen làm. Nó bắt đầu từ một thuật toán cố định cho K × K nhân ma trận có sử dụng K c phép nhân đối với một số liên tục c < 3 . Cụ thể, thuật toán này (bất kể đó là gì) có thể viết WLOG để:O(n2)K×KKcc<3

  1. Nó tính ma trận khác nhau L 1 , ... , L K c mà mục nhân của ma trận đầu tiên Một bởi vô hướng khác nhau và K c ma trận R 1 , ... , R K c từ ma trận thứ hai B của một hình thức tương tự,KcL1,,LKcAKcR1,,RKcB

  2. Nó nhân các kết hợp tuyến tính , sau đóLiRi

  3. Nó nhân lên mục của bởi vô hướng khác nhau, sau đó thêm tất cả các ma trận lên entrywise để có được một B .LiRiAB

(Đây là một cái gọi là "Bilinear" thuật toán, nhưng nó quay ra rằng tất cả các "đại số" thuật toán nhân ma trận có thể được viết theo cách này.) Đối với mỗi , thuật toán này chỉ có để lưu trữ các sản phẩm hiện tại L iR i và giá trị hiện tại của A B (ban đầu được đặt thành tất cả các số 0) trong bộ nhớ tại bất kỳ điểm nào, do đó, mức sử dụng không gian là O ( K 2 ) .i=1,,KcLiRiABO(K2)

Với thuật toán hữu hạn này, nó sau đó được mở rộng một cách độc đoán ma trận, bằng cách phá vỡ các ma trận lớn thành K × K khối kích thước K - 1 × K - 1 , áp dụng hữu hạn K × K thuật toán để khối ma trận, và gọi đệ quy thuật toán bất cứ khi nào nó cần nhân hai khối. Ở mỗi cấp độ của đệ quy, chúng ta cần phải giữ chỉ O ( K 2 ) yếu tố lĩnh vực trong bộ nhớ (lưu trữ O ( 1 )K×KK×KK1×K1K×KO(K2)O(1)khác nhau ma trận). Giả sử việc sử dụng không gian cho K - 1 × K - 1 nhân ma trận là S ( - 1 ) , việc sử dụng không gian của thuật toán đệ quy này là S ( ) S ( - 1 ) + O ( K 2 ) , mà cho S ( 1 ) = 2 K 2K×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2phá được đến .S()O(K2)


Đối với bất kỳ thuật toán kiểu Strassen nào, điều này có vẻ đúng với tôi. Nhưng Coppersmith-Winograd cũng đã chứng minh rằng để đi xuống thực sự đòi hỏi một chuỗi vô hạn các thuật toán theo kiểu Strassen, mỗi thuật toán càng ngày càng gần với số mũ thực sự. Thật vậy, cả thuật toán kiểu CW và thuật toán kiểu CU đều cung cấp các chuỗi như vậy (mặc dù không tiếp cận ω , theo như chúng ta biết). Trong rationals, nó có thể là hằng số được sử dụng trong một chuỗi như vậy sẽ phát triển rất nhanh chóng, do đó "the" n ω thuật toán có thể sẽ sử dụng ω ( n 2 ) không gian. nωωnωω(n2)
Joshua Grochow

1
... Nhưng bằng cách lập luận của bạn, người ta có thể luôn luôn nhận được một thuật toán trong thời gian và không gian O ( n 2 ) đối với bất kỳ δ > 0 . O(nω+δ)O(n2)δ>0
Joshua Grochow

@Joshua, yêu cầu bộ nhớ của các thuật toán loại Strassen này giống như , trong đó i là số chỉ mục của thuật toán và f có thể tính toán được. Vì vậy, nếu bạn tìm kiếm trên các thuật toán này từ i = 0 , . . . , k và k là hàm tăng trưởng chậm của n, khi đó công việc trở thành n ω + o ( 1 ) và bộ nhớ là n 2 + o ( 1 ) . f(i)n2i=0,...,knω+o(1)n2+o(1)
David Harris

@DavidHarris: Chà, chắc chắn, miễn là phát triển đủ chậm so với f , cụ thể là, k phải tăng nhanh nhất là f - 1 . Câu hỏi là, đối với bất kỳ gia đình nào, f là gì và k phát triển nhanh như thế nào . Nhưng không có gì đảm bảo rằng k sẽ tăng trưởng đủ chậm để có được tổng thể sử dụng bộ nhớ n 2 + o ( 1 ) ...kfkf1fkkn2+o(1)
Joshua Grochow

@Juaua. Ý tưởng là trên các đầu vào có độ dài , chúng tôi tìm kiếm trên các thuật toán loại Strassen k giả định đầu tiên , xác minh xem chúng có hợp lệ không và chọn một thuật toán nhanh nhất. Chỉ cần chọn k là hàm của n sao cho f ( k ( n ) ) = n o ( 1 ) . Kể từ khi k ( n ) , điều này có nghĩa là bất kỳ thuật toán Strassen-type sẽ được lựa chọn n đủ lớn. Vì vậy, thời gian đi đến n ω + o ( 1nkknf(k(n))=no(1)k(n)n là tốt. nω+o(1)
David Harris

4

Tổng quát hơn, nhân ma trận nhanh có thể được thực hiện trên bộ xử lý trong bộ nhớ O ( n 2 / p ) trên mỗi bộ xử lý. Tuy nhiên, giao tiếp giữa các bộ xử lý sau đó là tối ưu. Giao tiếp tối ưu có thể đạt được bằng cách sử dụng nhiều bộ nhớ hơn. Theo tôi biết, không biết liệu có thể đạt được giao tiếp tối ưu và bộ nhớ tối ưu hay không. Chi tiết có trong http://dx.doi.org/10.1007/PL00008264pO(n2/p)

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.