定義:在數學中,矩陣是乙個按照長方陣列排列的複數或實數集合
這是乙個很簡單的定義。
矩陣加減法
對於兩個相同大小的矩陣,直接把相同位置的元素相加即可,如下圖:
(這個好像並沒有什麼用)
對於兩個矩陣,當且僅當其中乙個矩陣的行與另乙個矩陣的列時,兩個矩陣相乘才有意義。
設\(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在這裡充分利用到了集合的概念和演算法 因一項工作而卡住需等待這項工作時,導致別的工作不能完全進行 這樣浪費資源和時間 怎麼處理呢 這裡有幾種解決的方法 其中一種就是每隔一段時間進行迴圈檢測看這項工作是...