LeetCode 311 稀疏矩陣的乘法

2021-10-24 06:02:07 字數 2141 閱讀 8589

本題是 leetcode 會員才能看…

給你兩個 稀疏矩陣 a 和 b,請你返回 ab 的結果。

你可以預設 a 的列數等於 b 的行數。

請仔細閱讀下面的示例。

示例:

輸入:a =[[

1,0,

0],[

-1,0

,3]]

b =[[7

,0,0

],[0

,0,0

],[0

,0,1

]]輸出: |10

0||7

00||

700|

ab =|-

103| x |00

0|=|

-703

||00

1|

2.1 暴力求解

沒有根據稀疏矩陣的特性進行優化

def

matrixmul1

(a, b)

:"""暴力法"""

m =len(a)

n =len(a[0]

) p =

len(b[0]

) ans =[[

0]* p for i in

range

(m)]

for i in

range

(m):

for j in

range

(p):

sum_ =

0for k in

range

(n):

sum_ += a[i]

[k]* b[k]

[j] ans[i]

[j]= sum_

return ans

2.2 優化(選取都不為0的行和列相乘)

稀疏矩陣就是有很多 0 ,所以其實優化就是要把都是 0 的行和列去掉

def

matrixmul2

(a, b)

: m =

len(a)

n =len(a[0]

) p =

len(b[0]

)

r_all0 =

[true

]* m # 標記全為 0 的 row

c_all0 =

[true

]* p # 標記全為 0 的 col

# 用 flag 做標記

flag =

false

for i in

range

(m):

flag =

false

for j in

range

(n):

if a[i]

[j]:

flag =

true

break

if flag:

r_all0[i]

=false

for j in

range

(p):

flag =

false

for i in

range

(n):

if b[i]

[j]:

flag =

true

break

if flag:

c_all0[j]

=false

ans =[[

0]* p for i in

range

(m)]

for i in

range

(m):

for j in

range

(p):

if(r_all0[i]

or c_all0[j]):

# 優化在這裡

continue

sum_ =

0for k in

range

(n):

sum_ += a[i]

[k]* b[k]

[j] ans[i]

[j]= sum_

return ans

參考:

leetcode 311. 稀疏矩陣的乘法

特殊矩陣 稀疏矩陣

對於乙個m n的矩陣,設s為矩陣的元素總個數s m n,設t為矩陣中非零元素的個數,滿足t 稀疏矩陣的零元素非常多,且分布無規律,所以稀疏矩陣的壓縮儲存方法為 只儲存矩陣中的非零元素,按照三元組的形式儲存。三元組由非零元素,該元素行下標和該元素列下標三個資料構成,放在乙個列數為3的陣列中。儲存結構又...

稀疏陣列,稀疏矩陣概念

稀疏矩陣 矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素的分布沒有規律,通常認為矩陣中非零元素的總數比上矩陣所有元素總數的值小於等於0.05時,則稱該矩陣為稀疏矩陣 sparse matrix 該比值稱為這個矩陣的稠密度。稀疏陣列 稀疏陣列可以看做是普通陣列的壓縮,但是這裡說的普通陣列是值...

稀疏矩陣運算

行邏輯鏈結的三元組順序表實現,加減乘和轉置運算,調的好累,這兩天少了點勁頭了,堅持住,試了好幾組資料應該沒問題了,但也可能還有漏洞 include include include using namespace std define ok 1 define error 0 define overfl...