在緊張的備考日語的過程中抽時間刷一下北京大學的python數據結構。查缺補漏。
/整除 >>>divmod(9,5) (1,4) /復數 >>>import cmath >>>(1+2j)*(1+3j) (-5+5j) >>>(1+4j).imag 4.0 >>>(1+4j).real 1.0
早就已經知道的C語言要想使用一個變量必須先初始化,Python的變量機制是引用數據對象,例如賦值語句‘a = 0’是創建a這個變量然后指向數值0,變量可以指向任意一個數據對象,變量的類型會隨着變量的變化而變化。

1 >>>a = 0 2 >>>type(a) 3 <class 'int'> 4 5 >>>a = '0' 6 >>>type(a) 7 <class 'str'>
由於變量的上一個性質,變量間的指向會因為前一個變量發生變化而變化。

1 >>>alist = [1,2,3] 2 >>>blist = [alist] * 3 3 >>>blist 4 [[1,2,3],[1,2,3],[1,2,3]] 5 >>>alist[1] = 'a' 6 >>>blist 7 [[1,'a',3],[1,'a',3],[1,'a',3]]
Python集合(set)是不重復元素的無序組合。

1 >>>a = {1,2,3} 2 >>>b = {2,3,4} 3 >>>a|b 4 {1,2,3,4} 5 >>>a&b 6 {2,3} 7 >>>a-b 8 {1} 9 >>>b-a 10 {4) 11 >>>a^b 12 {1,4} 13 >>>/ < ,<= ,> ,>= 子集,真子集,超集,真超集
調用函數:所有可以調用的事物成為callable。函數的參數寫在括號里,多個參數之間用逗號隔開。如果不加括號則表示對他的調用。

1 >>>import math 2 >>>a = math,sqrt(9) 3 >>>a 4 3.0 5 >>>a = math.sqrt 6 >>>a(9) 7 3.0
從鍵盤輸入:input()

1 /默認輸入的數據格式為str 2 >>>name = input('please input your name:') 3 please input your name:delete 4 >>>a,b = input().split() 5 1 2 6 >>>type(a) 7 <class 'str'>
棧、隊列和樹:具體的不再羅列,參見PDF。
遞歸:在程序中將問題不斷縮減成小問題,通過不斷調用自身來達到解決問題的目的。
遞歸三定律:
1,遞歸算法必須有一個基本結束條件(最小規模問題的直接解決)
2,遞歸算法必須能改變狀態向基本結束條件演進(減小問題規模)
3,遞歸算法必須調用自身(解決減小了規模的相同問題)

1 improt turtle 2 t = turtle.Turtle() 3 w = turtle.Screen() 4 5 def draw(_t , len): 6 if len > 0: 7 _t.forward(len) 8 _t.right(90) 9 draw(_t,len-5) 10 11 draw(t,100)
動態規划問題:動態規划算法通常基於一個遞推公式及一個或多個初始狀態。 當前子問題的解將由上一次子問題的解推出。使用動態規划來解題只需要多項式時間復雜度, 因此它比回溯法、暴力法等要快許多。問題的解決依賴於上一個子問題解決。即狀態和狀態轉移方程的建立,以找零錢為例。
給定change,求解最少的硬幣數量。
遞歸窮舉的方法因為迭代深度和迭代次數而受限。
解決方法是將重復步驟去重
例:[1,5,10]
找零:28
求 : minNum
解決方法:
d(28) = d(10+18) = d(18) + 1
d(28) = d(5 + 23) = d(23) + 1
d(28) = d(1 + 27) = d(27) + 1
if d(28) < d(18)+1 : minNum = d(18)+1
在這里發現遞歸可以完成。先寫一個遞歸版本。

1 def reC(coinsList,change): 2 minCount = change 3 for i in [c for c in coinList if c <= change]: 4 if reC(coinsList,change - i) + 1 < minCount: 5 minCount = reC(coinsList,change - i) 6 return minCount
測試發現遞歸完全可以實現找零。但是增大找零的數目會發現編譯器因為遞歸的調用次數增加而崩潰。
為了對他進行改進,可以引入容器的概念,將一些重復計算量進行優化。
例如:d(0) = 0; d(1) = d(0) + 1 = 0+1 ; d(2) = d(0) + 2 = d(1) + 1,自下而上采用遞推方法。

1 def dp(coinsList , change , minCount) : 2 for cents in range(change + i): 3 coinCount = cents 4 for i in [c for c in coinList if c <= cents]: 5 if minCount[cents-j] + 1 < coinCount: 6 coinCount = minCount[cents - j] + 1 7 minCoins[cents] = coinCount 8 return coinCount
二分查找:適用於有序數列。

1 def binaryFind(list,goal): 2 left = 0 3 right = len(list) - 1 4 result = False 5 while left < right and not result: 6 middle = (left + right)//2 7 if list[middle] == goal: 8 result = True 9 elif list[middle] < goal: 10 left = middle + 1 11 else: 12 right = middle - 1 13 return result

1 def dpBinaryfind(list,goal): 2 if len(list) == 0: 3 return False 4 else: 5 middle = len(list)//2 6 if list(middle) == goal: 7 return True 8 elif list(middle) < goal: 9 return dpBinaryfind(list[middle : ],goal) 10 else: 11 return dpBinaryfind(list[: middle],goal)
以上。