数据结构与算法(python)(算法入门)

数据结构与算法(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值