在紧张的备考日语的过程中抽时间刷一下北京大学的python数据结构。查缺补漏。
/整除>>>divmod(9,5)
(1,4)/复数>>>importcmath>>>(1+2j)*(1+3j)
(-5+5j)>>>(1+4j).imag4.0
>>>(1+4j).real1.0
早就已经知道的C语言要想使用一个变量必须先初始化,Python的变量机制是引用数据对象,例如赋值语句‘a = 0’是创建a这个变量然后指向数值0,变量可以指向任意一个数据对象,变量的类型会随着变量的变化而变化。
1 >>>a =02 >>>type(a)3
4
5 >>>a = '0'
6 >>>type(a)7
变量类型
由于变量的上一个性质,变量间的指向会因为前一个变量发生变化而变化。
1 >>>alist = [1,2,3]2 >>>blist = [alist] * 3
3 >>>blist4 [[1,2,3],[1,2,3],[1,2,3]]5 >>>alist[1] = 'a'
6 >>>blist7 [[1,'a',3],[1,'a',3],[1,'a',3]]
变量引用
Python集合(set)是不重复元素的无序组合。
1 >>>a = {1,2,3}2 >>>b = {2,3,4}3 >>>a|b4 {1,2,3,4}5 >>>a&b6 {2,3}7 >>>a-b8 {1}9 >>>b-a10 {4)11 >>>a^b12 {1,4}13 >>>/ < ,<= ,> ,>= 子集,真子集,超集,真超集
集合常用操作
调用函数:所有可以调用的事物成为callable。函数的参数写在括号里,多个参数之间用逗号隔开。如果不加括号则表示对他的调用。
1 >>>importmath2 >>>a = math,sqrt(9)3 >>>a4 3.0
5 >>>a =math.sqrt6 >>>a(9)7 3.0
函数调用
从键盘输入:input()
1 /默认输入的数据格式为str2 >>>name = input('please input your name:')3 please input your name:delete4 >>>a,b =input().split()5 1 2
6 >>>type(a)7
input()
栈、队列和树:具体的不再罗列,参见PDF。
递归:在程序中将问题不断缩减成小问题,通过不断调用自身来达到解决问题的目的。
递归三定律:
1,递归算法必须有一个基本结束条件(最小规模问题的直接解决)
2,递归算法必须能改变状态向基本结束条件演进(减小问题规模)
3,递归算法必须调用自身(解决减小了规模的相同问题)
1 improt turtle2 t =turtle.Turtle()3 w =turtle.Screen()4
5 defdraw(_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 defreC(coinsList,change):2 minCount =change3 for i in [c for c in coinList if c <=change]:4 if reC(coinsList,change - i) + 1 <5 mincount="reC(coinsList,change" return>
递归找零
测试发现递归完全可以实现找零。但是增大找零的数目会发现编译器因为递归的调用次数增加而崩溃。
为了对他进行改进,可以引入容器的概念,将一些重复计算量进行优化。
例如:d(0) = 0; d(1) = d(0) + 1 = 0+1 ; d(2) = d(0) + 2 = d(1) + 1,自下而上采用递推方法。
1 defdp(coinsList , change , minCount) :2 for cents in range(change +i):3 coinCount =cents4 for i in [c for c in coinList if c <=cents]:5 if minCount[cents-j] + 1 <6 coincount="minCount[cents" j>
7 minCoins[cents] =coinCount8 return coinCount
动态优化找零
二分查找:适用于有序数列。
1 defbinaryFind(list,goal):2 left =03 right = len(list) - 1
4 result =False5 while left < right and notresult:6 middle = (left + right)//2
7 if list[middle] ==goal:8 result =True9 elif list[middle] <10 left="middle">
11 else:12 right = middle - 1
13 return result
binaryFind
1 defdpBinaryfind(list,goal):2 if len(list) ==0:3 returnFalse4 else:5 middle = len(list)//2
6 if list(middle) ==goal:7 returnTrue8 elif list(middle) <9 returndpbinaryfind : else:11 return dpbinaryfind middle>
递归版本二分查找
以上。
9>10>6>5>