数据结构-----初始数据结构、及GDB调试

一、数据结构核心概念

相互之间存在一种或多种特定关系的数据元素的集合。

1. 数据结构定义
// 嵌入式场景示例:传感器网络节点结构
struct SensorNode {uint16_t node_id;     // 2字节float temperature;    // 4字节uint32_t timestamp;    // 4字节struct SensorNode *next; // 指针(4/8字节)
}; // 总大小:14-18字节(需内存对齐)
  • 核心作用:在有限内存中高效组织传感器数据

二、数据结构分类体系

1. 逻辑结构
类型特点嵌入式应用场景
线性一对一关系串口数据缓冲队列
树型一对多关系文件系统目录结构
图状多对多关系物联网设备拓扑关系
集合无特殊关系寄存器位操作
2. 物理结构
类型特点嵌入式适用场景
顺序连续内存存储实时数据采集缓冲区
链式指针链接存储动态任务调度列表

三、嵌入式开发核心数据结构

1. 线性结构
// 循环缓冲区实现(无动态内存分配)
#define BUF_SIZE 128
typedef struct {uint8_t data[BUF_SIZE];uint16_t head;uint16_t tail;
} CircularBuffer;void buf_push(CircularBuffer *cb, uint8_t val) {cb->data[cb->head] = val;cb->head = (cb->head + 1) % BUF_SIZE;
}
2. 树形结构
// 平衡二叉树节点(用于快速查找)
typedef struct TreeNode {int key;void *data;struct TreeNode *left;struct TreeNode *right;uint8_t height; // AVL树高度
} TreeNode;
3. 图结构
// 稀疏图邻接表表示(适用于低功耗设备)
typedef struct EdgeNode {uint16_t dest;uint16_t weight;struct EdgeNode *next;
} EdgeNode;typedef struct {EdgeNode **adjList;uint16_t numNodes;
} Graph;

四、算法设计与分析

算法:
是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。

1. 算法特性验证表
特性验证方法嵌入式特殊要求
有穷性最大执行周期分析满足硬实时截止期
确定性单元测试覆盖所有条件分支处理硬件异常分支
可行性指令周期计算避免浮点运算(无FPU设备)
高效性最坏情况时间复杂度分析限制栈深度防止溢出
2. 嵌入式算法设计原则
// 内存优化示例:位域使用
typedef struct {uint8_t led_state : 1;   // 1位uint8_t fan_speed : 3;   // 3位uint8_t reserved  : 4;    // 4位
} DeviceStatus; // 总大小1字节

五、时间复杂度核心概念

1. 定义

算法时间复杂度用于描述算法运行时间与输入数据规模(n)之间的增长关系,反映算法的效率。

2. 大O表示法规则
步骤操作说明示例转换
1用1取代所有加法常数项T(n)=3n+5 → T(n)=3n+1
2保留最高阶项T(n)=3n²+2n+1 → 3n²
3去除最高阶项的系数3n² → O(n²)

六、常见时间复杂度类型

1. 复杂度等级对比
类型数学表示典型算法嵌入式场景示例
常数时间O(1)数组索引访问寄存器读写操作
对数时间O(log n)二分查找平衡传感器数据查询
线性时间O(n)遍历数组串口数据帧解析
线性对数时间O(n log n)快速排序大数据量排序(慎用)
平方时间O(n²)冒泡排序小规模数据排序
指数时间O(2ⁿ)穷举算法密码破解(避免使用)

七、时间复杂度推导实战

1. 基础案例推导
// 案例1:单循环结构
void func1(int n) {for(int i=0; i<n; i++) {  // 执行n次printf("%d\n", i);    // O(1)操作}
}

分析

  • 总操作次数 T(n) = n × 1 = n
  • 时间复杂度:O(n)
// 案例2:嵌套循环结构
void func2(int n) {for(int i=0; i<n; i++) {        // n次循环for(int j=0; j<n; j++) {    // n次循环printf("%d,%d\n",i,j);  // O(1)操作}}
}

分析

  • T(n) = n × n × 1 = n²
  • 时间复杂度:O(n²)

2. 复合结构推导
// 案例3:混合复杂度结构
void func3(int n) {// 第一部分:O(n)for(int i=0; i<2n; i++) { // O(1)操作}// 第二部分:O(log n)int k=1;while(k < n) {k *= 2;  // 每次循环规模减半}// 第三部分:O(1)printf("Done");
}

分析

  • T(n) = 2n + log₂n + 1
  • 应用规则:
    1. 替换常数项 → 2n + log₂n + 1
    2. 保留最高阶项 → 2n
    3. 去除系数 → n
  • 最终时间复杂度:O(n)

3. 递归算法推导
// 案例4:二分递归
int fibonacci(int n) {if(n <= 1) return n;return fibonacci(n-1) + fibonacci(n-2);
}

分析

  • 递归树深度为n,每层产生2ⁿ个节点
  • T(n) ≈ 2ⁿ
  • 时间复杂度:O(2ⁿ)

八、特殊场景处理技巧

1. 最坏/平均情况分析
// 快速排序时间复杂度分析
void quick_sort(int arr[], int low, int high) {if(low < high) {int pi = partition(arr, low, high);  // O(n)quick_sort(arr, low, pi-1);          // 递归左半部quick_sort(arr, pi+1, high);         // 递归右半部}
}
  • 最坏情况(已排序数组):O(n²)
  • 平均情况:O(n log n)
2. 均摊分析
// 动态数组扩容操作
typedef struct {int *data;int size;int capacity;
} DynamicArray;void push_back(DynamicArray *da, int val) {if(da->size == da->capacity) {// 扩容操作 O(n)da->capacity *= 2;int *new_data = realloc(da->data, da->capacity*sizeof(int));da->data = new_data;}da->data[da->size++] = val;  // O(1)
}
  • 单次扩容成本O(n),但均摊到n次操作为O(1)

九、嵌入式开发优化策略

1. 时间复杂度与内存权衡
算法选择时间效率内存消耗适用场景
快速排序O(n log n)O(log n)内存充足的排序需求
插入排序O(n²)O(1)小规模数据排序
计数排序O(n+k)O(k)已知数值范围的整数排序
2. 实时系统注意事项
  • 避免不可预测的递归深度
  • 限制动态内存分配
  • 优先选择确定性算法

十、复杂度速查表

代码模式时间复杂度示例
单层循环O(n)for(i=0; i<n; i++)
双层嵌套循环O(n²)冒泡排序
循环变量指数增长O(log n)while(i<n) i*=2
分治算法(二分)O(n log n)归并排序
全排列组合O(n!)旅行商问题穷举解法

十一、GDB调试环境准备

1. 编译选项
# 基础调试编译 (生成符号表)
gcc -g main.c -o app# 多线程程序调试
gcc -g -lpthread thread_demo.c -o thread_app# 显示完整字符串内容(默认截断300字符)
(gdb) set print elements 0
2. 启动调试
# 常规启动
gdb ./app# 核心转储分析
gdb ./app core.dump

十二、核心调试流程

1. 基础调试流程
(gdb) break main        # 主函数入口断点
(gdb) run               # 启动程序执行
(gdb) next              # 单步步过
(gdb) step              # 单步步入
(gdb) continue          # 继续执行到下一个断点
2. 断点管理
命令功能说明
break fun.c:36在fun.c第36行设置断点
break MyClass::method类方法断点
info breakpoints查看所有断点
disable 2禁用2号断点
ignore 1 5忽略1号断点前5次触发

十三、内存错误调试技巧

1. 段错误(Segmentation Fault)排查
# 复现错误
(gdb) run
Program received signal SIGSEGV, Segmentation fault.# 定位错误位置
(gdb) where
#0  0x0804894f in viewMediaList (path=0xbfff0ca "/home/linux") at fun.c:36
#1  0x0804878b in main () at main.c:33# 检查关键变量
(gdb) frame 0            # 切换到出错栈帧
(gdb) print path         # 查看路径指针
(gdb) x/10x path         # 检查内存内容
2. 内存诊断命令
(gdb) info registers     # 查看寄存器状态
(gdb) x/20wx \(  esp        # 查看栈内存
(gdb) watch *0x0804a000  # 设置内存监视点
(gdb) backtrace full     # 显示完整堆栈信息

十四、高级调试技巧

1. 多线程调试
(gdb) info threads       # 显示所有线程
(gdb) thread 3           # 切换到3号线程
(gdb) break thr_func thread 2  # 特定线程断点
2. 条件断点
(gdb) break fun.c:50 if count > 100
(gdb) condition 3 buffer != NULL
3. 数据可视化
(gdb) print *array@10     # 打印数组前10元素
(gdb) set print pretty on # 结构化显示
(gdb) display var         # 持续监控变量

十五、典型调试场景示例

1. 缓冲区溢出检测
(gdb) break strcpy
(gdb) commands
> print (char*)dest
> print (char*)src
> continue
end
2. 死锁定位
(gdb) info threads
(gdb) thread apply all backtrace
(gdb) p mutex1->__data.__lock
3. 内存泄漏排查
(gdb) break malloc
(gdb) commands
> set   \)ptr = (void*)\(  rax
> printf "Allocated %p\n",   \)ptr
> continue
end(gdb) break free
(gdb) commands
> printf "Freed %p\n", (void*)\(  rdi
> continue
end

十六、调试流程总结

  1. 复现问题:使用run触发错误
  2. 定位现场where查看调用栈
  3. 分析上下文frame切换栈帧,info locals查看局部变量
  4. 诊断内存x命令检查内存,watch设置监视点
  5. 修正验证:修改代码后重新编译测试
  6. 预防措施:添加断言和内存检查

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

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

相关文章

HOT100(1)

目前想到的办法是暴力枚举&#xff0c;有什么更好的办法请多指教。。。。代码如下&#xff1a; 让数组第一个元素和后面的元素相加判断是否相等&#xff0c;让数组第二个元素与后面的元素相加判断是否相等&#xff0c;以此类推 /** * Note: The returned array must be mallo…

QuickAPI 和 DBAPI 谁更香?SQL生成API工具的硬核对比(一)

最近低代码开发火得不行&#xff0c;尤其是能把数据库秒变API的工具&#xff0c;简直是开发者的救星。今天咱就聊聊两款国内玩家&#xff1a;QuickAPI&#xff08;麦聪软件搞出来的低代码神器&#xff09;和 DBAPI&#xff08;开源社区的硬核作品&#xff09;。这两货都能靠SQL…

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

开启云服务器ubuntu22.04的远程桌面,支持Windows远程连接 - 开启XRDP支持

效果图 环境 云服务器 Ubuntu 22.04 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy 本地windows10 步骤 前置动作 # 远程登录 ssh rootx.x.x.x# 看看硬盘够不够空间&…

虚拟化数据恢复—重装系统服务器崩了的数据恢复过程

虚拟化数据恢复环境&故障&#xff1a; VMware虚拟化平台 vmfs文件系统 工作人员误操作重装操作系统&#xff0c;服务器崩溃。 重装系统会导致文件系统元文件被覆盖。要恢复数据&#xff0c;必须找到&提取重装系统前的文件系统残留信息&#xff0c;通过提取出来的元文件…

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…

AI智能混剪工具:AnKo打造高效创作的利器!

AI智能混剪工具&#xff1a;AnKo打造高效创作的利器&#xff01; 随着AI技术的迅速发展&#xff0c;AI智能混剪工具逐渐成为内容创作的利器&#xff0c;尤其是AnKo&#xff0c;作为一款免费的AI创作平台&#xff0c;提供了多模型AI聚合工具平台&#xff0c;能为用户带来更高效…

【Hestia Project 数据集】美国化石燃料 CO₂ 排放数据

Hestia Project™ 是一个革命性的研究项目,旨在帮助城市更精确地量化和管理与气候变化相关的碳排放问题。该项目提供了细粒度(建筑、街道、工厂级别)的化石燃料 CO₂ 排放数据,并通过直观的三维可视化系统向公众、政策制定者、科学家和工业界提供详细的时空信息,支持碳管理…

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

传感云揭秘:边缘计算的革新力量

在当今快速发展的科技时代&#xff0c;传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体&#xff0c;通过虚拟化技术将物理节点转化为多个服务节点&#xff0c;为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…

Springboot中的 Mapper 无法找到的 可能原因及解决方案

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 问题所示 执行代码的时候,出现如下问题: A component required a bean of type cn.iocoder.yudao.module.gate.dal.mysql.logger.GateOperateLogMap…

【c++】开发环境IDE、常见调试方法(gdb等)、基础c++语法特性、算法OJ刷题、入门c++项目【持续更新】

1 开发环境&IDE 基本就是如下3款,个人使用体验&#xff1a; vscode&#xff1a;优点-轻量化&#xff0c;插件多&#xff0c;便于远程调试&#xff0c;缺点-配置复杂 clion&#xff1a;优点-集成环境&#xff0c;最易于上手&#xff0c;缺点-商业软件&#xff0c;收费 visu…

Leetcode做题记录----3

1474、删除链表M个节点之后的N个节点 思路&#xff1a; 1、两个循环解决问题 第一个循环移动M个位置&#xff0c;第二个循环确定移动N个位置后的&#xff0c;然后将M位置的节点的next指向&#xff0c;N位置后的节点即可 2、注意边界条件和判空处理 代码实现&#xff1a; pub…

pytorch快速入门——手写数字分类GPU加速

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; pytorch快速入门——手写数字分类GPU加速 一、tensor1&#…

阿里wan2.1本地部署

1.安装虚拟环境&#xff0c; a) 安装python-3.11.8 b)在本地目录运行 - python -m venv Wan2.1-env - cd Scripts - activate 2.下载代码 git clone https://github.com/Wan-Video/Wan2.1.git cd Wan2.1 3.安装依赖库 pip install torch torchvision --index-url https://…

HTTPS建立连接过程

一、混合加密 通过混合加密的方式可以保证信息的机密性&#xff0c;解决了窃听的风险。 HTTPS采用的是对称加密和非对称加密结合的混合加密方式&#xff1a; &#xff08;1&#xff09; 在通信建立前采用非对称加密的方式交换会话密钥&#xff0c;后续就不再使用非对称加密。 &…

Leetcode-2272. Substring With Largest Variance [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-2272. Substring With Largest Variancehttps://leetcode.com/problems/substring-with-largest-variance/description/2272. 最大波动的子字符串 - 力扣&#xff08;LeetCode&#xff09;2272. 最大波动的子字符串…

蓝桥杯备赛 Day0_移动零

&#x1f388; 个人主页&#x1f449;&#xff1a;tbRNA-CSDN博客tbRNA-CSDN博客tbRNA-CSDN博客 &#x1f4af; 个人简介&#xff1a;在校大学生一枚&#x1f48b;. &#x1f60d; 希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;感谢大家的多多支持…

EDAS:投稿经验-word版本-问题解决

1. 字体不对&#xff0c;字体未嵌入问题 问题&#xff1a;word转PDF后&#xff0c;总是显示有字体格式不对&#xff08;忘记截图了&#xff09;。 办法&#xff1a;1. EDAS投稿PDF格式问题-CSDN博客-PDF上修改 IEEE论文检测的字体未嵌入问题Times New Ro…

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手&#xff08;Three-way Handshake&#xff09;与四次挥手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次挥手&#xff08;Four-way Wave&#xff09;三、常见问题解答总结为什么三次握手不…