數據結構:python
數據結構就是一些有關係的數據的集合,有順序表,鏈表,棧,隊列,樹,圖等結構。算法
算法:數據結構
算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法表明着用系統的方法描述解決問題的策略機制。app
不一樣的算法可能用不一樣的時間、空間或效率來完成一樣的任務。一個算法的優劣能夠用空間複雜度與時間複雜度來衡量。函數
簡而言之稱爲思路性能
算法的特性:測試
輸入: 算法具備0個或多個輸入
輸出: 算法至少有1個或多個輸出
有窮性: 算法在有限的步驟以後會自動結束而不會無限循環,而且每個步驟能夠在可接受的時間內完成
肯定性:算法中的每一步都有肯定的含義
可行性:算法的每一步都是可行的
算法效率的衡量spa
時間複雜度與「大O記法」:設計
假定計算機執行算法每個基本操做的時間是固定的一個時間單位,那麼有多少個基本操做就表明會花費多少時間單位。 雖然對於不一樣的機器環境而言,確切的單位時間是不一樣的,可是對於算法進行多少個基本操做(即花費多少時間單位)在規模數量級上倒是相同的,由此能夠忽略機器環境的影響而客觀的反應算法的時間效率。 對於算法的時間效率,咱們能夠用「大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)
理解「大O記法」3d
對於算法進行特別具體的細緻分析雖然很好,但在實踐中的實際價值有限。對於算法的時間性質和空間性質,最重要的是其數量級和趨勢,這些是分析算法效率的主要部分。
而計量算法基本操做數量的規模函數中那些常量因子能夠忽略不計。例如,能夠認爲3n²和100n²屬於同一個量級,若是兩個算法處理一樣規模實例的代價分別爲這兩個函數,
就認爲它們的效率「差很少」,都爲n²級。
最壞時間複雜度
分析算法時,存在幾種可能的考慮:
算法完成工做最少須要多少基本操做,即最優時間複雜度
算法完成工做最多須要多少基本操做,即最壞時間複雜度
算法完成工做平均須要多少基本操做,即平均時間複雜度
咱們主要關注算法的最壞狀況,亦即最壞時間複雜度。
時間複雜度的幾條基本計算規則
基本操做,即只有常數項,認爲就是O(1) 順序結構,時間複雜度按加法進行計算 a + b = c d + e = f 循環結構,時間複雜度按乘法進行計算 分支結構,時間複雜度取最大值
常見的時間複雜度
執行次數函數舉例 |
階 |
非正式術語 |
12 |
O(1) |
常數階 |
2n+3 |
O(n) |
線性階 |
3n²+2n+1 |
O(n²) |
平方階 |
5log2n+20 |
O(logn) |
對數階 |
2n+3nlog2n+19 |
O(nlogn) |
nlogn階 |
6n³+2n²+3n+4 |
O(n³) |
立方階 |
2^n |
O(2^n) |
指數階 |
所消耗的時間從小到大:O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2^n) < O(n!) < O(n^n)
Python內置類型性能分析
1.timeit模塊
用來測試小段的python代碼的執行速度
計時器類:class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>) Timer是測量小段代碼執行速度的類 stmt:是要測試的代碼語句(statment),也能夠傳方法名 setup:運行語句時,須要的設置,例如爲了執行time.time()要引入time包 timer:是一個定時器函數,與平臺有關,不須要處理 函數:timeit.Timer.timeit(number=1000000) Timer類中測試語句執行速度的對象方法 number參數是測試代碼時的測試次數,默認爲1000000次 方法返回執行代碼的平均耗時,一個float類型的秒數
#author:wzu-honghong #date:2019/4/25 def test1(): l = [] for i in range(3000): l.append(i) def test2(): l = [] for i in range(3000): l.insert(0,i) def test3(): l = [ i for i in range(3000)] def test4(): l = list(range(3000)) def test5(): l = [] for i in range(3000): l.extend([i]) def test6(): l = [] for i in range(3000): l = l + [i] # print(l) def test7(): l = [] for i in range(3000): l += [i] # print(l) from timeit import Timer print("開始測試") t1 = Timer("test1()","from __main__ import test1") print("append:\t\t\t",t1.timeit(number=1000), '秒') t2 = Timer("test2()","from __main__ import test2") print("insert:\t\t\t",t2.timeit(number=1000), '秒') t3 = Timer("test3()","from __main__ import test3") print("推導:\t\t\t",t3.timeit(number=1000), '秒') t4 = Timer("test4()","from __main__ import test4") print("list:\t\t\t",t4.timeit(number=1000), '秒') t5 = Timer("test5()","from __main__ import test5") print("extend:\t\t\t",t5.timeit(number=1000), '秒') t6 = Timer("test6()","from __main__ import test6") print("+:\t\t\t",t6.timeit(number=1000), '秒') t7 = Timer("test7()","from __main__ import test7") print("+=:\t\t\t",t7.timeit(number=1000), '秒')
list內置操做的時間複雜度
dict內置操做的時間複雜度
數據結構概念:
數據是一個抽象的概念,將其進行分類後獲得程序設計語言中的基本類型。如:int,float,char等。數據元素之間不是獨立的,存在特定的關係,這些關係即是結構。數據結構指數據對象中數據元素之間的關係。
Python給咱們提供了不少現成的數據結構類型,這些系統本身定義好的,不須要咱們本身去定義的數據結構叫作Python的內置數據結構,好比列表、元組、字典。而有些數據組織方式,Python系統裏面沒有直接定義,須要咱們本身去定義實現這些數據的組織方式,這些數據組織方式稱之爲Python的擴展數據結構,好比棧,隊列等。
數據結構與算法的區別:
數據結構是算法的載體
算法是解決問題的思路
數據結構是不一樣的數據組織形式
抽象數據類型(ADT)
抽象數據類型的含義是指一個數學模型以及定義在此數學模型上的一組操做。即把數據類型和數據類型上的運算捆在一塊兒,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。
最經常使用的五種數據運算:插入、刪除、修改、查找、排序