嵌入式入门Day24

数据结构Day5

  • 树形结构
    • 相关概念
    • 二叉树
      • 相关概念
      • 二叉树的状态
      • 二叉树性质
      • 二叉树的存储
      • 二叉树根据已有序列推出树的结构
        • 练习
  • 算法
    • 相关概念
    • 算法特性
    • 算法的设计要求
    • 时间复杂度
    • 排序算法
      • 冒泡排序(改良版)
      • 选择排序(O(n^2))
      • 直接插入排序(O(n^2))
      • 快速排序

在这里插入图片描述

树形结构

相关概念

  1. 树形结构:表示数据元素之间存在一对多的关系
  2. 树:是由一个根结点和多个子树构成的树形结构
  3. 节点:就是树中的数据元素
  4. 父亲结点:当前结点的直接上级节点
  5. 孩子节点:当前结点的直接下级节点
  6. 祖先结点:当前结点的直接或间接上级节点
  7. 子孙节点:当前结点的直接或间接下级节点
  8. 兄弟节点:拥有相同父结点的所有节点互称为兄弟节点
  9. 堂兄弟节点:其父结点在同一层的所有节点,互为堂兄弟节点
  10. 根结点:没有父结点的节点
  11. 叶子节点:没有子节点的节点称为叶子节点
  12. 分支节点:节点的度不为0的节点叫分支节点
  13. 节点的度:就是当前结点的孩子节点个数,就称为节点的度
  14. 树的度:就是树中节点的度的最大值
  15. 节点的层次:从根结点开始到当前结点所经历的层数称为该节点的层次
  16. 树的层次:每个节点的层次的最大值

二叉树

相关概念

  1. 二叉树:由根结点和最多两个子树组成,并且严格区分左右子树的树形结构
  2. 左子树:由当前结点的左孩子节点为根结点构成的二叉树
  3. 右子树:由当前结点的右孩子节点为根结点构成的二叉树
  4. 满二叉树:二叉树的最后一层全是叶子节点,在没有添加层数的条件下,不能在向该树中增加节点的树(除了最后一层为叶子节点外,其余层中的节点的度全为2)
  5. 完全二叉树:在一棵满二叉树的基础上,最后一层自右向左逐渐减少节点的二叉树

二叉树的状态

一共五种:空二叉树、只有根节点、只有根节点和左孩子,只有根节点和右孩子,全部都有
二叉树状态

二叉树性质

  1. 在二叉树的第 i 层上最多有 2^(i-1)个节点
  2. 在二叉树的前n层最多有 2^n - 1个节点
  3. 在二叉树中,叶子节点的个数,总比度为2的节点个数多1
  4. 在二叉树上,如果第i个节点存在左孩子,那么其左孩子一定是第 2i个节点,如果存在右孩子,那么一定是第2i+1个节点

二叉树的存储

  1. 顺序存储
    顺序存储时,需要给空节点留出空间,会浪费大量的存储空间,所以一般用于存储完全二叉树,不适合存储普通的二叉树
  2. 链式存储
    使用两个指针分别指向左右孩子
  • 存储结构
typedef char datatype
typedef struct Tree
{datatype data; 		//数据域struct Tree *L; 	//左孩子指针struct Tree *R; 	//右孩子指针
}Tree , TreePtr;
  • 二叉树创建
TreePtr tree_create()
{datatype ch; 		//存储数据scanf("%c", &ch); 	//输入数据getchar(); 			//吸收垃圾字符if(ch == '#') 		//设定#表示空子树{return NULL;}//申请节点封装数据TreePtr B = (TreePtr)malloc(sizeof(Tree));//创建左子树B->L = tree_create();//创建右子树B->R = tree_create();return B; 			//返回树指针
}
  • 二叉树遍历
    • 先序遍历:先访问根结点,然后访问左孩子节点最后访问右孩子节点
    • 中序遍历:先访问左孩子节点,访问根结点,最后访问右孩子节点
    • 后序遍历 :先访问左孩子,再访问右孩子,最后访问根结点
//先序遍历
void pri_order(TreePtr B)
{//判断树是否合法if(NULL == B){return;}//输出数据域printf("%c\t", B->data);//递归调用输出左右子树pri_order(B->L);pri_order(B->R);
}
//中序遍历
void mid_order(TreePtr B)
{//判断树是否合法if(NULL == B){return;}//递归调用输出左子树mid_order(B->L);//输出数据域printf("%c\t", B->data);//递归调用输出右子树mid_order(B->R);
}
//后序遍历
void post_order(TreePtr B)
{//判断树是否合法if(NULL == B){return;}//递归调用输出左右子树post_order(B->L);post_order(B->R);//输出数据域printf("%c\t", B->data);
}

二叉树根据已有序列推出树的结构

  1. 必须要有中序遍历,再加任意一个遍历就可以推出输的结构
  2. 口诀:先后序定顺序,中序遍历分左右
练习

在这里插入图片描述

算法

相关概念

  1. 算法:所谓算法,就是计算机解决问题的方法和步骤
  2. 程序 = 数据结构 + 算法

算法特性

  1. 确定性:算法的每一条语句都有确定的含义,不能模棱两可
  2. 有穷性:程序执行一定时间后会自动结束的性质
  3. 输入:至少有0个或多个输入,这里的输入,不限于输入语句
  4. 输出:至少一个或多个输出,这里的输出,不限于输出语句
  5. 可行性:经济可行性、社会可行性

算法的设计要求

  1. 正确性:对所有正确的输入数据都能得到对应正确的结果
  2. 健壮性:对不合法的输入数据,能够给出合理的输出,例如 switch中的default模块
  3. 可读性:要求核心代码有注释、命名要规范、代码有缩进等等
  4. 高效率:要求算法的时间复杂度要低
  5. 低存储:要求空间复杂度要低

时间复杂度

时间复杂度是一个算法的时间量度,正常情况下,没有办法使用时间来衡量一个算法的。
由于代码行数和一个程序执行的时间成正比,所以,我们就粗略得使用基本代码行与时间构建起一个对应关系式,该关系式就是时间复杂度。
在这里插入图片描述

常见的时间复杂度

在这里插入图片描述

排序算法

冒泡排序(改良版)

之前的冒泡排序在排序的过程中就可能已经排序完成了,剩下的时候还在进行无意义的遍历,此时我们添加一个标志flag来检测每次遍历时,是否发生了交换变量这个过程,如果有一次变量完全没有进行交换变量,说明这个数组已经完成了排序,后面的过程就无需进行了。

//冒泡排序
void buble_sort(int *arr, int len)
{for(int i = 1; i < len; i++){int flag = 0;  		//标记是否进行变量交换for(int j = 0; j < len-i; j++){if(arr[j] > arr[j+1]){flag = 1; 	//标志位置1//交换变量int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}//每一趟比较结束后,判断是否进行过变量交换if(0 == flag){break;	 		//提前结束冒泡排序}}printf("排序成功\n");
}

选择排序(O(n^2))

就是不断从待排序序列中选择最大值(小值),放入到已排序序列中

void select_sort(int *arr, int n)
{for(int i = 0; i < n; i++){int mini = i; 	//将待排序列的第1个元素当做最小值//遍历待排序列for(int j = i; j < n; j++){if(arr[mini] > arr[j]){mini = j; 		//更新下标}}//检查最值是否发生变化if(i != mini){//交换变量int temp = arr[i];arr[i] = arr[mini];arr[mini] = temp;}}printf("排序成功\n");
}

直接插入排序(O(n^2))

不断的取出待排序列的第一个元素,然后在已排序列中寻找合适的位置插入

void insert_sort(int *arr, int len)
{int i,j;		//循环变量for(i = 1; i < len; i++){//备份待处理数据temp = arr[i];//遍历已排序列for(j = i-1; j > 0 && temp <= arr[j]; j--){arr[j+1] = arr[j]; 		//当前元素后移}//将备份数据填入j+1的位置arr[j+1];}printf("排序成功\n");
}	

快速排序

设定一个基准,将大于和小于的基准分别放在这个数据的两边,然后在对已经分区的地方重复这个操作,当分区只有一个数据时就排列完成。

void quick_sort(int *arr, int low, int high);
int  quick_part(int *arr, int low, int high);void quick_sort(int *arr, int low, int high)
{//递归出口if(low >= high || low < 0 || high < 0){return;}//进行一次快排,并存储中点的值int mid = quick_part(arr,low,high);//对剩下的分区进行快排quick_sort(arr, low, mid-1);quick_sort(arr, mid+1, high);
}//单次快排
void quick_part(int *arr, int low, int high)
{//设定基准int x = arr[low];//循环条件,低位下标必须小于高位下标while(low < high){//每次移动完都检查下标,当前标记的数值若大于基准则检查下一个while(arr[high] > x && low < high){high--;}//小于则进行交换arr[low] = arr[high];//每次移动完都检查下标,当前标记值若小于基准值则检查下一个while(arr[low] < x && low < high){low++;}//若大于则进行交换arr[high] = arr[low];}//将基准值填入中间位置arr[low] = x;//返回基准的位置,以便后递归使用return low;
}

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

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

相关文章

百度网盘qzxing-master.zip

qzxing 这是一个针对 ZXing 条形码图像处理库的 Qt/QML 封装库。 支持以下类型的条形码解码&#xff1a; UPC-AUPC-EEAN-8EAN-13ITFCode 39Code 93Code 128&#xff08;GS1&#xff09;Codabar二维码数据矩阵Aztec&#xff08;测试版&#xff09;PDF 417 支持以下类型的条形…

Ping32与天锐绿盾加密软件对比:哪款防泄密软件适合您的企业?

企业数据泄漏事故层出不穷&#xff0c;为了有效防止机密信息的泄露&#xff0c;选择一款合适的防泄密软件显得尤为重要。Ping32和天锐绿盾加密软件都是市场上比较受欢迎的防泄密工具&#xff0c;那么它们各自的优势和差异是什么呢&#xff1f;让我们一起来了解。 1. 安全性&…

PDF拆分之怎么对批量的PDF文件进行分割-免费PDF编辑工具分享

>>更多PDF文件处理应用技巧请前往 96缔盟PDF处理器 主页 查阅&#xff01; ——————————————————————————————————————— 当然了&#xff0c;单个文件或者其他任意的文件个数的拆分也是支持的&#xff01; 序言 我之前的文章也有…

简易url解码器(定义python单行函数工具)

被%编码的url如同天书&#xff0c;自拟一个单行函数解析还原&#xff0c;方便相认。 (笔记模板由python脚本于2024年12月05日 15:14:17创建&#xff0c;本篇笔记适合学习Url的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&…

JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)

前言 我们想要部署一个javaWeb项目到tomcat上&#xff0c;需要了解一些概念 什么是tomcat&#xff1f; Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;下的一个开源项目&#xff0c;主要用于实现 Java Servlet、JavaServer Pages&#xff08;…

【笔记2-5】ESP32:freertos消息队列

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

亚马逊云科技大语言模型加速OCR应用场景发展

目录 前言Amazon Bedrock关于OCR解决方案Amazon Bedrock进行OCR关键信息提取方案注册亚马逊账号API调用环境搭建 总结 前言 大语言模型是一种基于神经网络的自然语言处理技术&#xff0c;它能够学习和预测自然语言文本中的规律和模式&#xff0c;可以理解和生成自然语言的人工…

贪心算法 part03

文章参考来源代码随想录 134. 加油站 方法一分类讨论&#xff1a; 情况一&#xff1a;如果gas的总和小于cost总和&#xff0c;那么无论从哪里出发&#xff0c;一定是跑不了一圈的 情况二&#xff1a;rest[i] gas[i]-cost[i]为一天剩下的油&#xff0c;i从0开始计算累加到最…

【JAVA练习】力扣860.柠檬水找零

题目&#xff1a; 解题思路&#xff1a; 可能面临3种面额&#xff0c; 5美元&#xff0c;不找还&#xff0c;5美元钞票数量加110美元&#xff0c;找还5美元&#xff0c;5美元钞票数量减1&#xff0c;10美元钞票加120美元&#xff0c;找还15美元&#xff0c;分为一张10美元 一…

Telnet不安全?如何配置使用更安全的STelnet远程登录华为AR1000V路由器?

在上一篇文章中&#xff0c;我们介绍了如何配置一台全新的AR1000V&#xff0c;来实现通过Telnet远程登录设备&#xff08;如何配置使用Telnet远程登录华为AR1000V路由器&#xff1f;&#xff09;。其实&#xff0c;在之前的文章中&#xff0c;我们已经介绍过Telnet是一种不安全…

UE----Ios打包笔记

UE 打包 IOS 软件 1.前期准备 1.1. 首先我们需要 一台装有Xcode 的MAC笔记本&#xff08;知道开机密码 最好是空的笔记本 剩余内存要大 &#xff09; 1.2. 一台IOS手机 1.3. 一个申请了开发者账户的 Apple ID (苹果账号) 知晓账号与密码最好 因为很麻烦 1.4. UE 需要 的 兼…

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

windows10电脑缺少dll文件的解决方案,系统缺少dll修复指南

在使用Windows 10操作系统时&#xff0c;有时会遇到由于缺少某些动态链接库&#xff08;Dynamic Link Library, 简称DLL&#xff09;文件而导致程序无法正常运行的问题。本指南将介绍几种解决此类问题的方法。 什么是DLL文件&#xff1f; DLL文件是Windows系统中的一种特殊类型…

并发编程(15)——基于同步方式的线程安全的栈和队列

文章目录 十四、day141. 线程安全的栈1.1 存在隐患的栈容器1.2 优化后的栈容器 2. 线程安全的队列2.1 基于智能指针的线程安全的队列2.2 不同互斥量管理队首、队尾的队列 十四、day14 在并发编程&#xff08;1&#xff09;并发编程&#xff08;5&#xff09;中&#xff0c;我们…

装箱问题的三种解法

有一个箱子容量为V&#xff08;正整数&#xff0c;0≤v≤20000&#xff09;&#xff0c;同时有n个物品&#xff08;0< n ≤30&#xff09;&#xff0c;每个物品有一个体积&#xff08;正整数&#xff09;。 要求n个物品中&#xff0c;任取若干个装入箱内&#xff0c;使箱子的…

万物可爬(以爬取浏览器井盖图片为例)

我们以爬取 井盖图片 这个链接中的图片为例&#xff1a; 点击F12 并选中其中一张图片 &#xff0c;得到它的信息。具体如下&#xff1a;我们可以编写对应的正则表达式&#xff1a; <img[^>]*src"(.*?)"[^>]*alt"井盖图片 的图像结果"[^>]*&g…

【AI系统】轻量级CNN模型新进展

CNN 模型小型化&#xff08;下&#xff09; 在本文会接着介绍 CNN 模型的小型化&#xff0c;除了第二篇文章提到的三个模型外&#xff0c;在本章节会继续介绍 ESPNet 系列&#xff0c;FBNet 系列&#xff0c;EfficientNet 系列和 GhostNet 系列。 ESPNet 系列 ESPNetV1 ESP…

Day06:缓存持久化

缓存持久化 redis做为缓存&#xff0c;数据的持久化是怎么做的&#xff1f; 在Redis中提供了两种数据持久化的方式&#xff1a;1、RDB 2、AOF 方式一&#xff1a;RDB RDB(Redis Database Backup file)&#xff0c;redis数据备份文件&#xff0c;也叫Redis数据快照&#xff…

msvcr100.dll 文件缺失要怎么解决?msvcr100.dll的多少修复方法分析

面对 msvcr100.dll 文件缺失引发的应用程序运行问题&#xff0c;实际上解决方案并不复杂。本文将提供几种直接有效的修复方法&#xff0c;帮助你迅速恢复文件完整性&#xff0c;确保应用程序能够顺利运行&#xff0c;从而轻松克服这一技术障碍。 一.msvcr100.dll主要特性和功能…

【机器学习】机器学习的基本分类-监督学习-梯度提升树(Gradient Boosting Decision Tree, GBDT)

梯度提升树是一种基于**梯度提升&#xff08;Gradient Boosting&#xff09;**框架的机器学习算法&#xff0c;通过构建多个决策树并利用每棵树拟合前一棵树的残差来逐步优化模型。 1. 核心思想 Boosting&#xff1a;通过逐步调整模型&#xff0c;使后续的模型重点学习前一阶段…