索引和顺序数据结构之间的区别

问题描述

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

解决方法

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

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

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

以一个示例为例,该示例如何根据实现的不同而有所不同,出于明显的性能原因,Python中的列表在内部实现了直接访问,除了由用户使用索引而不是next方法进行访问之外。

,

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

“已索引”表示存在与数据结构关联的索引,可用于引用数据结构的元素,最基本的示例是数组,该数组通过整数偏移量或{{ 1}},由键值索引。注意,这忽略了具有自然顺序的数据结构的感觉。我们可以看到数组具有自然顺序,但是Map没有。

“顺序”表示数据结构具有可用于对数据结构的元素进行操作排序的顺序。从某种意义上说,这应该是自然顺序,但是该术语也可能意味着对数据结构施加了可以进行迭代操作的顺序。

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

对于两个引用的类型findFirstHashSet,由于它们是实现类型,因此这些术语可用于描述数据结构的一般属性,或者可用于描述以下属性:实施。我不确定这是否有用,因为实现方式可能会发生变化。

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

,

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

索引数据结构

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

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

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

顺序数据结构

另一方面,在计算机科学领域,are not clearly defined根据实现的不同,它们在读写操作上具有不同的时间复杂度,但是大多数情况下-从来没有 O ( 1)。

在大多数情况下,顺序数据结构是通过以下方式实现的:

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