• 查找算法


    要点概论:

    1. 顺序查找法

    2. 二分查找法

    附录1. python语言提供的查找算法

      

    1. 顺序查找法

      查找算法是在程序设计中最常用到的算法。假定要从 n 个元素中查找 x 的值是否存在,最原始的办法是从头到尾逐个查找,这种查找方法称为顺序查找法。

      顺序查找算法有三种情形可能发生:最好的情况下,第一项就是要找的数据对象,只有一次比较;最差的情况下,需要 n 次比较,全部比较完之后查不到数据;平均情况下,比较次数为 n/2 次。即算法的复杂度为 O(n)。

      1)在列表中顺序查找特定数值 x 。

    def sequentialSearch(alist,item):
        pos = 0           #初始查找位置
        found = False     #未找到数据对象
        while pos < len(alist) and not found:        #列表未结束并且还未找到则一直循环
            if alist[pos] == item:                   #找到匹配对象,返回True
                found = True
            else:         #否则查找位置 + 1
                pos = pos + 1
        return found
    
    def main():
        testlist = [1,3,33,8,24,52,15,6]          #测试数据列表
        print(sequentialSearch(testlist,3))       #查找数据3
        print(sequentialSearch(testlist,13))      #查找数据13
    
    if __name__ == '__main__':
        main()
    # 程序运行结果如下:
    #         True
    #         False
    View Code

       2)在列表中顺序查找最大值和最小值。

    def maxl(alist):                #查找最大值
        pos = 0                     #初始查找位置
        iMax = alist[0]             #假设第一个值最大
        while pos < len(alist):    #在列表中循环
            if alist[pos] > iMax:  #如果列表当前值大于最大值iMAX
                iMax = alist[pos]  #则当前值未最大值iMax
            pos += 1               #查找位置 + 1
        return iMax               #返回最大值
    def minl(alist):               #查找最小值
        iMin = alist[0]            #假设第一个值最小
        for item in alist:        #遍历列表中每个数值
            if item < iMin:       #如果列表当前值小于最小值iMin
                iMin = item       #则当前值为最小值iMin
        return iMin              #返回最小值
    
    def main():
        testlist = [1,2,4,2,12,5,232,65,2,756,123]      #测试数据列表
        print('最大值 = ',maxl(testlist))              #查找并打印列表中最大值
        print('最小值 = ',minl(testlist))              #查找并打印列表中最小值
    if __name__ == '__main__':
        main()
    #  程序运行结果如下:
        #最大值 = 756
        #最小值 = 1
    View Code

    2. 二分查找法

      二分查找法又称折半查找法,用于预排序列表的查找问题。

      【要在排序列表 a 中查找元素 t ,首先,将列表 alist 中间位置的项与查找关键字 t 比较,如果两者相等,则查找成功;否则利用中间项将列表分成前,后两个子表,如果中间位置项目大于 t ,则进一步查找前一子表,否则进一步查找后一子表。

       重复以上过程,直到找到满足条件的记录,即查找成功;或直到子表不存在为止,即查找不成功】。

      对于包含 N 个元素的表,其时间复杂度为 O(㏒₂N)

      1)二分查找法的递归实现

    def _binarySearch(key,a,low,high):
        if high <= low: return -1                 #查找失败,返回 -1
        mid = (low + high) // 2                   #计算中间位置
        if a[mid] > key:                          #中间位置项目大于查找关键字
            return _binarySearch(key,a,low,mid)   #递归查找前一子表
        elif a[mid] < key:                        #中间位置项目小于查找关键字
            return _binarySearch(key,a,mid+1,high)#递归查找后一子表
        else:                                     #中间位置项目等于查找关键字
            return mid                            #查找成功,返回下标位置
    def binarySearch(key,a):                      #二分查找
        return _binarySearch(key,a,0,len(a))      #递归二分查找法
    def main():
        testlist = [1,2,3,23,33,54,77]            #测试数据列表
        print('关键字位于列表索引',binarySearch(33,testlist))  #二分查找关键字33
        print('关键字位于列表索引',binarySearch(58,testlist))  #二分查找关键字58
    
    if __name__ == '__main__':
        main()
    #程序运行结果如下:
        # 关键字位于列表索引   4
        # 关键字位于列表索引  -1
    View Code

      2)二分查找法的非递归实现

    def binarySearch(key,a):          #二分查找法的非递归实现
        low = 0                       #左边界
        high = len(a) - 1             #右边界
        while low <= high:            #左边界小于右边界,则循环
            mid = (low + high) // 2   #计算中间位置
            if a[mid] < key:          #中间位置项目小于查找关键字
                low = mid + 1         #调整左边界(在后一子表查找)
            elif a[mid] > key:        #中间位置项目大于查找关键字
                high = mid -1         #调整右边界(在前一子表查找)
            else:                     #中间位置项目等于查找关键字
                return mid            #查找成功,返回下标位置
        return -1                     #查找不成功(不存在关键字),返回 -1
    def main():
        testlist = [1,13,26,28,33,46,48,77,99]    #
        print('关键字位于列表索引',binarySearch(33,testlist))  #
        print('关键字位于列表索引',binarySearch(58,testlist))  #
    if __name__ == '__main__':
        main()
    #程序运行结果如下:
        # 关键字位于列表索引   4
        # 关键字位于列表索引  -1
    View Code

       PS: 另一种思路的二分查找算法 :http://www.cnblogs.com/Eva-J/articles/7197403.html

    附录1:python语言提供的查找算法

      python语言提供了下列查找算法。

        1)运算符 in :"x in alist" 测试值 x是否在列表 alist 中存在。

        2)内置函数 max , min:查找列表的最大值和最小值。

      示例如下:

    testlist = [1,3,44,5,2,55,534,23,77]
    
    >>>3 in testlist     #True
    
    >>>13 in testlist    #False  
    
    >>>max(testlist)     #534
    
    >>>min(testlist)     #1

     

      

  • 相关阅读:
    目标检测梳理:基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(转)
    4. 基于深度学习的目标检测算法的综述(转)
    2. 滑动窗口和 Bounding Box 预测(转)
    1. 初步认识目标定位、特征点检测、目标检测(转)
    redux (一)
    react-todoMVC脚手架
    SVN提示图标详解
    react ( 二 )
    react入门(一)
    JavaScript奇技淫巧
  • 原文地址:https://www.cnblogs.com/HZY258/p/8453795.html
Copyright © 2020-2023  润新知