日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言大数相乘的算法_MIT 算法导论(三)

發布時間:2025/3/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言大数相乘的算法_MIT 算法导论(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標簽:b站MIT算法導論課程的一些筆記,整理以(bu)后(hui)看

代碼引用標記:

  • 歸并排序的C語言實現
  • 第三節 分治法

    分治法(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語言實現

    #include

    2) 二分查找(在一個已經排好序的序列里面找到x)

    a) 步驟

    • Divide:把x與中間的值比較
    • conquer: 在一個子序列里迭代
    • combine: 啥也沒做

    b) 時間復雜度

    根據主方法:

    c) 算法的C語言實現

    #include

    3) n次冪運算

    a) 樸素算法

    • 步驟:乘完一個再乘一個,直到乘到第n個
    • 時間復雜度:

    b) 簡化算法(平方遞歸)

    i) 步驟

    • 將n個相乘的x分為兩部分來求
    • 分別對兩部分進行遞歸求積
    • 合起來

    ii) 時間復雜度

    • 根據主方法,

    iii) 算法的C語言實現

    #include

    4) Fibonacci數列

    a) 定義

    b) 樸素算法

    i) 步驟

    • 直接遞歸

    ii) 時間復雜度

    • 指數級別,具體值為 為黃金比例
    • 為什么是這個值?可以通過估算得到它是指數級別的,但具體值不知道怎么求
    • 那么怎么估算得到它是指數級的呢

    畫一個遞歸樹我們會發現,各個支路的遞歸速度是不一樣的,我們算最快的那個支路,可以得到 , 。但其他的支路肯定還需要繼續遞歸,所以說這個算法的時間復雜度是指數級別的是沒有問題的

    iii) 算法的C語言實現

    #include

    c) 改進算法1

    • 定義:自下而上遞歸式
    • 步驟:從n = 0, 1開始向上正著算
    • 時間復雜度:
    • 算法的C語言實現
    #include

    d) 改進算法2

    • 定義:樸素平方遞歸
    • 步驟: 最接近的整數,然后再利用冪運算里面的平方遞歸方法即可
    • 注:這種方法在現實中是不可能被實現的,因為計算機會舍去很多關鍵的位次

    e) 改進算法3(最神奇的一種)

    • 定義:矩陣法
    • 步驟(見下圖)

    圖片引自https://blog.csdn.net/u013068502/article/details/38338609?utm_source=blogxgwz3
    • 時間復雜度:應用平方遞歸,可以得到
    • 算法的C語言實現
    #include

    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 算法导论(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。