我正在尝试学习Big O分析,我想知道是否有人可以让我知道我是否正确地使用这两个例子(如果我不是,我哪里出错?)。我得到第一个是O(N ^ 2),第二个是O(N)。我如何获得它们的细分在下面的代码中。
第一个例子
public void sort(Integer[] v) {
//O(1)
if(v.length == 0)
return;
//O(N)*O(N)*O(1)
for(int i = 0; i < v.length; ++i)
{
for(int j = i + 1; j < v.length; ++j )
{
if(v[j].compareTo(v[i]) < 0)
{
Integer temp = v[i];
v[i] = v[j];
v[j] = v[i];
}
}
}
}
第二个例子
public void sort(Integer[] v){
TreeSet<Integer> t = new TreeSet<>();
//O(N)
for(int i = 0; i < v.length(); ++i)
{
t.add(v[i]);
}
int i = 0;
//O(N)
for(Integer value : temp)
{
v[i++] = v;
}
}
感谢您的帮助!
答案 0 :(得分:0)
你是对的 - 第一个是O(N^2)
,因为你有一个循环嵌套在另一个循环中,每个循环的长度取决于输入v
。如果v
的长度为2,则您将进行4次交换。如果v
的长度为8,则执行64次。
第二个是第二个实际上是O(n log(n)) - 参见对原帖的评论。 O(N)
,因为你已经迭代了输入,你的循环包含任何迭代或昂贵的操作。
答案 1 :(得分:0)
你的第一个例子是O(N ^ 2),你是对的。
你的第二个例子不是O(N),所以不是正确。
是O(N)* O(log N)+ O(N)
O(N)第一循环
O(log N)插入集合
O(N)第二循环
最后你有O(N * log N + N),取更高的值,所以答案是 O(N * log N)
<强>被修改强>
顺便说一句,Big O表示法不依赖于编程语言