提供算法计算性能O(n 3 log n)。该算法应该只包含简单的操作。
如何解决这个问题?...我正在攻读计算机科学GRE。谢谢!
答案 0 :(得分:2)
执行此操作的一种方法是编写一个运行O(n 3 )次的外循环和一个运行O(log n)次的内循环:
for (int i = 0; i < n * n * n; i++) {
for (int j = 1; j <= n; j *= 2) {
// ... do nothing ... //
}
}
请注意,内循环运行log n次,因为循环k次迭代后j的值为2 k ,并且一旦k≥lgn,我们将有j = 2 k ≥n。
另一种选择是编写一个递归函数,其运行时通过Master Theorem计算出O(n 3 log n)。一种方法是使一个函数对大小为n / 2的子问题进行8次递归调用,并且每次调用都可以使用Θ(n 3 ):
void silly(int n) {
if (n > 0) {
for (int i = 0; i < n * n * n; i++) {
// ... waste time ... //
}
for (int i = 0; i < 8; i++) {
silly(n / 2);
}
}
}
编辑:正如@Nuclearman所指出的,您还可以通过对大小为n 3的数组进行排序来获得运行时O(n 3 log n)使用像quicksort或heapsort这样的算法。更一般地,在大小为n 3 的输入上运行其运行时为O(n log n)的任何算法产生O的运行时间(n 3 log n)。这使用了log(n 3 )= 3 log n = O(log n)的事实。
希望这有帮助!