如何分析下面代码的增长?
How to analyze the growth of the following code?
我已经知道最坏情况的复杂度是 N,最好的情况是 Mlog(M),但我只是不知道如何。任何人都可以向我解释为什么会这样,以及不同的输入会导致每种情况吗?
public static Iterable<Integer> topM(int[] a, int M){
int N = a.length;
MinPQ<Integer> pq = new MinPQ<Integer>(M+1);
for(int i = 0; i < N; i++){
if(pq.size() < M)
pq.insert(a[i]);
if(pq.min() <= a[i]){
pq.insert(a[i]);
pq.delMin();
}
}
return pq;
}
复杂度为O(Nlog(M))
。最坏的情况是当数组按升序排序时,在这种情况下每个元素都被插入到队列中。
最好的情况是数组按降序排序,在这种情况下只插入前 M 个元素。最好情况下的复杂度是 O(N+Mlog(M))
。
p.s。第一条评论是正确的,第二条 if
应该是 else if
.
我已经知道最坏情况的复杂度是 N,最好的情况是 Mlog(M),但我只是不知道如何。任何人都可以向我解释为什么会这样,以及不同的输入会导致每种情况吗?
public static Iterable<Integer> topM(int[] a, int M){
int N = a.length;
MinPQ<Integer> pq = new MinPQ<Integer>(M+1);
for(int i = 0; i < N; i++){
if(pq.size() < M)
pq.insert(a[i]);
if(pq.min() <= a[i]){
pq.insert(a[i]);
pq.delMin();
}
}
return pq;
}
复杂度为O(Nlog(M))
。最坏的情况是当数组按升序排序时,在这种情况下每个元素都被插入到队列中。
最好的情况是数组按降序排序,在这种情况下只插入前 M 个元素。最好情况下的复杂度是 O(N+Mlog(M))
。
p.s。第一条评论是正确的,第二条 if
应该是 else if
.