write programs that do one thing and do it well
----- doug mcilroy (unix哲學)
如果你學過線代, 又恰巧你是個coder, 那麼你應該寫個計算行列式的program。
計算行列式(數學知識):
每行都按行座標排序, 求出列座標排列的逆序數
根據逆序數的奇偶行判斷該項的正負(奇負, 偶正)
逐項求和。
說明: 輸入行列式的 行(列)數 n
並依次輸入n*n個數。 程式將輸出
行列式的計算算式,並得出結果!
**實現分析: 呼叫標頭檔案裡的庫函式 next_permutation() 具體實現細節詳見**。
用線段樹求逆序數時間複雜度為n*logn。 當然以這種時間複雜度的演算法還有樹狀陣列求逆序數, 歸併排序求逆序數。
當然你也可以用直接暴力的方法求出逆序數,**是十分簡單的。時間複雜度和插入排序相同n*n。
然後就是具體的一些實現細節啦
線段樹求逆序數, **有點長。
#include#includeview code#include
using
namespace
std;
void pushup(int cur, int *sum)
void build(int l, int r, int cur, int *sum)
void update(int p, int l, int r, int cur, int *sum)
int m = (l+r)>>1
;
if(p<=m) update(p, l, m, cur<<1
, sum);
else update(p, m+1, r, cur<<1|1
, sum);
pushup(cur, sum);
}int query(int l, int r, int l, int r, int cur, int *sum)
int m = (l+r)>>1
;
int ret = 0
;
if(l<=m) ret+=query(l, r, l, m, cur<<1
, sum);
if(r>m) ret+=query(l, r, m+1, r, cur<<1|1
, sum);
return
ret;
}int reverse(int n, int *p)
return
tot;
}void solve(int n, int a[15][15
]) ans-=temp;
}else
ans+=temp;}}
while(next_permutation(p, p+n));
printf(
"\n%d\n\n
", ans);
}int
main()
return0;
}
歸併排序求逆序數:
歸併排序
void merge_sort(int * a, int x, int y, int *t)稍加改動, 即可求逆序數。 把 「else t[i++] = a[q++]; 」 改成 「else 」for( i = x; i < y; i++) a[i] =t[i];
}}
即:
void merge_sort(int * a, int x, int y, int *t)如果想求順序數的個數, 直接用總情況數 (n-1+1)*(n-1)/2 - 逆序數 即可!} for( i = x; i < y; i++) a[i] =t[i];
}}
用歸併排序法----計算行列式
#include#includeview code#include
using
namespace
std;
int merge_sort(int * a, int x, int
y) }
}return
cnt;
}
void solve(int n, int a[15][15
]) ans-=temp;
}else
ans+=temp;}}
while(next_permutation(p, p+n));
printf(
"\n%d\n\n
", ans);
}int
main()
return0;
}
稍加完善 ~ ~ ~
#include#includeview code#include
using
namespace
std;
//template
int merge_sort(int * a, int x, int
y) }
}return
cnt;
}
template
void solve(int n, tt a[15][15
]) ans-=temp;
}else
ans+=temp;}}
while(next_permutation(p, p+n));
cout
<
cout
<
\n\n行列式的結果為:
"}int
main()
return0;
}
行列式的計算
很多知識點都生疏了,標記一下。對於任意階行列式的定義一般是由二階 三階行列式的定義引出來的。因為二階和三階恰好是個特例,我們直接引入標準定義。解釋說明 上圖中 7 式中的p1 p2 是元素下標。總結來說。行列式就是 在該數表中找到n組數,且這n組數中每一組中的每乙個元素都不同行不同列,然後每一組各自...
C實現矩陣行列式計算
開始重新學習數學了,然而路途總是不那麼平坦,儘管是先挑選的最簡單的線性代數,然而一開始就進展不順 當然我承認數學一直都是乙個難以言說的傷痛,但是像什麼三階行列式計算還是老是算錯我就有點難以忍受了 於是編寫乙個程式解決行列式的計算問題,記得好像當初學線性代數的時候也想過程式設計實現,最終好像因為水平問...
MyMathLib系列 行列式計算
靠人不如靠己,準備做自己得mathlib,在學校的時候,就想過把數學數理的東西都計算機化,但一直沒有時間去做這件事情,現在覺得空餘 時間比較閒,就做做這件事情,先從線性代數開始,畢竟這裡面的很多演算法,實際共走中都有用到。在做這些演算法的過程中,也體會到了 數學中的東西不是沒有用,而是你沒用到。下面...