常见的查找算法
class Find(object):
"""常见的查找算法"""
def __init__(self):
pass
@staticmethod
def b_search(a_list, target):
"""二分查找算法 非递归实现"""
low = 0
high = len(a_list) - 1
while low <= high:
mid = low + (high - low) / 2
if target == a_list[mid]:
return mid
if target < a_list[mid]:
high = mid - 1
else:
low = mid + 1
return -1
def b_recursion_search(self, a_list, target, low, high):
"""二分查找算法 非递归实现"""
if low > high:
return -1
mid = low + (high - low) / 2
if target == a_list[mid]:
return mid
if target < a_list[mid]:
return self.b_recursion_search(a_list, target, low, mid - 1)
else:
return self.b_recursion_search(a_list, target, mid + 1, high)
@staticmethod
def b_first_search(a_list, target):
"""查找第一个等于目标值"""
low = 0
high = len(a_list) - 1
while low <= high:
mid = low + (high - low) / 2
if target <= a_list[mid]:
if target == a_list[mid] and target != a_list[mid - 1]:
return mid
else:
high = mid - 1
else:
low = mid + 1
return -1
@staticmethod
def b_last_search(a_list, target):
"""查找最后一个等于目标值"""
low = 0
high = len(a_list) - 1
while low <= high:
mid = low + (high - low) / 2
if target >= a_list[mid]:
if target == a_list[mid] and target != a_list[mid + 1]:
return mid
else:
low = mid + 1
else:
high = mid - 1
return -1
@staticmethod
def b_last_than_search(a_list, target):
"""查找最后一个大于等于目标值"""
low = 0
high = len(a_list) - 1
while low <= high:
mid = low + (high - low) / 2
if target <= a_list[mid]:
if mid == 0 or target > a_list[mid - 1]:
return mid
else:
high = mid - 1
else:
low = mid + 1
return -1
@staticmethod
def b_last_less_search(a_list, target):
"""查找最后一个小于等于目标值"""
low = 0
high = len(a_list) - 1
while low <= high:
mid = low + (high - low) / 2
if target >= a_list[mid]:
if mid == len(a_list) - 1 or target < a_list[mid + 1]:
return mid
else:
low = mid + 1
else:
high = mid - 1
return -1
@staticmethod
def sqrt(x):
"""求一个数的算数平方根,精确到小数点后6位"""
low = 0
mid = x / 2.0
high = x
while abs(mid ** 2 - x) > 0.000001:
if mid ** 2 < x:
low = mid
else:
high = mid
mid = (low + high) / 2
return round(mid, 6)