zoukankan      html  css  js  c++  java
  • 二分查找及几种变体的Python实现

    1. 在不重复的有序数组中,查找等于给定值的元素

    循环法

    def search(lst, target):
    	n = len(lst)
    	if n == 0:
    		return -1
    	
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low)//2 + low
    		if lst[mid] == target:
    			return mid
    		elif lst[mid] < target:
    			low = mid +1
    		elif lst[mid] > target:
    			high = mid -1
    	return -1
    

    递归法

    def search2(lst, target, low, high):
    	if low > high:
    		return -1
    	
    	mid = (high-low)//2 + low
    	if lst[mid] == target:
    		return mid
    	elif lst[mid] < target:
    		return search2(lst, target, mid+1, high)
    	elif lst[mid] > target:
    		return search2(lst, target, low, mid-1)
    

    2. 查找第一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] > value:
    			low = mid - 1
    		elif lst[mid] == value:
    			if mid == 0 or lst[mid-1] != value:
    				return mid
    			else:
    				high = mid - 1
    	return -1
    

    3. 查找最后一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] == value:
    			if mid == n-1 or lst[mid+1] != value:
    				return mid
    			else:
    				low = mid + 1
    	return -1
    

    4. 查找第一个大于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] >=value:
    			if mid == 0 or lst[mid-1] < value:
    				return mid
    			high = mid - 1
    

    5. 查找最后一个小于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] <= value:
    			if mid == n-1 or lst[mid+1] > 0:
    				return mid
    			low = mid + 1
    	return -1
    
  • 相关阅读:
    大屏设计-大数据综合展示可视化平台
    大数据可视化大屏设计经验,教给你!
    数据可视化表格-设计经验分享!
    大数据可视化大屏图表设计经验,教给你
    数据可视化美学形式与功能需要齐头并进
    大屏可视化解决方案
    node-sass 安装失败 win32-x64-57_binding.node
    node版本如何升级
    ES6课程---8、模板字符串
    ES6课程---7、箭头函数
  • 原文地址:https://www.cnblogs.com/leisurelylicht/p/er-fen-cha-zhao-ji-ji-zhong-bian-ti-dePython-shi-x.html
Copyright © 2011-2022 走看看