索引数据结构和顺序数据结构之间的差异



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

在java中,这些术语没有固定的含义。这些含义将从日常英语用法和你列出的类型的检查中获得。

"Indexed"意味着有一个与数据结构相关联的索引,该索引可用于引用数据结构的元素,最基本的例子是数组,该数组按整数偏移量索引,或Map,该数组由键值索引。注意,这省略了具有自然顺序的数据结构的意义。我们可以看到数组有一个自然的顺序,但Map没有。

"顺序"意味着数据结构具有可用于对数据结构元素的操作进行排序的顺序。有一种感觉,这应该是一个自然的顺序,但这个术语也可能意味着有一个强加在数据结构上的顺序,可以实现迭代操作。

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

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

请注意,"indexed"并不意味着"sequential",除非索引值本身是连续的。

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

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

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

例如,Python中的列表在内部实现了直接访问,这是出于明显的性能原因,除了由用户使用索引而不是下一个方法访问之外。

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

索引数据结构

基于更通用的随机/直接访问数据结构概念。

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

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

顺序数据结构

另一方面,在计算机科学领域没有明确定义,根据实现的不同,它们的读写操作具有不同的时间复杂性,但大多数情况下,它从来都不是O(1(。

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

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

最新更新