Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定不可预测非线性迭代算法的时间复杂度_Algorithm_Time Complexity - Fatal编程技术网

Algorithm 确定不可预测非线性迭代算法的时间复杂度

Algorithm 确定不可预测非线性迭代算法的时间复杂度,algorithm,time-complexity,Algorithm,Time Complexity,我不知道我是否正确使用了不可预测的词。但问题是: 我有一张长a宽b的长方形纸。我将继续从它的边上切割正方形,边长等于min(a,b),直到最后一个正方形是单位长度。确定我可以切割的方块数 这是我的算法: #include <iostream> using namespace std; int main() { long long a,b,temp,small,large,res; cin >> a >> b; res = 0;

我不知道我是否正确使用了不可预测的词。但问题是:

我有一张长a宽b的长方形纸。我将继续从它的边上切割正方形,边长等于min(a,b),直到最后一个正方形是单位长度。确定我可以切割的方块数

这是我的算法:

#include <iostream>

using namespace std;

int main()
{
    long long a,b,temp,small,large,res;
    cin >> a >> b;
    res = 0;

    small = min(a,b);
    large = a + b - small;

    while(small > 0 && small != large)
    {
        res = res + large/small;
        temp = large % small;
        large = small;
        small = temp;
    }

    cout << res;
    return 0;
}
#包括
使用名称空间std;
int main()
{
长a,b,温度,小,大,分辨率;
cin>>a>>b;
res=0;
小=最小值(a,b);
大=a+b-小;
while(小>0&&small!=大)
{
res=res+大/小;
温度=大%小;
大=小;
小=温度;
}

cout该算法与计算最大公约数的欧几里德算法非常相似。回想一下,该算法的工作原理是:

  • 从两个数字
    a,b
    开始,假设小于
    a>=b
    。如果
    a==b
    ,则停止
  • 在下一轮中,这两个数字是
    b
    a%b

现在考虑你的算法。它是相同的,除了它是<代码> A -B < /代码>。但是,如果<代码> a<2*b/COD>,这将做同样的事情。如果<代码> a k*b,那么在下一轮中,它只由一个倍数< <代码> b>代码>改变,所以在至多<代码> k< /代码>回合之后,它将收敛到<代码>一% b< /代码>。只是欧几里德算法的一个较慢版本

欧几里德算法的时间复杂度相当快——因为它是重复除法,所以轮数不超过位数

编辑:要在最后一个零件上展开: 要分析时间复杂性,第一个问题是,需要多少轮

如果
a
b
在其(二进制)中有
n
m
位,则启动的简单方法是说明,则不能超过
n+m
轮。因为只要
b
在给定轮中至少是两个,我们将在该轮中用一个数字除以两,因此结果将少一个数字。如果
b
为一,则这是最后一轮

第二个问题是,完成一轮需要多少时间

如果您对“运行时间在位数上最多是多项式”感到满意,那么这一点现在就很清楚了,因为您可以轻松地在位数上对多项式进行除法


我不确定最严密的分析可能是什么。你也许可以做一些双赢的分析来改进这一点,我几乎可以肯定这已经被研究过了,但我不知道参考,对不起。

这个算法非常类似于计算最大公因子的欧几里德算法。回想一下,算法w工作组成员:

  • 从两个数字
    a,b
    开始,假设小于
    a>=b
    。如果
    a==b
    ,则停止
  • 在下一轮中,这两个数字是
    b
    a%b

现在考虑你的算法。它是相同的,除了它是<代码> A -B < /代码>。但是,如果<代码> a<2*b/COD>,这将做同样的事情。如果<代码> a k*b,那么在下一轮中,它只由一个倍数< <代码> b>代码>改变,所以在至多<代码> k< /代码>回合之后,它将收敛到<代码>一% b< /代码>。只是欧几里德算法的一个较慢版本

欧几里德算法的时间复杂度相当快——因为它是重复除法,所以轮数不超过位数

编辑:要在最后一个零件上展开: 要分析时间复杂性,第一个问题是,需要多少轮

如果
a
b
在其(二进制)中有
n
m
位,则启动的简单方法是说明,则不能超过
n+m
轮。因为只要
b
在给定轮中至少是两个,我们将在该轮中用一个数字除以两,因此结果将少一个数字。如果
b
为一,则这是最后一轮

第二个问题是,完成一轮需要多少时间

如果您对“运行时间在位数上最多是多项式”感到满意,那么这一点现在就很清楚了,因为您可以轻松地在位数上对多项式进行除法


实际上,我不确定最严密的分析可能是什么。你可能可以做一些双赢的分析来改进这一点,我几乎可以肯定这一点已经研究过了,但我不知道参考,抱歉。

从代表问题大小的内容开始。最好的情况是从正方形(a=b)开始。从表示问题大小的内容开始。最好的情况是从一个正方形(a=b)开始。很好,它让我想到了欧几里德的gcd。@克里斯:哦,是的……它只是欧几里德的gcd。事实上它是同一个副本。为什么它的较慢版本?我没有得到这个。因为在我看来,欧几里德也以同样的方式交换,
如果(b==0)返回a;返回gcd(b,a%b)
哦,我读的是你的描述,而不是你的代码。对不起,如果你在做
a%b
而不是
a-b
,我想问题是
a-b
,但你做的是
a%b
优化,所以你做得很快。@ChrisBeck:谢谢你的帮助。我一点都没有想到这一点……我我现在要检查欧几里德gcd的时间复杂性证明。上次我看到同样的证明时,它几乎超过了我的头脑;)我希望这次我能抓住它,因为我在不知不觉中实现了欧几里德GCD;)很好的抓住,它让我也想到了欧几里德的GCD。@克里斯:哦,是的……它只是欧几里德GCD。事实上它是同一个副本。为什么它的较慢版本?我没有得到这个。因为在我看来,欧几里德GCD