【零基础】学python数据结构与算法笔记


前言

学习python数据结构与算法,学习常用的算法,


1.算法入门概念

算法(Algorithm):一个计算过程,解决问题的方法
Niklaus Wirth(尼古拉·沃斯,计算机科学家):“程序=数据结构+算法”

数据怎么存储的 叫做数据结构 静态
算法操作 动态 有输入有输出

2.估计算法运行效率与时间复杂度

时间复杂度:用来评估算法运行效率的一个式子。

打印一次,时间复杂度为1

print(‘hello world’)                        O(1)

打印n次,时间复杂度为n

for i in range(n):
	print("hello world")                   O(n)

两成循环嵌套,n^2,
以此类推,三层嵌套n^3

for i in range(n):
	for j in range(n):
		print("hello world")               O(n^2)

因为O(1)是一个单位,我们把它还是记为O(1)而不是O(3),就像我问你烧一壶水,不会有人回答三个几分钟或者几个三分钟,而是只回答十几分钟。那为什么不是3O(1),因为在计算机里,打印1次和打印三次实际的影响不大,不管我执行几次只要不上升到问题的规模n,就是O(1)。

print(‘hello world’)  
print(‘hello wo’)  
print(‘hello w’)                        O(1)

为什么不是O(n^2+n),就像问你睡几个小时,不会有人回答8个小时零几分钟,我们只留大单位,留一个大概的时间。

for i in range(n):
	print(hello world")
	for j in range(n):
		print(hello world")           O(n^2)
while n>1:
	print(n)
	n = n//2

n=64 时输出64 32 16 8 4 2 ,此时只执行了6次,并没有执行64次,虽然是//2,但时间复杂度不是n/2,因为并没有执行32次,而是记为O(logn)
在这里插入图片描述
只有当你的算法出现循环减半的过程,每次循环迭代,会让你的问题规模缩小一半时,复杂度式子中会出现logn。

总结

  • 时间复杂度是用来估计算法运行时间的一个式子(单位)
  • 一般来说,时间复杂度高的算法比复杂度低的算法慢。
  • 常见的时间复杂度(按效率排序)
    在这里插入图片描述
  • 复杂问题的时间复杂度
    在这里插入图片描述

3.简单判断时间复杂度

  • 确定问题规模n
  • 循环减半过程 —> logn
  • k层关于n的循环—>n^k
  • 复杂情况:根据算法执行过程判断

4.空间复杂度

  • 空间复杂度:用来评估算法内存占用大小的式子
  • 空间复杂度的表示方法和时间复杂度完全一样
    • 算法使用了几个变量:O(1)
    • 算法使用了长度为n的一维列表:O(n)
    • 算法使用了m行n列的二维列表:O(mn)
  • “空间换时间”
    时间比空间重要,尽量占用空间而使用户等待时间变短

5.递归

递归有两个特点:调用自身,结束条件.

左边两个没有结束条件,不是合法递归。
在这里插入图片描述
func3(x)是先打印再递归,所以func(3),输出是3 2 1
在这里插入图片描述
func4(x)是先递归再打印,所以func(3),输出是1 2 3
在这里插入图片描述

6.汉诺塔问题

递归实例:汉诺塔问题
在这里插入图片描述
目标将A中的圆盘移动到C。
当n=2时,
在这里插入图片描述
当圆盘有n个的时候,我们用递归的方法完成这部分,把最下面的圆盘看成一个整体,把n-1个上面的圆盘看成一个整体。
在这里插入图片描述
只有第2步是只移动了1个盘子,第1步和第3步都移动了n-1个盘子。
第1步和第3步不是我们说的只能移动一个盘子的合法步骤,但是它是一个比原问题规模小了1的同样的一个问题,这就是递归。

#n是n个盘子,a,b,c是柱子的名字,
#原函数意思是,n个盘子从a,经过b,移动到c,目的是移动到c
def hanoi(n,a,b,c):
	if n > 0:
		hanoi(n-1,a,c,b)  #第1步,把n-1个盘子从A经过C移动到B
		print("moving from %s to %s"%(a,c)) #第2步,把第n个盘子从A移动到C
		hanoi(n-1,b,a,c)  #第3步,把n-1个盘子从B经过A移动到C

在这里插入图片描述
前面三步是两个盘子的问题,后面三步也是两个盘子的问题,中间只移动一次
在这里插入图片描述
h(2)=2h(1)+1 = 3 = 2^2-1
h(3)=2(h2)+1 = 7 = 2^3-1
h(64)大概是2^64-1=18446744073709551616-1
其实没有这个传说,是法国数学家编出来教汉诺塔原理,和之前有个下棋的故事是一样的,皇帝往棋盘的第1格中放1粒米,第2格中放2粒米,在第3格中加倍至4粒……以此类推,每一格均是前一格的2倍。


总结

了解了算法入门概念,复习了递归。

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值