查找方式:依次查找与二分查找

简介: 查找方式:依次查找与二分查找

1.依次查找与二分查找的基本概念

1.1什么是依次查找?

故名思意,依次查找指的是对于任意一个序列,从一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k进行比对,条件符合者选出,不符者略过的一种查找方法

1.2什么是二分查找?

二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

2.两种查找方式的各自优劣

无论是哪种查找方式,都有其优劣性,并不能说谁好谁坏,只能说某一种情况下谁好一些,谁不适用一些

2.1依次查找优劣:

1.适用范围:任何数组都可以使用这个方法,适用范围大

2.运算效率:电脑运算量不可减免,运算效率一般

2.2二分查找优劣:

1.适用范围:使用的前提条件是有序数组,适用范围有限

2.运算效率:一旦适用,大大减少电脑运算量,提升运算效率

3.两种代码的实现示例

依次查找代码示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
  int arr[] = { 2,4,3,5,7,6,1,9,8 };
  int input = scanf("%d", &input);
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  int find = 0;
  for (i = 0; i < sz; i++)
  {
    if (input == arr[i])
    {
      printf("找到了,查找数字的下标是%d", i);
      find = 1;
      break;
    }
  }
  if (find == 0)
    printf("您查找的数字没有找到");
  return 0;
}

二分查找代码示例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int left = 0;
  int right = sz - 1;
  int input = 0;
    scanf("%d", &input);//这里需要注意,scanf有返回值,不可以写成“int input =     scanff("%d",&input);
  int find = 0;
  while (left<=right)
  {
    int mind = (left + right) / 2;
    if (input > arr[mind])
      left = mind + 1;
    else if (input < arr[mind])
      right = mind - 1;
    else if (input == arr[mind])
    {
      printf("找到了,下标是%d", mind);
        find = 1;
      break;
    }
  }
  if (find == 0)
    printf("没有找到\n");
  return 0;
}

4.有趣思维

上述二分查找的确数字较小时候可以使用,但是一但上升的超过int max值的时候呢?

由vs转到定义我们可以知道int类型的上限

或许你可能想到了,我直接把int 类型换成longlong类型不就可以扩大max值了吗,以此来扩大数组大小。。。

首先,这个把int改longlong方法的确可以,不过还有一种比较好的数学思维

下面来简要介绍一下这种处理方法:

1.为了便于大家理解,我们用数学方式求均值来进行呈现:

一般的数学思维:(a+b)/2

高端的数学思维(假设a<b):(b-a)/2+a

2.柱状图来理解两者求均值的方法

因此,我们可以把这个代码

给他改成

int mind = ( right - left )/ 2 + left

这样就一定程度上扩大了该代码的应用范围,不至于在较大数字运算时超过int max值造成电脑计算错误。

最后,如果存在错误,希望各位多多指正啦~明天会更好!

相关文章
|
人工智能 自然语言处理 人机交互
吴泳铭:拥抱人工智能驱动的产业智能革命
吴泳铭:拥抱人工智能驱动的产业智能革命
109481 505
|
Kubernetes 关系型数据库 MySQL
seata启动问题之指针异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
653 99
|
机器学习/深度学习 人工智能 机器人
人工智能与自动化:重塑未来工作场景
【8月更文第8天】随着技术的飞速发展,人工智能(AI)和自动化已成为推动各行各业变革的关键力量。这些技术不仅提高了生产效率,还为传统工作岗位带来了新的活力,并创造出了许多全新的职业领域。本文将探讨AI和自动化如何重塑工作场景,并通过具体的编程示例来展示如何利用这些技术。
520 1
|
11月前
|
人工智能 自然语言处理 数据挖掘
企业数字化转型的关键:如何利用OA系统实现自动化与智能决策
在数字化时代,传统办公系统已无法满足现代企业的需求。通过将RPA(机器人流程自动化)和AI(人工智能)技术与OA系统结合,企业能实现业务流程自动化、智能决策支持,大幅提升工作效率和资源配置优化,推动数字化转型。RPA可自动处理重复任务,如审批、数据同步等;AI则提供智能数据分析、预测和决策支持,两者协同作用,助力财务管理、人力资源管理、项目管理和客户服务等多个领域实现智能化升级。未来,智能化OA系统将进一步提升个性化服务、数据安全和协作能力,成为企业发展的关键驱动力。
|
C++
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
479 1
|
搜索推荐 API 对象存储
10分钟学会构建端到端的图片搜索服务
本文介绍在没有向量数据的情况下,怎样通过OpenSearch-向量检索版快速从零搭建图像搜索服务。
83691 69
|
自然语言处理 数据管理 大数据
发布!首个月球专业大模型来了
在2024数博会上,中国科学院地球化学研究所与阿里云联合发布国际首个“月球科学多模态专业大模型”(简称“月球专业大模型”)。
391 9
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
502 3
|
自然语言处理 算法 API
「AIGC」Python实现tokens算法
使用Python的`transformers`库,通过`AutoTokenizer`初始化BERT tokenizer,对文本进行分词统计,减少API调用。示例展示从开始到结束的时间,包括文本转换为tokens的数量和过程耗时。
560 0
「AIGC」Python实现tokens算法
|
安全 Java C++
CAS自旋锁到底是什么?为什么能实现线程安全?
本文是博主对多线程学习总结记录,希望对大家有所帮助。
1570 0
CAS自旋锁到底是什么?为什么能实现线程安全?