我编写了一个合并两个链表的函数。 (注意,如果你想知道为什么我正在调用函数node(i)
),该函数基于预先给定的代码。
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 ;
}
第一部分O(n) 第二部分O(n)
总体复杂度O(n)
或是O(n ^ 2),因为我遍历列表两次?
答案 0 :(得分:5)
遍历两次只是一个常数乘数。只要乘数不依赖于n,它仍然是O(n)。编辑:但是,请确保插入其他列表是恒定时间。如果这样做的时间与其他列表的大小成正比,那么,我想你可以看到当时会发生什么。
答案 1 :(得分:3)
因为你遍历了两次列表,所以它是O(2n)..这是O(n)。这是线性增长。
此外,在大多数编程语言中,已经跟踪了集合的长度,因此您只需拉动该属性而不是迭代两次。
答案 2 :(得分:0)
O(n ^ 2)算法的一个例子就是找到两个数组中的元素交集。它是O(n ^ 2)因为你从第一个数组中取出第一个元素并将它与第二个数组中的每个元素进行比较。然后取第二个元素并将其与第二个数组中的每个元素进行比较。重复。
作为深思熟虑,您可以通过散列一个数组中的所有元素(即O(n))将上述示例转换为O(n),然后检查第二个数组中的每个元素(也是O(n) )!
答案 3 :(得分:0)
找到适合自己的一种简单方法是使用不同的n值运行代码。尝试例如10,100,1000,10000,...直到你得到非平凡的时间。当你将n乘以10时,会发生什么?如果n * 10 =>时间* 10,它是O(n)。如果n * 10 =>时间* 100,它是O(n 2 )。在它们之间,它可能是O(n log n)。