二分算法(Python)

二分法的基本原理:把有序数组一分为二,再一分为二,直到不能分为止(直到查找到我们想要的答案)

时间复杂度:o(log  n)

空间复杂度:o(1)

算法分析:1,我们需要一个具有单调性的数组

2,我们需要运用left(数组的第一个元素,以下简称l)和right(数组的最后一个元素,以下简称r)设置middle,也就是数组中间的点,公式为(l+r)//2(或(l+r+1)//2,视情况而定)

3,如果l==r的话(视题而定嗷,这里笼统的说一下),咱们滴答案就找到啦

不懂就来看代码吧———

基础代码(二分查找)落谷p2249

# 2249ac
n,m= [int(i) for i in input().split()]
num=[int(i) for i in input().split()]
fnum=[int(i) for i in input().split()]# 输入处理
num.insert(0,0)# 数组前面插入0l1开始
for i in fnum:
    l = 1
    r = n
    while l<=r:
        if l == r:
            if num[l] == i:# 如果找到的数字==目标数字,就返回答案
                print(l,end=" ")
                break
            print(-1, end=' ')# 不等于就返回-1
            break
        mid=(l+r)//2# 一分为二
        if num[mid]>=i:# 如果mid偏大,就保留左边较小的元素
            r=mid
        if num[mid]<i:# 如果mid偏小,就保留右边较大的元素
            l=mid+1# +1是边界问题,边界问题很重(nan)要(gao

进阶版代码(二分答案)落谷p5119

# 5119二分ac
def check(t):# t是设定一个最大等待时间的最小值
    car = 1# 原始设定车有一辆
    id = 1# 第一头牛等待的时间
    get = 1# 设定第一头牛已经坐上车
    for i in range(2,n+1):
        get += 1# 来了一头牛
        wt = data[i] - data[id]# 等待时间(当前这一头牛-第一头牛的等待时间)
        if get > c or wt >t:# 如果到的奶牛的数量大于每辆大巴可以乘坐的牛数或等待时间超过设定时间就换下一辆车
            get=1
            id=i
            car+=1
    return car<=m# 车如果够就返回true

n,m,c=[int(i) for i in input().split()]
data=[int(i) for i in input().split()]
data.insert(0,0)# 熟悉的占位
data.sort()# 保证单调性
l = 0
r = data[-1]
while l<r:
    mid = (l + r) // 2# 一分为二
    if check(mid):# 请看上面函数
        r = mid# 答案可以更小
    else:
        l = mid + 1# 答案小了,需要右边更大的元素

当涉及到图像处理中的二分算法时,一种常见的应用是图像二值化。图像二值化将彩色图像转换为黑白图像,通过设置一个阈值,将亮度大于阈值的像素设为白色,小于阈值的像素设为黑色。 以下是使用二分算法实现图像二值化的一个示例: ```python import numpy as np from PIL import Image def binarize_image(image_path, threshold): # 打开图像并转换为灰度图 image = Image.open(image_path).convert("L") # 将图像转换为NumPy数组 image_array = np.array(image) # 二分算法处理图像 low = 0 high = 255 while high - low > 1: mid = (high + low) // 2 foreground_pixels = image_array > mid background_pixels = image_array <= mid foreground_mean = np.mean(image_array[foreground_pixels]) background_mean = np.mean(image_array[background_pixels]) if foreground_mean > background_mean: low = mid else: high = mid # 根据阈值对图像进行二值化处理 binary_image = image_array > (low + high) / 2 # 创建新的图像对象并保存 binary_image = Image.fromarray(binary_image.astype(np.uint8) * 255) binary_image.save("binary_image.png") # 调用函数进行图像二值化 binarize_image("input_image.png", 128) ``` 在上述代码中,`binarize_image` 函数接受两个参数:`image_path` 是输入图像的路径,`threshold` 是二值化的阈值。函数首先打开图像并将其转换为灰度图像。然后,它使用二分算法来查找最佳阈值,将图像分割为前景和背景。最后,根据阈值对图像进行二值化处理,并保存结果图像为 `binary_image.png`。 请注意,这只是二分算法在图像处理中的一种应用场景。在其他图像处理任务中,可能需要使用不同的方法和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值