查找算法—折半查找算法分析与实现(Python)

December 20, 2015 2:01 PM
折半查找是我很喜欢的一种查找方式,它代码简单,查询效率很高,时间复杂度是0(log2n).
折半查找是在一个有序的元组中查找元素,它通过关键词与中间值的比较,来查找相关的元素。如果关键词比中间值大,那么就在元组的后半部分查找,反之亦然。下面先贴出其代码的实现

#BinarySearch.py
#王渊
#2015.12.18
#Email:[email protected]

from pylab import *

def BinarySearch(data, length, key):                            #折半查找
    low = 0
    high = length-1
    if(key < data[low] or key>data[high]):                      #索引超出范围返回错误
        print("Error!!! The ", key, " is not in the data!!!")
        return -1
    while(low<=high):                                           #循环查找
        mid = low + (high-low)//2                               #计算当前分割下标
        if(data[mid] > key):                                    #若查找记录小于当前分割记录
            high = mid-1                                        #调整分割记录                                                         
        elif(data[mid] < key):                                  #若查找记录大于当前分割记录
            low = mid+1                                                                                                     
        else:                                                   #若查找记录等于当前分割记录
            return mid
    if(data[mid] != key):                                       #数据key不在查询列表data中返回错误
        print("Error!!! The ", key, " is not in the data!!!")
        return -1

length = 100            
data = array(range(length))
key = 59
idx = BinarySearch(data, length, key)
print(data)
if(idx != -1):
    print("The ", key, " is the ", idx+1, "th value of the data.")

运行结果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]

The  50  is the  51 th value of the data.

好了,其实,折半查找也是有它的缺点的,从上面的例子可以看出,在元组{1,2,3,3,3,4,5,6}中,查找元素3时,只是输出了第一次找到的结果,另外折半查找要求元组的元素是有序的,查找的结果才是正确的。不过总的来说,折半查找还是一种性能卓越的查找算法。

你可能感兴趣的:(数据结构,python)