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中列出的问题。
答案 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 == 5
和j == 1
,那么vals[i-1][j-1] != 0
和while
循环将只迭代一次; - 此事件以概率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)
。