当前位置: 首页 > 知识库问答 >
问题:

哪个列表实现最适合从前面和后面删除和插入?

严阳夏
2023-03-14

我正在研究一种算法,它将一小部分对象存储为一大部分对象的子列表。对象本身是有序的,因此需要一个有序列表。

最常见的操作将按频率顺序进行:

  1. 从列表中检索第n个元素(对于任意的n)
  2. 在列表的开头或结尾插入单曲
  3. 从列表中删除第一个或最后一个n个元素(对于一些任意的n)

从中间移除和插入永远不会完成,所以没有必要考虑其效率。

我的问题是,在Java(如LinkedList、ArrayList、Vector等)中,List的哪种实现对这个用例最有效?请解释不同数据结构的实现来捍卫你的答案,以便我做出明智的决定。

谢谢。

笔记

不,这不是家庭作业问题。不,我没有军队研究助理可以为我做这项工作。

共有3个答案

周朗
2023-03-14

出于这个目的,最好的数据结构可能是使用动态数组实现的deque,它基本上是一个ArrayList,它开始将元素添加到内部数组的中间,而不是开始。不幸的是,Java的ArrayDeque不支持查找第n个元素。

然而,自己实现一个(或查找现有的实现)非常容易,然后所描述的所有三个操作都可以在O(1)中完成。

储志业
2023-03-14

我投票支持双重链接列表。http://docs.oracle.com/javase/6/docs/api/java/util/Deque.html

裘安阳
2023-03-14

根据第一个条件(任意访问),您应该使用ArrayList。ArrayList(以及通常的数组)提供固定时间的查找/检索。相比之下,在LinkedList中查找项目需要线性时间。

对于ArrayList,末尾的插入或删除是免费的。LinkedList也可能是这样,但这将是一个特定于实现的优化(否则是线性的)。

对于ArrayList,前端的插入或删除需要线性时间(随着空间的一致重用,这些时间可能会变得恒定,具体取决于实现)。列表前面的LinkedList操作是常量。

最后两种使用情况在某种程度上相互平衡,但最常见的情况肯定是基于阵列的存储。

至于基本的实现细节:ArrayList基本上只是内存的连续部分。如果你知道起点在哪里,你只需要做一次加法就可以找到任何元素的位置。前线的行动成本高昂,因为可能需要转移要素以腾出空间。

LinkedList在内存中是不相交的,由相互链接的节点组成(引用第一个节点)。要找到第n个节点,您必须从第一个节点开始,并遵循链接,直到您到达所需的节点。前面的操作只需要创建一个节点并更新您的开始指针。

 类似资料:
  • 每次我运行我的双链接列表时,除了从列表后面删除外,所有方法都有效。我有一张4,3,9的单子。我从前面拆下(这拿走了4个)。然后,我调用了这个方法,它应该只删除9。相反,当我调用DL列表时,它返回null(这也删除了3)。请帮忙。 下面是代码的其余部分(它扩展了一个接口;生成的代码对于这个问题不是必需的,所以我们没有填写它。也就是说,节点后面的内容无关紧要)正确的代码:

  • 我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用

  • 我的想法是通过在方法中为螺栓打开连接的每个实例创建一个连接,并在时关闭它,从而减少到HBase的连接数量。但是,根据文档,不能保证在分布式模式下调用。 在这之后,我找到了Storm使用hbase-storm-Hbase工作的框架。不幸的是,几乎没有关于它的信息,只有在它的github Repo上的自述。 那么我的第一个问题是,使用storm-hbase进行storm-hbase集成是否是一个好的解

  • Android官网上有Like Executor,ThreadPool和FutureTask,因为AsyncTask被弃用了。关于我以后应该使用哪个API。现在不能使用Kotlin并发,因为我正在学习Java。

  • 本文向大家介绍ajax实现页面加载和内容删除,包括了ajax实现页面加载和内容删除的使用技巧和注意事项,需要的朋友参考一下 ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快,下面是用ajax以数据库fruit表为例写的加载页面和水果的删除,刚开始用ajax可能写起来还是会比较手生,就当是练习好了。

  • 本文向大家介绍jQuery实现列表的增加和删除功能,包括了jQuery实现列表的增加和删除功能的使用技巧和注意事项,需要的朋友参考一下 具体代码如下所示: 总结 以上所述是小编给大家介绍的jQuery实现列表的增加和删除功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!