Java 静态和静态的区别;动态数据结构

Java 静态和静态的区别;动态数据结构,java,c++,data-structures,Java,C++,Data Structures,静态和动态数据结构之间的主要区别、优点和缺点是什么 最常见的数据结构属于哪些类别 我怎么知道在哪种情况下使用它们呢?从一个过于简单的问题开始: 只有几种基本类型的数据结构:数组、列表和树。其他所有内容都可以通过使用这两种结构的不同类型来组合(例如,可以使用哈希值数组和每个哈希值一个列表来实现哈希表,以处理冲突) 在这些结构中,阵列是静态的(即,在对其执行操作时,它们的内存占用不会随时间而变化),而其他一切都是动态的(即,在一般情况下,内存占用会发生变化) 这两种结构之间的差异可以从上面得出:

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

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


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

从一个过于简单的问题开始:

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

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

这两种结构之间的差异可以从上面得出:

  • 静态需要预先知道最大尺寸,而动态可以动态适应
  • 静态不会重新分配内存,所以您可以保证内存需求
还有其他差异,但只有在数据可能被排序的情况下,这些差异才会起作用。我不能给出一个详细的列表,因为有许多动态数据结构对于不同的操作(“添加”、“删除”、“查找”)表现出不同的性能特征,因此它们不能放在同一个屋顶下

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

因此,总结一下:

  • 如果您需要保证最大内存使用率,那么除了阵列之外别无选择
  • <>如果您的数据大小有一个硬上限,请考虑使用数组。对于主要需要添加/删除操作(保持数组不排序)和主要需要查找操作(保持数组排序)的问题,数组非常适合,但不能同时用于这两种问题
  • 如果您没有硬性的上限,或者如果您需要所有的add/remove/find都是快速的,请使用适当的动态结构

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

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

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

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

    大多数DS都是动态DS


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

    简单提示

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

    • 能够有效地添加、删除或修改元素
    • 柔性尺寸
    • 有效利用资源–因为资源是在运行时根据需要分配的
    • 对元素的访问速度较慢(与静态数据结构相比)
    静态数据结构具有以下特征:

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

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

    在某种程度上,列表只是一棵退化树。你可以说有两种数据结构,分块的和基于节点的(以及这两种数据结构的各种混合体)。当您添加元素N+1时,您没有理由不能编写一个“BoundedList”类,该类将生成错误(或其他任何错误)。“但我同意这并不完全是一种基本的数据结构——更像是一种黑客行为。”德鲁:你在这两方面都是正确的。说实话,我开始打算写两种结构,不写树和图形,但我认为肯定有人会纠正我。看起来你绕不开那个:-)。至于有界列表,我想你会同意,处于原始问题所隐含的知识水平的人从被告知这一技术性问题中毫无收获。你可以从列表中构建图形:节点之间的链接列表和节点列表。类(或c中的结构)也是一个非常重要的静态结构。