我以为我学懂了数据结构,直到看了这个导图才发现,我错了

文章目录

一个人对人民的服务不一定要站在大会上讲演或是做什么惊天动地的大事业,随时随地,点点滴滴地把自己知道的想到的告诉人家,无形中就是替国家播种垦植。 —— 傅雷

本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。

https://github.com/midou-tech/articles

点关注,不迷路❤️❤️❤️

 下面的数据结构知识点都掌握了,那说明你复习的很不错了。图片看不清可以加我微信,给你私发pdf文件。(偷偷告诉你,微信搜索 龙跃十二 关注公众号,点击联系作者即可获得作者微信)

 今天翻消息,才发现粉丝想要一篇数据结构的总结,好东西当然是要分享出来的啦。

 因为疫情,在家远程办公一段时间了。远程办公,那叫一个酸爽,以前还有上下班时间,现在好了,远程之后时刻在线。不过总算结束了远程办公时间,我来到杭州公司上班了。这不,赶紧马不停蹄的赶点东西出来,数据结构与算法知识点思维导图。

 不要小看这张导图(这可是武功秘籍,秘籍已经有了,好好练,神功指日可待),只要你跟着这个导图去复习数据结构与算法,里面的知识点都搞透彻,面试数据结构问题基本难不倒你了。这么好的东西都送了,那还说什么,赶紧关注走一波,微信搜索 龙跃十二 即可无忧订阅。

 数据结构与算法的重要性,我必须强调一波。不管你学什么编程语言,不管你从事前端、后台、算法、数据挖掘、机器学习、人工智能等岗位,数据结构与算法都是绕不过去的。语言无关性,岗位无关性。数据结构与算法在面试中也是频频出现,基本一场面试有50%以上的时间再问这方面的内容。就这,你还敢不学好数据结构与算法么?

 下面是导图的目录结构。

数据结构与算法

基本概念&术语

数据&数据元素&数据项&数据对象

逻辑结构&存储结构

  • 逻辑结构

  • 线性结构

    • 线性表

    • 一般线性表

      • 线性表
    • 特殊线性表

      • 栈和队列
      • 字符串
    • 线性表的推广

      • 数组
      • 广义表
  • 非线性结构

    • 树结构

    • 二叉树

    • 图结构

    • 有向图

    • 无向图

  • 存储结构

  • 顺序存储结构

  • 链式存储结构

数据类型&抽象数据类型

算法&算法分析

  • 算法是为了解决某类问题而规定的一个有限长的操作序列

  • 算法特性

  • 有穷性

  • 确定性

  • 可行性

  • 有效的输入

  • 算法输出

  • 评价算法优劣

  • 正确性

  • 可读性

  • 健壮性

  • 高效性

  • 算法效率分析

  • 算法的时间复杂度

  • 算法的空间复杂度

线性结构

线性表

  • 顺序表示

  • 顺序表:逻辑&物理 次序上均相邻

  • 链式表示

  • 单链表

  • 双链表

  • 循环链表

  • 链表和顺序表的比较

  • 空间维度比较

  • 时间维度比较

  • 链表和顺序表的面试笔试题

  • 线性表的推广

  • 数组

  • 广义表

  • 栈的定义&特性

  • 后入先出

  • 栈的表示&常用操作

  • 顺序栈&链式栈

  • 入栈&出栈

  • 栈与递归

  • 栈的应用

队列

  • 队列的定义&特性

  • 先入先出

  • 队列的表示&常用操作

  • 循环队列&链式队列

  • 出队&入队

  • 队列的应用

  • 串的概念

  • 串的结构

  • 顺序存储

  • 链式存储

  • 串的匹配算法

  • BF算法

  • KMP算法

非线性结构

  • 树的基本概念

  • 二叉树

  • 性质&存储结构

  • 二叉树的遍历

  • 线性二叉树

  • 二叉树的建立

  • 哈弗曼树

  • 基本概念

  • 构造算法

  • 哈夫曼编码

  • AVL树

  • B树

  • 概念

  • 存储结构

  • 邻接表

  • 邻接矩阵

  • 十字链表

  • 邻接多重表

  • 边集数组

  • 遍历

  • 深度优先遍历

  • 广度优先遍历

  • 应用

  • 最小生成树

  • 最短路径

  • 拓扑排序

  • 关键路径

高级数据结构

自顶向下的伸展树

红黑树

  • 插入

  • 插入时的旋转经常考

  • 删除

确定性跳跃表

AA树

treap树

k-d树

配对堆

算法

查找

  • 概念

  • 线性表查找

  • 顺序查找

  • 二分查找

  • 分块查找

  • 树形查找

  • 二叉树查找

  • AVL树查找

  • B-树

  • B+树

  • 哈希查找

  • 概念

  • 冲突解决

排序

  • 概念
  • 冒泡排序
  • 选择排序
  • 插入排序
  • 希尔排序
  • 堆排序
  • 归并排序
  • 快速排序
  • 基数排序
  • 桶式排序
  • 大型数据结构的排序
  • 外部排序(非内存的方式排序)

图论算法

贪婪算法

分治算法

动态规划

随机化算法

回溯算法

 这里面的知识点,基本都写过博客。我在刚开始学习数据结构的时候都在CSDN上写过相应的博客,不过现在看过去写的博客实在太有学生气了。所以如果你是正在学习数据结构与算法的相关知识点或者复习可以去看博客文章,百度搜索 龙跃十二 即可找到我的文章。

 今天先把总结导图和导图的目录放上,接下来会陆续更新里面重要的知识点。关注我,重要知识不错过。

<think>好的,用户之前问了一个关于STM32串口DMA的问题,我解释了问题原因并给出了解决方案,其中用到了Size参数。现在用户说“Size这个参数我没定义耶”,这让我需要仔细回顾之前的对话。 首先,用户提供的代码中,RxEventCallback函数的参数确实有Size,这个参数是由HAL库在接收到数据时自动传入的。用户可能误解了这个参数的来源,以为需要自己定义,但实际上它是函数回调的一部分。 我需要检查之前的回复是否正确解释了这一点。之前我提到使用Size参数来设置发送长度,但没有明确说明这个参数是由库自动提供的,用户可能因此产生困惑。用户可能没有意识到Size是由HAL库管理的,不需要自己声明,致他们认为自己未定义该参数。 接下来,用户的问题显示他们对函数参数的作用域和来源不太清楚,需要进一步解释。我应该详细说明RxEventCallback函数的参数传递机制,强调Size是HAL库在触发回调时自动计算的接收数据长度,用户无需手动定义。 此外,用户可能在代码中直接复制了示例,但实际使用中没有看到Size的定义,从而产生疑问。需要指出Size是函数形参,由库填充,用户只需在回调中使用即可,不需要在全局或局部定义。 还要检查用户提供的代码是否有其他潜在问题,比如是否启用了IDLE中断,是否正确配置了DMA等,但当前问题集中在Size参数上,应优先解决这个疑问。 最后,可能需要提醒用户在使用Size时要注意其有效性,例如检查接收是否成功,或者在发送前处理数据,避免越界访问。同时,确保他们正确实现了回调函数的注册,因为如果函数没有被正确关联,Size可能不会被正确传递。</think>这个问题的关键在于理解HAL库的`RxEventCallback`工作机制。以下是详细分析: $$回调函数参数来源$$ 1. **自动传递机制**: - `Size`参数是HAL库在触发`RxEventCallback`时自动计算并传入的 - 该参数示实际接收到的数据长度(单位:字节) - 由DMA控制器自动更新,不需要用户手动定义 2. **函数原型定义**: ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) ``` 这是HAL库的标准回调函数声明,第二个参数由库自动填充 $$常见误解分析$$ 1. **参数作用域问题**: - `Size`是回调函数的形参,仅在回调函数内部有效 - 不需要在全局或文件作用域定义 2. **实际应用示例**: ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { // 可直接使用Size参数 char msg[32]; sprintf(msg, "Received %d bytes", Size); // 正确用法 HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100); } ``` $$硬件层原理$$ 1. **DMA传输计数器**: - 当使用`HAL_UARTEx_ReceiveToIdle_DMA()`时,DMA的CNDTR寄存器会自动递减 - `Size = RX_MAX - __HAL_DMA_GET_COUNTER(huart->hdmarx)` 2. **IDLE检测流程**: ```mermaid graph TD A[UART开始接收] --> B{DMA传输中} B -->|检测到IDLE中断| C[停止DMA] C --> D[计算实际接收长度Size] D --> E[触发RxEventCallback] ``` $$验证方法$$ 1. **添加调试输出**: ```c printf("Actual received size: %hu\n", Size); // 需重定向printf ``` 2. **查看寄存器状态**: ```c uint32_t counter = __HAL_DMA_GET_COUNTER(huart->hdmarx); ``` $$注意事项$$ 1. **CubeMX配置要求**: - 必须启用UART全局中断 - DMA通道需配置为循环模式(Circular) - 需要开启UART的IDLE中断检测 2. **固件库版本**: ```c // 检查HAL库版本是否支持该特性 #ifdef HAL_UART_MODULE_ENABLED #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) #error "需要关闭Register Callbacks功能" #endif #endif ``` 建议检查以下配置: 1. 在CubeMX中确认已勾选UART中断 2. 确认DMA配置为Normal/Circular模式 3. 确保调用过`HAL_UARTEx_ReceiveToIdle_DMA()`启动接收 4. 在main.c中添加函数原型声明: ```c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size); ``` 如果仍有问题,可尝试在回调函数开始处添加: ```c UNUSED(Size); // 消除编译器警告 ```
评论 68
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙跃十二

写的不错,给点鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值