我刚刚编写了一个可以完成其工作的代码,但是我必须对其进行优化以及时运行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--;
}
答案 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_t
和stdlib.h
的位置。
这与您所拥有的非常相似,除了maxFact
现在显式存储系数并且只需要一个循环即可进行计算。您的代码看起来至少接近O(log n),但如上所述,这样做可以降低flops / n,同时在算法上仍为O(log n)-效率更高,但在算法上并不优越。实际上,此答案中的代码运行速度比问题代码中的n
快10倍,平均快3倍,但是我们在此处的间隔是微秒(甚至达到了n
的精度极限),因此因数3实际上没有意义。
希望这会有所帮助