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

LinkedList开头插入的时间复杂度

曾阳飙
2023-03-14

我对在LinkedList开头插入元素的时间复杂性感到好奇。我知道LinkedList本身会将现有元素向右移动一个索引,但要做到这一点,它会进行与列表中现有元素一样多的迭代吗?

另外,最好的方式是在开头插入offerFirst吗?

共有2个答案

舒俊雄
2023-03-14

在列表前面插入一个项目只会做两件事(都非常轻量级):

1)更新HEAD指针(这是告诉我们第一个元素在哪里的指针)

2)将新元素的NEXT指针设置为旧的HEAD元素。

这是一个非常轻量级的操作,代表了链接列表的优势之一。

我对Java不是很了解,但是由于offerFirst旨在将一个元素添加到列表的前面,这可能是最好的方法

钱欣然
2023-03-14

添加到LinkedList前面的时间固定:

public void addFirst(E e) 
{
    addBefore(e, header.next);
}

private Entry<E> addBefore(E e, Entry<E> entry) 
{
    Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
    newEntry.previous.next = newEntry;
    newEntry.next.previous = newEntry;
    size++;
    modCount++;

    return newEntry;
}

它没有需要移动元素的数组作为支持。正如您所看到的,需要做的只是一组引用重新分配。

编辑:

为了解决您对offerFirst的担忧,您只需:

public boolean offerFirst(E e) 
{
     addFirst(e); 

     return true;
}

因此,正如我在评论中所说的,只有当您想要返回boolean时才使用它。

 类似资料:
  • 我主要是想理解在堆中插入一个新元素的大O和Omega背后的原因。我知道我可以在网上找到答案,但我真的喜欢有一个彻底的理解,而不是仅仅在网上找到答案,只是一味地记忆。 例如,如果我们有以下堆(以数组格式表示) 如果我们决定插入一个新元素“4”,那么我们的数组现在将如下所示 它将被放置在索引9中,由于这是第0个基于索引的数组,它的父数组将是索引4,也就是元素5。在这种情况下,我们不需要做任何事情,因为

  • 我偶然看到了这篇关于动态数组时间复杂性的文章,它澄清了很多。然而,我有一个基于案例的问题。假设我有一个总共有6个元素的动态数组,假设删除了第4个元素。在这种情况下,删除复杂度将是,这将是,因为最后两个元素只需要向上移动。这是正确的吗?我有一些文章给出了最坏情况下的复杂度,说如果删除最顶部的元素,那么时间复杂度将是。我找不到任何关于从中心移除/插入项目的内容。

  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 我对这两种算法的时间复杂度感到困惑。 usingTreeMap算法的时间复杂度正确吗?我知道在treemap中插入时间是log(n ),但是如果我们遍历一个包含10个元素的数组,它会变成nlog(n)吗?

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s