数据结构学习总结(一)

数据结构学习总结(一)

 

 

我们讨论的数据结构,一般是指数据在内存中的组织形式。从本质上来说,数据在内存中有两种存储方式。一种是连续存储,另一种是离散存储。连续存储是指数据存储时,在内存中是连续不间断的,而离散的则是指不连续的,间断的。

连续存储由于数据存储时连续的,故而知道了第一个元素的地址,就可以推知其他元素的位置,从而遍历所有数据;也是由于同样的原因,连续存储的存储单元(unit)只需存储数据本身,因而可以节省存储空间。如下图:

与此相反,离散存储由于是不连续的,所以无法从第一个元素的位置推知所有其他的位置。但是,我们存储数据必须保证我们可以随时访问得到(否则岂非白费功夫?)。为了达到这个目的,存储数据时就不能只存储数据本身,还需要存储下一个单元的位置(地址)。如下图:

在C、C++中,存储的一般是指向下一个单元的指针,而在C#、Java、Python这些完全面向对象的语言中,则存储一个变量,该变量引用下一个数据单元(C#、Java、Python中每一个数据单元均为一个对象,而引用对象的变量则存储该对象在内存中的地址,实质上跟C、C++的指针差不多,只不过对其进行了抽象、封装)。

连续存储方式最简单的就是数组,这也是最常用的方式,在许多编程语言中都内置了数组(貌似除了汇编以外,其他语言都有数组或近似数组的数据类型)。连续存储一定是线性的,而离散存储,在我看来应该分为两类,一类是线性的,一类是非线性的。线性的如链表,非线性的如树、十字链表等,下面将会讨论到。

我将从思想(概念)以及实现原理两方面进行总结,所以这些数据结构我都用C语言并假设数据的类型为int(整数)的前提下实现了(在C++、C#、Python等语言中这些数据结构已经实现到它们的语言本身或其标准库中),可以到Github:https://github.com/githubligao/Data-Structure.git或者百度网盘:http://pan.baidu.com/s/1rsMZW上下载我的实现代码。

有些数据不能连续存储,主要是由于**内存管理机制、数据结构特性、运行时动态性、以及硬件限制**等因素共同决定的。连续存储虽然效率高,但并不是所有数据都适合或可以连续存储。 --- ## 🧠 为什么有些数据不能连续存储? ### 1. **数据大小不固定** - 某些数据结构的元素大小不固定(如字符串、变长结构体等),无法统连续排列; - 例如:链表节点的大小可能因动态分配而不同。 ### 2. **动态增长需求** - 如果数据在运行时频繁增删,连续存储的数组结构在扩容时需要重新分配内存并复制数据,效率低; - 链表等结构通过离散存储避免了这个问题。 ### 3. **内存碎片问题** - 连续存储要求块**未被占用的连续内存块**; - 频繁分配和释放内存后,会产生**内存碎片**,即使有足够内存,也可能找不到连续的大块内存。 ### 4. **多线程/并发访问** - 在多线程环境中,多个线程可能同时请求内存分配; - 连续分配需要协调内存空间,容易造成竞争和效率下降; - 离散分配更灵活,适合并发操作。 ### 5. **虚拟内存与地址映射机制** - 现代操作系统使用**虚拟内存机制**,每个进程看到的地址空间是连续的,但实际物理内存是离散的; - 因此,**程序看到的“连续”只是虚拟地址的抽象**,实际物理内存不连续。 ### 6. **硬件限制** - 某些硬件平台对内存访问有特殊限制(如嵌入式系统); - 无法保证大块连续内存可用,因此采用离散结构更安全可靠。 --- ## 📌 举例说明 ### ✅ 连续存储适用场景(数组): ```c int arr[100]; // 100个int连续存储 ``` - 优点:访问快、缓存命中率高; - 缺点:扩容困难、插入删除慢。 ### ❌ 离散存储适用场景(链表): ```c struct Node { int data; struct Node* next; }; ``` - 优点:插入删除快、内存利用率高; - 缺点:访问慢、缓存不友好。 --- ## ✅ 总结 > 数据不能连续存储的原因包括:数据大小不固定、动态增长需求、内存碎片、并发访问、虚拟内存机制和硬件限制等。虽然连续存储访问效率高,但离散存储在灵活性、动态性和并发性方面具有优势,因此在实际系统中两者互补使用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值