简单算法复杂性

时间:2015-05-12 11:25:51

标签: java algorithm complexity-theory code-complexity

我有一个算法,我需要帮助找到它的复杂性(最可能的上限)

for(int i = 0; i < n/2; i++)
    for(int j = 0; j < n/4; j++)
        for(int k = 0; k < n; k++)
            x++;

我的分析是,如果n不会在每个for循环中被分割,那么它将是O(n^3)。这种复杂性仍然适用,因为每个&#34; for循环&#34;将每个操作减少到O(log n)复杂度,因为它在每次循环执行时将n除以n,使其变得越来越小(至少小于O(n))。

我会说答案在O(log n)O(n^3)之间。你能帮助我做出最严格的约束吗?

3 个答案:

答案 0 :(得分:3)

从内循环开始:

for(int k = 0; k < n; k++)
    x++;

显然是O(n)。

现在上面有一层:

for(int j = 0; j < n/4; j++)

是O(n),因为j需要 n / 4 才能达到 n ,我们知道O(n / 4)= O(n)< / p>

和外部循环一样是O(n)。所以复杂性是O(n^3) ,因为你有三个嵌套循环,每个循环都有O(n),而它们之间没有相互影响。< /强>

答案 1 :(得分:3)

假设每个步骤需要时间C. 对于k循环,所用时间为C n。 对于j循环,完成迭代所花费的时间是(C n) n / 4 = C (n ^ 2)/ 4 对于i-loop,完成迭代所花费的时间是(C *(n ^ 2)/ 4) n / 2 = C (n ^ 3)/ 8

所以总时间=(C / 8)*(n ^ 3)

由于C / 8是常数,因此在考虑Big-O表示法时可以忽略它。 因此,时间复杂度= O(n ^ 3)。

答案 2 :(得分:2)

<div id="player"><a href="rtsp://...">RTSP Link</a></div>

<script type="text/javascript">
    jwplayer("player").setup({
        sources: [{
            file: "rtmp://..."
        },{
            file: "http://..."
        }],
        rtmp: {
            bufferlength: 3
        },
        fallback: false
    });
</script>

因此总复杂度为for(int i = 0; i < n/2; i++) --> n/2 for(int j = 0; j < n/4; j++) --> n/4 for(int k = 0; k < n; k++) --> n x++; ,即O((n^3)/8)