从零开始_学_数据结构(零)——数据结构总述

本文详细阐述了数据结构的基本概念,包括数据、数据元素、数据项、数据对象、数据结构等,并介绍了逻辑结构的不同类型及其表示方法,以及物理结构中的顺序存储与链式存储的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:《大话数据结构》作者:程杰

 

写在最开始:

这是我自己学习的经验和记录,有的内容很容易理解,但又比较重要,我会直接摘抄书上的内容;有些比较复杂,我会写明自己的思考;有些我自己也没搞懂,我会用红色文字标明,写出自己的疑问,也许以后会解决。

 

数据结构的概念:

是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

注:这句话应该意思是,数据结构不是研究数值和数值计算的,而是研究对象(对象不止是数值,也可能是类对象或者其他),研究这些对象之间的关系(比如有什么共同点,比如顺序如何),以及操作(比如排序,插入等)。

 

数据结构的基础:

数据

 

数据的概念:

概括的来说数据,就是一切有意义的符号(我觉得可以说是数值)。例如,整型是数值是他自己(但存储形式是通过二进制内容),图像(最简单的是NTFS文件系统中的BitMap表,用一位(0或1,8位是1字节)来表示某一个簇是否被使用(1表示已使用,0相反)),声音(这个不太清楚)等。

 

由于一切数据都是以二进制数值的形式存储在硬盘或者内存的,因为可以认为这些二进制数值就是数据,但我个人认为,如果二进制数值没有意义的话,那么也不能称为数据(因为他不表示任何内容)。

 

并且,计算机的数据,要能被输入到计算机中(不止是PC),也要能被处理(没意义是不能被处理的,损坏的也不行)。

 

数据元素:

是组成数据、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。

 

例如,一个二进制位,如果我们要强行理解的话,只能以bool类型来理解,但若我们需要的是int类型的数据(4字节),那么显然是最小单位需要是4字节(32位)了,因为只有这样,这个int类型的数值也有意义。

 

因此,所谓的数据元素,就是指数据的一个单元,具体这个单元有多大,要根据实际需求而定。

 

 

数据项:

假如要分析结构数组,那么数据元素是结构,而结构是由若干个类型的变量组成,而这些变量,就是数据项。

 

数据项是数据不可分割的最小单位。(这样将其定义,再小的话不一定有意义)

 

 

数据对象:

是性质相同的数据元素的集合,是数据的子集,一般简称为数据。

 

例如数据有int类型,有结构,有类,毫无疑问,他们都是数据。

 

但假如我们只分析结构,那么其他数据对我们来说就没意义,也没必要去处理。

 

而对我们有意义的结构,则是我们的研究对象——数据对象,对我们来说,他们就是数据(全部数据的一部分,,是我们研究内容的全部)。

 

 

数据结构:

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

也就是说,某些数据之间,是存在一定联系的。例如数组,数组元素之间的联系就是同属于一个数组。

 

也许还有其他的关系,书上后面可能会讲(我大概看了眼后面的)。反正肯定有关系。

 

 

 

逻辑结构:

指数据对象中,数据元素之间的关系。

 

(1)集合结构

数据对象中的所有数据元素,他们之间的关系是:同属于一个集合。

 

(2)线性结构

数据元素之间的关系,是一对一的关系。

例如链表,前一个节点有指针指向后一个节点。

 

(3)树形结构

数据元素之间的关系,存在一对多的层次关系。

注意,是 分层的,从上往下是一对多。

如图,A的第一层,BCD是第二层,其他是第三层。从上层往下层对应,上层的并不同时对应下层的某一个节点,这样才能理解为一对多。

 

(4)图形结构

其中数据元素的关系是多对多。

如图,1对应2和3,然后2和3又共同对应5,分别对应4、8、6。

个人觉得树和图形结构的最大区别,是树是分层的,而图并不分层。

但这个想法尚未验证。

 

 

画逻辑结构时:

①每个圆圈是一个节点,可以用一个空园表示空节点;(至少可以表示空树)

②元素之间的逻辑关系,用节点之间的连线表示,如果这个关系是有方向的,用带箭头的连线(不能理解,什么叫做元素之间的逻辑关系?什么又叫做有方向的?

 

 

逻辑结构的用处:

逻辑结构是针对具体问题的,是为了解决问题而定义的。

例如,一个树形结构的数据对象,也可以将其理解为集合(因为也可以属于同一个集合),至于同时存在图和树或者其他的关系,暂时不能理解。

也许是一个结构同时具有树形的指针,也具有线性的指针就可以做到同时具备两种数据结构?

 

 

物理结构:

指数据的逻辑结构,在计算机中的存储形式。

补充:指在内存。若是在硬盘或者之类的地方,称为文件结构。

 

例如,一个1GB的文件,你要在里面找到Student对象A和Student对象B。

设定为你先找到了对象A(比如A在文件中的地址是第一个字节)。

(1)假如B存储在A之后的位置,那么如果使用逐字节方式的话,你会立刻找到B。

(2)假如B存储在A之后很远的位置,如果逐字节去找,那么会需要很久时间。

(3)假如有一个指针,他和A在一起,你找到A后,可以同时获得指针A的值,而假如指针A指向B,那么就知道了对象B的地址。因此,便立刻找到了对象B(即使B实际地址和A的距离很远)。

这种思想,在学C++的单向链表的时候是使用过的。

 

对于(1)的情况,这种存储形式叫做 顺序存储

 

对于(3)的情况,这种存储形式叫做 链式存储

 

链式存储的优点:

当需要插入新元素时,可以方便的插入,只需要更改前一个元素的指针即可(如果是双向链表,也需要更改后一个元素的指针),删除也同理。

链式存储的缺点:

需要占用更多的内存(因为要有一个或多个指针,用于指向下一个对象);

假如中间有一个节点损坏,那么无法找到下一个节点(没有下一个节点的地址)。

 

顺序存储的优点:

正好和链式存储相反,节约内存。假如对象是char字符(1字节),一个指针也占一字节,因此链式存储一个节点需要的内存比顺序存储多了一倍。

不会丢失数据,即使中间有节点出问题,也可以通过读取下一个地址来知道下一个元素的值。

顺序存储的缺点:

插入、删除都很不方便,很容易导致效率低下。

 

 

抽象数据类型:

数据类型:书上的定义很拗口,反正像int、char、结构、自定义类这样的就是数据类型。

抽象数据类型:就是指我们把某些信息抽象为什么样类型,例如“人名+学号+成绩+班级=学生”。这个“学生类”就是一个抽象数据类型,他包含人名(可能是string类),学号(可能是int类),成绩(可能是short类),班级(可能是char类)。

抽象包括了两个特点:①一个数学模型;②定义在模型的一组操作。

而在上面“学生类”的基础上,单纯只有数据是没有意义的。

例如,我们需要知道学生的成绩,因此,应该有一个显示学生成绩的方法(类方法);

例如,我们可能需要更改其分数(或者创建该对象时添加一个分数),因此,需要一个初始化学生成绩的方法;

又例如,我们可能需要对其成绩进行排序,存储在一个学生类对象数组之中,因此,要有一个能比较成绩的方法;

 

 

下一篇:数据结构之算法的基本概念

http://blog.youkuaiyun.com/qq20004604/article/details/50934619

对于 c1=1:1:长度 (SNR) fprintf('\n\n\n仿真信噪比为%f\n\n',SNR(c1)); 对于 num1=1:NumLoop %---------------导频格式--------------------------------------- pilot_symbols=qammod(randi([0 1],64,1),4); %----------------计算导频和数据数目---------------------------- num_pilot=ceil(num_symbol/pilot_Inter); 如果 rem(num_symbol,pilot_Inter)==0 num_pilot=num_pilot+1; 结束 num_data=num_symbol+num_pilot; %----------------导频位置计算---------------------------------- pilot_Indx=(1,num_pilot); Data_Indx=(1,num_pilot*(pilot_Inter+1)); 对于 i=1:num_pilot-1 pilot_Indx(1,i)=(i-1)(pilot_Inter+1)+1; 结束 pilot_Indx(1,num_pilot)=num_data; 对于 j=0:num_pilot Data_Indx(1,(1+jpilot_Inter):(j+1)pilot_Inter)=(2+j(pilot_Inter+1)):((j+1)*(pilot_Inter+1)); 结束 Data_Indx=Data_Indx(1,1:num_symbol); %----------------导频插入------------------------------------- piloted_ofdm_syms=(carrier_count,num_data); piloted_ofdm_syms(:,Data_Indx)=reshape(Modulated_Sequence,carrier_count,num_symbol); piloted_ofdm_syms(:,pilot_Indx)=repmat(pilot_symbols,1,num_pilot); %----------------IFFT变换——————————————————— time_signal=sqrt(carrier_count)*ifft(piloted_ofdm_syms); %----------------加循环前缀------------------------------------ add_cyclic_signal=[time_signal((carrier_count-守卫+1:carrier_count),:);time_signal]; % ===================加帧同步头(巴克码[1 1 1 -1])==================== c=一(4,57); c(4,:)=-1; Tx_data_trans1=[c;add_cyclic_signal]; % =======================加窗======================== signal_window = (大小(Tx_data_trans1)); signal_window = Tx_data_trans1.*repmat(rcosWindow(alpha,size(Tx_data_trans1,1)),1,num_symbol+7);% 通过矩阵点乘 Tx_data_trans = reshape(signal_window,1,[]);
03-25
<think>好的,我现在需要详细回答用户关于BLE广播数据结构的组成和格式的问题。首先,我需要回顾自己之前过的蓝牙低功耗(BLE)相关知识,尤其是广播包的结构。根据用户提供的引用内容,特别是引用[2]和引用[3],里面提到了广播包的类型和数据结构的限制。 用户的问题核心是BLE广播数据结构的格式和组成,所以我需要分步骤解释。首先,广播包的基本结构,包括各个字段的长度和用途。例如,每个广播包由多个AD Structure组成,每个AD Structure包含长度、类型和具体数据。这部分需要详细说明每个字段的含义,比如长度字段占1字节,类型字段也是1字节,后面的数据部分长度可变。 然后,我需要列举常见的广播数据类型,比如Flags、设备名称、服务UUID、制造商数据等,并给出每个类型的例子,例如Type 0x01对应Flags,数据部分可能包含BR/EDR支持、同时支持普通和低功耗模式等信息。这里需要参考引用[2]中的广告类型说明。 接下来,广播数据有31字节的限制,这一点在引用[1]和引用[3]中都有提到,虽然某些扩展模式可能更长,但通常基础广播模式下是31字节。这里需要强调数据长度的限制以及如何合理利用空间,如使用压缩或高效编码,如引用[1]中的注意事项部分。 此外,广播包和扫描响应数据的区别也需要说明。广播包是设备主动发送的,而扫描响应数据是在扫描请求后回复的,两者结构相同,但用途同,总长度可能达到62字节(31+31)。引用[1]提到扩展广播模式可能有更大的数据长度,但基础模式是31字节。 然后,我需要举一个实际的广播数据示例,帮助用户更好地理解结构。例如,分解一个包含Flags、设备名称和制造商数据的广播包,每个AD Structure的具体字节分配。 最后,根据用户的要求生成相关问题,可能需要涉及数据结构优化、类型字段作用、数据长度限制的影响等,确保问题主题相关,并参考提供的引用内容中的知识点。 需要检查是否符合系统级指令,比如所有数表达式是否正确使用$...$,是否有独立公式(但这个问题可能需要),中文回答是否正确,引用标识是否在适当的位置添加。例如,在提到数据长度限制时,引用[1]和引用[3]的相关部分需要标注。 可能需要注意的细节:确保每个AD Structure的格式正确,类型字段的常见值对应的正确含义,以及数据长度的计算方式(长度字段本身占1字节,类型1字节,数据部分n字节,总长度n+2)。同时,需要指出广播信道只有三个,无法跳频,这点在引用[3]中有提到,可能影响数据可靠性和功耗,但用户主要问的是数据结构,这部分可能作为补充说明。 总结回答结构:先总述广播数据结构的组成,然后分点详细讲解每个部分,再讨论数据长度限制及优化,举例说明,最后相关问题和引用标注。</think>### BLE广播数据结构的组成格式 BLE广播数据结构由多个**广告数据结构(AD Structure)**组成,每个AD Structure包含三个部分:**长度(Length)**、**类型(Type)**和**数据(Data)**。其格式如下: $$ \begin{array}{|c|c|c|} \hline \text{长度 (1字节)} & \text{类型 (1字节)} & \text{数据 (n字节)} \\ \hline \end{array} $$ 其中,`长度`字段表示**类型+数据**的总字节数,即数据部分的实际长度为`长度-1`[^2]。 --- #### 1. 常见广播数据类型 以下为几种常见的Type类型及其含义(部分示例): - **0x01 (Flags)**:指示设备能力,如是否支持BR/EDR、低功耗模式等。例如:`0x06`表示“仅BLE,支持传统蓝牙,且可被发现”[^2]。 - **0x08/0x09 (设备名称)**:完整或缩短的设备名称。例如:`0x08`对应完整名称如“Device_A”。 - **0x03/0x16 (服务UUID)**:完整UUID或部分UUID列表。例如:心率服务UUID为`0x180D`。 - **0xFF (制造商数据)**:自定义数据,通常包含厂商ID和自定义字段。例如:苹果的iBeacon数据[^2]。 --- #### 2. 广播数据长度限制 - **基础广播模式**:单个广播包(Advertising Data)最大为**31字节**,若同时启用扫描响应数据(Scan Response),则总长度可达**62字节**(31+31)[^1]。 - **扩展广播模式**:支持更长的数据(如1650字节),但需设备支持BLE 5.0及以上规范[^1]。 --- #### 3. 广播包示例 假设某广播包内容如下(十六进制): ``` 02 01 06 0A 09 44 65 76 69 63 65 5F 42 05 FF 4C 00 10 20 ``` 解析如下: - **02 01 06**:长度2,类型0x01(Flags),数据0x06(表示BLE仅限、可被发现)。 - **0A 09 44...5F42**:长度10,类型0x09(完整设备名),数据为ASCII码“Device_B”。 - **05 FF 4C...20**:长度5,类型0xFF(厂商数据),厂商ID为0x004C(苹果),后续为自定义数据。 --- #### 4. 数据设计的注意事项 - **空间优化**:需在有限长度内优先传输关键信息(如服务UUID),必要时压缩数据或分多次广播[^1]。 - **功耗频率**:数据过长可能导致广播间隔增加,影响扫描端功耗和响应速度[^3]。 - **兼容性**:需根据BLE版本选择广播模式,例如扩展广播需双方设备支持BLE 5.0[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值