Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入不应该只是O(n)而不是O(1)或O(n)插入到未排序的链表中吗?_Java_Algorithm_For Loop_Linked List_Runtime - Fatal编程技术网

Java 插入不应该只是O(n)而不是O(1)或O(n)插入到未排序的链表中吗?

Java 插入不应该只是O(n)而不是O(1)或O(n)插入到未排序的链表中吗?,java,algorithm,for-loop,linked-list,runtime,Java,Algorithm,For Loop,Linked List,Runtime,这属于stackoverflow.com/help/on-topic中的软件算法,在本例中,是一种将项添加到未排序数组列表的软件算法 这是我们在课堂上制作的关于不同数据结构上操作运行时的图表 我想重点讨论的是将值插入到未排序的数组列表中。下面是我们这样做的代码 public void insert(E value) { insertAtIndex(size, value); } public void insertAtIndex(int index, E value) { i

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

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

我想重点讨论的是将值插入到未排序的数组列表中。下面是我们这样做的代码

 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方法进行运行时分析时,它不就是开的,不是O1或开的吗?我了解了插入方法如何在O1中运行。如果size==0,则只需执行一两个快速操作,创建新节点,并将其分配给front

然而,在运行时分析方面,当您评估insert at index的if-else-if分支时,您不应该假设最坏的情况,因此if/else的运行时间将是测试的运行时间和最坏情况语句的运行时间之和。如果这样做,您会发现最坏的情况是在else分支中运行,因为它涉及在上运行的nodeAt方法


因此,整个insertAtIndex和insert方法不是在O1上运行吗?从图表中我看到,O1将被解释为一种正确的可能性。但是从这个分析来看,On应该是唯一的可能性。

是的,您的插入代码在On中运行。要在O1中运行,它应该插入索引0,而不是列表的末尾

一般来说,在Of中可以完成某些事情的语句不是每个实现都是的语句,而是最佳实现的语句


第二个困惑是关于表中的O1或On条目。它们对应于未排序的链表,以便插入可以在索引0处插入,或进行排序,以便插入必须找到正确的插入点。

实际上,如果要这样做,则nodeAt2是O2。。nodeAt3是O3..,以此类推。你想得太多了。作为程序员,我们尽量避免思考。你可以保留一个指向列表最后一个元素的指针。这避免了对nodeAtindex-1的调用,并立即在末尾插入新元素。@此实现没有右二列的后向指针。@Qwertyzw定义起来非常困难。这门课的重点不是数据结构和算法,让你思考运行时、数据结构、做某事的最佳方式等等……你所画的算法运行在上面,而不是O1,因为它需要每次遍历列表中的所有元素。是的,我怎么会错过未排序与排序的部分。。。。。。所以只关注细节,却忽略了大局