【发布时间】:2020-09-29 17:11:59
【问题描述】:
索引数据结构和顺序数据结构之间到底有什么区别?例如,HashSet 是索引数据结构,而 TreeSet 是顺序的。
【问题讨论】:
-
索引数据结构的逻辑顺序不一定与物理顺序相同。我不认为 TreeSet 是顺序的。
-
我认为 indexd 表示下划线实现使用数组,而顺序使用链表。
标签: java oop data-structures
索引数据结构和顺序数据结构之间到底有什么区别?例如,HashSet 是索引数据结构,而 TreeSet 是顺序的。
【问题讨论】:
标签: java oop data-structures
在 java 中,这些术语没有固定的含义。这些含义将通过日常英语用法以及对您列出的类型的检查获得。
'Indexed' 意味着有一个与数据结构相关联的索引,可以用来引用数据结构的元素,最基本的例子是一个数组,它以整数偏移量为索引,或者@987654321 @,由键值索引。请注意,这忽略了数据结构具有自然顺序的感觉。我们可以看到数组具有自然顺序,但 Map 没有。
'Sequential' 意味着数据结构有一个顺序,可用于对数据结构的元素进行排序操作。有一种感觉,这应该是一种自然顺序,但该术语也可能意味着对数据结构施加了一种允许迭代操作的顺序。
在这两种情况下,含义都不应包括对特定操作的引用。数据结构可能支持读取、写入或迭代,但不一定支持所有这些。例如,顺序数据结构可以支持findFirst 操作,而不允许将迭代作为外部操作。
对于HashSet和TreeMap这两个引用类型,由于它们是实现类型,所以这些术语可以用来描述数据结构的一般属性,也可以用来描述实现的属性。我不确定这是否很有用,因为实现可能会发生变化。
请注意,“索引”并不意味着“顺序”,除非索引值本身是顺序的。
【讨论】:
使用索引时,您可以直接在数据结构中的任何位置读取或写入数据。如果访问是顺序的,则必须遍历所有元素,直到找到想要的元素(例如迭代 next 方法)。
这也意味着索引结构的访问时间是恒定的,无论其大小如何,而顺序结构的访问时间会随着大小的增加而增加。
这适用于假设索引访问的内部实现(实际上只是可以以多种方式实现的访问操作)基于某种映射,并且顺序结构使用某种链表。这应该与所提问题的精神保持一致。
举个例子,这取决于实现会如何不同,Python 中的列表在内部实现直接访问,出于明显的性能原因,除了由用户使用索引访问,而不是使用 next 方法。
【讨论】:
让我们在更广泛的数据结构领域回答这个问题,而不是专注于 Java 或任何其他实现。
基于更通用的 - Random/Direct Access 数据结构概念。
使用这些数据结构的主要好处是,它们对于读取和写入操作都有O(1) 时间复杂度。
例如,当您定义数组时,大小相同的连续链,在物理RAM 中分配了小内存片(块),并且这些片中的每一个都具有唯一性,但连续链接的内存地址。这意味着,例如,如果array[0] 存储在0100X001,如果插槽占用 1 位,array[1] 将被分配到0100X010(如果更多,则相应地您必须将该位数添加到每个插槽);
另一方面,are not clearly defined 在计算机科学领域中,根据实现的不同,它们的读写操作的时间复杂度不同,但大多数情况下 - 它永远不会O(1) .
在大多数情况下,顺序数据结构的实现方式如下:
【讨论】: