为给定数字n查找因数的算法,该算法在时间O(log n)

时间:2018-11-28 00:47:30

标签: c++ runtime time-complexity big-o

我刚刚编写了一个可以完成其工作的代码,但是我必须对其进行优化以及时运行O(log n)。问题是我不确定其时间复杂度是否合适,如果不确定,我该如何解决?

数字的实数表示形式是序列s k ,s k-1 ... s 2 ,s 1 表示:

  
      -> n = 1! * s 1 + 2! * s 2 + ... + k! * s k
      -> s i ≤for i∈{1,2,...,k}
      -> s k > 0
      ->例如107 = 4! * 4 + 3! * 1 + 2! * 2 +1! * 1

我的代码:

unsigned long long int n;
unsigned long long int maxFact[21] = {0};

maxFact[0] = 1;
maxFact[1] = 1;

cout<<"Insert n: "; cin >> n;

int i = 2;
while (maxFact[i-1] * i <= n)  // find higher factorial <= n
{
    maxFact[i] = maxFact[i-1] * i;
    i++;
}

cout << "Factoradic representation of " << n << ":" << endl;

while (i > 1)
{
    cout << n / maxFact[i-1] << " ";
    n = n % maxFact[i-1];
    i--;
}

1 个答案:

答案 0 :(得分:0)

根据this definition of factoradic中使用的示例,您可以使用div()更快地确定系数。您可以像

那样实现
div_t result;
while (n != 0) {
  result = div(n, i);
  n = result.quot;
  maxFact[i++] = result.rem;
}

div()中包含div_tstdlib.h的位置。

这与您所拥有的非常相似,除了maxFact现在显式存储系数并且只需要一个循环即可进行计算。您的代码看起来至少接近O(log n),但如上所述,这样做可以降低flops / n,同时在算法上仍为O(log n)-效率更高,但在算法上并不优越。实际上,此答案中的代码运行速度比问题代码中的n快10倍,平均快3倍,但是我们在此处的间隔是微秒(甚至达到了n的精度极限),因此因数3实际上没有意义。

希望这会有所帮助