Python算法学习笔记

本文是Python算法学习笔记,涵盖了二分查找、选择排序、链表、递归、快速排序、散列表、广度优先搜索、狄克斯特拉算法和贪婪算法等核心概念。详细讲解了每种算法的原理、优缺点和应用场景,特别是讨论了动态规划和贪心算法在解决复杂问题中的应用,以及如何识别和处理NP完全问题。
摘要由CSDN通过智能技术生成

2022.9.29

第一章

二分查找:输入的是一个有序的元素列表,如果

要查找的元素包含在列表中二分查找返回其位置否则返回NULL

对于同样的查找任务,普通查找需要n次,二分查找需要log2n次

指数中在不指定下标的情况下默认底数都是2,因此二分查找在查找任务中最多需要检查log n个元素

注意:仅当列表有序时二分查找才有用

def binary_search(list,item):
    low = 0
    high = len(list)-1

    while low<=high:
        mid = (low+high)//2
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid-1
        else:
            low = mid+1
    return None

my_list=[1,3,5,7,9]
print(binary_search(my_list,3))
print(binary_search(my_list,-1))

import numpy as np
"""
假设有一个包含128个名字的有序列表,你要使用二分查找在其中查找一个名字
请问最多需要几步才能找到
长度翻倍后最多需要几步
"""
res = np.log2(128)
print(res) # 7
res_new=np.log2(256)
print(res_new) # 8

运行时间

        线性时间:最多需要猜测的次数与列表长度相同 用大O表示法则是O(n),相对的二分查找的大O表示法为O(log n)

大O表示法

        大O表示法指出了算法有多快,例如列表含有n个元素,简单查找需要检查每个元素,因此需要n次操作,使用大O表示法就是O(n),没有单位-----大O表示法指的是并非以秒为单位的速度,大O表示法能让我们能够比较操作数,它指出了算法运行时间的增速

        注意:简单查找的运行时间不可能超过O(n)

最好情况指的就是一次就查找到目标,最坏情况是遍历完所有数据之后才找到目标

除了这两种情况之外,还需要考虑平均情况的运行时间

         目前需要理解的是:

                1.算法的速度并非指的是时间而是操作数的增速

                2.谈论到算法的速度时指的是随着输入的增减,其运行时间将以什么样的速度增加

                3.算法的运行时间用大O表示法表示

                4.O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多

章节末尾提到了  旅行商问题 是运行时间极长的一个程序 n!

第二章 选择排序

        本章涉及数组和链表的使用

数组已经比较熟悉,下面介绍链表的内容

链表

        链表中的元素可以存储在内存的任何地方;链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起

        在链表中添加元素很容易:只需要将其放入内存,并将其地址存储到前一个元素中

        在插入元素这方面数组比较劣势,因为声明数组时就是从内存中取走了一块连续的地址,如果后续的内容不足以存放在已声明的数组中就会导致内容的丢失等问题,因此链表在插入元素方面更占优势

        链表有优点就会有缺点,缺点就是不能直接访问链表中的元素,必须从链表的头开始遍历;相反的数组可以通过下标来访问数组元素

        在中间插入 : 当需要在容器中间插入元素时,若使用链表则只需修改它前面的那个元素指向的地址,而使用数组时,则必须将后面的元素都向后移,如果数组没有足够的空间可能还得将整个数组复制到其他地方,因此需要在中间插入元素时,链表是更好的选择

        删除 : 在进行删除操作时,链表也是比数组更好的选择

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值