什麼是計算機科學?python
首先明確的一點就是計算機科學不單單是對計算機的研究,雖然計算機在科學發展的過程當中發揮了重大的做用,可是它只是一個工具,一個沒有靈魂的工具而已。所謂的計算機科學其實是對問題、解決問題以及解決問題的過程當中產生產生的解決方案的研究。例如給定一個問題,計算機科學家的目標是開發一個算法來處理該問題,最終獲得該問題的解、或者最優解。因此說計算機科學也能夠被認爲是對算法的研究。所以咱們也能夠感覺到,所謂的算法就是對問題進行處理且求解的一種實現思路或者思想。程序員
如何形象化的理解算法?算法
一個常勝將軍在做戰以前都會進行戰略的制定,目的是爲了可以在最短的時間切成本消耗最低的狀況下獲取最終的勝利。若是將編碼做爲戰場,則程序員就是這場戰役的指揮官,你如何能夠將你的程序能夠在最短且消耗資源最小的狀況下獲取最終的執行結果呢?算法就是咱們的策略!編程
意義數據結構
數據結構和算法思想的通用性異常的強大,在任何語言中都被使用,它們將會是咱們編碼生涯中伴隨咱們最長久利器(左膀右臂)。有必定經驗的程序員最終拼的就是算法和數據結構。app
數據結構和算法思想也能夠幫助咱們拓展和歷練編碼的思惟,可讓咱們更好的融入到編程世界的角角落落。數據結構和算法
什麼是算法分析?ide
剛接觸編程的學生常常會將本身編寫的程序和別人的程序作比對,獲取在比對的過程當中會發現雙方編寫的程序很類似但又各不相同。那麼就會出現一個有趣的現象:兩組程序都是用來解決同一個問題的,可是兩組程序看起來又各不相同,那麼哪一組程序更好呢?函數
引例:a+b+c = 1000 a^2 + b^2 = c^2 (a,b,c均爲天然數),求出a,b,c可能的組合?工具
#法一: for a in range(0,1001): for b in range(0,1001): for c in range(0,1001): if a+b+c == 1000 and a**2+b**2 == c**2: print(a,b,c) #法二: for a in range(0,1001): for b in range(0,1001): c = 1000-a-b if a+b+c == 1000 and a**2+b**2 == c**2: print(a,b,c)
如何評判程序的優劣?
消耗計算機資源和執行效果
計算算法執行的平均耗時
時間複雜度(推薦)
時間複雜度
評判規則 : 量化算法執行的操做/執行步驟的數量
最重要的項 :時間複雜表達式中最有意義的項
大 O 計法對時間複雜度進行表示 : O(量化表達式中最有意義的項)
常見時間複雜度:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
例一: 計算下列算法的時間複雜度
def sumOfN(n): theSum = 0 for i in range(1,n+1): theSum += i return theSum print(sumOfN(10)) # 1+n+1 = n+2 ==> O(n)
例二:計算下列算法的時間複雜度
a=5 b=6 c=10 for i in range(n): for j in range(n): x = i * i y = j * j z = i * j for k in range(n): w = a*k + 45 v = b*b d = 33 # 3 + n*n*3 + 2n + 1 ==> 3n**2+2n ==> 3n**2 ==> n**2 ==>O(n**2)
概念 :對於數據(基本類型的數據(int,float,char))的組織方式就被稱做爲數據結構。數據結構解決的就是一組數據如何進行保存,保存形式是怎樣的。
案例: 須要存儲一些學生的學生信息(name,score),那麼這些數據應該如何組織呢?查詢某一個具體學生的時間複雜度是什麼呢?(三種組織方式)
#方式一:列表 + 字典 [{ 'name':'xxx', 'score':'xxx' },{ 'name':'xxx', 'score':'xxx' },{ 'name':'xxx', 'score':'xxx' }] #方式二: 列表 + 元組 [ ('name','score'), ('name','score'), ('name','score') ] #方式三: 字典 + 字典 { 'zhangsan':{'score':'xxx'}, 'lisi':{'score':'xxx'} }
使用不一樣的形式組織數據,在基於查詢時的時間複雜度是不同的。所以認爲算法是爲了解決實際問題而設計的,數據結構是算法須要處理問題的載體。
該模塊能夠用來測試一段python代碼的執行時長/速度
Timer 類
該類是 timerit 模塊中專門用於測試代碼的執行時長/速度的,原型 class
用法 : timeit.Timer (stmt='pass',setup='pass')
stmt參數:表示即將進行測試的代碼塊語句。
setup:運行代碼塊語句時所須要的設置。
timeit函數:timeit.Timer.timeit(number=100000),該函數返回代碼塊語句執行number次的平均耗時。
例:實例化一個空列表,而後將0-n範圍的數據添加到列表中。(四種方式)
from timeit import Timer def text01(): alist = [] for i in range(1000): alist.append(i) return alist def text02(): alist = [] for i in range(1000): alist += [i] return alist def text03(): alist = [ i for i in range(1000)] return alist def text04(): alist = list(range(1000)) return alist if __name__ == '__main__': t1 = Timer('text01()',setup="from __main__ import text01") t_1 = t1.timeit(1000) print(t_1) t2 = Timer('text02()',setup="from __main__ import text02") t_2 = t2.timeit(1000) print(t_2) t3 = Timer('text03()',setup="from __main__ import text03") t_3 = t3.timeit(1000) print(t_3) t4 = Timer('text04()',setup="from __main__ import text04") t_4 = t4.timeit(1000) print(t_4) # 0.102241317647497 # 0.09949069216443718 # 0.0516077816489684 # 0.019912033670678397