我想知道是否有人能向我解释分析程序的语义。我知道如何做简单的,但有一些更复杂的我不知道该怎么做。例如,这是我书中的一个问题。我们给出了6个代码片段并告诉他们分析它们:
(1). sum = 0;
for( i = 0; i < n; ++i )
++sum;
(2). sum = 0;
for( i = 0; i < n; ++i )
for( j = 0; j < n; ++j )
++sum;
(3). sum = 0;
for( i = 0; i < n; ++i )
for( j = 0; j < n * n; ++j )
++sum;
(4). sum = 0;
for( i = 0; i < n; ++i )
for( j = 0; j < i; ++j )
++sum;
(5). sum = 0;
for( i = 0; i < n; ++i )
for( j = 0; j < i * i; ++j )
for( k = 0; k < j; ++k )
++sum;
(6). sum = 0;
for( i = 1; i < n; ++i )
for( j = 1; j < i * i; ++j )
if( j % i == 0 )
for( k = 0; k < j; ++k )
++sum;
我理解1,2和4.那些很容易。我得不到的是3,5和6。
1次运行n
次,以便其中一个位于Big-Oh(n)
。 2有两个for
循环,每个循环运行n
次,因此这个循环为Big-Oh(n^2)
。 4是我以前见过的东西。内循环的运行次数与i
的次数相同。因此,如果i = 1
然后循环运行一次,如果i = 2
循环运行两次1 + 2 + 3 + ... + n
模式n(n + 1) / 2
,这意味着整个Big-Oh(n^2)
}}。我不确定如何在条件中使用n * n
进行3。这也是我不知道如何在i * i
中使用i * i
的原因。至于6,我们不仅拥有if
,而且还有一个n
语句,可能会也可能不会运行。我该怎么办?任何人都可以帮助解释如何做那些?感谢。
UPDATE 我对3有一个想法。那个外部for循环运行n^2
次,内部for循环运行n * n^2
次。那么对于那个,我们会n^3
Big-Oh(n^3)
吗?那个人会在$scope.form = {};
$scope.car = null;
$scope.getCar = function(hash) {
$http.get('/cars/'+hash).success(function(car) {
$scope.car = car;
$scope.form = car;
});
};
吗?
答案 0 :(得分:0)
你想出了第三个。同样的理由适用于所有这些。实际上,您的目标是根据sum
找到n
的最终价值。
对于第五个,即求和:Σ i = 0 n (Σ j = 0 n ^ 2 (j))
内部求和只是(i 2 *(i 2 + 1))/ 2,它来自the simple summation formula。
然后你有Σ i = 0 n (i 2 *(i 2 + 1)) / 2等于[Σ i = 0 n (i 4 )+Σ i = 0 < sup> n (i 2 )] /。
这是O(N 5 ),看着主导词Σ i = 0 n (i 4 ),您可以将其视为一个整数,这样您只需增加指数就可以得到N 5 。第六个是作为练习留下的,想象一下sum
到底会是什么。