数组常见查找算法

news2025/5/19 21:18:13

文章目录

  • 时间复杂度
  • 1. 顺序查找(Linear Search)
  • 2. 二分查找(Binary Search)
  • 3. 插值查找(Interpolation Search)
  • 4.分块查找
  • 5.哈希查找

时间复杂度

  1. 衡量算法执行时间随输入规模增长而增长的速度的一个概念。它用大写字母O表示,后跟一个函数描述算法执行时间。这里的“n”通常代表输入数据的大小或数量。
  2. 例如,对于顺序查找(线性查找)算法,你需要遍历数组中的每个元素来查找目标值。如果数组有n个元素,那么在最坏的情况下(即目标值不存在于数组中),你也需要遍历整个数组,因此执行时间为n次,那么顺序查找算法的时间复杂度就是O(n)。
  3. 对于其他的时间复杂度表示,如O(log n),它表示算法的执行时间与输入数据的大小成对数关系。这意呀着,随着输入数据大小的增加,算法的执行时间不会像O(n)那样线性增长,而是增长得更慢。二分查找就是一个典型的O(log n)时间复杂度的算法。

1. 顺序查找(Linear Search)

在这里插入图片描述

描述:顺序查找是最简单的查找方法,它逐个检查数组中的每个元素,直到找到所需的元素或搜索完整个数组。

时间复杂度:平均和最坏情况都是O(n),最好情况是O(1)(如果第一个元素就是目标元素)。

#include <stdio.h>  
// 顺序查找函数  
int linearSearch(int arr[], int n, int x) {  
    for (int i = 0; i < n; i++) {  
        if (arr[i] == x) {  
            return i; // 找到元素,返回其索引  
        }  
    }  
    return -1; // 未找到元素,返回-1  
}  
  
int main() {  
    int arr[] = {2, 3, 4, 10, 40};  
    int n = sizeof(arr)/sizeof(int); //sizeof(arr)是数组所占用的字节大小,sizeof(int)是int类型所占的字节大小。二者相除得出个数,即数组的长度。
    int x = 10;  
    int result = linearSearch(arr, n, x);  
    if (result == -1) {  
        printf("no);  
    } else {  
        printf("Yes -> %d", result);  
    }  
    return 0;  
}

2. 二分查找(Binary Search)

在这里插入图片描述

描述:二分查找是一种在有序数组中查找特定元素的快速算法。它通过将数组分成两半,判断目标元素可能存在的那一半,然后继续在那一半中查找,直到找到元素或搜索范围为空。

时间复杂度:平均和最坏情况都是O(log n)。
在这里插入图片描述

#include<stdio.h>
int main(){
	int arr [] = {25,44,53,62,79,81,91};
	int i;
	int len = sizeof(arr)/sizeof(int);
	int n = 79;
	//方法1: while嵌套 
//	int max = len-1,min = 0,mid = (max+min)/2;
//	printf("max = %d,min = %d,mid = %d,len = %d",max,min,mid,len);
//	while(min <= max){
//		if(arr[mid]>n){
//			max = mid-1;
//		}else{
//			min = mid+1;
//		}
//		mid = (max+min)/2;	
//	}
//	printf("\n");
//	printf("mid = %d",mid);
	int flag = BinarySearch(arr,len,n);
	printf("flag = %d\n",flag);
	if(!flag){
		printf("no");
	} else{
		printf("yes -> %d",arr[flag]);
	}
	return 0;
}
//方法2:BinarySearch函数 
int BinarySearch(int arr[],int len,int n){
	int max=len-1,min=0,mid;
	while(min<=max){
		mid = (max+min)/2;
		if(arr[mid] == n)
			return mid;
		else if(arr[mid]>n){
			max = mid-1;
		}else{
			min = mid+1;
		}
	}
	return -1;
}

3. 插值查找(Interpolation Search)

在这里插入图片描述

插值查找是一种在有序数组中查找某一特定元素的搜索算法。在选择中间点时,它使用了插值公式,这个公式基于要查找的值和数组两端的值之间的比例关系来估计中间点的位置。这种方法在数组元素分布较为均匀时尤其有效。

时间复杂度

  1. 最好情况:如果元素恰好位于通过插值公式计算出的中间点,则时间复杂度为O(1)。
  2. 平均情况:如果分布较为均匀,则接近O(log n);但如果分布极不均匀,则可能退化到O(n)。
  3. 最坏情况:当数组中的元素分布极不均匀时,插值查找可能退化为线性查找,时间复杂度为O(n)。
#include<stdio.h>
//插值查找:
int InterpolationSearch(int arr[],int len,int n){
	int max = len - 1; // 数组的最大索引  
    int min = 0;       // 数组的最小索引  
    int mid;           // 用于存储计算出的中间索引  
	while(min<=max){
		// 根据插值查找公式计算中间索引  
        // mid = min + [(n - arr[min]) / (arr[max] - arr[min])] * (max - min)  
		mid = min+(n-arr[min])/(arr[max]-arr[min])*(max-min);
		if(arr[mid] == n)
			return mid;
			//如果中间mid大于查找元素,则左半部分继续查找 
		else if(arr[mid]>n){
			max = mid-1;
			//否则,在右半部分查找 
		}else{
			min = mid+1;
		}
	}
	return -1;
}
int main(){
	int arr [] = {25,44,53,62,79,81,91};
	int i;
	int len = sizeof(arr)/sizeof(int);
	int n = 79;
	int flag = BinarySearch(arr,len,n);
	printf("flag = %d\n",flag);
	if(flag==-1){
		printf("no");
	} else{
		printf("yes -> %d",arr[flag]);
	}
	return 0;
}

在这里插入图片描述

4.分块查找

在这里插入图片描述

5.哈希查找

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

langgraph 多智能体 Multi-agent supervisor

1. 工具定义 1.1网络搜索工具 from typing import Annotated import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.tools import tool from langchain_experimental.utilities import PythonREPLos.environ["TAVIL…

【Maven系列】深入解析 Maven 镜像配置

前言 Maven 是一个流行的 Java 项目管理和构建工具&#xff0c;可以自动化构建项目、管理依赖、生成报告等。在Maven构建项目时&#xff0c;通常经常需要下载各种依赖。默认情况下&#xff0c;Maven 会从中央仓库下载这些依赖&#xff0c;但在某些情况下&#xff0c;这个过程可…

HTML 添加 文本水印

body,html {margin: 0;height: 100vh;width: 100vw;} // 自定义文案const setting {text: "水印文案", // 水印内容innerDate: true, // 在水印下方增加日期width: 110, // 水印宽度};// 自定义文字水印const watermark (function () {return {build: function (a…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员&#xff0c;考试通常两部分&#xff1a;笔试和实验考试。 考试科目&#xff1a; HCIE-Datacom笔试考试内容&#xff1a; HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…

我们来学webservie - WSDL

WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生&#xff0c;把酒临风,其喜洋洋者矣老张说能签下xx项目&#xff0c;一来证明了集团在行业中的翘楚地位&#xff0c;二来感谢各位领导给予的大力支持接下来的一周&#xff0c;项目经理、业务顾问相继入场&#xff0…

weblogic开启https

JSK证书生成 生成密钥库和证书 使用Java的keytool命令来生成一个Java密钥库&#xff08;Keystore&#xff09;和证书。keytool是Java开发工具包&#xff08;JDK&#xff09;中用于管理密钥库和证书的命令行工具。 #创建证书存放目录 [weblogicosb1 jksHL]$ mkdir -p /home/w…

激活函数在神经网络中的应用与选择

目录 ​编辑 Sigmoid函数 代码示例与分析 Tanh函数 代码示例与分析 ReLU函数 代码示例与分析 Leaky ReLU函数 代码示例与分析 PReLU函数 代码示例与分析 ELU函数 代码示例与分析 SELU函数 代码示例与分析 Softmax函数 代码示例与分析 结论 在深度学习领域&am…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…

2023年第十四届蓝桥杯Scratch国赛真题—推箱子

推箱子 程序演示及其源码解析&#xff0c;可前往&#xff1a; https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程&#xff0c;在线测评模考&#xff0c;助力赛事可自行前往题库中心&#xff0c;按需查找&#xff1a; https://www.hixinao.com/ 题库涵盖…

[RabbitMQ] RabbitMQ常见应用问题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

HarmonyOS 5.0应用开发——UIAbility生命周期

【高心星出品】 文章目录 UIAbility组件创建AbilityUIAbility的生命周期Create状态WindowStageCreate状态Foreground和Background状态WindowStageWillDestroy状态Destroy状态 UIAbility组件 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility组…

Coovally CPU版:用AI模型微调技术革新数据标注方式

文章目录 前言一、为什么选择Coovally CPU版&#xff1f;1.微调模型更懂你的数据2.省时省力的标注流程3.零GPU门槛&#xff0c;适配性强 二、教程&#xff1a;如何用Coovally CPU版完成高效数据标注&#xff1f;第一步&#xff1a;安装Coovally CPU版第二步&#xff1a;加载数据…

Lua元表和元方法的使用

元表是一个普通的 Lua 表&#xff0c;包含一组元方法&#xff0c;这些元方法与 Lua 中的事件相关联。事件发生在 Lua 执行某些操作时&#xff0c;例如加法、字符串连接、比较等。元方法是普通的 Lua 函数&#xff0c;在特定事件发生时被调用。 元表包含了以下元方法&#xff1…

【初阶数据结构与算法】二叉树链式结构的定义与实现万字笔记(附源码)

文章目录 一、二叉树链式结构的定义二、二叉树链式结构功能的基本实现1.链式二叉树的手动创建2.链式二叉树的前中后序遍历前序遍历中序遍历后序遍历 3.链式二叉树节点的个数4.链式二叉树叶子节点的个数5.链式二叉树的高度/深度6.链式二叉树第k层节点的个数7.链式二叉树的查找8.…

前端框架的选择与反思:在简约与复杂之间寻找平衡

在当今互联网时代&#xff0c;前端开发已经成为web应用构建中不可或缺的一环。从最初的静态HTML页面&#xff0c;到如今复杂的单页应用&#xff08;SPA&#xff09;&#xff0c;前端技术的发展让我们见证了Web应用的蓬勃发展。然而&#xff0c;伴随着技术的进步&#xff0c;一个…

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参…

SpringBoot期末知识点大全

一、学什么 IoC AOP&#xff1a;面向切面编程。 事物处理 整合MyBatis Spring框架思想&#xff01; 二、核心概念 问题&#xff1a;类之间互相调用/实现&#xff0c;导致代码耦合度高。 解决&#xff1a;使用对象时&#xff0c;程序中不主动new对象&#xff0c;转换为由外部提…

撰写技术文档的关键步骤和核心要点

编写项目的技术文档是一个重要且细致的任务&#xff0c;它不仅有助于项目的当前开发团队理解系统的结构和工作原理&#xff0c;还为未来的维护和扩展提供了宝贵的参考资料。以下是撰写技术文档时应遵循的几个关键步骤和组成部分&#xff1a; 1. 概述 项目简介&#xff1a;简要…

【人工智能】Transformers之Pipeline(二十八):视觉问答(visual-question-answering)

​​​​​​​ 目录 一、引言 二、视觉问答&#xff08;visual-question-answering&#xff09; 2.1 概述 2.2 dandelin/ViLT 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.3.3 pipeline对象返回参数 2.4 pipeline实战 2.5 模型…