难道不能插入O(n)而不是O(1)或O(n)插入未排序的链表吗?

时间:2015-02-07 01:49:41

标签: java algorithm for-loop linked-list runtime

这属于stackoverflow.com/help/on-topic的“软件算法”,在本例中是一个软件算法,用于将项目添加到未排序的数组列表中。

这是我们在课堂上关于不同数据结构上的操作运行时间的图表 enter image description here

我想关注的是将值插入未排序的数组列表中。这是我们的代码

 public void insert(E value) {
    insertAtIndex(size, value);
}
public void insertAtIndex(int index, E value) {
    if (index < 0 || index > size) {
        throw new IndexOutOfBoundsException("index: " + index);
    }
    if (size == 0) {
        ListNode<E> newNode = new ListNode<E>(value);
        front = back = newNode;
    }
    else {

        if (index == 0) {
            ListNode<E> newNode = new ListNode<E>(value, front);
            front = newNode;
        }
        else {
            ListNode<E> current = nodeAt(index - 1);
            ListNode<E> newNode = new ListNode<E>(value, current.next);
            current.next = newNode;
            if (index == size) {
                back = newNode;
            }
        }       

    }
    size++;
}
 private ListNode<E> nodeAt(int index) {
    ListNode<E> current = front;
    for (int i = 1; i <= index; i++) {
            current = current.next;
    }
    return current;
}

当你对insert方法进行运行时分析时,它不仅仅是O(n),而不是O(1)还是O(n)?我得到插入方法如何在O(1)中运行。如果size == 0,则只需执行两次快速操作,创建新节点并将其分配给前端。

然而,就运行时分析而言,https://academics.tjhsst.edu/compsci/CS2C/U2/bigoh.html,当你评估if if分支是否在索引处时,你不应该“假设最坏的情况,因此if / else的运行时间将会是测试的运行时间和最坏情况声明的运行时间的总和“。如果你这样做,你会看到最糟糕的情况是在else分支中,因为它涉及在O(n)中运行的nodeAt方法。

因为这不会整个insertAtIndex和insert方法在O(n)中运行,而不是O(1)?从我在图表中看到的情况来看,O(1)将被解释为正确的可能性。但是从这个分析来看,O(n)应该是唯一的可能性。

1 个答案:

答案 0 :(得分:0)

是的,您的插入代码在O(n)中运行。要在O(1)中运行,它应该在索引0而不是在列表的末尾插入。

一般来说,可以在O(f)中完成某些事情的声明并不是每个实现都是O(f)的声明,而是最优实现是O(f)。

您遇到的第二个困惑是表格中的条目“O(1)或O(n)”。它们对应于未排序的链表(因此插入可以在索引0处插入)或排序(因此插入必须找到正确的插入点)。