我正在努力寻找给定代码的复杂性。我认为我正在努力确定正确的复杂性以及如何实际分析复杂性。要分析的代码如下:
public void doThings(int[] arr, int start){
boolean found = false;
int i = start;
while ((found != true) && (i<arr.length)){
i++;
if (arr[i]==17){
found=true;
}
}
}
public void reorganize(int[] arr){
for (int i=0; i<arr.length; i++){
doThings(arr, i);
}
}
问题是:
1)重组方法的最佳案例复杂性及其发生的输入是什么? 2)重组方法的最坏情况复杂性是什么以及它发生了什么输入?
我的回答是:
1)对于重组方法,可能会出现两种可能的最佳情况。第一个是当数组长度为1时,意味着重组和doThings方法中的循环将只运行一次。另一种可能性是当数组的第i项为17时,意味着doThings循环不会在第i次迭代时完全运行。因此,在两种情况下,最佳情况=Ο(n)。
2)最坏的情况是数字17位于数组的末尾并且数字17不在数组中。这意味着数组将遍历n×n次,这意味着最坏的情况将是Ο(n ^ 2)。
如果我的问题不正确并且可能解释问题,有人可以帮我正确回答问题吗?
答案 0 :(得分:0)
&#34;最佳案例&#34;数组是空的,你什么也没搜索。
最糟糕的情况是你看每一个元素,因为你从未见过17.所有其他案例都介于两者之间。
if (arr[i]==17){
是最热门的路径&#34;代码,意味着它最常运行。
在最糟糕的情况下,它总是会执行n*(n-1)/2
次{我认为我做的数学正确',因为即使你设置了found = true
,reorganize
方法也没有#39} ; t知道这一点,并没有结束,并继续搜索,即使你已经扫描了整个阵列。
基本上,没有方法就可以展平代码。你有这个问题。