本文主要实现查找算法中的二分查找算法,顺序查找,插入查找算法以及fibonacci查找算法,个人认为以上查找算法本质的不同其实就是缩小的区间方式不一样罢了。二分查找算法采用二分缩小区间的方法;顺序查找算法每次缩小一个单位区间;而插入查找算法则通过数据的分布特征来重新计算区间:,就是二分查找的升级版本;最后的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: