【问题标题】:Difference between indexed and sequential data structure索引和顺序数据结构之间的区别
【发布时间】:2020-09-29 17:11:59
【问题描述】:

索引数据结构和顺序数据结构之间到底有什么区别?例如,HashSet 是索引数据结构,而 TreeSet 是顺序的。

【问题讨论】:

  • 索引数据结构的逻辑顺序不一定与物理顺序相同。我不认为 TreeSet 是顺序的。
  • 我认为 indexd 表示下划线实现使用数组,而顺序使用链表。

标签: java oop data-structures


【解决方案1】:

在 java 中,这些术语没有固定的含义。这些含义将通过日常英语用法以及对您列出的类型的检查获得。

'Indexed' 意味着有一个与数据结构相关联的索引,可以用来引用数据结构的元素,最基本的例子是一个数组,它以整数偏移量为索引,或者@987654321 @,由键值索引。请注意,这忽略了数据结构具有自然顺序的感觉。我们可以看到数组具有自然顺序,但 Map 没有。

'Sequential' 意味着数据结构有一个顺序,可用于对数据结构的元素进行排序操作。有一种感觉,这应该是一种自然顺序,但该术语也可能意味着对数据结构施加了一种允许迭代操作的顺序。

在这两种情况下,含义都不应包括对特定操作的引用。数据结构可能支持读取、写入或迭代,但不一定支持所有这些。例如,顺序数据结构可以支持findFirst 操作,而不允许将迭代作为外部操作。

对于HashSetTreeMap这两个引用类型,由于它们是实现类型,所以这些术语可以用来描述数据结构的一般属性,也可以用来描述实现的属性。我不确定这是否很有用,因为实现可能会发生变化。

请注意,“索引”并不意味着“顺序”,除非索引值本身是顺序的。

【讨论】:

    【解决方案2】:

    使用索引时,您可以直接在数据结构中的任何位置读取或写入数据。如果访问是顺序的,则必须遍历所有元素,直到找到想要的元素(例如迭代 next 方法)。

    这也意味着索引结构的访问时间是恒定的,无论其大小如何,而顺序结构的访问时间会随着大小的增加而增加。

    这适用于假设索引访问的内部实现(实际上只是可以以多种方式实现的访问操作)基于某种映射,并且顺序结构使用某种链表。这应该与所提问题的精神保持一致。

    举个例子,这取决于实现会如何不同,Python 中的列表在内部实现直接访问,出于明显的性能原因,除了由用户使用索引访问,而不是使用 next 方法。

    【讨论】:

      【解决方案3】:

      让我们在更广泛的数据结构领域回答这个问题,而不是专注于 Java 或任何其他实现。

      索引数据结构

      基于更通用的 - Random/Direct Access 数据结构概念。

      使用这些数据结构的主要好处是,它们对于读取和写入操作都有O(1) 时间复杂度。

      例如,当您定义数组时,大小相同的连续链,在物理RAM 中分配了小内存片(块),并且这些片中的每一个都具有唯一性,但连续链接的内存地址。这意味着,例如,如果array[0] 存储在0100X001,如果插槽占用 1 位,array[1] 将被分配到0100X010(如果更多,则相应地您必须将该位数添加到每个插槽);

      顺序数据结构

      另一方面,are not clearly defined 在计算机科学领域中,根据实现的不同,它们的读写操作的时间复杂度不同,但大多数情况下 - 它永远不会O(1) .

      在大多数情况下,顺序数据结构的实现方式如下:

      • 除第一个元素外,每个元素都有对其直接前身的引用;
      • 除最后一个元素外,每个元素都有对其直接后继元素的引用。

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        • 2014-08-27
        • 2013-01-03
        • 1970-01-01
        • 2014-04-07
        相关资源
        最近更新 更多