【问题标题】:Calculating Big O running time计算大 O 运行时间
【发布时间】:2013-02-09 08:21:08
【问题描述】:

您好,我无法找到该算法的运行时间,假设 s = O(logN) 并且 Random_Integer 的运行时间是常数时间:

  1  express N-1 as 2^t * u where u is odd:
  2  for i <-- to s do
  3    a <-- Random_Integer(2, N-2);
  4    if EuclidGCD(a, N) not equal to 1 then
  5         return false;
  6    x sub 0 <-- a^u mod N;
  7    for j <-- 1 to t do
  8        x sub j <-- x^2 sub j-1 mod N;
  9    if x sub j = 1 and x sub j-1 not equal to 1 and x sub j-1 not equal to N -1 then
  10        return false;
  11   if x sub t not equal to one then
  12        return false;
  13 return true;

从内部循环开始,指数模运算需要 n^3 时间,循环运行 n 次迭代,总共 n^4。然后按照我的方式进入外循环,我们有另一个指数模运算,它再次需要 n^3 时间,然后 EuclidGCD 也需要 n^3 时间。最后,外循环也运行 n 次迭代。我相信这些值是正确的,但是我对如何获得总运行时间感到困惑。我也很困惑这两个嵌套循环的运行时间是否应该相乘,以及外部循环中对 ExtendedEuclid 的方法调用是否应该与外部循环的运行时间相乘。我希望这很清楚,感谢您的帮助。

【问题讨论】:

    标签: algorithm big-o


    【解决方案1】:

    内循环为 n^4(外循环内最慢的部分),外循环每次迭代运行一次,即 EDIT: logn times, so n^4logn。

    但是...

    根据提前到达return false 的频率,在最坏的情况下可能只有 n^5,例如如果几乎所有时间你在第一次迭代中都返回 false 那么你只花了 n^3-n^4 的工作,所以你的平均值为 O(n^3) 或 O(n^4) (取决于是哪个return false)。

    【讨论】:

    • 等一下,循环迭代只运行记录N次迭代,你怎么得到n^5?
    • 嗯,你是对的 - 作者的帖子自相矛盾的是它是 n 还是 log N,但我会假设它是 log N 并修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多