二分查找法(python实现与floor,ceil实现)
2018-01-29 12:50
253 查看
查找问题在计算机中的应用是非常广泛的,比如你到银行去查一下你的账户还有多少钱,这也是一个查找问题。
二分查找法是比较基础的一种查找方法,但是它有一定的限制,只能在有序的数组中才能使用二分查找法,因此,使用二分查找法前,我们还要使用排序算法对数组进行排序。
二分查找的想法也很简单,如图所示:
取数组的中间元素v
比较要查找的元素m,将数组进行对半划分,直到找到元素m为止
输出:
扩展:
前面的代码前提假设是我们已经排好序的数组中没有重复元素,但如果有重复元素,我们还可以采用另一种方法,floor,ceil.
如果我们要查找的元素是个重复值,比如刚好是v,我们就可以返回重复值出现的第一个索引和最后一个索引了。
如果要查找的元素不存在,比如要查找42这个元素,floor这个元素返回的就是41出现的最后一个索引,ceil返回的就是43出现的第一个索引。
输出:
观察一下他们的输出
二分查找法是比较基础的一种查找方法,但是它有一定的限制,只能在有序的数组中才能使用二分查找法,因此,使用二分查找法前,我们还要使用排序算法对数组进行排序。
二分查找的想法也很简单,如图所示:
取数组的中间元素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
相关文章推荐
- 实现JavaScript 的Math.round,Math.ceil,Math.floor函数功能 CodeWars 打怪日记
- python 向上取整ceil 向下取整floor 四舍五入round
- Python入门笔记(2)_ 数据类型及取整运算 round,floor,ceil
- python实现查找算法:二分查找法
- python 向上取整ceil 向下取整floor 四舍五入round
- python 向上取整ceil 向下取整floor 四舍五入round
- python 向上取整ceil 向下取整floor 四舍五入round
- python数据结构,二分查找法的实现!
- python 向上取整ceil 向下取整floor 四舍五入round
- python 内建函数range/math.ceil/math.floor
- python 向上取整ceil 向下取整floor 四舍五入round
- Python函数之 ceil, floor,round
- Python实现二分查找法
- Java入门学习-使用Math,实现lg、平方、开方、round、floor、ceil的算法。
- python中的数字取整(ceil,floor,round)概念和用法
- python(50):python 向上取整 ceil 向下取整 floor 四舍五入 round
- python实现透明转发
- MySQL 以及 Python 实现排名窗体函数
- python 实现Hadoop的partitioner和二次排序
- Python实现N阶台阶的走法问题