当前位置: 首页 > news >正文

C语言算法之查找

一.查找相关概念

这一部分解释数据结构里面查找的相关基础概念:

  • 查找:在数据集合中寻找满足某种条件的数据元素的过程。
  • 查找表:用于查找的数据集合
  • 关键字:数据元素中唯一标识该元素的某个数据项的值
  • 静态查找表:静态查找表是指在查找表建立后,查找表中的元素不再发生变化。
  • 动态查找表:动态查找表是指在查找表建立后,查找表中的元素可能会发生增加、删除等变化。
  • 查找长度:查找长度是指在进行一次查找操作时,需要比较的关键字的个数
  • 平均查找长度:平均查找长度是指进行n次查找操作时,所有查找长度之和除以n的结果。

二.顺序查找(线性查找)

1.对象

  • 静态查找表
  • 线性表(顺序表、链表)

2.原理

从数据结构的起始位置开始,依次检查每个元素,直到找到目标元素或到达数据结构的末尾为止。

具体步骤如下:

  1. 从数据结构的第一个元素开始遍历,依次和目标元素进行比较。
  2. 如果当前元素等于目标元素,则返回该元素位置。
  3. 如果已经遍历完所有元素(即到达数据结构的末尾)仍未找到目标元素,则返回查找失败。

顺序查找的时间复杂度为O(n),其中n为数据结构中元素的数量。当数据量较小或者数据结构没有特定的有序性质时,顺序查找是一个常用的查找方法。

3.代码

typedef struct{                        //查找表的数据结构(顺序表)
ElemType *elem;                        //动态数组基址
int TableLen;                           //表的长度
}SSTable;//顺序查找
int Search_ _Seq(SSTable ST, ElemType key){int i;for( i=0;i<ST. TableLen)&& ST.elem[i] !=key; ++i);        //查找成功,则返回元素下标;查找失败,则返回-1return i==ST.TableLen? (-1): i;
}

三.折半查找(二分查找)

1.对象

  • 静态查找表
  • 有序的顺序表

2.原理

它的原理基于以下思想:

  1. 首先确定待查找区间的左右端点 mid、left 和 right,并计算出中间位置 mid。
  2. 将要查找的值与 mid 位置上的元素进行比较。如果相等,则返回 mid;否则,判断查找值与 mid 元素大小的关系,若小于 mid 位置的元素,则在左侧区间继续查找;否则,在右侧区间继续查找。
  3. 不断重复以上操作,直到找到目标元素或者区间为空。

具体地,折半查找的实现步骤如下:

  1. 初始化 left 和 right 为数组的左右端点,即 left=0,right=n-1,其中 n 表示数组的长度。
  2. 计算 mid 位置,即 mid = (left + right) / 2。
  3. 判断查找值是否等于 mid 位置上的元素,如果是,则返回 mid。如果不是,则比较查找值和 mid 位置上的元素大小关系,如果小于 mid 位置上的元素,则从 left 到 mid - 1 的区间内继续查找;否则,从 mid + 1 到 right 的区间内继续查找。
  4. 重复步骤 2 和 3,直到找到目标元素或者区间为空。

需要注意的是,折半查找只适用于有序数组。如果数组没有排序,则需要先对数组进行排序。

折半查找(二分查找)的时间复杂度是 O(log n)。

3.代码

typedef struct{                        //查找表的数据结构(顺序表)
ElemType *elem;                        //动态数组基址
int TableLen;                           //表的长度
}SSTable;//折半查找
int Binary_ Search(SSTable L, ElemType key){int Low=0, high=L.TableLen-1,mid;while(low<=high){mid=(low+high)/2;           //取中间位置if(L.elem [mid]==key)return mid;             //查找成功则返回所在位置else if(L.elem[mid]>key)high=mid-1;             //从前半部分继续查找elselow=mid+1;              //从后半部分继续查找}return - 1;                     //查找失败,返回-1 
}

四.分块查找(索引顺序查找)

1.思想

它的基本思想是将有序表分成若干个块,每个块中存储多个关键字,并且块之间按照关键字的大小顺序连接起来。这样就形成了一个“块链”。

在进行查找时,先在块中进行二分查找,如果找到了关键字,则返回;若未找到,则需要在相邻的块中继续查找。由于块之间是有序的,因此可以采用类似于二分查找的方法来确定需要进入哪个块中进行查找,从而可以减少查找的次数,提高查找效率。

分块查找的时间复杂度为 O(√n),其中 n 表示有序表中元素的个数。虽然它的效率不如二分查找,但是在某些特定情况下,如查找次数较少、表比较大等情况下,分块查找仍然具有一定的优势。

2.C语言模拟分块查找

int blockSearch(int arr[], int n, int x, int blockSize) {// 计算块数int blocks = (int)ceil((double)n / blockSize);// 数组 index 表示每个块的起始下标,maxIndex 表示当前块中最大的下标int index[blocks], maxIndex[blocks];for (int i = 0; i < blocks; i++) {index[i] = i * blockSize;maxIndex[i] = (i + 1) * blockSize - 1;if (maxIndex[i] >= n) {maxIndex[i] = n - 1;}}// 查找所在块int block = -1;for (int i = 0; i < blocks; i++) {if (arr[index[i]] <= x && arr[maxIndex[i]] >= x) {block = i;break;}}// 块内顺序查找if (block == -1) {return -1;}for (int i = index[block]; i <= maxIndex[block]; i++) {if (arr[i] == x) {return i;}}return -1;
}

五.哈希函数

1.哈希函数

哈希函数是将任意大小的数据映射到固定大小的数据的一种函数。在哈希表中,哈希函数通常用于将关键字映射到桶的索引上,以便于快速定位元素。

哈希函数的设计非常重要,它直接影响了哈希表的性能。一个好的哈希函数应该满足以下几个条件:

  1. 映射均匀:哈希函数应该尽量让不同的关键字映射到不同的桶中,从而避免冲突的发生。一个映射均匀的哈希函数可以使得每个桶中元素的数量尽可能均衡,也可以减少线性探测或者拉链法时的查找次数。
  2. 易于计算:哈希函数的计算速度应该尽可能快,这样可以提高哈希表的建立和查询效率。
  3. 低冲突率:哈希函数应该尽量避免冲突的发生,即不同的关键字映射到相同的桶中,因为冲突会导致查找效率下降。如果无法完全避免冲突,那么就需要选择一种合适的冲突处理方式,如开放寻址法、线性探测、拉链法等。

哈希函数的设计方法有很多种,常见的包括直接取模法、乘法取整法、平方取中法等。具体如何选择和设计哈希函数需要根据具体问题和数据特征进行考虑。

2.举例

以下是一个简单的哈希函数,使用了取模法将关键字映射到桶中:

int hash(int key, int buckets) {return key % buckets;
}

这个哈希函数接受两个参数:key 表示要映射的关键字,buckets 表示哈希表的大小(即桶的数量)。该函数将关键字 key 对哈希表的大小进行取模运算,得到的余数就是关键字在哈希表中对应的桶的索引。

需要注意的是,该哈希函数不一定适用于所有情况,因为它可能会导致冲突的发生。例如,如果哈希表的大小与某些关键字的倍数有关,那么这些关键字就会被映射到同一个桶中,从而影响查找效率。为了避免这种情况,我们需要选择更加复杂的哈希函数,并根据实际情况进行调整和优化。

六.说明

新星计划:数据结构与算法,@西安第一深情,创作打卡2!

相关文章:

C语言算法之查找

一.查找相关概念 这一部分解释数据结构里面查找的相关基础概念&#xff1a; 查找&#xff1a;在数据集合中寻找满足某种条件的数据元素的过程。查找表&#xff1a;用于查找的数据集合关键字&#xff1a;数据元素中唯一标识该元素的某个数据项的值静态查找表&#xff1a;静态查…...

肝一肝设计模式【九】-- 享元模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…...

自动化测试的十大雷区【刚入门必看】

虽然从自己的错误中学习也不错&#xff0c;但从别人的错误中学习总是更好的。 作为一个自动化测试人员&#xff0c;分享常见的容易犯的10个错误&#xff0c;可以从中吸取教训&#xff0c;引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时&…...

【Android源码篇】用grep搜索源码内容关键词

前言 选项&#xff1a; • -w&#xff1a;只匹配整个单词&#xff0c;不会部分匹配 • -r&#xff1a;递归搜索 • -n&#xff1a;显示行号 • -i&#xff1a;忽略字符大小写 • -I&#xff08;大写i&#xff09;&#xff1a;忽略二进制文件 • -I&#xff1a;忽略文件内容&am…...

腾讯云轻量应用服务器卡死怎么连接?

腾讯云轻量云服务器卡死怎么解决&#xff1f;使用腾讯云自带的VNC登录连接轻量服务器&#xff0c;或使用腾讯云OrcaTerm一键免密登录轻量实例。如果是确定数据没问题&#xff0c;也可以使用控制台自带的重启实例。 腾讯云轻量应用服务器参考&#xff1a;https://curl.qcloud.co…...

Charles安装及抓取APP接口

一、Charles使用 Charles是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0c;能够在Windows&#xff0c;Mac&#xff0c;…...

Linux开发工具:yum和vim的使用

目录 一. Linux下的软件 1.1 软件安装的三种方法 1.2 采用yum安装软件 1.3 yum源的问题 二. vim开发工具的使用 2.1 vim的三种基本模式 2.2 命令模式下vim的常用指令 2.2.1 定位相关指令 2.2.2 光标移动相关指令 2.2.3 插入相关指令 2.2.4 复制粘贴相关指令 2.2.5 替…...

Java基础重温巩固

方法 方法与方法之间是平级关系&#xff0c;不能嵌套return表示结束当前方法 基本数据类型和引用数据类型 基本数据类型&#xff1a;数据存储在自己的空间中 引用数据类型&#xff1a;数据存储在其他空间中&#xff0c;自己空间存储的是地址值 值传递 传递基本数据类型时&…...

Text2SQL 语义解析数据集、解决方案和学术论文资源整合

目录 什么是Text2SQL? Text2SQL语义解析数据集 Text2SQL解决方案 Text2SQL相关学术论文 欢迎大家&#xff0c;我是你们的博主&#xff0c;今天我们来讨论一个非常有趣且有挑战性的话题 —— Text2SQL。这个话题涉及到自然语言处理 (NLP)&#xff0c;数据库查询语言 (SQL)&…...

redis集群+哨兵配置实操宝典

本地安装redis 配置集群和哨兵 1、下载安装redis #wget http://download.redis.io/releases/redis-5.0.12.tar.gz #下载安装包 #yum -y install gcc #安装依赖包 #tar -zxvf redis-5.0.12.tar.gz #cd redis-5.0.12 #make 2、主备配置 我们采用一主两备的结构 主机 192.168.3.…...

nginx的语法

概览 Nginx是一个高效、稳定的开源Web服务器和反向代理服务器&#xff0c;也可以用作邮件代理服务器、负载均衡器和HTTP缓存。以下是Nginx配置文件的一些基本语法和组成部分&#xff1a; 配置块&#xff08;Block Directives&#xff09;&#xff1a;Nginx配置文件由许多嵌套的…...

华为OD机试之英文输入法(Java源码)

英文输入法 题目描述 主管期望你来实现英文输入法单词联想功能。 需求如下&#xff1a; 依据用户输入的单词前缀&#xff0c;从已输入的英文语句中联想出用户想输入的单词&#xff0c;按字典序输出联想到的单词序列&#xff0c; 如果联想不到&#xff0c;请输出用户输入的单词…...

一个团队管理者应该干什么?

文章目录 一、前言二、搞好团队气氛三、上下都要处理好四、做好计划并监督执行&#xff0c;控制风险。五、小结 一、前言 话说管理这个东西是猪有猪的想法&#xff0c;狗有狗的想法。所以不会有一个定论&#xff0c;总是有人定义这个管理方式&#xff0c;那个管理方式。看的管…...

服务器数据库文件加载到 MySQL

要将数据库文件加载到 MySQL 中&#xff0c;您可以使用以下步骤&#xff1a; 1. 确保 MySQL 服务器正在运行。您可以使用以下命令检查 MySQL 服务器的状态&#xff1a; sudo systemctl status mariadb 如果 MySQL 服务器没有运行&#xff0c;请使用以下命令启动它&…...

6-《网络面试》

6-《网络面试》 1.http是什么&#xff1f;http的工作机制&#xff1f;http报文&#xff1f;1.1 http工作机制&#xff1a;1.2 URL和http报文 2. HTTP请求方法和状态码3.Get和Post的区别4.HTTP的Header解析1.text/html2.x-www-form-urlencoded3.multipart/form-data4.applicatio…...

[高光谱]高光谱数据的获取与展示

一、环境准备 需要安装spectral包&#xff0c;这个包专门用于高光谱数据展示。 pip install spectral 二、数据加载 要预先准备原始高光谱的.mat数据和分类数据gt.mat(ground-turth)&#xff1b;然后使用scipy.io中的loadmat(.)将其读入程序。 from scipy.io import loadmat…...

veth网卡的多队列及RPS

背景&#xff1a; 3.10内核下容器使用的veth网卡&#xff0c;默认开启的是一个队列&#xff0c;导致在某些单线程多TCP链接的应用场景下&#xff0c;出现某个CPU软中断高的情况。之前处理的方案一直是开启这个veth网卡的RPS&#xff0c;让其在多流场景下可以去分散到其它CPU上…...

国内的程序员数量是否已经饱和或者过剩?

首先&#xff0c;国内程序员数量确实在逐年增加&#xff0c;特别是近年来互联网行业迅猛发展&#xff0c;促进了技术人员需求的增长。然而&#xff0c;要判断程序员是否饱和并不是简单地看人数。下面我们细分几个角度来看看这个问题。 1、合格的程序员数量不够 国内的IT领域和…...

flutter不能抓包

需要获取手机IP地址设置才能抓包&#xff0c;获取IP地址&#xff0c;需要跟原生通讯获取&#xff0c; 1&#xff1a;获取IP地址 安卓代码&#xff1a; /*** 原生和flutter通讯交互*/ class MainActivity : FlutterActivity() {var methodChannel: MethodChannel? nullover…...

从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?

.NET多平台应用程序UI&#xff08;. NET MAUI&#xff09;的市场吸引力与日俱增&#xff0c;这是微软最新的开发平台&#xff0c;允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上 .NET MAUI的潮流&#xff0c;但我们将在这篇文章中为大家展示他的潜…...

Vue3.0 + ElementPlus 后台管理系统模板:从零搭建到实战部署

1. 为什么选择Vue3.0ElementPlus开发后台系统 最近两年接手过不少后台管理系统的项目&#xff0c;从最初的Vue2到现在的Vue3&#xff0c;我深刻体会到组合式API带来的开发效率提升。特别是配合ElementPlus这个UI库&#xff0c;简直就是后台管理系统开发的"黄金搭档"。…...

10分钟训练高质量AI音色:RVC变声器实战指南

10分钟训练高质量AI音色&#xff1a;RVC变声器实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI …...

别再瞎选 B2B2C 开源商城了!实测对比 Tigshop /ShopXO/Likeshop/Niushop/BeikeShop

作为一名折腾过不少开源电商项目的程序员&#xff0c;我深知一个道理&#xff1a;选择电商系统这事儿&#xff0c;选对了皆大欢喜&#xff0c;选错了就是无底洞。技术栈老旧的、文档缺东少西的、号称“免费”结果到处埋坑的&#xff0c;这些年我都踩过一遍。最近因为项目需要调…...

3D-Speaker模型微调实战:大间隔损失函数在说话人验证中的应用

3D-Speaker模型微调实战&#xff1a;大间隔损失函数在说话人验证中的应用 【免费下载链接】3D-Speaker A Repository for Single- and Multi-modal Speaker Verification, Speaker Recognition and Speaker Diarization 项目地址: https://gitcode.com/gh_mirrors/3d/3D-Spea…...

华为云Stack网络平面规划实战:从External_OM到内大网,手把手教你避开IP地址规划的坑

华为云Stack网络平面规划实战&#xff1a;从External_OM到内大网&#xff0c;手把手教你避开IP地址规划的坑 在云计算架构设计中&#xff0c;网络平面规划往往是决定项目成败的关键环节。华为云Stack作为企业级云平台解决方案&#xff0c;其网络架构的复杂性要求架构师必须具备…...

【HTML动态交互实战】模拟股市波动可视化系统

1. 从零搭建股市波动可视化系统 最近在做一个金融数据分析的小项目&#xff0c;需要模拟股票价格波动并可视化展示。作为一个前端开发者&#xff0c;我第一时间想到用HTML5 Canvas来实现这个需求。下面就把我的实现思路和踩过的坑分享给大家。 先说说为什么要用Canvas而不是S…...

从SAC到HIL-SERL:拆解LeRobot中强化学习算法的工程化集成与调试

从SAC到HIL-SERL&#xff1a;拆解LeRobot中强化学习算法的工程化集成与调试 在具身智能领域&#xff0c;强化学习算法的落地应用一直面临着理论与工程之间的巨大鸿沟。LeRobot框架通过HIL-SERL&#xff08;Human-In-the-Loop Sample-Efficient Reinforcement Learning&#xff…...

如何用paraphrase-multilingual-MiniLM-L12-v2在90天内降低多语言内容处理成本60%

如何用paraphrase-multilingual-MiniLM-L12-v2在90天内降低多语言内容处理成本60% 【免费下载链接】paraphrase-multilingual-MiniLM-L12-v2 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/paraphrase-multilingual-MiniLM-L12-v2 paraphrase-multilingual-…...

Fish Speech 1.5零样本语音克隆实操:10秒参考音频生成中英日韩多语种语音

Fish Speech 1.5零样本语音克隆实操&#xff1a;10秒参考音频生成中英日韩多语种语音 想不想让AI用你朋友的声音说一段话&#xff1f;或者用某个电影角色的音色&#xff0c;为你朗读一段外语新闻&#xff1f;过去&#xff0c;这需要专业的录音设备和复杂的模型训练。但现在&am…...

PHP网关调试失效?93%的线上事故源于这3个被忽略的底层配置项(工业场景实测数据支撑)

第一章&#xff1a;PHP网关调试失效的工业级认知盲区在高并发微服务架构中&#xff0c;PHP常作为轻量级API网关或BFF&#xff08;Backend for Frontend&#xff09;层存在。然而&#xff0c;大量团队在调试阶段遭遇“请求无响应”“日志无输出”“Xdebug断点不触发”等现象时&a…...