一文弄懂二分查找原理

本文详细介绍了二分查找算法的基本原理及其四种常见的变形问题:查找第一个等于给定值的元素、查找最后一个等于给定值的元素、查找第一个大于等于给定值的元素和查找最后一个小于等于给定值的元素。对于每个变形,文章提供了相应的解题思路和代码实现。二分查找算法适用于有序且不含重复数据的集合,时间复杂度为 $O(logn)$,但不适用于链表存储的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,简单的二分查找算法

二分查找(Binary Search)算法是一种针对有序且不含重复数据集合的查找算法,时间复杂度为 $O(logn)$ ,二分查找虽然性能比较优秀,但应用场景也比较有限。

因为底层依赖于数组这种结构,所以不适合数据量大的情况。再次,对于较小规模的数据查找,二分查找的优势并不明显,一般直接使用顺序遍历就可以了。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。

如果数据使用链表存储,二分查找的时间复杂就会变得很高,变成了 $O(n)$。

简单的二分查找算法的 C++ 代码如下:

// 非递归实现
int BinarySearch(int a[], int n, int value){
    int low = 0, high = n-1;
    int mid = (low+high)/2;
    while( low <= high){
        // mid = low+(high-low)/2; mid = low+((high-low)>>1)
        mid = (low+high)/2;

        if( a[mid] == value ){
            return mi
### YOLOv1 原理与实现 #### 2.1 YOLOv1 简介 YOLO (You Only Look Once) v1 是一种用于实时对象检测的单阶段神经网络框架。该方法通过将输入图像划分为多个网格单元,并让每个网格负责预测固定数量的边界框及其对应的类别概率来完成物体检测任务[^3]。 #### 2.2 核心算法原理与具体操作步骤 YOLOv1 将整个图片分成 S×S 的网格结构,如果某个物体中心落在这个格子内部,则此格子就负责预测该物体的位置以及其属于各个类别的条件概率 P(C_i|Object)。对于每一个网格,模型会输出 B 个边框坐标(x, y, w, h),其中 x 和 y 表示相对于网格左上角位置的比例偏移量;w 和 h 则表示宽度和高度相对于整张图的比例尺寸。此外还会给出这些候选区域存在目标的概率 C。 为了提高定位准确性并减少冗余预测,在训练过程中引入了 IOU(Intersection Over Union)作为评价标准之一,即真实标签包围盒与预测结果之间的重叠程度比率。当两个矩形框完全吻合时IOU=1,而没有任何交集则为0。因此优化过程旨在最大化正样本间的平均IOU值的同时最小化负样本得分。 #### 数学模型和公式 在数学建模方面,YOLOv1 设计了一种特殊的损失函数用来衡量预测值同标注数据间差异: \[ L_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B}(1^{obj}_{ij})[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]\] 这里 \(L_{coord}\) 控制着坐标的权重系数;\(1^{obj}_{ij}\) 是指示变量,只有当第 i 个 grid cell 中确实含有 object 并且 jth 边界框负责预测它的时候才取 1 。上述表达式计算的是所有含object 的grid cells里所对应的最佳box 对应的真实center point 同预测值之间差距平方之和。 另外还有关于宽高误差项、置信度误差项及分类误差项等部分共同构成了最终的整体loss function 形式。 ```python def compute_loss(predictions, targets): """ 计算YOLOv1损失函数 参数: predictions -- 模型预测的结果向量 targets -- 数据集中给定的目标真值 返回: total_loss -- 总体损失数值 """ # 初始化各项损失分量 coord_mask = ... conf_pos_mask = ... conf_neg_mask = ... class_mask = ... # ... (省略中间具体的mask构建逻辑) # 计算各部分损失 loss_coord = torch.sum(coord_mask * (pred_box_xy - true_box_xy)**2) loss_conf_pos = torch.sum(conf_pos_mask * (pred_box_confidence - true_box_confidence)**2) loss_conf_neg = torch.sum(conf_neg_mask * pred_noobj_confidence**2) loss_class = torch.sum(class_mask * F.cross_entropy(pred_class_probabilities, target_classes)) # 加权求和得到总损失 total_loss = lambda_coord*loss_coord + loss_conf_pos + loss_conf_neg + loss_class return total_loss ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.whl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值