Algorithm 时间复杂度算法分析

Algorithm 时间复杂度算法分析,algorithm,time-complexity,Algorithm,Time Complexity,我已经写了一个函数,合并两个链表。(请注意,该函数基于预先给定的代码,以防您想知道我为什么调用函数节点(i)) 第一部分O(n) 第二部分O(n) 总体复杂度O(n) 还是O(n^2),因为我遍历列表两次?遍历两次只是一个常数乘数。只要乘数不依赖于n,它仍然是O(n)。编辑:但是,请确保插入到其他列表中的时间是恒定的。如果执行时间与另一个列表的大小成正比,那么,我想你可以看到接下来会发生什么。因为你遍历了两次列表,它是O(2n)。。哪个是O(n)。它是线性增长 此外,在大多数编程语言中,集合的长

我已经写了一个函数,合并两个链表。(请注意,该函数基于预先给定的代码,以防您想知道我为什么调用函数
节点(i)

第一部分O(n) 第二部分O(n)

总体复杂度O(n)


还是O(n^2),因为我遍历列表两次?

遍历两次只是一个常数乘数。只要乘数不依赖于n,它仍然是O(n)。编辑:但是,请确保插入到其他列表中的时间是恒定的。如果执行时间与另一个列表的大小成正比,那么,我想你可以看到接下来会发生什么。

因为你遍历了两次列表,它是O(2n)。。哪个是O(n)。它是线性增长

此外,在大多数编程语言中,集合的长度已经被跟踪,因此您可以直接提取该属性,而不是重复两次。

O(n^2)算法的示例类似于查找两个数组中元素的交点。它是O(n^2),因为您将从第一个数组中获取第一个元素,并将其与第二个数组中的每个元素进行比较。然后取第二个元素并将其与第二个数组中的每个元素进行比较。重复一遍


值得思考的是,您可以通过散列一个数组中的所有元素(即O(n))将上述示例转换为O(n),然后检查第二个数组中的每个元素(也就是O(n))

一个简单的方法是使用不同的n值运行代码。例如,尝试10、100、1000、10000。。。直到你得到不平凡的时光。当你把n乘以10,时间会发生什么变化?如果n*10=>time*10,则为O(n)。如果n*10=>time*100,则为O(n2)。在这两者之间,它可能是O(n logn)。

来自一个学术的p.O.v.和一个大的Oh符号p.O.v.这是100%正确的。我认为值得注意的是,对于比较两个O(n)算法,每n个原子操作的数量也很有趣(对于原子,在这种情况下,请考虑(浮点)运算、逻辑运算和分支)
public SLL mergeUnsorted(SLL otherList)
{
    // find length of this list
    int length = 0 ;
    Iterator itr = this.iterator() ;
    while (itr.hasNext())
    {
        Object elem  = itr.next() ;
        length++ ;
    }

    // get each node from this list and
    // add it to front of otherList list
    int i = length -1 ;
    while (i >= 0)
    {
        // returns node from this list
        SLLNode ins = node(i) ;

        ins.succ = otherList.first ;
        otherList.first = ins ;
        i-- ;
    }
    return this ;
}