了解给定代码的时间复杂性

时间:2016-05-14 04:47:51

标签: algorithm time-complexity

我正在为代码强制编写simple question代码。它读起来像这样:

Vasya有两双袜子。每天早上,Vasya在上学前都要穿上一双袜子。当他晚上回家时,瓦西亚脱掉旧袜子扔掉了。每隔m天(在数字为m,2m,3m,......的日子)妈妈给Vasya买了一双袜子。她在晚上做得很晚,所以Vasya在第二天之前就不能穿上新袜子了。连续几天过去,直到Vasya袜子用完了?

输入

单行包含两个整数n和m(1≤n≤100;2≤m≤100),用空格分隔。

输出

打印一个整数 - 问题的答案。

我的解决方案是:

int main()
{
    int res,i,n,m;
    cin >> n >> m;

    i = 1;
    res = n;
    while(res >= i*m)
    {
        res++;
        i++;
    }

    cout << res;
    return 0;
}

时间复杂度应该是多少?它绝对不是O(n),因为我们以m为步长增加。它是log n(base m)吗?但是原来的n也随着时间的推移而增加!

请说明理由。

2 个答案:

答案 0 :(得分:1)

RAM computation model中最大的因素是:

while(res >= i*m)
{
    res++;
    i++;
}

边界因素将是:

n + i < i*m因为res从n开始并以与i

相同的速率增长

i*m-i > n

i > n / (m-1)

由于我们在这里处理整数值,因此附加边界将是

i >= 1

算法将随着O(n/m)

而增长

答案 1 :(得分:0)

这是一个非常好的编码...... 为了找到时间复杂度,我们可以在这里忽略n的增量,因为m正在追逐其自身值的增量倍数,如1m,2m,3m,所以我们可以忽略多个增量的额外增量....所以while循环将迭代这里直到m的倍数超过n的值(忽略n的增量).. 而复杂性显然是O(n / m)。 并且对于连续几天的数据,女孩将用尽袜子你可以打印(m * i-res)的值......