嵌入式入门Day25

数据结构Day 6,IO Day1

  • 查找算法
    • 顺序查找
    • 折半查找(二分查找)
    • 哈希查找
  • IO
    • 概念
    • 标准IO
      • 创建递归索引(用于查询结构体定义)
    • 文件IO
    • 标准IO缓冲区指针
    • 相关函数

在这里插入图片描述

查找算法

顺序查找

  1. 关键字:分为主关键字和次关键字
  2. 主关键字:可以唯一识别的信息,如身份证、学号等等
  3. 次关键字:可以识别到若干个信息,如姓名,年龄等可以重复的信息
  4. 顺序查找概念:按照顺序逐一比较,查找某个关键字是否存在线性表中
  5. 顺序查找的时间复杂度O(n)

折半查找(二分查找)

  1. 前提:需要顺序存储,记录有序
  2. 折半查找:取顺序表的中值比较,每次排除一半的数据
  3. 折半查找的时间复杂度尾O(log2n)
#include <stdio.h>

#define MAX 100
typedef struct
{
	char name[20];
	char sex[8];
	int age;
}Stu;
typedef struct
{
	Stu data[MAX];
	int len;
}Seqlist, *Seqlist_ptr;

int main(int argc, const char *argv[])
{
	int age;			//记录用户输入的年龄数据
	int i;				//低位下标
	int j; 				//高位下标
	int mid;			//中间下标
	int flag = 0; 		//查找标志位
	//直接定义并初始化一个顺序表
	Seqlist S = {5,{{"小胖","男",30},{"细狗","男",28},{"黑狗","女",25},{"添狗","男",21},{"狼狗","女",19}}};
	printf("请输入要查找的年龄:");
	scanf("%d",&age);
	//初始化下标
	i = 0;
	j = S.len-1;
	//下标相遇结束循环
	while(i <= j)
	{
		//计算中点下标
		mid = (i+j)/2;
		//输入数据与中点比较,如果小于中点数据,就去低位区寻找,反之去高位区寻找,如果相等查找结束
		if(age < S.data[mid] && i <= j)
		{
			j = mid - 1;
		}else if(age > S.data[mid] && i <= i)
		{
			i = mid + 1;
		}else
		{
			printf("查找成功,该学生是:%s\n", S.data[mid].name);
			flag = 1; 		//查找成功标志置1
			break;
		}
	}
	if(flag == 0)
	{
		printf("查找失败\n");
	}
	return 0;
}

哈希查找

  1. 哈希表概念:利用哈希函数关键字代入哈希函数,算出下标,把关键字存入下标对应的数组中。

  2. 哈希表的构建:哈希函数,数组,解决冲突方法。

  3. 哈希函数构建方法:直接定址法,数字分析法,平方取中,除留余数

    • 直接定址法:采用某个线性函数产生的地址作为下标。eg:f(x) =2*x+1
    • 数字分析法:取数字的前两位或者后三位作为下标。
    • 平方取中法:将关键字平方后取中间某几位作为下标。
    • 除留余数法(常用):将关键字模某个值,产生的下标作为地址eg:f(x) = x%13;
  4. 解决冲突方法:线性探测再散列,二次探测再散列,再哈希(重新构建新的哈希函数)等。

    • 冲突:不同关键字带入哈希函数得到相同下标。
    • 线性探测再散列:逐一往后+1的方式探测。
    • 二次探测再散列:逐一往后+i^2方式探测。
    • 再哈希:重新构建新的哈希函数。
      时间复杂度O(1)。

假设由关键字:{12,14,21,36,18,66,16}构建哈希表,哈希函数是H(key) = key%7
采用线性探测解决冲突,表中初始值为-1.请构建哈希表。

#include <stdio.h>

int main(int argc, const char *argv[])
{
	ins sub; 			//存储临时下标
	int hash[20];		//定义长度为20的哈希表
	//将哈希表中所有元素的值初始化为-1
	for(int i = 0; i < 20; i++)
	{
		hash[i] = -1;
	}
	
	//定义数组存储待处理数据
	int arr[7] = {12,14,21,36,18,66,16};
	for(int i = 0; i < 7; i++)
	{
		sub = a[i]%7; 		//将数组中的元素传入哈希函数计算下标
		while(-1 != hash[sub]) 		//如果发生冲突,则进行线性探测
		{
			sub = (sub+1)%13;
		}
		hash[sub] = arr[i];	//将数据放入哈希表中
	}
	
	//哈希查找
	int temp;
	int count = 0; 			//统计查找次数
	printf("请输入要查找的数据:");
	scanf("%d", &temp);
	sub = temp%7;
	while(hash[sub] != temp)	//未找到该数据
	{
		sub = (sub+1)%7;		//进行线性探测
		count++;
		if(count % 13 == 0)
		{
			break; 				//已经全部查找过了
		}
	}
	if(count == 13)
	{
		printf("查找失败\n");
	}else
	{
		printf("要查找的数据在%d位\n", sub+1);
	}
	return 0;
}

IO

概念

学习方法:不要死记硬背,学会使用man手册查,加上有道翻译去理解。

input:输入,output:输出
  1. IO是计算机中的输入/输出(Input/Output)的简称,指的是计算机系统与外部设备之间进行数据交换的过程。输入是指将外部数据传输到计算机系统中,输出是指将计算机系统中的数据传输到外部设备中。

  2. 标准IO,也称为高级IO,是C语言标准库提供的一种IO操作方式。它使用文件流指针(如stdin、stdout、stderr)作为操作入口,通过缓冲机制(全缓冲、行缓冲、不缓冲)来管理数据的输入和输出。标准IO提供了丰富的函数接口,如fopen、fclose、fread、fwrite等,方便开发者进行文件操作

  3. 文件IO,也称为低级IO,是Linux系统调用提供的一种IO操作方式。它通过文件描述符(0,1,2)来访问文件,文件描述符是一个非负整数,用于标识打开的文件。文件IO没有缓冲机制,直接对文件进行读写操作。常见的文件IO函数有open、close、read、write等。

标准IO

  1. 标准IO依赖C标准库,使用时调用C标准库的函数,在写入或者读取数据时,标准IO先将数据放入缓冲区,当缓冲区满了或者刷新时机到了,标准IO会调用文件IO将数据写入硬件或者从硬件读取出来。
  2. 标准IO = 文件IO+缓冲区
  3. 标准IO函数:scanf/printf getchar/putchar gets/puts
  4. 文件IO依赖于系统调用,文件IO没有缓冲区,每一次调用,系统都会进行一次内核态到用户态的切换,也就是每一次调用系统都处于阻塞状态,等待用户程序执行完成,所以文件IO调用时非常浪费系统开销。

创建递归索引(用于查询结构体定义)

  1. 进入 cd /usr/include 专门用来存放头文件的目录
  2. 进入 cd /usr/include 专门用来存放头文件的目录
  3. vim -t 想要查看的数据名 前两步是一次性操作,之后想要查看其他内容,直接执行第三步即可

文件IO

依赖系统调用,由内核封装的一系列函数,可以直接作用于操作系统,每一次调用操作系统都处于阻塞状态,等待文件IO进程的完成,所以使用文件IO系统开销非常大。

标准IO缓冲区指针

stdin:标准输入流指针,调用标准IO输入函数时,标准IO输入函数操作的指针,将数据放入stdin指向的缓冲区。
stdout:标准输出流指针,调用标准IO输出函数时,标准IO输出函数操作的指针,将数据从stdout指向的缓冲区输出。
stderr:标准出错流指针,调用标准IO错误函数时,标准IO错误函数操作的指针,没有缓冲区,出错信息会立刻显示出来。

相关函数

  1. fopen fclose
#include <stdio.h>

       FILE *fopen(const char *pathname, const char *mode);
       功能:打开文件
       参数1:指向文件的指针(一般写成路径)
           绝对路径:home/ubuntu/24101/IO/IO-1/1.txt 是从家目录出发的一整条完整的路径。
           相对路径:/1.txt 当前文件夹下的某个文件。
       参数2:打开模式由6种可选
           r:只读方式打开文件,光标位于文件的开头。
           r+:读写方式打开文件,光标位于文件的开头。
           w:只写方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件内容,
           光标位于文件的开头。
           w+:读写方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件内容,
           光标位于文件的开头。
           a:追加写的方式打开文件,如果文件不存在就创建文件,光标位于文件的末尾
           a+:读和追加写的方式打开文件,如果文件不存在就创建文件,读的时候光标位于文件的开
           头,写的时候光标位于文件的末尾。                                 
    返回值:成功返回指向打开的文件指针,失败返回NULL,并置位错误码。
    
     #include <stdio.h>

       int fclose(FILE *stream);
       功能:关闭文件指针指向的文件,将光标重置到文件开头。
       参数1:文件指针
       返回值:成功返回0,失败返回EOF(-1)并置位错误码。
  1. fgetc fputc
#include <stdio.h>

       int fgetc(FILE *stream);
    功能:从stream指向的文件中,读取一个单字符。
    参数:指向文件的指针
    返回值:成功返回读取的字符,读取到文件末尾或者失败返回EOF-1#include <stdio.h>

       int fputc(int c, FILE *stream);
       功能:将字符c写入到stream指向的文件中
       参数1:字符变量或者常量
       参数2:指向文件的指针
       返回值:成功返回写入的字符,失败返回EOF(-1)
  1. fgets fputs
#include <stdio.h>
       char *fgets(char *s, int size, FILE *stream);
       功能:从stream指向的文件中读取size-1个字符放入s指向的缓冲区,在末尾加上'\0'。
       读取时连同换行一起读取。
       参数1:字符串存储的起始地址。
       参数2:读取的大小size-1个字符
       参数3:文件指针。
       返回值:成功返回读取的字符串,失败或者读取到文件末尾返回NULL.
#include <stdio.h>

      
       int fputs(const char *s, FILE *stream);
       功能:将s指向的字符串写入到stream指向的文件
       参数1:字符串起始地址
       参数2:文件指针
       返回值:成功返回非负数,失败返回EOF(-1)
  1. sprintf snprintf
#include <stdio.h>

     
       int sprintf(char *str, const char *format, ...);
       功能:将变量常量按照格式转换字符的形式写入到字符串str中
       参数1:字符数组或者字符串
       参数2:格式控制字符串
       参数3456...:要写入字符串的数据(变量或者常量)
        eg:
        sprintf(str,"%s %d %f","班长是好人",100,12.5);
        但是无法预知要写入的字符串长度,可能会导致str的溢出
       int snprintf(char *str, size_t size, const char *format, ...);
        功能:将变量常量按照格式转换字符的形式写入到字符串str中
        参数1:字符数组或者字符串
        参数2:要写入的字节个数
        参数3:格式控制字符串
        参数456...:要写入字符串的数据(变量或者常量)
       

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统——虚拟内存管理

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 背景 进程必须全部放入物理内存后方可运行&#xff0c;这个规则将程序大小限制为物理内存大小。许多情况下并不需要将整个程序置于内存中&#xff0c;比如程序几乎从不执行但…

Java 在Json对象字符串中查找和提取特定的数据

1、在处理JSON数据时&#xff0c;需要提出个别字段的值&#xff0c;通过正则表达式提取特定的数据 public static void main(String[] args) {//定义多个JSON对象字符串类型&#xff0c;假设每个对象有a,b,c 字段String strJson "{\"a\":1.23,\"b\"…

进度与预算

一个项目&#xff0c;如果进度上可以按时完成&#xff0c;一般来说预算不会超标&#xff0c;或者超标幅度有限。 一个项目&#xff0c;如果进度上严重超期&#xff0c;预算基本上会超标&#xff0c;而且超标很大。 现在很多项目&#xff0c;人力成本占比都比较大&#xff0c…

Ungoogled Chromium127编译指南 Windows篇 - 安装Visual Studio 2022(六)

1. 引言 在编译Ungoogled Chromium之前&#xff0c;正确安装和配置Visual Studio 2022是至关重要的一步。作为主要的开发环境&#xff0c;Visual Studio不仅提供了必要的编译工具&#xff0c;还包含了大量构建过程中需要的组件和库。本文将详细介绍如何在Windows系统上安装和配…

电子商务人工智能指南 3/6 - 聊天机器人和客户服务

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

精确的单向延迟测量:使用普通硬件和软件

论文标题&#xff1a;Precise One-way Delay Measurement with Common Hardware and Software&#xff08;精确的单向延迟测量&#xff1a;使用普通硬件和软件&#xff09; 作者信息&#xff1a;Maciej Muehleisen 和 Mazen Abdel Latif&#xff0c;来自Ericsson Research Eri…

字符串的特征

底层是char类型的数组 char[] replace()&#xff1a;替换 split()&#xff1a;切分 indexOf()&#xff1a;第一个字符所在位置&#xff0c;从0开始算 substring(3, 6)&#xff1a;字符串截取&#xff0c;包括3不包括6 字符串不可变 本质上是数组&#xff0c;数组是固定值…

三维扫描检测在汽车制造中的应用

三维扫描&#xff0c;通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 三维扫描…

【已解决】黑马点评项目中启动Spring Boot服务失败,com.sun.tools.javac.tree.JCTree qualid

黑马点评项目中启动Spring Boot服务失败 报错提示 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid这是因为 lombok 版本不兼容造成的 找到 pom.xml 文件&#xff0…

Netty入门(快速了解以及使用netty)

二. Netty 入门 1. 概述 1.1 Netty 是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty 是一个异步的、基于事件驱动的网络应用框架&…

Python办公—DataMatrix二维条码制作

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

前缀和(八)矩阵区域和

1314. 矩阵区域和 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&…

Nginx日常运维方法Linux版

关注 工 仲 好&#xff1a;IT运维大本营1&#xff0c;安装&#xff1f; 下载RPM&#xff1a;wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm 离线包用其它方式下载也可以。 安装&#xff1a;rpm -ivh nginx-1.10.0-1.el7.ngx.x86_…

基于eFramework车控车设中间件介绍

车设的发展&#xff0c;起源于汽车工业萌芽之初&#xff0c;经历了机械式操作的原始粗犷&#xff0c;到电子式调控技术的巨大飞跃&#xff0c;到如今智能化座舱普及&#xff0c;远程车控已然成为汽车标配&#xff0c;车设功能选项也呈现出爆发式增长&#xff0c;渐趋多元繁杂。…

【Copilot 】TAB keybinding not working on JetBrains Client

pycharm ssh 远程到ubuntu24.04 发现tab就是tab,无法输出copilot给出的自动补全到便捷器里。禁用host的copilot插件,重新启动ide就好了。解决办法 参考大神的办法删除主机和客户端插件中的 Copilot插件。 仅在客户端中重新安装 Copilot 插件。 我只是禁用也可以 对比了键盘映…

使用API管理Dynadot域名,设置默认域名服务器ip信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

【Linux】文件描述符fd

1.前置预备 文件 内容 属性访问文件之前&#xff0c;都必须先打开他 #include<stdio.h> int main() { FILE* fpfopen("log.txt","w"); if(fpNULL) { perror("fopen"); return 1; } fclose(fp); return 0…

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…

结构型-代理模式(Proxy Pattern)

什么是代理模式 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理…

如何实现多级缓存以及缓存之间数据的一致性

文章目录 神领物流 -- 如何实现多级缓存以及缓存之间数据的一致性一. 为什么要使用多级缓存?二. 为什么要选择MongoDB作为数据库三. 如何缓存之间的一致性1. 如何同步更新Redis缓存2. 如何同步更新CaffeineCache缓存 神领物流 – 如何实现多级缓存以及缓存之间数据的一致性 采…