美文网首页
二分查找实现

二分查找实现

作者: sun5kong | 来源:发表于2019-07-10 14:17 被阅读0次

二分查找实现

    def bsearch(self, nums, target):
        low, high = 0, len(nums)
        while low <= high:
            middle = low + ((high - low) >> 1)
            if nums[middle] == target:
                return True
            elif nums[middle] > target:
                high = middle - 1
            else:
                low = middle + 1
        return False

递归实现

    def binaySearch(self, nums, target):
        return self.bsearchInternally(nums, 0, len(nums) - 1, target)

    def bsearchInternally(self, nums,low, high, target):
        if low > high: return False
        mid = low + ((high - low) >> 1)
        if nums[mid] == target:
            return True
        elif nums[mid] > target:
            high = mid - 1
        else:
            low += 1
        return self.bsearchInternally(nums, low, high, target)
1. 循环退出条件

low <= high

2. mid的取值

mid = (low + high) // 2, 当low 和 high比较大时候, 两者之和可能会溢出, 改进写法 mid = low + (high - low) // 2, 优化写法mid = low + ((high - mid)>>1)

3.low 和 high 更新

low = mid + 1, high = mid - 1

二分查找应用场景

1. 二分查找依赖顺序表结构, 数组
2. 针对有序数据
3. 数据太小不适合二分查找
4. 数据太大也不适合

二分查找变形

  1. 查找第一个值等于给定值的元素
    def bsearch(self, nums, target):
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low + ((high - low) >> 1)
            if nums[mid] > target: high = mid - 1
            elif nums[mid] < target: low = mid + 1
            else:
                if mid == 0 or nums[mid - 1] != target: return mid
                high = mid - 1
        return -1
  1. 查找最后一个值等于给顶元素
    def bsearchLast(self, nums, target):
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low + ((high - low) >> 1)
            if nums[mid] > target:
                high = mid - 1
            elif nums[mid] < target:
                low = mid + 1
            else:
                if mid == len(nums) - 1 or nums[mid + 1] != target: return mid
                low = mid + 1
        return -1
  1. 查找第一个大于等于给定值的元素
    def bsearchFirst(self, nums, target):
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low + ((high - low) >> 1)
            if nums[mid] >= target:
                if mid == 0 or nums[mid - 1] < target: return mid
                else:
                    high = mid - 1
            else:
                low = mid + 1
        return -1
  1. 查找最后一个小于等于给定值的元素
    def bsearchLastSmallOrEqual(self, nums, target):
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low + ((high - low) >> 1)
            if nums[mid] > target:
                high = mid - 1
            else:
                if mid == len(nums) - 1 or nums[mid + 1] > target: return mid
                low = mid - 1
        return -1

相关文章

  • 简单算法

    冒泡排序: while 实现的二分查找: 递归实现二分查找:

  • 算法之二分查找

    二分查找 二分查找是著名、高效并有应用广泛的查找算法。 二分常规实现 1.循环实现 下面我用python语言实现循...

  • 分治算法(swift二分法排序递归实现)

    二分查找 1、二分查找(Binary Search) 2、二分查找的基本思想 swift算法实现

  • 二分查找

    网上找到的图片便于理解 二分查找递归实现与循环实现代码: /** 二分查找 1.二分查找又称折半查找,它是一种效率...

  • 二分查找

    数据顺序存储,有序序列 O(logn) 递归实现二分查找: 非递归实现二分查找:

  • 算法 二分查找 (C++)

    二分查找的实现:

  • 数据结构与算法之美笔记——二分查找(下)

    摘要: 基础的二分查找算法无论是概念还是实现都比较简单(关于 二分查找基础实现文章 可点击此处查看),但二分查找存...

  • 算法4 读书笔记

    1.二分查找的迭代实现 #pragma warning(disable:4996) #include /*二分查找...

  • 二分查找

    二分查找 什么是二分查找 实现原理 什么是二分查找 二分查找是从一个有序数组中找到目标元素(通常是找下标)的过程 ...

  • 查找算法之-二分查找

    查找是针对已排序数进行查找的。1、二分查找非递归实现思想:通过while循环不断在新的区间中二分查找 2、二分查找...

网友评论

      本文标题:二分查找实现

      本文链接:https://www.haomeiwen.com/subject/sshhkctx.html