- 博客(384)
- 资源 (4)
- 收藏
- 关注
原创 【频域分析及处理】4. FFT 采样频率和采样点数的选取
5、为了保证频率和幅度的准确性(博主理解为在该段采样时间内获取的原信号周期为整数倍,频谱尽可能不泄露),需满足。4、基2-FFT要求点数N为2的指数倍(不考虑补零或截断,采样点数直接等于FFT运算点数),因此可得到大于。1、根据奈奎斯特采样定理保证不混叠且能还原出原信号信息,确定最小采样频率。2、频率分辨率为100Hz,最小采样总时间。的N的可取值序列。......
2022-07-15 18:11:13 11484 7
原创 【C 数据结构-动态内存管理】5. 内存紧缩(内存碎片化处理)
文章目录【 1. 堆 】【 2. 分配算法 】【 3. 回收算法 】【 1. 堆 】无论是边界标识法还是伙伴系统,都是将空闲的存储空间链接成一个链表,即可利用空间表,对存储空间进行分配和回收。本节介绍另外一种动态内存管理的方法,使用这种方式在整个内存管理过程中,不管哪个时间段,所有未被占用的空间都是地址连续的存储区,这些 地址连续的未被占用的存储区 在编译程序中称为 堆。假设存储区的初始状态如上图所示,若采用本节介绍的方法管理这块存储区,当 B 占用块运行完成同时所占的存储空间释放后,存储区的状
2024-05-07 22:03:22 405
原创 【C 数据结构-动态内存管理】4. 无用单元收集(垃圾回收机制)
例如,在C语言中,用户可以通过 malloc 和 free 两个功能函数来动态申请和释放存储空间,当用户使用 malloc 申请的空间使用完成后,没有使用 free 函数进行释放,那么该空间就会成为无用单元。:假设使用 malloc 申请了一块存储空间,有。是一块用户不再使用,但是系统无法回收的存储空间。,当其中一个指针完成使命后,私自将该存储空间使用。所有的存储空间无论是处于使用还是空闲的状态,,数据结构中称这种访问为悬挂访问。
2024-05-07 21:39:41 534
原创 线性卷积和圆周卷积
时域乘积(点乘) = 频域圆周卷积除以长度N的傅里叶逆变换。频域圆周卷积 = 时域乘积(点乘)的傅里叶变换乘以长度N。当圆周卷积的长度=线性卷积的结果的长度时,二者等价。时域圆周卷积 = 频域乘积(点乘)的傅里叶逆变换。频域乘积(点乘) = 时域圆周卷积的傅里叶变换。时域的圆周卷积相当于在频域进行了点乘。
2024-05-03 17:58:59 904
原创 【C 数据结构-图】3. 深度优先搜索、广度优先搜索
文章目录【 1. DFS 深度优先搜索 】1.1 基本原理1.2 C 实现【 2. BFS 广度优先搜索 】2.1 基本原理2.2 C 实现对存储的图中的顶点进行遍历搜索,常用的遍历方式有两种:深度优先搜索和广度优先搜索。【 1. DFS 深度优先搜索 】1.1 基本原理 深度优先搜索的过程 类似于树的先序遍历,首先从例子中体会深度优先搜索。例如下图是一个无向图,采用深度优先算法遍历这个图的过程为:首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以,需要标记
2024-04-29 17:23:39 857
原创 【C 数据结构-图】2. 图的存储结构
例如:存储下图中的两张图时,除了存储图中各顶点本身具有的数据外,还需要使用二维数组存储任意两个顶点之间的关系。解决了邻接表不方便计算有向图顶点入度的问题。中顶点的入度和出度只需从数组中。,以表示距离无穷远,根本无法到达。可以提高无向图中操作顶点的效率。,而无法计算该顶点的入度。
2024-04-29 11:10:15 769
原创 【C 数据结构-树】4. 哈夫曼树
例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1。上图中从根结点到结点 c 的路径长度为 4-1=3。通常记作 WPL。例如上图中所示的这颗树的带权路径长度为:WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3。:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。:在一棵树中,一个结点到另一个结点之间的通路,称为路径。:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,上图中结点 a 的权为 7,结点 b 的权为 5。
2024-04-24 22:24:37 845
原创 【C 数据结构-树】2. 二叉树
性质 3 的计算方法为:对于一个二叉树来说,除了度为 0 的叶子结点和度为 2 的结点,剩下的就是度为 1 的结点(设为。同时,对于每一个结点来说都是由其父结点分支表示的,假设树中分枝数为 B,那么总结点数。例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。而分枝数是可以通过 n1 和 n2 表示的,即。两种方式得到的 n 值组成一个方程组,就可以得出。所以,n 用另外一种方式表示为。使用顺序表(数组)存储二叉树。顺序存储只适用于完全二叉树。满二叉树也是完全二叉树。每个结点的度都为 2。
2024-04-24 21:06:54 1257
原创 【C 数据结构-树】1. 树的相关基础
如果一个结点没有父结点,那么这个结点就是整棵树的根结点。对于具有同一个根结点的各个子树,相互之间不能有交集。单个结点也是一棵树,根结点就是它本身。
2024-04-23 21:57:21 1145
原创 【C++ STL容器适配器】priority_queue 优先级队列
每当有新元素进入,它都会根据既定的排序规则找到优先级最高的元素,并将其移动到队列的队头;同样,当 priority_queue 从队头移除出一个元素之后,它也会再找到当前优先级最高的元素,并将其移动到队头。容器适配器模拟的也是队列这种存储结构,但是,riority_queue 容器适配器中元素的存和取,遵循的并不是 First in,First out(先入先出)原则,而是。,因此访问元素的唯一方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素。
2024-04-23 10:00:21 1006
原创 【C++ STL序列容器】array 数组
各个元素的值是不确定的(array 容器不会做默认初始化操作)普通数组的基础上添加了一些成员函数和全局函数。,且效率并没有因此变差。
2024-04-22 21:54:41 947
原创 【C++ STL序列容器】list 双向链表
普通数组,则 begin() 函数返回的是指向数组第一个元素的指针,同样 end() 返回指向数组中最后一个元素之后一个位置的指针。容器包含的 begin() 和 end() 成员函数的功能完全相同。必须保证新旧容器存储的元素类型一致。
2024-04-22 21:23:59 675
原创 【C 数据结构】队列
设计出两个结构体,一个结构体Node表示结点,其中包含有一个data域和next指针,其中data表示数据,其可以是简单的类型(如int,double等等),也可以是复杂的结构体(struct类型)。当进行动态创建队列的时候,也只不过是向后继续不断的申请内存空间,即使前面出队操作释放掉了前面的空间,但是指针依旧会向后进行移动,直到达到系统预留给程序的内存上界被强行终止。设计另一个结构体,其包括了两个分别永远指向队列的队尾和队头的指针,我们主要的操作只对这两个指针进行操作。
2024-04-18 17:21:46 964
原创 【C 数据结构】循环链表
在init重创建的结点next指向空,而在主函数调用创建之后手动 将head头结点的next指针指向自身。找到需要删除的结点,将其前一个结点的next指针直接指向删除结点的下一个结点。问题就是获取到链表的节点数同时也需要完成一次遍历才可以达成目标。在原有的双向链表的基础上,将尾部结点和头部结点进行互相连接。循环链表的尾指针指向的是链表的开头。
2024-04-11 11:33:27 685
原创 【C 数据结构】双向链表
双链表删除结点时,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。每个节点存在前后两个指针,分别指向前驱节点和后继节点。
2024-04-11 10:14:59 688
原创 【C 数据结构】静态链表
数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)a[0] 是备用链表的第一个节点,我们知道它的位置,操作它的直接后继节点相对容易,无需遍历备用链表。备用链表最后1个节点的游标为 0 即指向表头,备用链表第1个节点存有值,则表明数据已存满。
2024-04-11 09:32:10 1075
原创 【C 数据结构】单链表
---------------------------------------以下对链表的操作实现均建立在已创建好链表的基础上,该链表是一个具有头节点的链表。由于头节点本身不用于存储数据,因此在实现对链表中数据的"增删查改"时要引起注意。将插入位置前结点的 next 指针指向插入结点,除非再添加一个指针,作为插入位置后续链表的头指针,否则会导致插入位置后的这部分链表丢失。不存任何数据的空节点,通常作为链表的第一个节点。链表实际存储的是一个一个的节点。永远指向链表第一个节点的位置。第一个存有数据的节点。
2024-04-10 16:09:30 850
原创 【C 数据结构】顺序表
顺序表存储数据时,会提前申请一整块足够大小连续的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。顺序表申请的存储容量要大于顺序表的长度。
2024-04-10 11:01:13 607
原创 C++ 学习笔记
当 value 类型为 char* 时,cout会从 value 这个 char * 地址开始遍历地址对应的元素直至遇到 ‘\0’ 字符。
2024-04-08 17:29:28 860
原创 【C++ STL有序关联容器】map 映射
无论是调用复制构造函数还是调用拷贝构造函数,前提是需要保证两个容器的类型一致。map容器会自动根据各键值对中键的大小,按照既定的规则进行。使用 map 容器存储的各个键值对,
2024-04-06 20:23:53 1164
原创 【C++ STL序列容器】deque 双端队列
当操作对象是容器时,它和容器包含的 begin() 和 end() 成员函数的功能完全相同;如果操作对象是普通数组,则 begin() 函数返回的是指向数组第一个元素的指针,同样 end() 返回指向数组中最后一个元素之后一个位置的指针(注意不是最后一个元素)。deque 容器还有一个std::swap(x , y) 非成员函数(其中 x 和 y 是存储相同类型元素的 deque 容器),它和 swap() 成员函数的功能完全相同,仅使用语法上有差异。deque 还擅长在序列头部添加或删除元素。
2024-04-06 16:32:48 828
原创 【C++ STL】简述
将不适用的序列式容器(包括 vector、deque 和 list)变得适用。元素在容器中的位置同元素的值无关,即容器不是排序的。容器中封装的是组织数据的方法(也就是数据结构)元素是未排序的,元素的位置由哈希函数确定。元素默认是由小到大排序好的。容器就是一些模板类的集合。容器适配器本质上还是容器。
2024-04-06 15:23:35 1049
原创 【C++ STL有序关联容器】set 集合
基本语法该容器采用默认的std::less规则,会对存储的 DataType 类型元素做升序排序。注意,由于 set 容器支持随时向内部添加新的元素,因此创建空 set 容器的方法是经常使用的。
2024-04-03 17:40:17 965
原创 【C++ STL迭代器】iterator 迭代器
尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式:迭代器定义方式具体格式正向迭代器容器类名::iterator 迭代器名;常量正向迭代器容器类名::const_iterator 迭代器名;反向迭代器(全称:反向迭代器适配器)容器类名::reverse_iterator 迭代器名;常量反向迭代器容器类名::const_reverse_iterator 迭代器名;迭代器名就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。
2024-04-03 15:49:52 940
原创 【Ucore操作系统】8. 并发
简单地说,线程是进程的组成部分,进程可包含 1~n 个线程,属于同一个进程的线程共享进程的资源, 比如地址空间、打开的文件等。基本的线程由线程ID、执行状态、当前指令指针 (PC)、寄存器集合和栈组成。线程是可以被操作系统或用户态调度器独立调度(Scheduling)和分派(Dispatch)的基本单位。在本章之前,进程是程序的基本执行实体,是程序关于某数据集合上的一次运行活动,是系统进行资源(处理器、 地址空间和文件等)分配和调度的基本单位。在有了线程后,对进程的定义也要调整了,
2024-03-27 22:36:19 863
《数字信号处理1》学习笔记-思维导图
2023-02-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人