当前位置: 首页 > 面试题库 >

为什么典型的数组列表实现不是双端的?

汪晨
2023-03-14
问题内容

为什么通常不将ArrayLists实现为双端的,这样可以支持在正面和背面快速摊销插入?

使用后者比使用前者有任何不利之处吗?

(我不是在谈论Java -我还没有看到双端数组列表是其他任何语言中的默认值,但是Java只是一个很好的例子。)

*编辑:我最初称它们为“阵列双端队列”,但这对我来说是一个误解;我不是在谈论队列,而是双端数组列表。


问题答案:

ArrayList很简单;条目从0开始,您可以在结尾添加内容(这可能会使数组变长),但列表中的条目#X始终为backing_array[X]

ArrayDeque会更复杂;除了必须跟踪序列的开始(因为不再保证从0开始,除非您希望进行O(N)个移位/不移位)之外,您还必须担心另一端是“空”。这种额外的复杂性是有代价的。在更常见的情况(列表)中,RTL仍然必须在双端队列中进行所有必要的检查和索引数学运算,从而无缘无故降低应用程序运行速度。条目#X变为backing_array[start+X],并且边界检查对它们也具有额外的数学意义。

因此,除非确实需要双端队列功能,否则至少在弄乱数组时,坚持使用列表会更简单有效。



 类似资料:
  • 我现在想要一个数据结构,就像一个有索引的Deque。因此,它应该有O(1)在前面和后面添加和删除元素,以及O(1)基于索引访问元素。这并不难想象一个适合这种情况的设置。 ArrayDeque似乎是一个自然的选择。但是,ArrayDeque不实现List。由于底层数据结构是一个数组,是否有充分的理由不允许索引? 还有,更实用的是,有人知道有哪个图书馆在做我想做的事情吗。据我所知,Apache Com

  • 我想实现一个具有以下约束的双端优先级队列: > 需要在固定大小的数组中实现。例如100个元素。如果在数组已满后需要添加新元素,则需要删除最旧的元素 需要最大和最小的O(1) 如有可能,插入O(1) 如果可能,去掉O(1)中的最小值 如果可能,清除O(1)中的空/初始化状态 O(1)中当前数组中元素的个数 我希望 O(1) 用于上述所有 5 个操作,但不可能在同一实现中对所有这些操作使用 O(1)。

  • 这是一个Springboot项目。代码片段如下所示。在第59行,显示是

  • 从Joshua Bloch的Effective Java中, > 数组与泛型类型有两个重要的区别。第一个数组是协变的。泛型是不变的。 协变简单地说,如果X是Y的子型,那么X[]也将是Y[]的子型。数组是协变的,因为字符串是对象的子类型,所以 不变简单地说,不管X是不是Y的子类型, 我的问题是为什么决定在Java中使数组是协变的?还有其他的SO帖子,比如为什么数组是不变的,但是列表是协变的?,但它们

  • 问题内容: 当实现像队列这样的FIFO时,我的教练总是建议我们将其表示为圆形数组,而不是常规数组。为什么? 是因为在后者中,我们最终将在数组中包含垃圾数据吗? 问题答案: 如果您使用固定数量的Array-Slots / Elements,则以循环方式回收插槽比较容易,因为您不需要重新排列Elements的顺序。每当第一个Element以类似Array的方式移除时,您都必须将剩余的Elements向

  • 问题内容: 例: Python是(非常)面向对象的,我不理解为什么对象不继承“ len”功能。另外,我一直在尝试错误的解决方案,因为它对我来说似乎是合乎逻辑的 问题答案: Guido的解释在这里: 首先,出于HCI的原因,我选择len(x)而不是x.len()(def len ()来得晚)。实际上,HCI有两个相互交织的原因: (a)对于某些运算,前缀表示法比后缀读得更好-前缀(和infix!)运