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

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...