python 学习简记 《编程导论》 CH10&CH11

本文主要探讨了Python编程中的一些基础算法和数据结构,包括线性搜索、二分查找及其复杂度分析,介绍了选择排序和归并排序这两种排序算法的原理和效率。此外,还简单介绍了Python内置的排序函数以及散列表的概念和应用,强调了Python在排序和搜索上的高效性能。同时,提到了Python的PyLab库在数据可视化方面的作用,展示了如何使用PyLab绘制图形,并探讨了如何自定义图的样式和属性。
摘要由CSDN通过智能技术生成

《编程导论》 CH10 一些简单的算法和数据结构

10.1 搜索算法

搜索算法就是在一个元素集合中寻找具有特殊属性的一组元素。把这个元素集合称为搜索空间。

本节分析两个用于搜索列表的算法,它们都满足如下需求:

def search(L,e):

      """假定L是列表

          如果e在L中返回True,否则返回False"""

语法上和Python的表达式e in L相同。

1. 线性搜索和间接访问元素

def search(L,e):
    for i in range(len(L)):
        if L[i]==e:
            return True
    return False
在Python中,列表被表示为一个长度(表示列表中对象的数量)和一个固定大小的指针对象序列。

这是一种间接操作的实现技巧。使用间接操作来访问元素时会先访问另一个元素,其中包含对目标元素的引用。

访问列表中第i个元素所用的时间是常数,地址为start+4*i,算法复杂度O(len(L))

2.二分查找和利用假设

假设有一个包含整数的列表,其中的元素按升序存储。

def search(L,e):
    for i in range(len(L)):
        if L[i]==e:
            return True
        if L[i]>e:
            return False
    return False

 搜索到大于e的数字就停止,这样可以降低平均运行时间,但是不会改变最坏情况下的复杂度。

def search(L,e):
    def bSearch(L,e,low,high):
        #Decrements high - low
        if high==low:
            return L[low]==e
        mid = (low+high)//2
        if L[mid]==e:
            return True
        elif L[mid]>e:
            if low==mid: #finish
                return False
            else:
                return bSearch(L,e,low,mid-1)
        else:
            return bSearch(L,e,mid+1,high)
        
    if len(L)==0:
        return False
    else:
        return bSearch(L,e,0,len(L)-1)
递归的二分查找

像search这样的函数通常称为包装函数。search函数会为用户代码提供一个优秀的接口,但是实际上并不执行真正的计算,而是用适当的参数调用辅助函数bSearch。

算法复杂度O(log(len(L)))

10.2 排序算法

利用二分查找需要先排序,如果需要搜索统一个列表多次(k次),那可以先对列表进行一次排序操作,当满足:

(sortComplexity(L)+k*log(len(L)))<k*len(L)时这是有价值的。

Python内建的排序算法足够高效O(nlog(n)): L.sort()对列表排序 sorted(L)返回的列表和L包含相同的元素而不修改L


选择排序:

选择排序会保持一个循环不变式:将列表分割成前一部分(L[0:i])和后一部分(L[i+1:len(L)]),前一部分是有序的,并且其中的所有元素都不大于后一部分中的最小元素。

def selSort(L):
    """assume L is a list,and elements could be compared by >,ascending sort"""
    suffixStart =0
    while suffixStart != len(L):
        prefixEnd=suffixStart #书上没这句 编译不通过?
        for i in range(prefixEnd,len(L)):
            if L[i]<L[prefixEnd]:
                L[prefixEnd],L[i]=L[i],L[prefixEnd]
        suffixStart += 1
复杂度O(len(L)^2)

1.归并排序

前面说的二分查找是分治算法的一种。

分治算法可以被描述为:

1)一个输入大小的阈值,输入大小低于这个值的问题不会被分解;

2)子问题的大小和数量,据此对问题进行分解;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的turtle库是一个海龟绘图模块,它是Python自带的标准库,可以通过import语句导入并在Python中使用。海龟绘图源自20世纪60年代的logo语言,它模拟了一个真实的海龟在画布上游走的过程,通过控制海龟的移动和绘画来创建图形。turtle库提供了一些功能函数,包括移动和绘画等操作。你可以使用turtle.fd(d)向前移动一定的距离d,使用turtle.bk(d)向后移动一定的距离d,使用turtle.circle(半径, 弧度)以某个点为圆心绘制曲线等。此外,turtle库还提供了绝对坐标和海龟坐标两种角度坐标体系,你可以通过turtle.seth(angle)来改变海龟的游走方向,也可以通过turtle.left(angle)和turtle.right(angle)以海龟为参考系改变方向。下面是一个示例代码: import turtle turtle.left(45) turtle.fd(150) turtle.right(135) turtle.fd(300) turtle.left(135) turtle.fd(150) 这段代码可以让海龟按照一定的角度和距离绘制出一些图形。通过使用turtle库,你可以使用海龟绘图来进行一些简单的图形绘制和可视化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python基础学习简记--海龟绘图(Day10)](https://blog.csdn.net/weixin_39344224/article/details/102807350)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python 学习笔记(三)---turtle库的使用(超详细)](https://blog.csdn.net/qq_40181592/article/details/86770960)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值