【发布时间】:2010-05-11 20:23:51
【问题描述】:
静态和动态数据结构的主要区别、优缺点是什么?
最常见的数据结构属于哪些类别?
我怎么知道在哪种情况下使用它们?
【问题讨论】:
标签: java c++ data-structures
静态和动态数据结构的主要区别、优缺点是什么?
最常见的数据结构属于哪些类别?
我怎么知道在哪种情况下使用它们?
【问题讨论】:
标签: java c++ data-structures
从过度简化开始:
只有几种基本的数据结构:数组、列表和树。其他所有内容都可以通过使用这两种结构的不同类型来组合(例如,可以使用哈希值数组和每个哈希值的列表来实现哈希表以处理冲突)。
在这些结构中,数组是静态的(即,它们的内存占用不会随着对其执行操作而随时间变化),而其他一切都是动态的(即,在一般情况下,内存占用会发生变化)。
这两种结构的区别可以从上面推导出来:
还有其他差异,但只有在您的数据可能被排序时才会发挥作用。我无法给出一个详尽的列表,因为有许多动态数据结构对不同的操作(“添加”、“删除”、“查找”)表现出不同的性能特征,因此它们不能放在同一个屋檐下。
一个非常明显的区别是,排序数组需要在内存中移动(可能很多)东西才能进行“查找”以外的任何操作,而动态结构通常执行较少的工作。
所以,回顾一下:
编辑:我没有提到图表,这是另一种动态数据结构,可以说它不能由更简单的部分组成(根据定义,一棵树只有一个链接“进入”任何节点,除了根,而图可能有多个)。然而,在“什么会更好用”的场景中,图并不能真正与其他结构进行比较,因为您要么需要使用图,要么不需要(其他结构可能表现出不同的性能,但最终它们都支持相同的一组操作)。
【讨论】:
静态数据结构 (SDS) 是固定大小的(例如数组),一旦分配给它们的内存量不能在运行时改变,而动态数据结构 (DDS)(例如链接列表)具有灵活的大小,它们可以增长或根据需要缩小以包含要存储的数据。
SDS 是线性数据结构,允许快速访问存储在其中的元素,但与 DDS 相比,插入/删除操作的成本很高,后者对元素的访问速度较慢,但插入/删除速度较快。
大部分 DS 都是动态 DS。
如果 SDS 空间是在实际数据插入之前分配的,那么空间可能会被浪费或有时可能会不足,因此只有在预先知道要插入的确切数据量的情况下才应该使用它们,如果这是要在运行时知道,应该使用 DDS。
【讨论】:
反之亦然,如果使用静态,则会丢失内存,而在动态的情况下,性能会降低。最好的设计会有效地使用数据结构,没有一个完美的答案。
【讨论】:
简单提示
动态数据结构具有以下特点:
静态数据结构具有以下特点:
综上所述,使用动态结构来存储一组已知的、不改变的数据是无效的。在这种情况下使用静态数据结构将节省系统资源并提供对元素的更快访问。另一方面,如果已知数据的大小会发生变化,则使用动态结构。
【讨论】: