java - 如何分析以下代码的增长?
问题描述
我已经知道最坏情况的复杂度是 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))
。ps第一个评论是正确的,第二个if
应该是else if
。
推荐阅读
- java - Gradle:不同JavaCompile任务的输出文件
- arduino - Arduino - 代码是什么意思?
- django - Django-2.x 中的文件上传安全性
- javascript - JQuery - 找出 HTML 标签是什么 $(this)
- python - 检查 Tkinter Widget (OptionMenu) 是否被禁用
- xml - XSLT 转换返回空 XML
- r - 根据 2 个条件合并两个表并将平均值作为结果列输出
- ftp - 如何使用apache camel检查从ftp位置下载的文件是否完成
- ios - Unity - 为什么 iPhone 6 和 7 的触摸输入行为不同?
- python - 使用熊猫根据其他列的值获取最新值