在Java上下文中说话。如果我想在ArrayList
或link edList
中间插入,我被告知Arraylist
将执行得很糟糕。
我理解这是因为,我们需要移动所有元素,然后进行插入。其顺序应为n/2,即O(n)。
但是linkedList
不也是这样吗。对于链表,我们需要遍历到找到中间位置,然后进行指针操作。在这种情况下,也需要O(n)时间。不是吗?
谢啦
我认为,在分析复杂性时,您需要考虑您正在使用的度量。在ArrayList
中,您的度量是shuffling
,这只是赋值。但这是一个相当复杂的操作。
另一方面,你使用的是一个链接列表
,你只是在寻找参考。实际上,您只执行一次插入。因此,虽然算法的复杂度会相似,但在O(n)
时间执行的实际过程是不同的。对于ArrayList
,它执行大量内存操作。对于链接列表
,它只是在读取。
对于那些说他不了解LinkedList的人
LinkedList的开头只有一个指针,结尾只有一个指针。它不会自动知道你要删除的节点后面的节点(除非它是一个双链接列表),所以你需要遍历列表,从创建临时指针开始,直到你到达你要删除的节点之前,我相信OP正在讨论这个。
这里的原因是链表中的元素没有实际的移动。链表由节点组成,每个节点都包含一个元素和指向下一个节点的指针。在列表中插入元素只需要几件事:
如果你曾经做过一系列的回形针,你可以把每一个回形针看作是它的链条的开始,以及它后面所有的回形针。要把一个新的回形针插入链条,你只需要在新的回形针要去的地方断开回形针,然后插入新的回形针。一个LinkedList
就像一个回形针链。
一个ArrayList
有点像一个碉堡或一个mancala板,每个隔间只能容纳一件物品。如果你想在中间插入一个新的元素(并且保持所有元素的顺序相同),那么你必须在那个位置之后移动所有的东西。
链表中给定节点之后的插入是恒定的时间,只要你已经有了对该节点的引用(Java中有一个ListIterator
),到达该位置通常需要与节点位置成线性的时间。也就是说,到达_n_th节点需要n个步骤。在数组列表(或数组,或任何基于连续内存的结构,真的)中,列表中_n_th元素的地址只是(第一个元素的地址)n×(元素的大小),这只是一点点算术,我们的计算设备支持快速访问任意内存地址。
好吧,关于LinkedList和ArrayList有很多讨论,但当我在《用Java思考》中看到这个描述时,我仍然感到困惑: LIKEDList还实现了基本的列表接口,如ARARYLIST DO,但是它比ARARYList更有效地执行某些操作(列表中的插入和删除)。 我不知道为什么它强调“在列表的中间”,我想在列表的开头插入时,ArrayList也需要转移后面的元素,而且它比LinkedList快吗
问题内容: 我到处搜寻,但是没有找到可能。 我有这个MySQL查询: 字段ID具有“唯一索引”,因此不能有两个。现在,如果数据库中已经存在相同的ID,我想对其进行更新。但是我真的必须再次指定所有这些字段,例如: 要么: 我已经在插入中指定了所有内容… 需要特别说明的是,我想使用变通方法来获取ID! 我希望有人能告诉我最有效的方法是什么。 问题答案: 没有其他方法,我必须两次指定所有内容。首先是插入
问题内容: 几个月前,我从关于Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新: 我现在已经切换到PostgreSQL,显然这是不正确的。它指的是所有正确的表,因此我认为这是使用不同关键字的问题,但是我不确定在PostgreSQL文档的哪个地方覆盖了这个问题。 为了澄清,我想插入几件事,如果它们已经存在,请对其进行更新。 问题答案: 自9.5版起的Postg
我想知道如何一次将数据批量插入MySQL数据库,我不知道怎么做。根据mvc单击提交按钮时插入表数据。 和来自另一个表我想将所有数据添加到另一个表中,和是只读的 检查这张照片 milkload jsp页面 Milkload模型类 MilkLoadDAO类
问题内容: 当使用“ ALTER TABLE tab ADD col”时,新列将添加到表的末尾。例如: 桌子会变成 但是,正如我的示例列的命名所暗示的那样,我实际上希望表最终像这样: 在COL_4之前使用COL_3。 除了从头开始重建表之外,是否还有任何标准的SQL可以完成工作?但是,如果没有标准的SQL,我仍然可以使用一些与供应商相关的Oracle解决方案,但是最好还是使用标准解决方案。 谢谢。
如何插入双引号 2.创建要插入该表的存储过程。 3.使用此查询插入的数据: 它的作品!!! 4.以下组合全部失败。当双引号变成单引号时,反之亦然 如何使用存储过程插入上述数据??