數據結構(python)


  在緊張的備考日語的過程中抽時間刷一下北京大學的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'>
input()

   棧、隊列和樹:具體的不再羅列,參見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
binaryFind
 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)
遞歸版本二分查找

 

 以上。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM