查找算法

要点概论:

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

 

  

原文地址:https://www.cnblogs.com/HZY258/p/8453795.html