[英]Finding running time of program
我是算法和DS的新手。 我指的是一本書,其中有一些我很難理解的問題。
我需要找到以下程序的運行時間:(注釋僅來自本書)
function(int n) {
for(int i=1;i<=n/3;i++) { // will execute n/3 time
for(int j=1;j<=n;j+=4) { // will execute n/4 times
printf("*");
}
}
}
答案:O(n ^ 2)
n ^ 2怎么樣? 第一個循環將執行n / 3次,第二個循環將執行n / 4。 n / 3 * n / 4 = n ^ 2/12。 n ^ 2怎么樣? 請幫助我理解。
問題2
function(int n) {
for(int i=0;i<n;i++) { // will execute n times
for(int j=i;j<i*i;j+=4) { // will execute n*n times ?????? (How?)
if(j%i==0) {
for(int k=0;k<j;k++) { // will execute j times
printf("*");
}
}
}
}
}
答案:O(n ^ 5)
第一個循環執行n次。 精細。
第二個循環如何執行n * n次? 在這里,j的值被初始化為i,所以它不應該是(n * n)-i次嗎? 如果將j初始化為0,那將是n * n次,對嗎?
第三個循環執行j次,因為k
請幫助我理解為什么第二個循環(j)將執行n * n次。 謝謝。
這本書涉及大哦。 關於big-Oh的完整介紹可能太長了,但是在big-Oh領域,它認為:
O(a*f(n)) = O(f(n))
有a
恆定的。
另一個是:
O(a_k * n^k+ a_(k-1) n^(k-1)+...+a_0) = O(n^k)
f(n)
是一個隨機函數。
關於第二個問題 :第二個循環從i
到i*i
。 現在,由於i
將達到n-1
,因此它的大小為O(n)
,因此循環將在最后一次運行(n-1)*(n-1)
次中執行。 由於j
最終將達到O(n^2)
量級,並且第三個循環從0
到j-1
,因此第三個(最內部)循環的時間復雜度也為O(n^2)
。 因此,這意味着循環的總時間復雜度為:
O(n)*O(n^2)*O(n^2)=O(n^5)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.