数据结构与算法(python)(算法部分)
文章目录
一、算法入门
1.时间、空间复杂度
时间复杂度:T(n)=O(f(n)) 估计算法运行时间的式子(单位)用最大数量级
f(n)基础操作重复执行的次数 O(1) O(n) O(log n) {O(1)、O(n2+n)}表述不正确
快速判断:
确定问题规模n
循环减半: logn
k层关于n的循环 nk
按效率排序 O(1)<O(log n)<O(n)<O(nlog n)<O(n2)<O(n2log n) <O(N3)
复杂时间复杂度 O(n!) O(2n) O(nn)
空间复杂度:S(n)=O(f(n)) 评估算法内存占用大小
使用了几个变量: O(1)
使用了长度为n的一位列表:O(n)
使用m行n列的二维列表:O(mn)
原则:"空间换时间 "
2.递归
复习:递归
特点:调用自身、结束条件。
def fun3(x):
if x>0:
print(x)
fun3(x-1)
# 输入x=3 输出 :3 2 1
#
def fun3(x):
if x>0:
fun3(x-1)
print(x)
#输入 x=3 输出 1 2 3 先执行调用函数的操作,函数无法执行时执行打印 从内向外打印
fun3(3)
递归实例:汉诺塔问题:三根柱子ABC,在一根上由上到下按从小到大放64个圆盘,按大小顺序重新摆放到另一个柱子上。
# 汉诺塔问题:
# n=2时:
# 1.小圆盘A到B
# 2.大圆盘A到C
# 3.小圆盘B到C
# n个盘子 下面一个看成一个整体,上面n-1个看成一个整体
# 1.n-1个圆盘A经过C到B(比原规模小1的原问题)
# 2.第n个圆盘A到C(一步)
# 3.n-1个圆盘B经过A到C(比原规模小1的原问题)
#递推式:h(x)=2h(x-1)+1 大约2^n
#h(64)=18446744073709551615 每秒移动一个,要5800亿年
def hanoi(n,a,b,c):
if n>0:
hanoi(n-1,a,c,b)
print("moving from %s to %s"%(a,c))
hanoi(n-1,b,a,c)
hanoi(2,'A','B','C')
二、查找问题
查找:在一些数据元素中,通过一定的方法找出与给定关键词相同的数据元素的过程。
列表查找(线性表查找):从列表中查找指定元素
输入:列表、待查找元素
输出:元素下标
内置列表查找函数:index() 就是线性查找
1.顺序查找
顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。
时间复杂度o(n)
#顺序查找
def linear_search(li,val):
for ind,v in enumerate(li):
if v==val:
return ind
else:
return None
2.二分查找
二分查找:又叫折半查找,从有序列表的初始候选区 li[0:n]开始,通过对待查找的与候选区中间值的比较,可以使候选区减少一半。
时间复杂度o(log n) 但是需要先排序
#二分查找: 1-9 中查找元素3
def binary_search(li,val):
left=0
right=len(li)-1
while left<=right:
mid=(left+right)//2
if li[mid]==val:
return mid
elif li[mid]>val:#待查找的值在mid左侧
right=mid-1
else:#li[mid]<val 待查找的值在mid右侧
left=mid+1
else:
return None
li=[1,2,3,4,5,6,7,8,9]
print(binary_search(li,3))
三、列表排序
排序:将一组 无序 的记录序列调整为有序的记录序列
列表排序:将无序列表变为有序列表
输入:列表
输出:有序列表
升序与降序
内置排序函数:sort() 基于归并排序
常见算法排序:
冒泡排序、选择排序、插入排序
快速排序、堆排序、归并排序
希尔排序、计数排序、基数排序
1.冒泡排序
列表每两个相邻的数,如果前面的比后面的大,则交换这两个数
一趟排序完成后,无序区减少一个数,有序区增加一个数
代码关键点:趟、无序区
时间复杂度O( n2)
#冒泡排序
import random
def bubble_sort(li):
for i in range(len(li)-1):#第i趟
exchange=False
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange=Ture
if not exchange:#如果没有发生交换则表示已经排好序
return
li=[random.randint(0,100) for i in range(10)]
print(li)
bubble_sort(li)
print(li)