python数据结构与算法基础 第一课
tags:
- python
- 路飞学院
categories:
- python
- 递归
- 算法与数据基础
文章目录
第一节 算法概念
1. 算法介绍
- 算法(Algorithm) :一个计算过程,解决问题的方法
- Niklaus Wirth:“程序=数据结构+算法”
- 数据结构将涉及顺序表、链表、堆栈、队列、树、二叉树、平衡二叉树、红黑树;
- 算法将涉及排序算法(冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序、希尔排序、计数排序、桶排序、基数排序)、查找算法(顺序查找、二分法查找、二叉树查找、哈希查找)。
第二节 时间复杂度
1. 为什么使用时间复杂度
- 算法性能的衡量不再是以运行开始到运行结束的时间来衡量,因为对于不同性能的计算机会产生不同的差异,所以算法的衡量主要以时间复杂度。
- 时间复杂度:时间复杂度是用来估计算法运行时间的一个式子(单位)
- 一般来说,时间复杂度高的算法比复杂度低的算法慢。
2. 常见的时间复杂度
- 常见时间复杂度排序:0(1)<0(logn)<O(n)<O(nlogn)><o(n2)<o(n2logn)<O(n^3)
- 复杂问题的时间复杂度:O(n!) 0(2^n) O(n^n)
- 直接输出语句print(“hello world!”) 时间复杂度 O(1)
- for 语句的二层嵌套循环 时间复杂度 O(n*n)
- for 语句的n层嵌套循环 时间复杂度 O(n个n相乘)
- while语句中有对初始条件的对半减少操作 时间复杂度 O(logn) 以2为底数
第三节 空间复杂度
- 空间复杂度:用来评估算法内存占用大小的式子
- 空间复杂度的表示方式与时间复杂度完全一样
- 算法使用了几个变量: 0(1)
- 算法使用了长度为n的一维列表: O(n)
- 算法使用了m行n列的二维列表: O(mn)
- 空间不算事: 空间换时间
第四节 简单语法之递归
1. 递归条件
- 调用自身
- 结束条件(规模递减)
2. 递归举例
#!/usr/bin/env python3
def fun1(x):
if x > 0:
fun1(x - 1)
print(x)
def fun2(x):
if x > 0:
print(x)
fun1(x - 1)
fun1(4) # 1 2 3 4
fun2(4) # 4 3 2 1
3. 递归应用-汉诺塔问题
- 大梵天创造世界的时候做了三根金刚石柱子,在第一根柱子.上从下往上按照大小顺序摞着64片黄金圆盘。
- 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
- 在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
- 64根柱子移动完毕之日,就是世界毁灭之时。
解决方法:
- 假设n=2: 1.把小圆盘从A移动到B 2.把大圆盘从A移动到C 3.把小圆盘从B移动到C
- 然后把n-1看做一个整体, 那么就剩n-1和n了上面的步骤就可以解决
#!/usr/bin/env python3
# 汉诺塔问题
i = 0
def hannoi(n, a, b, c):
global i
if n > 0:
hannoi(n-1, a, c, b)
print("moving from %s to %s" % (a, c))
i += 1
hannoi(n-1, b, a, c)
hannoi(3, 'A', 'B', 'C')
print(i)
结论:
- 汉诺塔移动次数的递推式: h(x)=2h(x-1)+1
- h(64)=18446744073709551615 2^64
- 假设婆罗门每秒钟搬一个盘子,则总共需要5800亿年!