7-8 二分查找法

news2024/9/30 23:33:06

 

分数 10

全屏浏览题目

切换布局

作者 王跃萍

单位 东北石油大学

用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。

输入格式:

直接输入一个要查找的正整数key。没有其它任何附加字符。

输出格式:

找到则在一行中按照“weizhi:下标”的格式输出其在数组中对应的下标,否则输出not found。

输入样例:

4

输出样例:

weizhi:3

输入样例:

15

输出样例:

not found

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

我的答案:

分析过程:

二分查找法是一种在有序数列中查找特定元素的搜索算法。工作原理如下:

  1. 开始时,选择数组的中间元素。
  2. 如果该元素是我们正在搜索的元素,则查找过程结束。
  3. 如果所选元素比目标元素小,则在数列的右半部分中查找。
  4. 如果所选元素大,则在数列的左半部分中查找。
  5. 重复该过程,每次减少一半的数据,直到找到匹配的元素或搜索范围为空。

解题步骤:

  1. 初始化三个指针:low, high和mid。其中low指向数组的开始,high指向数组的末尾。
  2. 当low <= high时,进行以下步骤:
    1. 计算mid = (low + high) / 2。
    2. 检查数组中的中间元素arr[mid]
    3. 如果arr[mid]与key相等,输出mid并结束程序。
    4. 如果arr[mid] < key,将low设置为mid + 1。
    5. 如果arr[mid] > key,将high设置为mid - 1。
  3. 如果low > high,表示key不存在于数组中,输出"not found"。

C语言:

#include <stdio.h>

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int key, low = 0, high = 9, mid;

    scanf("%d", &key);

    while (low <= high) {
        mid = (low + high) / 2;
        if (arr[mid] == key) {
            printf("weizhi:%d\n", mid);
            return 0;
        } else if (arr[mid] < key) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    printf("not found\n");
    return 0;
}

C++:

#include <iostream>
using namespace std;

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int key, low = 0, high = 9, mid;

    cin >> key;

    while (low <= high) {
        mid = (low + high) / 2;
        if (arr[mid] == key) {
            cout << "weizhi:" << mid << endl;
            return 0;
        } else if (arr[mid] < key) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    cout << "not found" << endl;
    return 0;
}

这两个解决方案都是基于上述的解题步骤。这种查找方法对于大型数据集特别高效,因为它每次迭代都会减少查找范围的一半。

总结:

从这道题目,我们可以学习和深化以下几个方面的认识和技能:

1. **二分查找法的基本原理和应用**:二分查找法是一个经典的搜索算法,用于快速查找有序数列中的特定元素。

2. **算法效率**:理解为什么二分查找是高效的(与线性查找相比),特别是对于大数据集。这种算法的时间复杂性是O(log n),与每次都减少查找范围一半的策略直接相关。

3. **条件循环**:通过while循环和条件判断,我们可以控制程序的执行流程,直到满足某个条件为止。这在很多算法和问题解决方案中都是一个常见的模式。

4. **数组操作**:学习如何在C和C++中使用数组,如何访问和比较其元素。

5. **边界处理**:注意在二分查找中如何正确地调整low, high和mid的值以避免错误和无限循环。

6. **逻辑判断**:如何使用if-else结构进行条件判断和决策,这是编程中的一个基本技能。

7. **输出格式和要求的匹配**:根据题目要求格式化输出结果,体现了实际编程任务中对细节的关注和精确性。

8. **问题分解能力**:学会如何将一个大问题分解成更小、更容易解决的部分。例如,二分查找的每一步都是将问题规模减半。

9. **调试和错误处理**:如果初始实现未能得到正确的答案,这也为我们提供了一个调试代码和处理潜在错误的机会。

总的来说,这道题目为我们提供了一个理解和实现二分查找的机会,这不仅强化了我们的算法和数据结构知识,而且也提高了解决实际问题、调试和代码实现的能力。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/905694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发-并发挑战及底层实现原理笔记

并发编程挑战 上下文切换 cpu通过给每个线程分配cpu时间片实现多线程执行&#xff0c;时间片是cpu分配给各个线程的时间&#xff0c;cpu通过不断切换线程执行。线程有创建和上下文切换的开销。减少上下文切换的方方法 – 无锁并发编程&#xff0c;eg&#xff1a;将数据的id按…

CSS中如何实现文字溢出省略号(text-overflow: ellipsis)效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中如何实现文字溢出省略号&#xff08;text-overflow: ellipsis&#xff09;效果&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …

16----公式

本节我们来学习如何在markdown中打印公式 Markdown是一种轻量级标记语言&#xff0c;常用于撰写文档、博客和论坛帖子。虽然Markdown本身并不支持数学公式&#xff0c;但可以使用一些扩展来实现公式的显示。在支持公式扩展的 Markdown 解析器中&#xff0c;我们可以使用 Katex …

【核磁共振成像】临床基本通用脉冲序列

目录 一、脉冲序列二、自旋回波(SE)脉冲序列2.1 自旋回波脉冲序列2.2 信噪比、差噪比2.3 采样2.4 改进的自旋回波变型序列 三、反向恢复(IR)脉冲序列3.1 反向恢复脉冲序列3.2 关于反向恢复脉冲序列的改进 四、梯度回波(GE)脉冲序列4.1 GE序列基本概念4.2 三维成像 五、相干稳态…

【Spring Boot 源码学习】自动装配流程源码解析(下)

自动装配流程源码解析&#xff08;下&#xff09; 引言往期内容主要内容4. 排除指定自动配置组件5. 过滤自动配置组件6. 触发自动配置事件 总结 引言 上篇博文&#xff0c;笔者带大家了解了自动装配流程中有关自动配置加载的流程&#xff1b; 本篇将介绍自动装配流程剩余的内…

【Freertos基础入门】同步互斥与通信

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、同步互斥与通信是什么&#xff1f;1.基础概念2.freertos通信可用的手段 二、同步与互斥的概念三、各类通信的区别与适用场景总结 前言 本系列基于stm32系列…

wustojc2005中英长度单位换算

#include <stdio.h> int main() {int n, inch;int foot;scanf("%d", &n);foot n /100.0/0.3048;inch (n/100.0/0.3048-foot)*12;printf("%d %d",foot,inch);return 0; }

使用PyMuPDF添加PDF水印

使用Python添加PDF水印的博客文章。 C:\pythoncode\new\pdfwatermark.py 使用Python在PDF中添加水印 在日常工作中&#xff0c;我们经常需要对PDF文件进行处理。其中一项常见的需求是向PDF文件添加水印&#xff0c;以保护文件的版权或标识文件的来源。本文将介绍如何使用Py…

Python自动化测试五种模型

一、前言 在自动化测试中&#xff0c;我们往往将自动化脚本都归纳属于哪种框架模型&#xff0c;比如关键字驱动模型等。 本篇将列举实际自动化测试中&#xff0c;Python 自动化测试的五种模型&#xff1a;线性模型、模块化驱动模型、数据驱动模型、关键字驱动模型、行为驱动模…

大模型框架LangChain开发实战(一)

一、概述 在大模型应用中&#xff0c;通常是基于框架来呼叫模型的&#xff0c;大模型提供了两个最重要的功能&#xff0c;一是提供了具体的intermediate steps&#xff08;即做事情的中间步骤&#xff0c;模型作为reasoning engine&#xff09;&#xff0c;二是提供了evaluati…

vue3实现容器内容滚动到底,触底加载新数据

scroll方式实现 在Vue3中&#xff0c;可以使用ref和onMounted钩子函数获取容器元素并监听滚动事件&#xff0c;判断内容是否滚动到了底部&#xff0c;从而触发加载新数据。 以下是一个简单的示例代码&#xff1a; <template><div class"container" ref&…

Kafka的底层“真面目”

简介 kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息&#xff0c;消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。 kafka对外使用topic的概念&#xff0c;生产者往topic里写消息&…

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码&#xff1a; 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩&#xff0c;是为了更快速的查找一个点的根节点。对于一个集合树来说&#xff0c;它的根节点下面可以依附着许多的节点&#xff0c;因此&am…

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型&#xff0c;一个 key 对应一个 value&#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的&#xff0c;意思是 Redis 的 String 可以包含任何数据&#xff0c;比如图片或者序列化的对象&#xff0c;一个 Redi…

【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

如何使用媒体查询(media query)来适配不同设备上的样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用媒体查询适配不同设备上的样式⭐ 基本语法⭐ 示例⭐ 常见的媒体特性⭐ 创建响应式布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

(2)、将SpringCache扩展功能封装为starter

(2)、将SpringCache扩展功能封装为starter 1、准备工作 前面我们写了一个common-cache模块,尽可能的将自定义的RedisConnectionFactory, RedisTemplate, RedisCacheManager等Bean封装了起来。 就是为了方便我们将其封装为一个Starter。 我们这里直接《SpringCache+Redis实…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…

Communication Channels

沟通渠道 n * (n - 1) / 2 你1 相关方3 4 4 * 3 / 2 6 你1 相关方3 相关方1 5 5 * 4 / 2 10 人越多&#xff0c;沟通渠道越多&#xff0c;沟通成本理论越高

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…