当前位置: 首页 > 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;但我们将在这篇文章中为大家展示他的潜…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...