1. 程式人生 > >【軟考】【資料結構】演算法基礎

【軟考】【資料結構】演算法基礎

  演算法與資料結構的關係:演算法的實現依賴於資料結構的設計,儘管在設計演算法步驟時可以不考慮資料結構,但演算法在計算機上與採用的資料結構密切相關。演算法的效率與資料結構有一定的關係,但並不是資料結構越簡單演算法的效率就會越高。

1.演算法的特性

  有窮性:執行有窮步之後結束
  確定性:每一條指令都必須有確切含義
  有效性:每個步驟都能有效執行並能得到確定結果
  輸入>=0個,輸出>=1個

2.演算法設計目標

  正確性:應滿足具體問題的需求
  可讀性:便於閱讀和交流
  健壯性:輸入資料非法時,能適當的做出反應或進行處理,不會產生莫名其妙的輸出結果
  效率與低儲存需求:效率是指演算法的執行時間,儲存量需求是指演算法執行過程中所需的最大儲存空間

3.演算法的複雜度

  空間複雜度:演算法在執行過程中臨時佔用儲存空間大小的度量
  時間複雜度:程式執行從開始到結束所需要的時間。
常見的對演算法執行所需時間的度量:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)
O(1)是指時間複雜度為常數級的,單條語句
O(n)單層迴圈
O(n^2)雙層迴圈
O(n^3)三層迴圈
O(log2 n)排序二叉樹查詢鍵值,n為結點數量,log2 n 為比較的次數
O(n log2 n)

4.常用經典演算法

  迭代法:用於求方程或方程組近似根的一種常用演算法。
  窮舉搜尋法:對可能是解的眾多候選解按某種順序進行逐一列舉和檢驗,並從中找出那些符合要求的候選解作為問題的解。
  遞推法:利用問題本身所具有的一種地推關係求問題的解。典型用法是整數的階乘。
    整數階乘:n!=(n1)!×n
  遞迴法:設法將問題分解成一些規模較小的問題,然後從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能採用同樣的分解方法和綜合方法。遞推階段,把複雜問題的求解推到較簡單的問題求解上;迴歸階段:獲得最簡單情況的解後逐級返回,獲得稍複雜問題的解。典型用法是菲波那切數列和揹包問題。
    菲波那切數列:

F0=0,F1=1,Fn=Fn1+Fn2
    揹包問題:有N件物品和一個容量為V的揹包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。
     分析:如果不放第i件物品,那麼問題就轉化為“前i-1件物品放入容量為v的揹包中”,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為“前i-1件物品放入剩下的容量為v-c[i]的揹包中
  回溯法:也稱為試探法。放棄當前候選解去尋找下一個候選解的過程稱為回溯;擴大當前候選解的規模並繼續試探過程稱為向前試探。典型用法是n皇后問題。
    n皇后問題:在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。
  貪心法:一種不追求最優解,只希望得到較為滿意解的方法。典型用法是裝箱問題、馬踏棋盤問題。
    裝箱問題:有n和物品,每個物品體積v1, v2, v3……大小不一,但是都小於箱子體積大小V,現在將所有物品都打包裝進箱子,要求裝完這些物品之後開啟的箱子數量儘量小,求開啟的箱子數量是多少?
      分析:將所有物品按照體積大小降序排列,按照箱子開啟的順序,每一次從頭遍歷箱子結點,看開啟的箱子的剩餘體積能不能放下當前物品,直到遍歷完所有已經開啟的箱子還是放不下,就開啟一個新的箱子。
    馬踏棋盤問題:
  分治法:把大問題的解分解成一些較小的問題,然後由小問題的解方便地構造出大問題的解。典型用法是Hanoi塔、比賽日程安排。
    Hanoi塔:
    比賽日程安排問題:
  動態規劃法:與分治法類似,將大問題分解成子問題,先求子問題,然後從這些子問題的解得到原問題的解,子問題往往不是獨立的。