找到给定代码的复杂性

时间:2016-11-10 15:05:25

标签: algorithm time-complexity complexity-theory

我正在努力寻找给定代码的复杂性。我认为我正在努力确定正确的复杂性以及如何实际分析复杂性。要分析的代码如下:

    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)。

  

如果我的问题不正确并且可能解释问题,有人可以帮我正确回答问题吗?

1 个答案:

答案 0 :(得分:0)

&#34;最佳案例&#34;数组是空的,你什么也没搜索。

最糟糕的情况是你看每一个元素,因为你从未见过17.所有其他案例都介于两者之间。

if (arr[i]==17){是最热门的路径&#34;代码,意味着它最常运行。

在最糟糕的情况下,它总是会执行n*(n-1)/2次{我认为我做的数学正确',因为即使你设置了found = truereorganize方法也没有#39} ; t知道这一点,并没有结束,并继续搜索,即使你已经扫描了整个阵列。

基本上,没有方法就可以展平代码。你有这个问题。

What is the Big-O of a nested loop, where number of iterations in the inner loop is determined by the current iteration of the outer loop?