如何在算法中制定比较次数?

时间:2017-05-10 19:39:24

标签: algorithm for-loop if-statement time-complexity asymptotic-complexity

我正在接受面试准备课程,因为我完全是自学成才。我的导师希望我在算法中表达比较次数,大概是在公式中。

他给我的例子是计数排序,所以它有三个循环;两个在同一范围内,一个嵌套。嵌套循环中也可能进行三次比较。

A) 我知道在for循环中:

for(var i = 0; i < n; i++)

将进行n次比较。 使用嵌套循环:

for(var i = 0; i < n; i++){
    for(var y = 0; y < n; y++){}
}

有n ^ 2个比较。

b)中 考虑两个if子句有三个潜在的比较,它看起来像这样:

for(var i = 0; i < n; i++){
    for(var y = 0; y < n; y++){
        if(array[y] < target_values){}
        else if(array[y] == target_values && y <i ){}
    }
}

此时最坏情况不是n * 3n而最佳情况是n * 2n吗? 如果我们在上面的外部循环范围内添加第三个循环,那么不会有n * 3n + n个比较,最坏的情况是这个算法?最佳情况n * 2n + n?

1 个答案:

答案 0 :(得分:1)

  • 第一个循环:n(内圈的每n次重复,您将in进行比较。
  • 第二个循环:n ^ 2
  • if条件:n ^ 2

如果始终执行else子句(即所有元素&gt; = target_values):

  • array [y] == target_values:n ^ 2

如果else if first子句始终为true(即所有元素== target_values):

  • y&lt;我:n ^ 2

最坏情况下4*n^2 + n的总和。
为了最好的情况,所有元素都小于target_values,并且您进行了2*n^2 + n次比较。

此解决方案假定了以下几点:

  • 无需与&amp;&amp;进行比较,这通常是正确的
  • loop unrolling