【问题标题】:How to determine how often a statement in a nested loop is executed?如何确定嵌套循环中的语句执行的频率?
【发布时间】:2016-11-11 13:01:07
【问题描述】:

我正在阅读有关使用递归关系确定嵌套循环复杂性的一段文本。在这个特定的示例中,我试图确定计数变量将作为 n 的函数递增多少次。

这是我正在分析的循环:

for (int i = 1; i <= n; i++) {
     int j = n;
     while (j > 0) {
           count++;
           j = j / 2;
     }
}

我想我理解第一行将简单地等同于 n,因为它只针对 n 的每个值执行,但它的其余部分是我遇到的麻烦。我认为答案类似于 n(n/2) ,只是这个例子使用的是整数除法,所以我不确定如何用数学表示。

我已经在纸上手动运行了几次循环,所以我知道对于 1-6 的 n 值,计数变量应该等于 1、4、6、12、15 和 18。我似乎无法想出公式...任何帮助将不胜感激!

【问题讨论】:

    标签: java algorithm complexity-theory nested-loops


    【解决方案1】:

    循环在[1, n] 范围内执行n。对于设置为n的j变量,它每次除以2,因此内部循环执行的次数为floor(l2(n)) + 1,,其中l2是二进制日志函数。将所有这些值从 1 加到 n(乘以 n)。

    【讨论】:

    • +1 将其表示为floor(l2(i)) + 1 可能会更清楚一些(j 每次通过内部循环都会递减;i 控制内部循环执行的次数)。跨度>
    • 其实我收回了。不是floor(l2(i)) + 1floor(l2(j)) + 1。这是floor(l2(n)) + 1。最终答案只是n 的倍数。
    • 感谢您的帮助!因此,如果我理解正确,我的整个循环将由 n((floor(l2(n)) + 1)?不大于 l2(n)?
    • @Stavrosnco 我刚刚注意到j 总是被定义为n。因此,特德霍普是正确的。很抱歉有任何混淆。
    【解决方案2】:

    内部j 循环将第一个设置位的位置添加到计数中。

    每次除以 2 与右移相同,直到所有位都为零。

    所以,2 在二进制中是 10,内部循环的值为 2。 4 在二进制中是 100,内部循环的值为 3。

    外部循环似乎只是将第一个设置位的位置乘以数字本身。


    这是一个 n = 13 的示例。

    二进制中的 13 是 1101,所以第一个设置位在位置 4。

    4 * 13 = 52。52 是最终答案。

    【讨论】:

      【解决方案3】:

      for (int i = 1; i

      顶部的这个循环经过循环n次

       int j = n;
       while (j > 0) {
             count++;
             j = j / 2;
       }
      

      这里的这个循环经过 循环 log(n) 次,注意它是以 2 为底的对数,因为您每次都除以 2。

      因此,总计数为 n * ceiling(log(n))

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多