【问题标题】:Differences between Static & Dynamic data structures静态和动态数据结构之间的差异
【发布时间】:2010-05-11 20:23:51
【问题描述】:

静态和动态数据结构的主要区别、优缺点是什么?

最常见的数据结构属于哪些类别?

我怎么知道在哪种情况下使用它们?

【问题讨论】:

    标签: java c++ data-structures


    【解决方案1】:

    从过度简化开始:

    只有几种基本的数据结构:数组、列表和树。其他所有内容都可以通过使用这两种结构的不同类型来组合(例如,可以使用哈希值数组和每个哈希值的列表来实现哈希表以处理冲突)。

    在这些结构中,数组是静态的(即,它们的内存占用不会随着对其执行操作而随时间变化),而其他一切都是动态的(即,在一般情况下,内存占用会发生变化)。

    这两种结构的区别可以从上面推导出来:

    • 静态需要预先知道最大尺寸,而动态可以动态调整
    • Static 无论如何都不会重新分配内存,因此您可以有保证的内存需求

    还有其他差异,但只有在您的数据可能被排序时才会发挥作用。我无法给出一个详尽的列表,因为有许多动态数据结构对不同的操作(“添加”、“删除”、“查找”)表现出不同的性能特征,因此它们不能放在同一个屋檐下。

    一个非常明显的区别是,排序数组需要在内存中移动(可能很多)东西才能进行“查找”以外的任何操作,而动态结构通常执行较少的工作。

    所以,回顾一下:

    1. 如果您需要保证最大内存使用率,除了数组之外别无选择。
    2. 如果数据大小有硬性上限,请考虑使用数组。数组非常适合主要需要添加/删除操作(保持数组未排序)和主要需要查找操作(保持数组排序)的问题,但不能同时适用于两者。
    3. 如果您没有硬性上限,或者如果您要求所有的添加/删除/查找都很快,请使用适当类型的动态结构。

    编辑:我没有提到图表,这是另一种动态数据结构,可以说它不能由更简单的部分组成(根据定义,一棵树只有一个链接“进入”任何节点,除了根,而图可能有多个)。然而,在“什么会更好用”的场景中,图并不能真正与其他结构进行比较,因为您要么需要使用图,要么不需要(其他结构可能表现出不同的性能,但最终它们都支持相同的一组操作)。

    【讨论】:

    • 在某种程度上,列表只是一棵退化的树。您可以说有两种数据结构,一种是基于块的,一种是基于节点的(以及两者的各种混合)。
    • 另外,我不同意 1)。没有理由你不能编写一个“BoundedList”类,当你添加元素 N + 1 时会产生错误(或其他)。但我同意这不完全是一个基本的数据结构——更像是一种 hack。跨度>
    • @Drew:你在这两个方面都是正确的。说实话,我开始打算写2种结构,并把树和图表排除在外,但我认为肯定有人会纠正我。看起来你无法解决这个问题:-)。至于有界列表,我想你会同意,在原始问题所暗示的知识水平上的人不会从被告知这种技术性中获得任何好处。
    • 您可以从列表中构建图表:节点之间的链接列表和节点列表。
    • 一个类(或来自 c 的结构)也是一个非常重要的静态结构。
    【解决方案2】:

    静态数据结构 (SDS) 是固定大小的(例如数组),一旦分配给它们的内存量不能在运行时改变,而动态数据结构 (DDS)(例如链接列表)具有灵活的大小,它们可以增长或根据需要缩小以包含要存储的数据。

    SDS 是线性数据结构,允许快速访问存储在其中的元素,但与 DDS 相比,插入/删除操作的成本很高,后者对元素的访问速度较慢,但​​插入/删除速度较快。

    大部分 DS 都是动态 DS。

    如果 SDS 空间是在实际数据插入之前分配的,那么空间可能会被浪费或有时可能会不足,因此只有在预先知道要插入的确切数据量的情况下才应该使用它们,如果这是要在运行时知道,应该使用 DDS。

    【讨论】:

      【解决方案3】:

      反之亦然,如果使用静态,则会丢失内存,而在动态的情况下,性能会降低。最好的设计会有效地使用数据结构,没有一个完美的答案。

      【讨论】:

        【解决方案4】:

        简单提示

        动态数据结构具有以下特点:

        • 能够有效地添加、删除或修改元素
        • 尺寸灵活
        • 有效使用资源 - 因为资源是在运行时根据需要分配的。
        • 对元素的访问速度较慢(与静态数据结构相比)

        静态数据结构具有以下特点:

        • 无法直接添加、删除或修改元素。如果完成,这是一个消耗资源的过程。
        • 固定大小。
        • 在创建数据结构时分配的资源,即使元素不包含任何值。
        • 更快地访问元素(与动态数据结构相比)

        综上所述,使用动态结构来存储一组已知的、不改变的数据是无效的。在这种情况下使用静态数据结构将节省系统资源并提供对元素的更快访问。另一方面,如果已知数据的大小会发生变化,则使用动态结构。

        【讨论】:

          猜你喜欢
          • 2015-10-09
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-19
          • 2011-04-19
          相关资源
          最近更新 更多