二分查找——我欲修仙(功法篇)

简介: 二分查找——我欲修仙(功法篇)

前言🚗🚗🚗


经历了一段时间的《数据结构与算法》学习,你已经从凡人步入了修仙界,现在你可以尝试去接触一些简单的算法题开始你的修仙生涯了,那今天我们来看看今天的修炼吧⛽⛽⛽


590f5b303a2ba15931568d12606e54ab_9a47de153eb547e6800f559b381de30b.png


这是是一道非常经典的入门级修炼功法,收录在力扣# 704,而它的名字就已经将写法写在你的脸上了

😂——二分查找

ps:工欲善其事必先利其器,一部好的功法可以让你在修仙路上少走许多弯路。😏😏😏


二分查找?


二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


1684814112824.png


第一阶段 二分查找?🤔🤔🤔


二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

因此我们需要left变量middle变量,right变量以及以各target变量


在这个阶段我们需要了解二分查找的基本运算方式,以及需要使用的变量。


第二阶段 易错点😬😬😬


我们应该了解下二分算法的易错点


1.在循环体的跳出判定条件是左边大于等于右边(left>=right)还是左边大于右边(left>right)

2.如果(str[middle]>target),那么接下来我们应该将(middle)更新为(right)还是(right-1)?


问题一:


对待该问题我们需要首先将题意理解清楚,我们根据查找区间分为两种写法——左闭右闭写法和左必右开写法

左闭右闭写法故名思意在该区间我们两头的数都应该取到,我们假设一个这样的区间[1,1],很明显我们的判定条件上必须加上等于,与之相反的当区间为[1,1)左闭右开时我们不能加上等于号。


问题二


应对第二个问题我们只需简单的假设一下当我们使用左闭右闭写法时我们已经判断了(str[middle]>target)那么我们下一次判断的时候就不用该将(middle)加入进去那么自然我们会将(right)更新为(middle-1),当我们使用左闭右开写法时本来定义中就已经不包含(middle)值,那么我们为啥还要将(right)更新为(middle-1)呢?


总结


简单总结一下:

左闭右闭写法——要等于号,并且(middle)应更新为(left=right+1)或(right=middle-1)

左闭右开写法——不要等于号,并且(middle)应更新为(right=middle和(left=middle+1)(这个地方要好好理解下哟)


题目代码(C语言实现)


#include<stdio.h>
#include<string.h>
#define MAX 100000
int search(int* nums, int numsSize, int target)
{
  int left=0, right, middle;
  right = numsSize;
  while (left <= right)//这里是左闭右闭写法
  {
  middle = (left + right) / 2;
  if (*(nums + middle) > target)
    right = middle - 1;
  else if (*(nums + middle) < target)
    left = middle + 1;
  else
    return middle;
  }
  return -1;//查找失败,无该目标值
}
int main()
{
  int nums[MAX] = { 0 };
  int target = 0;
  int numsSize = 0, i;
  scanf("%d", &numsSize);//输入区间长度
  printf("\n");
  for (i = 0;i < numsSize;i++)
  scanf("%d", nums + i);//输入查找区间
  printf("\n");
  scanf("%d", &target);//输入目标值
  numsSize = strlen(nums);
  printf("下标为:%d", search(nums,numsSize,target));
}
目录
相关文章
|
云安全 人工智能 安全
重磅发布,阿里云安全大模型正式投入使用
2023年云栖大会,阿里云安全正式宣布基于通义千问大模型训练的安全大模型投入使用。首期开放的功能包括为用户提供定制化的安全告警解读、事件调查及处置建议服务,覆盖全网超过99%的告警事件类型。即日起,用户可在阿里云安全中心免费使用体验。
重磅发布,阿里云安全大模型正式投入使用
|
8月前
|
移动开发 JSON API
1688 商品详情数据接口(H5、APP 端)
1688商品详情数据接口是1688平台提供的数据交互通道,支持H5和APP端,提供商品的全面信息(如标题、价格、库存、销量等),并实时更新。开发者可通过HTTP/HTTPS协议调用接口,使用GET或POST方法获取数据。示例代码展示了如何用Python请求该接口,需替换API密钥和商品ID。
|
人工智能 IDE 程序员
通义灵码 AI 程序员正式上线!
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
1032 5
|
存储 自然语言处理 算法
【算法精讲系列】MGTE系列模型,RAG实施中的重要模型
检索增强生成(RAG)结合检索与生成技术,利用外部知识库提升大模型的回答准确性与丰富性。RAG的关键组件包括文本表示模型和排序模型,前者计算文本向量表示,后者进行精细排序。阿里巴巴通义实验室推出的GTE-Multilingual系列模型,具备高性能、长文档支持、多语言处理及弹性向量表示等特性,显著提升了RAG系统的检索与排序效果。该系列模型已在多个数据集上展示出优越性能,并支持多语言和长文本处理,适用于各种复杂应用场景。
2192 18
|
人工智能 测试技术 人机交互
深入浅出智能工作流(Agentic Workflow)|技术干货
著名AI学者、斯坦福大学教授吴恩达提出AI Agent的四种设计方式后,Agentic Workflow(智能体工作流)在全球范围内迅速走红,多个行业纷纷实践其应用,并推动了新的Agentic AI探索热潮。吴恩达总结了Agent设计的四种模式:自我反思、工具调用、规划设计及多智能体协作。前两者较普及,后两者则为智能体使用模式从单一大模型向多智能体协同配合完成业务流程的转变奠定了基础。
5434 3
|
Python
Python报错ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Python报错ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
2505 1
|
数据采集 SQL 自然语言处理
阿里云OpenSearch RAG混合检索Embedding模型荣获C-MTEB榜单第一
阿里云OpenSearch引擎通过Dense和Sparse混合检索技术,在中文Embedding模型C-MTEB榜单上拿到第一名,超越Baichuan和众多开源模型,尤其在Retrieval任务上大幅提升。
2138 4
|
Java 测试技术 C++
Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理
Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理
321 0
Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
422 0
|
机器学习/深度学习 算法 数据挖掘
图像嵌入(Image Embedding
机器学习中的图像嵌入(Image Embedding)是一种将图像数据转化为连续的、低维度的向量表示的方法,这些向量表示通常用于后续的机器学习任务,如分类、聚类、检索等。图像嵌入的目的是将高维度的图像数据转化为更易于处理的低维度数据,同时保留尽可能多的原始图像信息。常用的图像嵌入方法包括:
4259 3

热门文章

最新文章