演算法 矩陣以及運用

2022-01-10 21:29:55 字數 2130 閱讀 2562

定義:在數學中,矩陣是乙個按照長方陣列排列的複數或實數集合

這是乙個很簡單的定義。

矩陣加減法

對於兩個相同大小的矩陣,直接把相同位置的元素相加即可,如下圖:

(這個好像並沒有什麼用)

對於兩個矩陣,當且僅當其中乙個矩陣的行與另乙個矩陣的列時,兩個矩陣相乘才有意義。

設\(a\)為\(p×m\)的矩陣,\(b\)為\(m×q\)的矩陣,我們用乙個矩陣\(c\)來儲存矩陣\(a\)與矩陣\(b\)的乘積。

定義在矩陣乘法中,結果\(c\)矩陣的第\(i\)行第\(j\)列的數,就是由矩陣\(a\)第\(i\)行 \(m\)個數與矩陣\(b\)第\(j\)列\(m\)個數分別相乘再相加得到的

即:其中矩陣\(c\)中的第\(i\)行第\(j\)列元素可以表示為:

那麼答案矩陣就可以表示成

舉個例子

輸入:

2 3

1 2 3

3 2 1

2 1 1

2 23 3

輸出:

2 3

1 2 3

3 2 1

2 1 1

2 23 3

矩陣乘法能很好地運用是因為矩陣乘法支援乘法交換律

即是:\(a×(b×c) =(a×b)×c\)

可以很大程度上優化動態規劃時的過程。

就拿斐波拉契數列來舉例:

\(f(i)=f(i-1)+f(i-2);(i≤3)\)

很容易就想到一項一項地遞推,時間複雜度為\(o(n)\)。

但如果\(n\)達到\(1e18\)甚至更大的時候,可能跑乙個上午都跑不出來。

這時候就可以使用矩陣加速。

我們定義乙個矩陣\([f(n-2),f(n-1)]\),我們希望得到\(f(n)\),即需要\([f(n-1),f(n)]\),需要另乙個矩陣來乘上\([f(n-2),f(n-1)]\)。

因為\(f(n)=f(n-1)+f(n-2)\)矩陣第一列應該是:

同理,矩陣第二列為:

所以

對於任意乙個\(n(n≥3)\)有,第\(n\)項為

其中矩陣\([1, 1]\)表示\([f(1), f(2)]\)

#include #include #include using namespace std;

#define ll long long

ll n, mod;

struct matrix

void matrix_read()

void matrix_write()

} friend matrix operator * (matrix x, matrix y)

} return res;

}};matrix model, fib;

void init();

void run();

matrix power(ll);

int main()

void init()

void run()

printf("%lld", fib.mar[0][1] % mod);

}

輸入\(n, m\)

輸出斐波拉契第\(n\)項對\(m\)取模後的值

常用前端演算法以及運用

1 判斷乙個字串是否屬於回文。function checkpalindrom str 2 二維陣列中的查詢function finditem arr,item 3 陣列去重a。let uniqueint function arr let data for let i 0 i4 統計陣列中項,找出最多...

Hive 配置以及運用

hive 配置,hive是facebook開源的,用於解決海量結構化資料的統計,它提供了sql查詢功能 hive架構 1.底層的hdfs 2.yarn 的mapreduce 計算 sql語句執行 3.meta store 可以是mysql,也可以是預設的 配置 1.在hive env.sh中配置 h...

演算法實際運用

我們在linux中用select實現多路復用中有幾個巨集 fd set fd clr fd zero在這裡充分利用到了集合的概念和演算法 因一項工作而卡住需等待這項工作時,導致別的工作不能完全進行 這樣浪費資源和時間 怎麼處理呢 這裡有幾種解決的方法 其中一種就是每隔一段時間進行迴圈檢測看這項工作是...