【零基础】学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
    评论
数据结构习资料分享 内容概览: 本次分享包涵了大计算机相关专业必的“数据结构”课程的一系列习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份习资料适用于所有大计算机相关专业的生,无论你是初者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始习,如数组和链表,然后再习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。
Python数据结构与算法分析是一个专栏,主要记录了如何使用Python数据结构与算法笔记和练习题。这个专栏包括了Python的内置数据结构和扩展数据结构。Python给我们提供了很多现成的数据结构类型,如列表、元组、字典等,这些是系统预先定义好的数据结构。而还有一些数据组织方式需要我们自己去定义和实现,比如栈、队列等,这些被称为Python的扩展数据结构。通过习这些数据结构和算法分析,可以更好地理解和应用Python编程语言。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Python数据结构与算法】(一)基本概念和算法分析](https://blog.csdn.net/weixin_45052363/article/details/125099029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python 数据结构与算法详解](https://blog.csdn.net/qq_35029061/article/details/127561227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值