嵌入式入门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; 		//查找成功标志置1break;}}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的哈希表//将哈希表中所有元素的值初始化为-1for(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...:要写入字符串的数据(变量或者常量)

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

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

相关文章

内网代理转发工具

概念区分 端口转发 端口转发就是将一个端口&#xff0c;这个端口可以本机的端口也可以是本机可以访问到的任意主机的端口&#xff0c;转发到任意一台可以访问到的IP上&#xff0c;通常这个IP是公网IP。 适用端口转发的网络环境有以下几种&#xff1a; 服务器处于内网&#x…

MNIST_FC

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…

算法之括号匹配中最长有效字符串

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 任何一个左括号都能找到和其正确配对的右括号任何一个右括号都能找到和其正确配对的左括号 求最长的有效的括号长度 2. 解释 例如&#xff0c;这里的括号 ((((()()()()()()()))()最长有效是&#xff1a;((()()()()()()(…

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源&#xff1a;统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构&#xff1a;X86&#xff08;海光C86-3G 3350&#xff09; OS版本信息&#xff1a;1070桌面专业版 软件信息&#xff1a;postgresql-14.2postgis-3.2 …

【书生大模型实战营】Python 基础知识-L0G2000

前言&#xff1a;本文是书生大模型实战营系列的第2篇文章&#xff0c;是入门岛的第二个任务&#xff0c;主题为&#xff1a;Python基础知识。 官方教程参考链接&#xff1a;Tutorial/docs/L0/Python at camp4 InternLM/Tutorial 1.任务概览 本关为Python基础关卡&#xff0…

智能安全新时代:大语言模型与智能体在网络安全中的革命性应用

一、引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益严重&#xff0c;成为各行各业面临的重大挑战。传统的安全防护措施已难以应对日益复杂的网络威胁&#xff0c;人工智能&#xff08;AI&#xff09;技术的引入为网络安全带来了新的希望。特别是大语言模型&#xff…

数仓技术hive与oracle对比(三)

更新处理 oracle使用dblink透明网关连接其他数据库&#xff0c;mysql、sqlserver、oracle&#xff0c;然后用sql、plsql更新数据&#xff1b;或者使用etl工具实现更新。 hive使用sqoop连接mysql、sqlserver、oracle实现数据更新。 oracle oracle数据加载命令 批量sql脚本上…

在 Vue.js 中使用对象映射和枚举类型

学习啦&#xff01; 对象映射是一种将一个对象的属性名映射到另一个对象的属性名的方法。 const keyMapping {username: 用户名, gender: { label: 性别, mapping: gender }, // gender 映射为 性别email: 邮箱, // email 映射为 邮箱phone: 电话, // phone 映射为 电话addres…

嵌入式学习(15)-stm32通用GPIO模拟串口发送数据

一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间&#xff1b;发送8位数据&#xff1b;拉高一个波特率的时间。 三、代码 …

【C语言期末复习全攻略】:知识点汇总与考试重点剖析、附刷题资料软件

零、引用 期末考试临近&#xff0c;无论你是初学者还是“熬夜选手”&#xff0c;C语言的学习都需要系统梳理和重点突破。本文将全面总结C语言的核心知识点&#xff0c;并针对考试中常见的题型提供复习建议&#xff0c;助你轻松拿下高分。 文末提供了一款免费的C语言刷题软件 …

美颜SDK接入实战:构建智能化直播美颜APP的技术路径详解

如何将美颜SDK顺利接入并构建一个智能化的直播美颜APP呢&#xff1f;本文将从技术路径的角度&#xff0c;带你深入解析这一过程。 一、了解美颜SDK的基本功能 美颜SDK通常包括多个功能模块&#xff0c;针对不同的直播场景&#xff0c;SDK会提供针对性的优化算法&#xff0c;确…

【Spring】Spring事务和事务传播机制

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 一、Spring事务 我们在MySQL阶段已经学习了MySQL的事务相关知识&#xff0c;详情可见 【MySQL数据库】索引与事务-CSDN博客 1、概念 我们在此做一个简单回顾…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面&#xff1a; 主页面&#xff1a; 添加信息&#xff1a; 删除信息&#xff1a; 删除第一行&#xff08;支持多行删除&#xff09; 需求分析&#xff1a; 用QT实现一个学生管理信息系统&#xff0c;数据库为MySQL 要求&#xf…

核心网S6730-H48X6C-V2堆叠

核心网是电信网络的中枢,负责数据传输、服务提供和网络管理,对保障通信质量、支持新技术服务和维护网络安全至关重要。堆叠技术通过将多个网络设备逻辑上整合为一个单元,简化管理,提升网络可用性和性能,同时降低成本,增强网络扩展性。 堆叠在网络建设中至关重要,它通过…

教程: 5分钟部署 APIPark 开源 LLM Gateway 与 API 开放门户

极大简化了大语言模型调用的过程&#xff0c;无需复杂代码即可同时连接主流大语言模型&#xff0c;让企业更加快捷、安全地使用AI。喜欢或感兴趣的小伙伴们赶紧去体验吧&#xff01; &#x1f517;更详细使用教程可以查看&#xff1a;APIPark 产品使用文档 APIPark 提供出色的…

HTML5教程-表格宽度设置,最大宽度,自动宽度

HTML表格宽度 参考&#xff1a;html table width HTML表格是网页设计中常用的元素之一&#xff0c;可以用来展示数据、创建布局等。表格的宽度是一个重要的参数&#xff0c;可以通过不同的方式来设置表格的宽度&#xff0c;本文将详细介绍HTML表格宽度的不同设置方式和示例代…

RISC-V架构下OP-TEE 安全系统实践

安全之安全(security)博客目录导读 本篇博客&#xff0c;我们聚焦RISC-V 2024中国峰会上的RISC-V和OP-TEE结合的一个安全系统实践&#xff0c;来自芯来科技桂兵老师。 关于RISC-V TEE(可信执行环境)的相关方案&#xff0c;如感兴趣可参考RISC-V TEE(可信执行环境)方案初探 首…

RTK数据的采集方法

采集RTK&#xff08;实时动态定位&#xff09;数据通常涉及使用高精度的GNSS&#xff08;全球导航卫星系统&#xff09;接收器&#xff0c;并通过基站和流动站的配合来实现。本文给出RTK数据采集的基本步骤 文章目录 准备设备设置基站设置流动站数据采集数据存储与处理应用数据…

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…