嵌入式入门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.mzph.cn/web/62039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…

3-5 C常用的字符串库函数

1.0 字符串库函数 strlen()函数用于返回字符串的长度&#xff0c;不包括结尾\0 uint32_t strlen(char *str) {uint32_t len 0;while (str[len] ! \0){len;}return len; } 编译器在处理字符串时&#xff0c;会自动的在数据末尾添加ASCI码“0对应十进制0&#xff0c;便于程序对…

weblogic开启https

JSK证书生成 生成密钥库和证书 使用Java的keytool命令来生成一个Java密钥库&#xff08;Keystore&#xff09;和证书。keytool是Java开发工具包&#xff08;JDK&#xff09;中用于管理密钥库和证书的命令行工具。 #创建证书存放目录 [weblogicosb1 jksHL]$ mkdir -p /home/w…

11.14【JAVA EXP3】【DEBUG】

比较疑惑的一点是当前页面&#xff08;资源的url)与请求的url? 请求的url由webService接收&#xff0c;servelt当中也可以发送出这个url 进行页面跳转&#xff0c;是跳转到某个Jsp页面&#xff0c;这个页面的url是在哪里定义的&#xff1f; 在Jsp打印信息&#xff0c;这个报…

陈若尧新歌《一来二去》陆续登陆全球音乐平台

由青年演员&#xff0c;歌手陈若尧带来的全新创作单曲《一来二去》由索尼音乐发行&#xff0c;于2024年11月18日陆续全球上线。这也是陈若尧与索尼音乐合作的第一首单曲。探索古典风格与流行音乐的新结合。歌曲上线不久,就因优美抒情的动人旋律&#xff0c;诗意而意味深远的歌词…

Jenkins凭据管理及使用详解

简介:Jenkins凭据管理是指对Jenkins中存储的敏感信息进行管理的功能,这些信息通常用于认证和授权,以确保Jenkins能够安全地与其他系统和服务进行交互。以下是关于Jenkins凭据管理添加及作用的详细介绍: 一、Jenkins凭据管理的添加 进入凭据管理页面: 登录Jenkins后,点击…

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两…

深入浅出:PHP中的正则表达式全解析

深入浅出&#xff1a;PHP中的正则表达式全解析 引言 在编程的世界里&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称regex&#xff09;是一种强大的工具&#xff0c;用于描述文本模式&#xff0c;并对字符串进行搜索、验证和替换等操作。本文将带你深…

AcWing 94. 递归实现排列型枚举

文章目录 前言代码思路 前言 差点忘记写题了&#xff0c;最近把手机上面的 csdn 卸载了&#xff0c;自己总喜欢做一些无病呻吟&#xff0c;没啥意思&#xff0c;一个男人就应该努力追求事业&#xff0c;要么死在罗马&#xff0c;要么死在路上。无病呻吟算啥呢。现在敲代码还是…

YOLOv10改进,YOLOv10添加CARAFE轻量级通用上采样算子,可提高目标检测性能

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…

leetcode每日一题(20241205)

leetcode每日一题&#xff08;20241205&#xff09;: 20241204的困难题还没搞明白。。然后今天还加班了回来晚&#xff0c;明天抽空补上 3001.捕获黑皇后需要的最少移动次数 题目描述&#xff1a; 现有一个下标从 1 开始的 8 x 8 棋盘&#xff0c;上面有 3 枚棋子。 给你 6 个…

WPF+MVVM案例实战与特效(三十四)- 日志管理:使用 log4net 实现高效日志记录

文章目录 1、概述2、日志案例实现1、LogHelper 类详解2、代码解释3、配置文件4、实际应用案例场景 1:记录系统运行日志场景 2:记录数据库操作日志场景 3:记录 HTTP 请求日志5、总结1、概述 在WPF软件开发中,良好的日志记录机制对于系统的调试、维护和性能优化至关重要。lo…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

如何通过零代码平台搭建工程企业劳务管理系统?

通过零代码平台搭建工程企业劳务管理系统&#xff0c;可以快速实现灵活定制的管理流程&#xff0c;同时降低开发成本和时间投入。以下是具体步骤和功能模块的搭建方法&#xff1a; 1. 需求分析与模块设计 目标&#xff1a;明确劳务管理的核心需求&#xff0c;设计系统的主要功…

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

elasticSearch(一):elasticSearch介绍

一、搜索引擎 搜索引擎的核心目的是帮助用户以最小的成本才海量数据中找到最想要的结果。糟糕的搜索引擎往往会所问非所答&#xff0c;用户查了半天也得不到自己想要的&#xff0c;好的搜索引擎往往第一页就是用户最想要的结果。而目前判断搜索引擎好坏一般是从召回率、精确率…

深度相机获取实时图像总结

问题详情&#xff1a;之前一直把曝光调整到50000&#xff0c;画面一直很流畅&#xff0c;知道领导要求将曝光改成500000时整个程序卡死了 问题解决&#xff1a; 首先怀疑是帧率太低的原因&#xff0c;控制变量后发现不是帧率的问题&#xff0c;看着代码很迷茫&#xff0c;领导…

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中&#xff0c;系统分析员可以用序列图来表达&#xff0c;系统内部一群对象合力完成某一个系统用例时&#xff0c;执行期间的交互情形。之后&#xff0c;序列图可能通过设计…

关于线扫相机的使用和注意事项

引言 线扫相机作为工业视觉系统中的核心设备之一&#xff0c;以其高分辨率和高速成像的特点被广泛应用于印刷质量检测、电子元件检测、纺织品缺陷检测等领域。本文从线扫相机的基本原理出发&#xff0c;探讨其使用方法&#xff0c;并总结在实际应用中的注意事项&#xff0c;为…