c语言大数相乘的算法_MIT 算法导论(三)
生活随笔
收集整理的這篇文章主要介紹了
c语言大数相乘的算法_MIT 算法导论(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標簽:b站MIT算法導論課程的一些筆記,整理以(bu)后(hui)看
代碼引用標記:
第三節 分治法
分治法(Divide and conquer)
1) 分治法的步驟
- 把問題分為幾個小的子問題(分)
- 解決每個子問題(治)
- 把幾個子問題的解合起來(合)
2) 分治法的一些說明
- 接下來的課程陸續會講到3-4種算法的設計方法
- 分治法是比較簡單的一種算法設計方法
幾種算法(分治法的應用)
1) 歸并排序
a) 按照分治法給出步驟
- 將大的要排序的序列分為兩部分
- 分別對兩部分進行排序
- 然后把兩部分排序的結果合并在一起
b) 時間復雜度
根據主方法,
c) 偽代碼
Merge(A, p, q, r)n1 = p - p + r
n2 = r - p
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p + i - 1]
for j = 1 to n2
R[j] = A[q + j]
L[n1 + 1] =
R[n2 + 1] =
i = 1
j = 1
for k = p to r
if L[i] R[j]
A[k] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
MERGE-SORT(A, p, r)
if p < r
q *= (p + r) / 2 //**表示向下取整
MERGE-SORT(A, p, q)
MERGE-SORT(A, q+1, r)
MERGE(A, p, q, r)
d) 算法的C語言實現
#include2) 二分查找(在一個已經排好序的序列里面找到x)
a) 步驟
- Divide:把x與中間的值比較
- conquer: 在一個子序列里迭代
- combine: 啥也沒做
b) 時間復雜度
根據主方法:
c) 算法的C語言實現
#include3) n次冪運算
a) 樸素算法
- 步驟:乘完一個再乘一個,直到乘到第n個
- 時間復雜度:
b) 簡化算法(平方遞歸)
i) 步驟
- 將n個相乘的x分為兩部分來求
- 分別對兩部分進行遞歸求積
- 合起來
ii) 時間復雜度
- 根據主方法,
iii) 算法的C語言實現
#include4) Fibonacci數列
a) 定義
b) 樸素算法
i) 步驟
- 直接遞歸
ii) 時間復雜度
- 指數級別,具體值為 為黃金比例
- 為什么是這個值?可以通過估算得到它是指數級別的,但具體值不知道怎么求
- 那么怎么估算得到它是指數級的呢
畫一個遞歸樹我們會發現,各個支路的遞歸速度是不一樣的,我們算最快的那個支路,可以得到 , 。但其他的支路肯定還需要繼續遞歸,所以說這個算法的時間復雜度是指數級別的是沒有問題的
iii) 算法的C語言實現
#includec) 改進算法1
- 定義:自下而上遞歸式
- 步驟:從n = 0, 1開始向上正著算
- 時間復雜度:
- 算法的C語言實現
d) 改進算法2
- 定義:樸素平方遞歸
- 步驟: 最接近的整數,然后再利用冪運算里面的平方遞歸方法即可
- 注:這種方法在現實中是不可能被實現的,因為計算機會舍去很多關鍵的位次
e) 改進算法3(最神奇的一種)
- 定義:矩陣法
- 步驟(見下圖)
- 時間復雜度:應用平方遞歸,可以得到
- 算法的C語言實現
5) n階矩陣相乘
a) 樸素算法
- 就是按照矩陣相乘的定義。沒啥好說的
- 時間復雜度:
- 算法的C語言實現
b) strassen算法(羨(ji)慕(du)天才的腦子)
- 基本思想:減少乘法的次數
- 使矩陣分塊(分成均勻的四塊),然后
a, b, c, d, e, f, g, h, r, s, t, u代表的值見下圖
- 時間復雜度:
- 現在可以做到最好的時間復雜度為
- 問題:如果矩陣分不成均勻的四塊是不是就不能使用這種方法了
6) VLSI layout(超大規模集成電路)
a) 問題描述:把有n個葉節點的完全二叉樹畫到網格里使得占用的網格面積最小
b) 樸素算法
- 方式:
- 時間復雜度分析
高度:
寬度:
所以
c) 優化算法
- 時間復雜度分析
所以,
總結
以上是生活随笔為你收集整理的c语言大数相乘的算法_MIT 算法导论(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vscode安装python插件_pyt
- 下一篇: 移动端调用百度地图api_百度智能云图像