1. 程式人生 > 其它 >Python資料結構與演算法(第1節)

Python資料結構與演算法(第1節)

技術標籤:資料結構

一、演算法

1.概念

演算法是獨立存在的一種解決問題的方法和思想。對於演算法而言,實現的語言並不重要,重要的是思想。(推薦書籍:裘宗燕《資料結構與演算法 Python語言描述》)

2.五大特性

輸入: 演算法具有0個或多個輸入
輸出: 演算法至少有1個或多個輸出
有窮性: 演算法在有限的步驟之後會自動結束而不會無限迴圈,並且每一個步驟可以在可接受的時間內完成
確定性:演算法中的每一步都有確定的含義,不會出現二義性
可行性:演算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完成

二、演算法效率衡量

1.執行時間反應演算法效率

實現演算法程式的執行時間可以反應出演算法的效率,即演算法的優劣。

2.單純依靠執行的時間來比較演算法的優劣並不一定是客觀準確的!

3.時間複雜度與“大O記法”

算然對於不同的機器環境而言,確切的單位時間是不同的,但是對於演算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響而客觀的反應演算法的時間效率。
**“大O記法”:**對於單調的整數函式f,如果存在一個整數函式g和實常數c>0,使得對於充分大的n總有f(n)<=c*g(n),就說函式g是f的一個漸近函式(忽略常數),記為f(n)=O(g(n))。也就是說,在趨向無窮的極限意義下,函式f的增長速度受到函式g的約束,亦即函式f與函式g的特徵相似。

**時間複雜度:**假設存在函式g,使得演算法A處理規模為n的問題示例所用時間為T(n)=O(g(n)),則稱O(g(n))為演算法A的漸近時間複雜度,簡稱時間複雜度,記為T(n)

4.最壞時間複雜度

  • 演算法完成工作最少需要多少基本操作,即最優時間複雜度
  • 演算法完成工作最多需要多少基本操作,即最壞時間複雜度
  • 演算法完成工作平均需要多少基本操作,即平均時間複雜度
    我們主要關注演算法的最壞情況,亦即最壞時間複雜度。

5.時間複雜度的基本計算規則

  • 基本操作,即只有常數項,認為其時間複雜度為O(1)
  • 順序結構,時間複雜度按加法進行計算
  • 迴圈結構,時間複雜度按乘法進行計算
  • 分支結構,時間複雜度取最大值
  • 判斷一個演算法的效率時,往往只需要關注運算元量的最高次項,其它次要項和常數項可以忽略
    在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度
    在這裡插入圖片描述

三、Python內建型別效能分析

1.測試方法

timeit模組可以用來測試一小段Python程式碼的執行速度。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
timeit.Timer.timeit(number=1000000)

2.list內建操作的時間複雜度

在這裡插入圖片描述

3.dict內建操作的時間複雜度

在這裡插入圖片描述

四、資料結構

1.概念

資料是一個抽象的概念,將其進行分類後得到程式設計語言中的基本型別。如:int,float,char等。資料元素之間不是獨立的,存在特定的關係,這些關係便是結構。資料結構指資料物件中資料元素之間的關係,通俗地講,資料結構就是資料的組織方式。

2.演算法與資料結構的區別

程式 = 資料結構 + 演算法

演算法是為了解決實際問題而設計的,資料結構是演算法需要處理的問題載體

3.抽象資料型別(Abstract Data Type)

抽象資料型別(ADT)的含義是指一個數學模型以及定義在此數學模型上的一組操作。即把資料型別和資料型別上的運算捆在一起,進行封裝。