您的位置:首页 > 编程语言 > Python开发

二分查找法(python实现与floor,ceil实现)

2018-01-29 12:50 253 查看
查找问题在计算机中的应用是非常广泛的,比如你到银行去查一下你的账户还有多少钱,这也是一个查找问题。

二分查找法是比较基础的一种查找方法,但是它有一定的限制,只能在有序的数组中才能使用二分查找法,因此,使用二分查找法前,我们还要使用排序算法对数组进行排序。

二分查找的想法也很简单,如图所示:

取数组的中间元素v

比较要查找的元素m,将数组进行对半划分,直到找到元素m为止



#选择排序
def selectionSort(arr):
for i in range(len(arr)-1):
for j in range(i + 1,len(arr)):
if arr[i] > arr[j]:
arr[i] , arr[j] = arr[j], arr[i]
return arr

def binarySearch(arr,target):
#输入的是一个已经排好序的数组
#对arr[l,r]操作
l = 0
r = len(arr) -1
while (l <= r):
mid = int(l + (r - l) / 2)
if arr[mid] == target:
return mid
if target < arr[mid]:
r = mid - 1
else:
l = mid + 1
return False
arr1 = selectionSort([2,3,4,5,6,33,35,24,98,44,36,32,41])
print(arr1)
index = binarySearch(arr1,41)
print(index)


输出:

[2, 3, 4, 5, 6, 24, 32, 33, 35, 36, 41, 44, 98]
10


扩展:

前面的代码前提假设是我们已经排好序的数组中没有重复元素,但如果有重复元素,我们还可以采用另一种方法,floor,ceil.

如果我们要查找的元素是个重复值,比如刚好是v,我们就可以返回重复值出现的第一个索引和最后一个索引了。



如果要查找的元素不存在,比如要查找42这个元素,floor这个元素返回的就是41出现的最后一个索引,ceil返回的就是43出现的第一个索引。



def floor(arr,target):
l = -1
r = len(arr) - 1
while(l < r):
mid = l + (r - l + 1)//2
if arr[mid] >= target:
r = mid -1
else:
l = mid
if l + 1 < len(arr) and arr[l + 1] == target:
return l+1
return l

def ceil(arr,target):
l = 0
r = len(arr)
while (l < r):
mid = l + (r - l)//2
if arr[mid] <= target:
l = mid + 1
else:
r = mid
if r - 1 >= 0 and arr[r - 1] == target:
return r  - 1
return r

def main(arr,target):
floorIndex = floor(arr,target)
ceilIndex = ceil(arr,target)
if ceilIndex - floorIndex == 1:
return False,False
else:
return floorIndex,ceilIndex
arr = [1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 5, 5, 5, 6, 6, 6]
l ,r = main(arr,3)
print(l,r)
l , r =  main(arr,2)
print(l,r)


输出:

观察一下他们的输出

False False
3 7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: