如果我們可以計算一個特定的for
循環被執行多少次,那麼我們可以很容易地瞭解複雜性。我們可以從一個簡單的for循環開始。
試想,如果我們想找到這個for
環路,則多少時間運行,我們可以通過編寫一系列做到這一點(因爲它是一系列均勻),並找到環以下,
for(int i=1;i<=m;i++)
{
//....
}
現在這裏那個術語是> m(limit)
。通過這種方式,我們可以輕鬆找到for
循環所需的迭代次數。
在這個例子中,如果我們寫我的所有可能值,
1,2,3,4,5,......,m
該系列產品是Arithmetic Progression。現在我們有一個公式,用於查找n-th
系列的條款{a(n) = a(1)+(n-1)*d}
。這裏d=1, a(1)=1
現在我們需要找到最大值n,例如a(n)<=m
。
我們可以通過簡單地將a(n)=m
找到並找到值n
。所以在這裏
m = 1+ (n-1)*1
m = 1+n-1
m = n
n = m.
所以這裏的總迭代將m
,因此我們可以說,這個for循環的複雜性是O(m)
。如果你寫的j
然後系列的所有值將1,5,25,125,.....
,現在這個系列是Geometric Progression
現在考慮您給了一個例子,
for(int j=1; j<n; j*=5)...
這裏。找到n-th
的公式爲a(n) = a(1)*(r^(n-1))
,這裏是a(1)=1 and r=5
。
現在把n(limit)
到位的a(n)
,看看有多少次循環執行,讓我們重命名限制n
爲m
去除混亂,
a(n) = a(1)*(r^(n-1))
m = 1*(5^(n-1))
m = 5^(n-1)
Now take log of base 5 on both side
log (m) = (n-1) //log is of base 5
n = log(m)+1
這樣我們就可以在這裏找到所需的總迭代n = log(m)+1
其中log是基數5.在去掉常數之後,我們可以說這個循環的複雜度爲O(log m)
,其基數爲5.
對於你的第二個例子,同樣的方法問題,如果你寫了一系列的j
,您將獲得n,n/10,n/100,....
所以它也是Geometric Progression
與a(1)=n , r= 1/10
這裏a(n)
將1
因爲我們需要找到term.If你找到的總迭代,你會得到它作爲log n
與基地10
大-theta(logn)僅適用於嵌套循環嗎? (For循環內的循環)
這是沒有必要的。假設我們只有一個循環,其格式如下,
for(int i=1;i<=n;i*=2)
這個循環也有O(log n)
複雜,它不是一個內循環。所以這取決於for循環的增量操作。它定義了for循環的整體複雜性。
在第二個例子中,內環是無限循環。 –
@SanketMakani對不起,修改。 – Miku
@Miku但是上面兩個循環的複雜性總體來說是Big-Theta(n * log(n))。它只是複雜度爲Big-Theta(log n)的內部循環。 –