zoukankan      html  css  js  c++  java
  • 数据结构之旅——搜索、排序和复杂度分析(Python实现)(二)

    搜索算法:

    首先是python自己的min/max函数,这个函数返回最小项的索引。此函数需要注意的是:使用的对象必须为iterable。关于min/max函数还有不少使用技巧,以下一一列举:

    1.最基本的如:

    tmp = max(1,2,4)
    print(tmp)
    #可迭代对象
    a = [1,7,9,3,5]
    tmp = max(a)
    print(tmp)

    2.参数key的使用:

    利用max/min函数中的key参数实现多种搜索:
    (1).找出一组数中绝对值最大的数:

    a = [-9, -8, 1, 3, -4, 6]
    tmp = max(a, key=lambda x: abs(x))
    print(tmp)

    (2).arr = ["abc","abcd","abcde"] 找到 arr中长度最短的字符串:

    arr = ["abc","abcd","abcde"]
    res = min(arr,key=len)

    (3).找出字典中值最小的那组数据:

    prices = {
        'A':123,
        'B':450.1,
        'C':12,
        'E':444,
    }
    # 在对字典进行数据操作的时候,默认只会处理key,而不是value
    # 先使用zip把字典的keys和values翻转过来,再用max取出值最大的那组数据
    max_prices = max(zip(prices.values(), prices.keys()))
    print(max_prices)

    最常用的两种搜索算法比较:

    1.顺序搜索:

    顾名思义,即从头开始往后遍历,直到找到目标项。期间每遍历到一个元素就与目标进行比较。若到最后一个位置都没有找到目标项,则返回False。

    在确定了平均情况下,把在每一个可能的位置找到目标项所需的迭代次数相加,并且用总和除以N。得出平均情况下的复杂度为O(n)。当然,显然易见的是顺序搜索的最好情况下,即第一个就是目标项,的时间复杂度为O(1)

    2.有序列表的二叉搜索

    强调!!!有序列表。必须要是有序列表。

    默认该列表为从小到大排序。第一步、搜索算法直接找到列表的中间位置,然后把该位置的项和目标项进行比较。如果他们一致,就返回该位置。不一致则进入第二步。第二步、判断:如果目标项小于当前项,算法按第一步搜索列表中间项以前的部分。如果目标项比当前项大,算法按第一步搜索列表中间项以后的部分。当找到目标,或当前的开始位置比当前的结束位置大的时候,停止搜索过程。

    如下是二叉搜索函数的实现代码:

    def binarySearch(target, sortedList):
        left = 0
        right = len(sortedList)-1
        if sortedList[0] < sortedList[-1]: #判断该列表是否是按从小到大的顺序排列
            while left <= right:
                midpoint = (left + right)//2
                if target == sortedList[midpoint]:
                    return midpoint
                elif target > sortedList[midpoint]: #说明目标项在中间位置数的右边
                    left = midpoint+1
                elif target < sortedList[midpoint]: #说明目标项在中间位置数的左边
                    right = midpoint -1
            return -1 #没找到目标项
    
        if sortedList[0] > sortedList[-1]:
            while left <= right:
                midpoint = (left + right)//2
                if target == sortedList[midpoint]:
                    return midpoint
                elif target < sortedList[midpoint]:
                    left = midpoint+1
                elif target > sortedList[midpoint]:
                    right = midpoint -1
            return -1
    
    print(binarySearch(2, [1,2,3,4,5,6,7,8,9]))

    二叉搜索的最好情况毋庸置疑就是O(1),中间位置的元素就是目标项。最坏情况则是一直分割到最后,找到了目标项,复杂度为O(log2n).

    看上去二叉搜索可能比顺序搜索要更高效。然而选择何种搜索算法,取决于列表中的数据的组织方式。因为对于二叉搜索,必须要有有序列表这个前提,所以如果要搜索的列表是无序的,那么排序的时间复杂度很可能是不可忽略的,最终的时间复杂度可能会远远大于顺序搜索。

  • 相关阅读:
    一首诗
    jsp作用域问题
    jsp关于request.setAttribue还有response.addCookie()的两个问题
    编程学习过程记录
    一些关于自己的未来的东西
    requests的post提交form-data; boundary=????
    记录一些爬虫的小细节
    【CSS3】CSS——链接
    【CSS3】CSS——文本
    【CSS3】background-clip与background-origin的联系与区别
  • 原文地址:https://www.cnblogs.com/Misakikure/p/9664948.html
Copyright © 2011-2022 走看看