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
    
  • 相关阅读:
    redis性能优化、内存分析及优化
    代码质量审核和管理工具分析比较
    SpringBoot集成Nacos
    Navicat,Dbeaver,heidiSql,DataGrip数据库连接工具比较
    python报错:
    6.Python深入_内存管理
    Win7安装python第三方模块objgraph报错
    5.Python深入_装饰器
    4.Python深入_闭包
    1.Python深入_对象的属性
  • 原文地址:https://www.cnblogs.com/leisurelylicht/p/er-fen-cha-zhao-ji-ji-zhong-bian-ti-dePython-shi-x.html
Copyright © 2011-2022 走看看