以下代码的时间复杂度是多少?

时间:2015-06-12 22:27:28

标签: time-complexity

int rand7()
{
    int vals[5][5] = {
        { 1, 2, 3, 4, 5 },
        { 6, 7, 1, 2, 3 },
        { 4, 5, 6, 7, 1 },
        { 2, 3, 4, 5, 6 },
        { 7, 0, 0, 0, 0 }
    };

    int result = 0;
    while (result == 0)
    {
        int i = rand5();
        int j = rand5();
        result = vals[i-1][j-1];
    }
    return result;
}

此解决方案解决了详细信息here中列出的问题。

1 个答案:

答案 0 :(得分:2)

最坏情况下的运行时间将是无限的,如果你继续获得i j vals[i-1][j-1] == 0,那么while循环永远不会终止。这种情况几乎肯定不会发生。

T表示rand7()预期运行时间,我们有以下观察结果:

  • 如果i == 1, 2, 3, 4,则无论j是什么,我们都会vals[i-1][j-1] != 0,因此while循环在这种情况下只会迭代一次; - 此事件的概率为4/5
  • 如果i == 5j == 1,那么vals[i-1][j-1] != 0while循环将只迭代一次; - 此事件以概率1/25
  • 发生
  • 在剩下的情况下我们有vals[i-1][j-1] == 0,因此我们需要重新开始使用新的随机值(i, j)。 - 发生这种情况的概率为4/25

从上面的观察,我们有以下关系:

T = 4/5 * 1 + 1/25 * 1 + 4/25 * (1 + T)

因此预期的运行时间为T = 25/21 = O(1)