[英]Big O Notation and Time Complexity of C++ Code Snippet
所以我正在尋找c ++代碼片段的時間復雜性的確認:
for(int i = 0; i<N, i++){
for(int k = 1; k<N; k*=2){
//code with O(1)
}
}
我認為這將是O(NlgN)
,其中lg是log base 2.內部循環將是O(lgN)
因為k在每次迭代后加倍。 外部循環顯然是O(N)
,使整個代碼:
O(N)*O(lgN) = O(NlgN).
是的,它在O(n log n)中,但是基數與大O符號f=n \\cdot log_2(n) \\in \\mathcal{O}(log_2(n) * n ) \\subseteq \\mathcal{O}(\\frac{ln(n)}{ln(2)} * n ) \\subseteq \\mathcal{O}(log(n) * n ) \\ni f = n \\cdot ln (n)
因為f=n \\cdot log_2(n) \\in \\mathcal{O}(log_2(n) * n ) \\subseteq \\mathcal{O}(\\frac{ln(n)}{ln(2)} * n ) \\subseteq \\mathcal{O}(log(n) * n ) \\ni f = n \\cdot ln (n)
ie
注意最后的日志應該仍然是ln,但是人們並不關心每當log是10或e的基數時的混亂,因為它在大O中無關緊要。
因此,即使for(int k = 2; k<N; k*= k)
,使用大O表示法時復雜度也相同。 然而,有時人們在比較非常小的優化時會記下常數因素,但除非你在談論在全球數十億實例上運行的快速排序實現,否則這是不可行的。
對於我們如何確定你的內部循環是由log(n)
約束的部分我有點也沒有找到一個很好的數學證明。 當然執行它是一種證明,但我的理論方法是,我們可以同意內循環執行的頻率與函數k *= 2
需要更大的參數來達到n
,所以其中k(x) >= n
我們知道我們需要哪個x
來得到我們想要的k(x)
,是反函數k^(-1)
, 2^x
的反函數是log_2(x)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.