Python | 你好,二分法

Posted 算法与编程之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python | 你好,二分法相关的知识,希望对你有一定的参考价值。

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

引言

二分法指的是数学领域的概念,用二分法求函数f(x)零点近似值,这一思想也经常用于计算机中的查找过程中。尤其是当数据量很大适宜采用该方法。

二分法查找的思路:(要求数组按升序排列)

1.首先,从数组的中间开始查找,如果该元素就是目标元素,则查找结束,否则继续下一步。

2.对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数组的前半段中查找;若x大于当前位置值则在数组的后半段中继续查找,直到找到为止。

3.如果某一步数组为空,则表示找不到目标元素。

假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量left,mid,right分别指向数据的左,中间和右,mid=(left+right)/2。

问题描述

这是力扣的一题,整数数组 nums 按升序排列,数组中的值互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你旋转后的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0

输出:4

示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3

输出:-1

示例 3:

输入:nums = [1], target = 0

输出:-1

解决方案

二分法解答,查找目标值。用while循环,遍历数组,再找到中间数,将数组分割为两部分,如果中间数是目标数,则跳出循环,输出该数的下标。若不是目标数,就与目标数作比较,注意旋转后的数组是无序的,但部分是有序的,需要再做一次判断,找到目标值所在区间,如果 [l, mid ] 是有序数组,且 target 满足(nums[0],nums[mid])则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r]。如果[mid, r]是有序数组且target 满足(nums[mid],nums[len(nums)-1]),则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找,若找不到目标值,输出-1。

附件

代码清单 1 DFS求解搜索旋转排序数组Python代码

nums=[4,5,6,7,0,1,2]

target=0

l, r = 0, len(nums) - 1

while l <= r:

    mid = (l + r) // 2

    if nums[mid] == target:

        print(mid)

    if nums[0] <= nums[mid]:

        if nums[0] <= target < nums[mid]:

            r = mid - 1

        else:

            l = mid + 1

    else:

        if nums[mid] < target <= nums[len(nums) - 1]:

            l = mid + 1

        else:

            r = mid – 1

print(-1)

结语

通过二分法查找,要查找的数是中间数时,只要一次就能找到,最差的情况就是n/2=0,n为数组长度,但最后等于0时要么找到要么没有找到,总的来说比冒泡排序效率高,不需要一个一个找。这只是对二分法的初步了解,之后将深度综合学习。

实习编辑:李欣容

稿件来源:深度学习与文旅应用实验室(DLETA)

以上是关于Python | 你好,二分法的主要内容,如果未能解决你的问题,请参考以下文章

Python 利用二分法查询数据

python学习(二分法)

Python 二分法查找

python实现二分法查找

二分法查找python的实现

Python 二分法查找