Python实现四大经典查找算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yinhui_zhang/article/details/89061283

    本文主要实现查找算法中的二分查找算法,顺序查找,插入查找算法以及fibonacci查找算法,个人认为以上查找算法本质的不同其实就是缩小的区间方式不一样罢了。二分查找算法采用二分缩小区间的方法;顺序查找算法每次缩小一个单位区间;而插入查找算法则通过数据的分布特征来重新计算区间:mid = low + (key -nums[low])*(high-low)/(nums[high]-nums[low])),就是二分查找的升级版本;最后的fibonacci查找算法的缩小区间的方法则是通过fibonacci数列来确定。同样是本文只给出代码和少量的注释的理论理解,具体理论请参考reference。

1.二分查找算法

二分查找算法真的算是最有用的算法了,各种刷题中二分算法的思想简直无所不能啊,如旋转数组的最小值,求数组的前k个数等,都是采用二分查找缩小区间的方法。以下给出递归和非递归的二分算法的三种不同方式的代码。

def bin_serach(lst, value, low , high):
    #递归出口
    if low > high:   
        return -1
    mid = low + ((high - low)>>1) #避免大数溢出
    if lst[mid] > value:
        return bin_serach(lst, value, low , mid-1)
    elif lst[mid] < value:
        return bin_serach(lst, value, mid+1, high)
    else:
        return mid

def binary_search(lis, left, right, num): 
    if left > right: #递归结束条件 
        return -1 
    mid = low + ((high - low)>>1) 
    if num < lis[mid]: 
        right = mid -1 
    elif num > lis[mid]: 
        left = mid + 1
    else:
        return mid 
    return binary_search(lis, left, right, num)

     
def bin_search1(nums, target):
    low = 0
    high = len(nums)-1
    while(low <= high):
        mid = low + ((high - low)>>1)  # +优先级比》大
        if nums[mid] > target:
            high = mid -1
        elif nums[mid] < target:
            low = mid + 1
        else:
            return mid
    
    return -1

2.顺序查找

def sequence_search(nums, target):
    for i in range(len(nums)):
        if nums[i] == target:
            return i
    return -1

3.插入查找

插入查找算法需要注意while循环中的条件判断,真的治学要严谨,分母是不可以等于0。具体参考reference的wiki和博客。


def interpolation_search(nums, key):
    low = 0
    high = len(nums) -1
    
    while(nums[low]<= key <=nums[high] and nums[low] !=nums[high]):
        mid = low + int((key - nums[low])*(high - low)/(nums[high]-nums[low]))
        if nums[mid] < key:
            low = mid + 1
        elif nums[mid] > key:
            high = mid - 1
        else:
            return mid
        
    if key == nums[low]:
        return low
    else:
        return -1

4.fibo查找算法


class Fibo_serach:
    
    def make_fibo_arry(self, nums):
        first = 1
        sec = 1
        third =2
        fblength = 2
        while(third < len(nums)):
            third = first + sec
            first = sec
            sec = third
            fblength += 1
            
        fb = [1,1]
        for i in range(2, fblength):
            fb.append(fb[i-1] + fb[i-2])
            
        return fb
    
    def search(self, nums, key):
        fibo_arry = self.make_fibo_arry(nums)
        last_value_fibo_arry = fibo_arry[-1]
        filled_array = nums
        last_value_nums = nums[-1]
        for j in range(len(nums), last_value_fibo_arry):
            filled_array.append(last_value_nums)
            
        low = 0
        high = len(nums)
        k = len(fibo_arry) - 1   
        while(low <=high):
            mid = low + fibo_arry[k-1] -1  #减去1是因为数组从0 开始
            if key < filled_array[mid]:
                high = mid -1
                k = k - 1
            elif key > filled_array[mid]:
                low = mid + 1
                k = k - 2
            else:
                if mid > high:
                    return high
                else:
                    return mid
        return -1
   

reference:

1. wiki Interpolation search

2.【算法】先生,您点的查找套餐到了(二分、插值和斐波那契查找)

3.常用查找数据结构及算法(Python实现)   (attention: 这个链接中有的代码有问题,理论写的不错)

猜你喜欢

转载自blog.csdn.net/yinhui_zhang/article/details/89061283