数据结构python版_数据结构(python)

在紧张的备考日语的过程中抽时间刷一下北京大学的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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值