數據結構和算法緒論

程序設計 = 數據結構 + 算法python

 

數據結構:邏輯結構(數據對象中數據元素之間的相互關係)和物理結構(數據的邏輯結構在計算機中的存儲形式)。算法

  邏輯結構:集合結構(只有同屬一個集合的關係)、線性結構(一對一的關係)樹形結構(存在一對多的層次關係)、圖形結構(多對多的關係)。數據結構

  物理結構:順序存儲(把數據放在地址連續的存儲單元裏,數據間的邏輯關係和物理關係一致)、鏈式存儲(任意存儲單元,數據元素的存儲關係不能反映其邏輯關係,須要用一個指針存放數據元素的地址)。函數

經常使用抽象數據類型:測試

 

算法的五個特性:輸入(零個或多個輸入)、輸出(至少一個輸出)、有窮性(有限步驟後結束,每一個步驟在可接受時間內完成)、肯定性(每一個步驟都被精肯定義無歧義;在必定條件下只有一條執行路徑)、可行性(每一個步驟都能經過執行有限次數完成)。設計

算法設計的要求:指針

  1. 正確性:沒有語法錯誤;對合法輸入產生知足要求的輸出;對非法輸入產生知足規格的說明;對故意刁難的測試輸入都有知足要求的輸出結果。對象

  2. 可讀性:便於閱讀。blog

  3. 魯棒性:輸入數據不合法也能作出相關處理。遞歸

  4. 時間效率高和存儲量低。

 

時間複雜度和空間複雜度

事先分析估算。時間消耗取決於:算法採用的策略、編譯產生的代碼質量、問題的輸入規模、機器執行指令的速度。(因此拋開硬軟件因素,程序運行所需時間依賴於算法好壞和輸入規模)

分析算法的運行時間時,要把程序當作是獨立於程序設計語言的算法或一系列步驟,把基本操做的數量和輸入模式關聯起來。

判斷算法效率時,函數中的常數和其餘其餘次要項能夠忽略,主要關注最高項的階數。T(n) = O(f(n)),隨問題規模 n 的增大,算法執行時間的增加率和f(n)的增加率相同,稱爲漸進時間複雜度(即時間複雜度),通常關注最壞時間複雜度。

大O階方法:

  1. 常數 1 取代運行時間中的全部加法常數。

  2. 只保留最高階項,且不保留最高階項的係數。

經常使用時間複雜度:O(1) < O(logn)< O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

 

斐波那契數列

def fib(n):
    if n == 0 or n == 1:
        return n
    return fib(n-1) + fib(n-2)

遞歸方法的時間複雜度爲O(2n)

 

一些遞歸方法的時間複雜度:

  

空間複雜度指算法所需的存儲空間,S(n) = O(f(n))

相關文章
相關標籤/搜索